1. 设置gpu卡号
cuda_set_device(gpu_index); // 通过给定gpu_index不同的值设置使用的显卡。
CHECK_CUDA(cudaSetDeviceFlags(cudaDeviceScheduleBlockingSync)); // 主机线程将阻塞,直到设备完成其工作。
/// <summary>
/// set the gpu used
/// </summary>
/// <param name="n">gpu index</param>
void cuda_set_device(int n)
{
gpu_index = n; // 全局变量
cudaError_t status = cudaSetDevice(n);
if(status != cudaSuccess) CHECK_CUDA(status);
}
2. 检查cuda和cudnn版本并获取显卡个数
void show_cuda_cudnn_info()
{
int cuda_version = 0, cuda_driver_version = 0, device_count = 0; // 初始化值
CHECK_CUDA(cudaRuntimeGetVersion(&cuda_version)); // cuda version: 11.1. cuda_version = 11*1000+1*10 = 11010
CHECK_CUDA(cudaDriverGetVersion(&cuda_driver_version)); // cuda_driver_version: 11.6. 11060
fprintf(stderr, " CUDA-version: %d (%d)", cuda_version, cuda_driver_version);
if(cuda_version > cuda_driver_version) fprintf(stderr, "\n Warning: CUDA-version is higher than Driver-version! \n"); // 安装的cuda必须小于系统支持的版本。
#ifdef CUDNN
fprintf(stderr, ", cuDNN: %d.%d.%d", CUDNN_MAJOR, CUDNN_MINOR, CUDNN_PATCHLEVEL); // 8 0 5
#endif // CUDNN
#ifdef CUDNN_HALF // 构建Tensor核心
fprintf(stderr, ", CUDNN_HALF=1");
#endif // CUDNN_HALF
CHECK_CUDA(cudaGetDeviceCount(&device_count)); // 获取显卡设备个数device_count
fprintf(stderr, ", GPU count: %d ", device_count);
fprintf(stderr, " \n");
}
3. 检查opencv版本
show_opencv_info();
void show_opencv_info()
{
std::cerr << " OpenCV version: " << CV_VERSION_MAJOR << "." << CV_VERSION_MINOR << "." << CVAUX_STR(CV_VERSION_REVISION) OCV_D
<< std::endl;
}
4. 检测gpu算力
char device_name[1024];
int compute_capability = get_gpu_compute_capability(net->gpu_index, device_name);
int get_gpu_compute_capability(int i, char *device_name)
{
typedef struct cudaDeviceProp cudaDeviceProp;
cudaDeviceProp prop;
cudaError_t status = cudaGetDeviceProperties(&prop, i);
CHECK_CUDA(status);
if (device_name) strcpy(device_name, prop.name); // gpu名称
int cc = prop.major * 100 + prop.minor * 10; // __CUDA_ARCH__ format. 8*100+6*10=860
return cc;
}