ubantu18.04安装NVIDIA驱动 CUDA cuDNN (笔记)

ubantu18.04安装NVIDIA驱动 CUDA cuDNN

安装NVIDIA驱动

  1. 禁用nouveau
sudo gedit /etc/modprobe.d/blacklist.conf  #打开禁用列表

在最后空白行添加

blacklist nouveau
options nouveau modeset=0

更新并重启

sudo update-initramfs -u
reboot

检查是否禁用成功

lsmod | grep nouveau  #若无输出即禁用成功
  1. 安装gcc
sudo apt install build-essential
  1. 安装驱动
sudo ubuntu-drivers autoinstall #自适应安装最新适用版本
#安装好后重启
reboot
  1. 检测驱动安装是否成功
nvidia-smi  #若安装成功后可以看到驱动型号

安装CUDA

NVIDIA驱动与CUDA对应版本查询链接
CUDA下载链接

  1. CUDA安装
    在下载好的文件目录下执行:
chmod a+x cuda_10.1.105_418.39_linux.run   
sudo sh cuda_10.1.105_418.39_linux.run  #安装过程中去掉驱动选项 如果之前有cuda,则在最后加上 --override
  1. 添加环境变量
    打开.bashrc文件
sudo gedit ~/.bashrc

在最后空白行添加

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
#注意不同版本的路径名也不同

更新:

source ~/.bashrc   #若不执行 source,需要重启系统才生效
#创建软连接,方便多个版本的cuda切换
ln -s /usr/local/cuda-10.1 /usr/local/cuda
  1. 检查是否安装成功
nvcc -V  #反馈版本号即成功

其他校验方法参考:https://blog.csdn.net/BigData_Mining/article/details/99670642

安装CUDANN

cuDNN下载链接
解压方法:
将.tgz文件解压在当前目录:
tar zxvf MY_NAME.tgz

将.tar.gz文件解压在当前目录:
tar zxvf  MY_NAME.tar.gz

下载好后解压,在解压后的目录执行:

sudo cp cuda/include/cudnn.h /usr/local/cuda-10.1/include/ 
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.1/lib64/ 
sudo chmod a+r /usr/local/cuda-10.1/include/cudnn.h 
sudo chmod a+r /usr/local/cuda-10.1/lib64/libcudnn*
#检查是否安装成功:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

8.0及以上版本可能不会反馈
#有头文件信息反馈即成功,如下图所示。
cuDNN安装成功反馈

Nvidia opencl环境配置(题外话)
sudo apt install clinfo
clinfo //查看opencl目前的platforms

sudo cp -a /usr/local/cuda-10.1/include/CL /usr/local/include
sodu cp -a /usr/local/cuda-10.1/lib64/libOpencl* /usr/lib
验证: 新建文件test.c -> gcc test.c -lOpenCL编译 -> 之后生成a.out文件 -> 运行./a.out
验证代码 test.c :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef MAC
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif
int main() {
/* Host data structures */
cl_platform_id *platforms;
//每一个cl_platform_id 结构表示一个在主机上的OpenCL执行平台,就是指电脑中支持OpenCL的硬件,如nvidia显卡,intel CPU和显卡,AMD显卡和CPU等
cl_uint num_platforms;
cl_int i, err, platform_index = -1;
/* Extension data */
char* ext_data;
size_t ext_size;
const char icd_ext[] = "cl_khr_icd";
//要使platform工作,需要两个步骤。1 需要为cl_platform_id结构分配内存空间。2 需要调用clGetPlatformIDs初始化这些数据结构。一般还需要步骤0:询问主机上有多少platforms
/* Find number of platforms */
//返回值如果为-1就说明调用函数失败,如果为0标明成功
//第二个参数为NULL代表要咨询主机上有多少个platform,并使用num_platforms取得实际flatform数量。
//第一个参数为1,代表我们需要取最多1个platform。可以改为任意大如:INT_MAX整数最大值。但是据说0,否则会报错,实际测试好像不会报错。下面是步骤0:询问主机有多少platforms
err = clGetPlatformIDs(5, NULL, &num_platforms);
if(err < 0) {
perror("Couldn't find any platforms.");
exit(1);
}
printf("I have platforms: %d\n", num_platforms); //本人计算机上显示为2,有intel和nvidia两个平台
/* Access all installed platforms */
//步骤1 创建cl_platform_id,并分配空间
platforms = (cl_platform_id*)
malloc(sizeof(cl_platform_id) * num_platforms);
//步骤2 第二个参数用指针platforms存储platform
clGetPlatformIDs(num_platforms, platforms, NULL);
/* Find extensions of all platforms */
//获取额外的平台信息。上面已经取得了平台id了,那么就可以进一步获取更加详细的信息了。
//一个for循环获取所有的主机上的platforms信息
for(i=0; i<num_platforms; i++)
{
/* Find size of extension data */
//也是和前面一样,先设置第三和第四个参数为0和NULL,然后就可以用第五个参数ext_size获取额外信息的长度了。
err = clGetPlatformInfo(platforms[i],
CL_PLATFORM_EXTENSIONS, 0, NULL, &ext_size);
if(err < 0)
{
perror("Couldn't read extension data.");
exit(1);
}
printf("The size of extension data is: %d\n", (int)ext_size);//我的计算机显示224.
/* Access extension data */
//这里的ext_data相当于一个缓存,存储相关信息。
ext_data = (char*)malloc(ext_size);
//这个函数就是获取相关信息的函数,第二个参数指明了需要什么样的信息,如这里的CL_PLATFORM_EXTENSIONS表示是opencl支持的扩展功能信息。我计算机输出一大串,机器比较新(专门为了学图形学而购置的电脑),支持的东西比较多。
clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS,
ext_size, ext_data, NULL);
printf("Platform %d supports extensions: %s\n", i, ext_data);
//这里是输出生产商的名字,比如我显卡信息是:NVIDIA CUDA
char *name = (char*)malloc(ext_size);
clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME,
ext_size, name, NULL);
printf("Platform %d name: %s\n", i, name);
//这里是供应商信息,我显卡信息:NVIDIA Corporation
char *vendor = (char*)malloc(ext_size);
clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR,
ext_size, vendor, NULL);
printf("Platform %d vendor: %s\n", i, vendor);
//最高支持的OpenCL版本,本机显示:OpenCL1.1 CUDA 4.2.1
char *version = (char*)malloc(ext_size);
clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION,
ext_size, version, NULL);
printf("Platform %d version: %s\n", i, version);
//这个只有两个值:full profile 和 embeded profile
char *profile = (char*)malloc(ext_size);
clGetPlatformInfo(platforms[i], CL_PLATFORM_PROFILE,
ext_size, profile, NULL);
printf("Platform %d full profile or embeded profile?: %s\n", i, profile);
/* Look for ICD extension */
//如果支持ICD这一扩展功能的platform,输出显示,本机的Intel和Nvidia都支持这一扩展功能
if(strstr(ext_data, icd_ext) != NULL)
platform_index = i;
//std::cout<<"Platform_index = "<<platform_index<<std::endl;
printf("Platform_index is: %d\n", platform_index);
/* Display whether ICD extension is supported */
if(platform_index > -1)
printf("Platform %d supports the %s extension.\n",
platform_index, icd_ext);
//释放空间
free(ext_data);
free(name);
free(vendor);
free(version);
free(profile);
}
if(platform_index <= -1)
printf("No platforms support the %s extension.\n", icd_ext);
/* Deallocate resources */
free(platforms);
return 0;
}

参考https://zhuanlan.zhihu.com/p/53393267

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值