Windows下安装 CUDA 的问题总结

在Windows上安装CUDA过程中,遇到系统黑屏、NVCC找不到cl.exe、CUDA无法运行和编译问题。解决方法包括回滚显卡驱动、安装MSVC Build Tools并更新环境变量、确保驱动和CUDA版本匹配,以及解决旧版CUDA与新编译工具的兼容性问题。通过测试脚本验证CUDA配置成功。
摘要由CSDN通过智能技术生成

​ 近几天因为项目需要,要在自己的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 = 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值