int gpu_count = -1;
cudaGetDeviceCount(&gpu_count);
std::cout << "gpu count: " << gpu_count << std::endl;
多显卡环境中设置显卡
cudaSetDevice(0)
多显卡环境下当cuda运算结束后需要reset显卡设备
cudaDeviceReset()
查询当前正在使用的设备号
int device_id;
cudaGetDevice(&device_id);
std::cout << "device id: " << device_id << std::endl;
cuda提供了一个内置结构体,可以查询到设备的很多信息
struct cudaDeviceProp {
char name[256]; //器件的名字
size_t totalGlobalMem; //Global Memory 的byte大小
size_t sharedMemPerBlock; //线程块可以使用的共用记忆体的最大值。byte为单位,多处理器上的所有线程块可以同时共用这些记忆体
int regsPerBlock; //线程块可以使用的32位寄存器的最大值,多处理器上的所有线程快可以同时实用这些寄存器
int warpSize; //按线程计算的wrap块大小
size_t memPitch; //做内存复制是可以容许的最大间距,允许通过cudaMallocPitch()为包含记忆体区域的记忆提复制函数的最大间距,以byte为单位。
int maxThreadsPerBlock; //每个块中最大线程数
int maxThreadsDim[3]; //块各维度的最大值
int maxGridSize[3]; //Grid各维度的最大值
size_t totalConstMem; //常量内存的大小
int major; //计算能力的主代号
int minor; //计算能力的次要代号
int clockRate; //时钟频率
size_t textureAlignment; //纹理的对齐要求
int deviceOverlap; //器件是否能同时执行cudaMemcpy()和器件的核心代码
int multiProcessorCount; //设备上多处理器的数量
int kernelExecTimeoutEnabled; //是否可以给核心代码的执行时间设置限制
int integrated; //这个GPU是否是集成的
int canMapHostMemory; //这个GPU是否可以讲主CPU上的存储映射到GPU器件的地址空间
int computeMode; //计算模式
int maxTexture1D; //一维Textures的最大维度
int maxTexture2D[2]; //二维Textures的最大维度
int maxTexture3D[3]; //三维Textures的最大维度
int maxTexture2DArray[3]; //二维Textures阵列的最大维度
int concurrentKernels; //GPU是否支持同时执行多个核心程序
};
可以在程序开始时加上验证
int gpu_count = -1;
cudaGetDeviceCount(&gpu_count);
if (gpu_count < 1)
{
std::cout << "no gpu device !" << std::endl;
exit(0);
}
无情的摸鱼机器