Linux下CUDA9.0和CUDA8.0切换记录及所遇问题

双CUDA版本切换及所遇问题## 标题

  • CUDA的版本切换
    CUDA各版本的安装教程及对应cuDNN的配置教程不再赘述,下文假设用户系统已经安装好了CUDA8.0和CUDA9.0
  1. 查看CUDA版本;nvcc -V

  2. 修改用户环境配置文件: vim ~/.bashrc 在文档的最后添加如图环境变量:
    Linux下CUDA9.0和CUDA8.0切换记录及所遇问题
    别忘记sudo source ~/.bashrc

  3. cd /usr/local
    ls 查看是否有cuda文件夹,如果没有执行sudo ln -s cuda-8.0 cuda(或者sudo ln -s cuda-9.0 cuda 取决于你想切换什么版本)

  4. nvcc -V 查看版本,观察cuda版本是否变化

  5. 测试自己的程序,博主从8.0换到了9.0,在测试使用cuda9.0的项目时遇到了如下报错
    ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory
    解决方法:
    检查 /usr/local/cuda-9.0/lib64 下是否有 libcublas.so.9.0
    如果有的话则在终端输入sudo idconfig cuda-9.0/lib64
    (关于idconfig的相关知识参见:https://www.cnblogs.com/lyongde/p/4190588.html)
    输入上述命令后又出现如下报错:
    /sbin/ldconfig.real: /usr/local/cuda-9.0/lib64/libcudnn.so.7 不是符号连接
    Linux下CUDA9.0和CUDA8.0切换记录及所遇问题
    百度后找到解决方式: https://blog.****.net/hjxu2016/article/details/69389597
    个人理解: idconfig命令后会生成一些.so文件, 但这里生成的libcudnn.so.7并没有链接到任何一个库或者链接上
    Linux下CUDA9.0和CUDA8.0切换记录及所遇问题
    图片来自于上述idconfig链接,侵删
    由于改变了软连接,所以lib64里面的东西也变了,故需要idconfig

    解决方法总结:
    首先在usr/local/cuda-8.0/lib64/下搜索libcudnn(由于是libcudnn报错)
    ls后发现两个文件libcudnn.so.7 和libcudnn.so.7.0.5 理论上只有一个libcudnn.so.7.0.5
    Linux下CUDA9.0和CUDA8.0切换记录及所遇问题
    这里的libcudnn.so和libcudnn static.a暂时不知道是什么用途,这里打个问号
    ll查看链接情况,发现上述四个文件相互独立
    Linux下CUDA9.0和CUDA8.0切换记录及所遇问题
    我们这里强行将生成的.so.7链接到原有的.so.7.0.5上:

    ln -sf /usr/local/cuda-8.0/lib64/libcudnn.so.5.0.5 /usr/local/cuda-8.0/lib64/libcudnn.so.5

    链接后输入ll , 命令执行成功
    Linux下CUDA9.0和CUDA8.0切换记录及所遇问题
    现在重新执行上述操作中的sudo idconfig ***
    问题解决.