windows下的CUDA环境配置

1、环境配置

英伟达官方提供了详细的配置文档:

https://docs.nvidia.com/cuda/cuda-quick-start-guide/index.html#

配置文档中提供了win和linux平台下的两类安装指南,由于我的平台是win64,所以只尝试了win系统的配置。下面是官方提供的详细版配置指南:

https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/

总的说,配置过程非常简单,windows下只需要下载CUDA Development Tools安装器,点击一键安装即可。

CUDA Development Tools安装器提供了:自动卸载旧版本、自动注册环境变量、自动安装IDE插件等等功能,要做的就是点击next steps就可以了。(第二次覆盖安装时,如果破坏了卸载程序,可能需要手动修改nvcc的环境变量)

但是经过自己上手,发现官方文档中有不少问题,主要是支持版本不清晰,容易造成反复卸载安装,浪费时间,故写一个配置核对和安装的教程文档:

1.1 系统要求

1、检查系统和编译器
英伟达对windows的系统支持仅有以下几个版本,我的系统是Microsoft Windows 10 22H2,所以直接下载NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads)就可以了。

CUDA支持的windows版本.png

CUDA12.6 在windows平台下仅支持MSVC编译器。CUDA最新版及后续版本都将不再对32-bit compilation native and cross-compilation提供支持。

1.2 显卡要求

1、检查显卡版本是否被支持

访问下方网址,检查自己的显卡是否在其中。

https://developer.nvidia.com/cuda-gpus

一查晕了,我是1050ti,不在支持列表里。
支持显卡.png

但是查询社区后的结果是可行。

cuda_support_card.png

因此,如果你的显卡型号不在官网的支持列表里,不要着急,google一下:cuda + 你的显卡型号。

2、检查显卡驱动

确定了自己显卡型号被支持,另一个需求就是显卡驱动的版本,这对应着你能够安装的CUDA toolkit版本
需要首先检查自己的显卡驱动,下图是CUDA版本与驱动版本的对应关系(https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html):

cuda_toolkit_minimum_driver_version.png

通过

1
英伟达控制面板->帮助->系统信息

可以直接看到自己的显卡驱动版本。你可以通过升级驱动或选择驱动适配的CUDA版本进行安装。

1.3 windows 系统下的 VS 要求

英伟达官方的tools kit可以为你一键安装VS的插件适配,能很大程度提高编程效率,因此虽然我的电脑跑VS很费劲,还是选择了VS作为我CUDA编程的IDE。

直接在官网下载Instaler。在安装过程中发现我的vs并不能安装Nsight Integration, 去官网查询后得知VS2019和之前的版本号,仅支持32位;而对于2022和后续版本,仅支持64位。

visual_studio_support.png

这个套件包含了几个很重要的工具,所以还是得安装。对我而言重要的工具有两个:

Nsight Compute : CUDA application interactive kernel profiler

Nsight Systems : System-wide performance analysis tool

所以我重新安装了一个VS2022。官方下载地址如下:

https://visualstudio.microsoft.com/zh-hans/downloads/

在安装时选择C++桌面开发即可。

1.4 安装及验证

1. 安装过程:

1、选择一个解压文件夹,这个文件夹在安装结束后会被自动删除。

install_1.png

解压中

install_2.png

2、选择高级安装,设置安装位置及安装组件

3、安装完成

2. 验证:

这里有三种方式验证,三种方法可以交叉验证,以确定到底哪一步出错了。

下面是具体的验证方法:

1、在CMD中输入命令行,即可验证NVCC编译器的版本。NVCC是CUDA的编译器,是在C编译器基础上的一个拓展。

“CUDA nvcc编译器会自动分离你代码里面的不同部分,如图中主机代码用C写成,使用本地的C语言编译器编译,设备端代码,也就是核函数,用CUDA C编写,通过nvcc编译,链接阶段,在内核程序调用或者明显的GPU设备操作时,添加运行时库。”

出自:https://face2ai.com/CUDA-F-1-1-%E5%BC%82%E6%9E%84%E8%AE%A1%E7%AE%97-CUDA/

下面是查看版本的命令:

1
nvcc -V

验证结果:

nvcc_version.png

同样的,你可以使用where指令查询NVCC的安装位置,确保环境变量中定义的位置指向的是你现在安装的NVCC:

1
where nvcc

2、运行示例

在安装目录下,有一系列测试用例,可以直接执行。如下图:

test_case.png

直接在命令行中执行这些程序,也可验证环境是否成功。我运行了带宽测试,结果如下:

test_result.png

3、最后一个验证方法是克隆官方示例,并编译运行。官方示例是通过VS编写的,在打开时只需点击sln工程文件即可。示例仓库如下:

https://github.com/nvidia/cuda-samples

将代码克隆下来后,通过运行其中bandwidthTest这个测试项目,测试tools和VS的集成功能是否完善。

Samples/1_Utilities/bandwidthTest

test_sample.png

验证结果:

vs_test_result.png

1.5 遇到的一些问题和解决方法

1. Nsight Integration组件安装失败

报错截图:
error1.png

具体报错如下:

1
2
3
4
5
6
7
8
9
Not Installed:
- Nsight for Visual Studio 2019
Reason: VS2019 was not found
- Nsight for Visual Studio 2017
Reason: VS2017 was not found
- Integrated Graphics Frame Debugger and Profiler
Reason: see https://developer.nvidia.com/nsight-vstools
- Integrated CUDA Profilers
Reason: see https://developer.nvidia.com/nsight-vstools

解决方法:

https://forums.developer.nvidia.com/t/cuda-toolkit-not-fully-installed/182066/4
https://forums.developer.nvidia.com/t/integrated-cuda-profilers-not-installed/254745

简单地说,没有安装是因为 Graphics Frame Debugger 和 Profiler 目前以及从toolkit中移除(toolkit 的基本功能是开发环境,调优工具理应独立按需配置)。如果需要安装,需要进行单独的配置,具体的安装教程文档如下:

https://developer.nvidia.com/nvidia-nsight-integration-install-tips

这是官方对问题的回复:

1
2
3
4
5
Hi, @sandocarlos1

Integrated Graphics Frame Debugger and Profiler is not part of CUDA toolkit now. If you need to do Graphics debugger/profiler, you can download the standalone NVIDIA Nsight Graphics | NVIDIA Developer 67

Integrated CUAD Profilers now is replaced with Nsight Compute and Nsight System. They are part of CUDA toolkit actually. If you installed successfully, you can search these 2 tools to launch directly.

2. 安装器的选择

由于网络原因,我选择了local安装器。两个安装器的功能是完全一致的,只是network安装器会在安装过程中下载待安装文件。如果网络环境不好,我也建议你选择local安装器,从而避免重复下载带来的额外耗时。

installer.png

3. 驱动版本

驱动版本问题.png

上述问题是因为现安装的显卡驱动比installer自带的驱动版本高,在安装时可以直接选择取消勾选安装driver(如下图),一般不会造成问题。

uncheck_driver.png

下图是官方文档(https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html)中表明的安装程序自带的驱动版本:

toolkit_inpackage_driver_version.png

自己的驱动版本可以通过英伟达管理面板查看,比如我的驱动版本就是最新的,比安装包自带的驱动版本高,所以出现了上述的告警。

driver_version.png

4. NVCC环境变量的自动修改

如果之前安装过某个版本的CUDA,这里会提示可能需要人为修改环境变量:

environment_variable.png

根据我的验证,如果你没有自己乱删文件,导致卸载出问题了,安装器会自动帮你更新环境到新的安装位置:

update_environment_variable.png

5. VS配置错误,无法正确编译CUDA示例项目

重复安装不同版本的CUDA,可能会造成VS的项目配置出现一些问题,如下方的帖子和我的截图:

https://forums.developer.nvidia.com/t/while-testing-cuda-11-7-installation-tracedesigntime-intellisense/251408

vs_config_error.png

对VS进行repair后仍然报错,排除问题是由于IDE安装不全:

vs_config_error2.png

到这里为止,和帖子中的问题一模一样,还是没有正确检索到安装的CUDA版本号。这个帖子的问题仍然没有解决,所以我选择自己进行解决。通过查阅几个方案后,定位到了原因所在,总结得到了如下可行方案:

step 1. 修改项目CUDA
这里关键点在于不要学习各种帖子中描述的直接修改文件,而是选择直接内部修改配置,避免破坏文件的健全性,具体的操作如下:

1
VS中右键项目->生成依赖性->生成自定义->选择现在正确安装的版本:

config_s1.png

step 2. 重新打开项目

1
VS中右键项目->生成

step 3. 点击上方debug按钮,即可开始调试:

vs_test_result.png

原因分析:

https://github.com/NVIDIA/cuda-samples/issues/281

https://github.com/NVIDIA/cuda-samples/issues/207

https://forums.developer.nvidia.com/t/cannot-run-samples-on-ms-visual-studi-2019/72472

上述的帖子中,都遇到了相同的问题,问题根源在于IDE找不到编译所需的依赖文件。这个CUDA的版本号是github中的项目指定的。问题出在这里,当打开一个新的陌生项目时,依赖检查模块定位到了配置文件中指定的CUDA版本,但该版本并不是本机安装的版本,因此依赖无法被正确加载。需要手动修改依赖版本。

如下图,图中是一个测试项目刚打开时的依赖项配置页面,图中默认的12.5版本的CUDA并不是我本机安装的版本。所以需要手动指定。

vs_config_error3.png

总地说,任何在CUDA版本上的修改都有可能会导致这个问题。包括但不仅限于:工程中指定了CUDA版本,但运行前并没有确认本地安装的CUDA版本是否一致;工程中升级CUDA版本,需要重新指定CUDA依赖。此外,工程路径中有中文同样会造成编译失败,切记检查是否是因为字符集乱码导致无法定位。

这是一个常见的简单问题,拓展问题搜索关键词

1
2
3
4
5
6
7
8
9
10
11
12
13
[未找到导入的项目XXX,请确认<Import>声明中的CUDAs路径正确,且磁盘上存在该文件]

[Can't load sample projects after local installation]

[While testing cuda 11.7 installation:tracedesigntime, intellisense]

[CUDA props path]

[VS工程加载失败 | 找不到导入的项目CUDA xx.props解决方案]

[Cannot run samples on MS Visual Studi 2019]

[CUDA示例项目无法编译]

针对该类问题,英伟达官方给出的解决方案:

https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#build-customizations-for-existing-projects

1.6 一些有用的资料

  1. CUDA Toolkit Archive
    包含所有toolkit的历史版本,如果GPU太老,不被最新版本的toolkit支持,可以考虑安装旧版本的:

https://developer.nvidia.com/cuda-toolkit-archive

1.7 一些有趣的事实

1、 VS 的 Intellisense 并不支持 CUDA 的特性语法,比如<<<>>>.

这是很多开发者舍弃VS作为编辑器的部分原因:

https://www.reddit.com/r/CUDA/comments/uimcen/is_there_a_way_to_get_visual_studio_2019/?rdt=65020

更有趣的是,早在2018年就有人在社区中提出开发这项插件的请求,但是直到现在,这个问题仍然open着。

https://developercommunity.visualstudio.com/t/Add-support-for-CUDA-extensions-to-Intel/399545?space=22&entry=suggestion

在2022年,终于有热心的开发者注意到了这个小问题,提供了一种宏替换的方法,通过在代码头添加宏替换,自行解决这个问题,下面是回复原文:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
his suggestion has been open for going on 5 years now with no signs of life from MSFT. I don’t mean to sound pessimistic, but perhaps we’ll need to find our own workarounds. To that end:

If you are using CUDA at all, you have statements like DoGenSteps <<<BLOCKS, 1024>>> (setnum);. Intellisense can’t understand statements like this at all, and flags them as ‘expected an expression.’ Similarly, if you declare some shared memory __shared__ uint8_t s_LookupTable8[128];, Intellisense complains that it is not initialized. However it’s illegal to initialize shared memory in CUDA (for good reason).

To address this, I’ve added this to my CUDA files:

#ifdef __INTELLISENSE__
#define CUDA_KERNEL(...)
#define FAKEINIT = {0}
#else
#define CUDA_KERNEL(...) <<< __VA_ARGS__ >>>
#define FAKEINIT
#endif
With that in place, I can write code like this:

DoGenSteps CUDA_KERNEL(BLOCKS, 1024) (setnum);
__shared__ uint8_t s_LookupTable8[128] FAKEINIT;
Yes, it’s a bit clunky, and obviously a workaround rather than a real solution, but it’s better than nothing (which is what we’ve got now). And Intellisense has no problems with it.

As for the other problems OP describes, a number of them can be cleared up by defining CUDACC before including cuda_runtime:

#ifdef __INTELLISENSE__
#define __CUDACC__
#endif
#include <cuda_runtime.h>
Put that at the top of your cu file. That one change resolves most or all of the issues OP describes. And since it’s wrapped in that #ifdef, it only affects the generation of Intellisense data and has no effect on the compiled code.

While these suggestions may not fix everything, they fix 100% of the Intellisense errors I’ve got. So I figured I’d share.

更多的,有人在2022年开源了一个python脚本,用于生成上述思路的宏,从而试图解决这个问题:

https://github.com/pjueon/cuda_intellisense

英伟达官方为vsc编写了一套专用的code edition插件,但是仍然不管VS用户的死活:

https://developer.nvidia.com/nsight-visual-studio-code-edition

这一定程度上反映了轻量与重量的优缺点。你可以选择VSC作为你的开发工具,选择VS作为你的调优工具和工程管理工具。