最近在家里过寒假,可能这是还在学校里带着最大的福利了,无意之中翻出了多年前买的几本关于CUDA编程的书,于是随便在自己电脑上配置了一下环境,试试能不能把当年没有看完的书给看完了,于是有了今天这个判断CUDA是否安装成功的一个博客。
原本按照自己以前的安装法子来配置环境,无奈开机后总是不成功,于是采用了Ubuntu默认的安装方式,即 apt-get nvidia-cuda-toolkit , 安装好以后本打算着用CUDA自带的测试sample 来试试是否安装成功,无奈此种安装方式是不带sample的,于是采用如下步骤测试。
nvidia-setting
有了上图后可以确认NVIDIA的驱动已经安装好。
但是,这时出现了个比较神奇的事情,就是如下命令的失败:
nvidia-detector
该命令显示 显卡并没有被识别,而这恰恰和上图出现的结果相反,十分令人费解,于是继续探索。
lspci | grep -i vga
该命令证明 NVIDIA 显卡也没有被识别,但这也是与第一个命令结果相反的,于是继续在网上搜索。
最后在无意中发现了这个 帖子: https://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=14898
该帖子最后的一个回答解答了我的疑虑:
lspci | egrep 'VGA|3D'
该结果清楚的显示我的电脑上的NVIDIA显卡已经被识别,验证了一个命令的驱动安装成功的结果。
由于此种安装方式并不会有自带的sample因此需要我自己去编写测试,这时在网上找到了这么一个demo,感觉不错,如下:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
//初始化CUDA
int count=0;
bool InitCUDA()
{
printf("Start to detecte devices.........\n");//显示检测到的设备数
cudaGetDeviceCount(&count);//检测计算能力大于等于1.0 的设备数
if(count == 0)
{
fprintf(stderr, "There is no device.\n");
return false;
}
printf("%d device/s detected.\n",count);//显示检测到的设备数
int i;
for(i = 0; i < count; i++)
{//依次验证检测到的设备是否支持CUDA
cudaDeviceProp prop;
if(cudaGetDeviceProperties(&prop, i) == cudaSuccess)
{//获得设备属性并验证是否正确
if(prop.major >= 1)//验证主计算能力,即计算能力的第一位数是否大于1
{
printf("Device %d: %s supportsCUDA %d.%d.\n",i+1,prop.name,prop.major,prop.minor);//显示检测到的设备支持的CUDA 版本
break;
}
}
}
if(i == count)
{//没有支持CUDA1.x 的设备
fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
return false;
}
cudaSetDevice(i);//设置设备为主叫线程的当前设备
return true;
}
int main()
{
if(!InitCUDA())
{//初始化失败返回系统int argc, char** argv
return 0;
}
printf("Hello GPU! CUDA has been initialized.\n");
//exit(argc ? EXIT_SUCCESS : EXIT_FAILURE);
return 0;//返回系统
}
其中需要注意的一个问题是运行编译好的程序时需要使用 sudo , 即使用管理员权限, 可能是在安装NVIDIA驱动和CUDA的时候本身就是安装使用管理员权限的,所以要调用它们的时候也是需要使用sudo来操作的。