前言
本文记录cuda库在windows系统上的编译运行的3种方式,主要包括命令行编译、VisualStudio2017编译、VSCode上编译等。
一、windows环境下CUDA环境配置
1.下载MinGW以使用GCC编译器
下载MinGW链接:https://github.com/msys2/msys2-installer/releases
选择下如下版本:

下载后的安装程序:

msys2安装完成后,启动弹出终端后,安装MinGW-w64工具链:
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain

直接回车确认安装所有的工具链。



打开cmd中确认编译环境是否安装好:
gcc --version g++ --version gdb --version

2.安装NIVIDIA显卡驱动和CUDA ToolKit
参考文档:CUDA和cudnn库安装
安装完成后,这里把bin目录(E:\Program Files\NVIDACUDA\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin)加到环境变量中,cmd打开测试安装环境。


3.命令行测试自己的编译环境
创建hello.cpp文件,测试安装的g++编译器:
#include <cstdlib>
#include <stdio.h>int main(void)
{printf("Hello World!\n");system("pause");return 0;
}
命令行:g++ hello.cpp -o hellocpp
生成hellocpp.exe,点开输出:
创建hellocuda.cu文件,测试cuda的nvcc编译器:
#include <cstdlib>
#include <stdio.h>
#include "cuda_runtime.h"__global__ void hello_from_gpu()
{printf("Hello World from the GPU!\n");
}int main()
{hello_from_gpu<<<2, 4>>>();cudaDeviceSynchronize();system("pause");return 0;
}
命令行:nvcc hellocuda.cu -o hellocuda
生成:hellocuda.exe文件,点开程序运行结果如下:

至此,在windows下的cuda编译环境已没有问题。如果在linux上编译就不需要另外下载MinGw,可在linux上单独安装cuda toolkit,由于电脑GPU限制只能安装较低版本,实际安装时会“CUDA10.0已停止主流支持”问题,所以本文主要是windows系统下编译。
二、在VS2017上配置编译cuda代码
1.在VS2017上新建项目
visual Studio C++下载地址:免费的开发人员软件和服务 - Visual Studio费的开发人员软件和服务 - Visual Studio
我使用的是Visual Studio Community 2017版本,下载安装后,新建项目:
文件-->新建项目 -->选择CUDA10.0-->输入名称,选择位置-->点击确定

注意:我这里使用vs2017,是因为cuda10.1最高只支持2017版本,如果你的cuda版本高可以选择更新的VS版本。可以参考:https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#compiling-sample-projects
点击确定后,工程项目中会自动生成一个kernel.cu源文件。

2.添加自己的文件
有以下几种方式处理kernel.cu
a.直接在kernel.cu文件中修改,删除或增加代码,编译将其作为唯一核函数运行
b.将kernel.cu重命名为其它文件,可清除内容,写自己的代码
c.项目中移除kernel.cu文件,并将另一个文件imfipG.cu添加到项目中
这里使用第3种。提前把imfipG.cu放入到项目中,在项目中移除kernel.cu文件,并添加文件,选择现有项。(imflipG.cu也可以换成前面的hellocuda.cu文件)

3.配置项目环境属性
第一步:右建项目,打开属性页,这里选择编译配置release x64;

第二步:设置包含目录include目录。

第三步:设置cuda的包含链接库路径和lib库
设置cuda代码链接库目录,链接器->常规->附加库目录(添加安装路径:E:\Program Files\NVIDACUDA\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64, 这里也可以使用相对路径)


第四步:修改计算能力,如下图中默认值是35,暂时不做修改,我使用的cuda10.1计算能力为3.0,这里需要改成30(如果设置为35计算会出错)。

4.生成可执行文件并测试
回到项目,鼠标右键点击项目,点击“生成”,可以发现编译成功:

生成文件如下:

在VS2017中直接F5启动项目,可得到结果:

注意,这里使用的imflipG文件中main函数是带有形参传入的,需要在属性页面设置命令行输入的参数,如下图是输入了4个参数。如果是使用hellocuda.cu文件,main函数参数列表是空,这里可忽略。

三、在VSCode中配置编译cuda代码
1.在vscode中安装插件
基于Windows系统,需要在cuda中下载C/C++和 Nsight Visual Studio Code Edition这两个插件。参考官方文档说明: https://marketplace.visualstudio.com/items?itemName=NVIDIA.nsight-vscode-edition
直接在VScode左侧栏中搜索以下两个插件下载。


2. 在VScode中调试CUDA程序
第一步:重启VSCode软件,打开带有.cu文件的文件夹,可以右下角状态栏自动识别为cuda程序,且在编写程序时可以自动链接相关cuda函数库补全代码
第二步:添加task.json、launch.json文件,如果是初始启动或调试会自动生成,修改这两个文件如下:
task.json:
launch.json:
第三步:点击左边三角形编译运行:
成功运行结果:

这里存在的问题:打端点调试的话,程序并不会停在断点处?可能有更好的方法来解决。另外运行过程中如果报错,按照错误提示修改即可,比如报错:nvcc fatal : Cannot find compiler 'cl.exe' in PATH!,添加对应的路径到系统变量中就好。
解决方法:查询cl.exe的路径添加到环境变量中:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64!
检查环境变量设置成功:

3.我踩的坑:
问题1:Nsight VSCE插件版本问题
需要避坑的是这里下载的Nsight VSCE插件默认最新版本,所以需要点进去下载与你cuda对应的版本。
此处提供最老的版本是2021版本,存在的问题是,虽然下载了nsight组件,但和我的cuda toolkit 10.0并不匹配,需要下一个6.0版本的nsight组件。然而官网没有低版本的VSIX插件文件下载。
官网下载nsight链接:https://developer.nvidia.com/tools-downloads#?dn=nsight-visual-studio-edition-6-0-0
问题2:launch.json中配置“cuda-gdb”调试方法,启动时实际上会报错


遇到这个问题时,因我gpu硬件限制和nsight插件版本不对应,所以不知道是我nsIght版本问题导致还是nsight插件调试只支持linux平台上使用,上一步能编译成功主要是设置"cppvsdbg"编译器而非“cuda-gdb”的原因。