近几天因为项目需要,要在自己的Windows
台式机上安装CUDA和配置nvcc
开发环境。不想这么一装就装了一天有余,强行解决了各种错误才得以正常使用,以下把遇到的所有可能错误及解决方案列出,以供将来安装时参考。
安装后进入系统黑屏
这是安装CUDA时遇到的第一个错误~~,还让我一度以为显卡坏了~~,但最后发现是CUDA安装时安装的驱动和显卡不兼容。
解决方案:
Boot 进安全模式,在设备管理器里选回退驱动程序
把显卡驱动回滚到先前的版本。重启电脑就能正常运行了。
NVCC 编译时显示 “找不到 cl.exe”
非常显然的错误,在Windows下,nvcc
是依赖于MSVC工具链的(目前还没有提供任何mingw
的支持),因此需要一套完整的MSVC Build Tools。(笔者这里最后用的是用于桌面的 Visual C++ 2015 v140 工具集
)。
解决方案:
安装Visual Studio的MSVC模块后将cl.exe
所在目录加入到PATH环境变量中。
CUDA无法正常运行
我在这里遇到的情况是所有__global__
函数都没有效果,cudaGetDeviceCount
返回一个很大的数值。
初步判断是CUDA Runtime存在问题,发现cudaGetDeviceCount
返回了错误代码35
,输出错误信息为CUDA driver version is insufficient for CUDA runtime version
。因此可以断定是驱动版本与CUDA版本不匹配导致。
解决方案:
安装与当前驱动版本相匹配的CUDA,比如笔者所用的391.35
最适合的版本是CUDA 9.1
以下是来自英伟达官网的驱动适配表格:
CUDA Toolkit | Linux x86_64 Driver Version | Windows x86_64 Driver Version |
---|---|---|
CUDA 10.0.130 | >= 410.48 | >= 411.31 |
CUDA 9.2 (9.2.148 Update 1) | >= 396.37 | >= 398.26 |
CUDA 9.2 (9.2.88) | >= 396.26 | >= 397.44 |
CUDA 9.1 (9.1.85) | >= 390.46 | >= 391.29 |
CUDA 9.0 (9.0.76) | >= 384.81 | >= 385.54 |
CUDA 8.0 (8.0.61 GA2) | >= 375.26 | >= 376.51 |
CUDA 8.0 (8.0.44) | >= 367.48 | >= 369.30 |
CUDA 7.5 (7.5.16) | >= 352.31 | >= 353.66 |
CUDA 7.0 (7.0.28) | >= 346.46 | >= 347.62 |
各种奇怪的编译问题
在配置好上述环境后,笔者又在编译时遇到了两个意想不到的错误,最后发现这两个错误都能归结于一个原因——老版CUDA对新版的编译工具集不支持。
其中部分报错内容如下:
...\include\type_traits(603): error: expression must have a constant value
fatal error -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!
遇到这些错误,不要慌张,这(一般)只是因为你所使用的工具集太新了。
解决方案:
下载安装老版本(如Visual C++ 2015 v140
)的工具集,或者在Visual Studio Installer
里手动添加老版本工具集包。并将cl.exe
的PATH设置到老工具集所在的位置(如果是Visual Studio
用户,可以直接考虑切换项目编译工具集)。
结果检验
在排除了上述问题后,我们就可以测试CUDA是否正常工作了~
下面放出我自己写的一个测试脚本(比较长):
#include <cuda_runtime.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <windows.h>
using std::cout;
using std::endl;
typedef float calc_type;
void randomize(calc_type * array, int len) {
// 随机生成数据
for(int i = 0 ; i < len ; i ++) array[i] = rand()/((calc_type)RAND_MAX);
}
void cpuAddition(calc_type * a, calc_type *b, calc_type *c, int len) {
// 用cpu计算
for(int i =