/**
 * Prints the device properties.
 * @param file the file to print out the properties.
 */
void printDevProp(FILE* file) {
    cudaDeviceProp devProp = getDeviceProperties();

	fprintf(file, "Major revision number:         %d\n",  devProp.major);
	fprintf(file, "Minor revision number:         %d\n",  devProp.minor);
	fprintf(file, "Name:                          %s\n",  devProp.name);
	fprintf(file, "Total global memory:           %lu\n", (unsigned long) devProp.totalGlobalMem);
	fprintf(file, "Total shared memory per block: %lu\n", (unsigned long) devProp.sharedMemPerBlock);
	fprintf(file, "Total registers per block:     %d\n",  devProp.regsPerBlock);
	fprintf(file, "Warp size:                     %d\n",  devProp.warpSize);
	fprintf(file, "Maximum memory pitch:          %lu\n", (unsigned long) devProp.memPitch);
	fprintf(file, "Maximum threads per block:     %d\n",  devProp.maxThreadsPerBlock);
	for (int i = 0; i < 3; ++i)
		fprintf(file, "Maximum dimension %d of block:  %d\n", i, devProp.maxThreadsDim[i]);
	for (int i = 0; i < 3; ++i)
		fprintf(file, "Maximum dimension %d of grid:   %d\n", i, devProp.maxGridSize[i]);
	fprintf(file, "Clock rate:                    %d\n",  devProp.clockRate);
	fprintf(file, "Total constant memory:         %lu\n", (unsigned long) devProp.totalConstMem);
	fprintf(file, "Texture alignment:             %lu\n", (unsigned long) devProp.textureAlignment);
	fprintf(file, "Concurrent copy and execution: %s\n",  (devProp.deviceOverlap ? "Yes" : "No"));
	fprintf(file, "Number of multiprocessors:     %d\n",  devProp.multiProcessorCount);
	fprintf(file, "Kernel execution timeout:      %s\n",  (devProp.kernelExecTimeoutEnabled ? "Yes" : "No"));
	fflush(file);
	return;
}
const cudaDeviceProp& getCurrentDeviceProperties() {
  int device = 0;
  auto err = cudaGetDevice(&device);
  checkCuda(err, std::string("CUDA ERROR: cudaGetDeviceCount "));

  return getDeviceProperties(device);
}
/**
 * Returns the number of multiprocessors in the selected GPU.
 * @return the number of multiprocessors in the selected GPU.
 */
int getGPUMultiprocessors() {
	cudaDeviceProp prop = getDeviceProperties();
	return prop.multiProcessorCount;
}