コード例 #1
0
ファイル: Application.cpp プロジェクト: Guillermo-/MCGPU
int metrosim::run(int argc, char** argv)
{
	SimulationArgs args = SimulationArgs();
	//args.useNeighborList = false;
	if (!getCommands(argc, argv, &args))
	{
		exit(EXIT_FAILURE);
	}

	DeviceContext context = DeviceContext();
	if (args.simulationMode == SimulationMode::Parallel)
	{
		if (!openDeviceContext(&context, MIN_MAJOR_VER, MIN_MINOR_VER, args.deviceIndex))
		{
			exit(EXIT_FAILURE);
		}
	}

	if (args.simulationMode == SimulationMode::Parallel)
	{
		fprintf(stdout, "Beginning simulation using GPU...\n");
	}
	else
	{
		fprintf(stdout, "Beginning simulation using CPU...\n");
	}

	Simulation sim = Simulation(args);
	sim.run();

	fprintf(stdout, "Finishing simulation...\n\n");

	if (args.simulationMode == SimulationMode::Parallel)
	{
		if (!closeDeviceContext(&context))
		{
			exit(EXIT_FAILURE);
		}
	}

	exit(EXIT_SUCCESS);
}
コード例 #2
0
ファイル: Application.cpp プロジェクト: orlandoacevedo/MCGPU
int metrosim::run(int argc, char** argv) {
	SimulationArgs args = SimulationArgs();

	if (!getCommands(argc, argv, &args)) {
		exit(EXIT_FAILURE);
	}

#ifdef _OPENACC
	int numDevices = acc_get_num_devices(acc_device_nvidia);

	// Ensure args.simulationMode is either Serial or Parallel
	if (args.simulationMode == SimulationMode::Default) {
		if (numDevices < 1) {
			fprintf(stdout, "No GPU devices found; defaulting to CPU "
                            "execution.\n");
			args.simulationMode = SimulationMode::Serial;
		} else {
			fprintf(stdout, "%d GPU device(s) found; running on GPU.\n",
                    numDevices);
      // FIXME (blm)
      fprintf(stdout, "WARNING: Not all features support GPU offloading at "
                      "this time. Results may be inaccurate.\n");
			args.simulationMode = SimulationMode::Parallel;
		}
	}

    if (args.simulationMode == SimulationMode::Parallel) {
        if (numDevices == 0) {
            fprintf(stdout, "ERROR: Cannot find suitable GPU!\n");
            exit(EXIT_FAILURE);
        }

        // Implicitly sets the device
        acc_init(acc_device_nvidia);
    }

#else
    // Without OpenACC, only serial calculations are supported
    if (args.simulationMode == SimulationMode::Parallel) {
        fprintf(stdout, "Must compile with OpenACC capability to run in "
                "parallel mode.\n");
        exit(EXIT_FAILURE);
    } else {
        args.simulationMode = SimulationMode::Serial;
		fprintf(stdout, "Beginning simulation using CPU...\n");
    }
#endif

	Simulation sim = Simulation(args);
	sim.run();

	fprintf(stdout, "Finishing simulation...\n\n");

// Shutdown the device if we were using the GPU
#ifdef _OPENACC
	if (args.simulationMode == SimulationMode::Parallel) {
		acc_shutdown(acc_device_nvidia);
	}
#endif

	exit(EXIT_SUCCESS);
}