Update
手动添加syncthreads部分已过时,请看最后一部分
开始
之前因为一些原因需要使用cuda,安装后我的vs2022似乎也自动安装了cuda开发环境。昨天打算简单体验一下cuda编程,所以尝试使用vs2022的cuda预设项目模板来进行一个hello world的编程。
我这里的cuda版本是11.8,所以选择CUDA 11.8 Runtime
项目模板进行创建。
编译时报错
在生成项目并打开生成的源码后,可能会显示错误(活动) E1696 无法打开 源 文件 "cuda_runtime.h"
这是因为IntelliSense没有在include path中找到对应的头文件。
虽然可以诸如修改path环境变量或是别的什么,但是其实vs的cuda插件已经提供了一个参数来指定cuda toolkit
目录。打开项目的属性,CUDA C/C++
-Common
中有CUDA Toolkit Custom Dir
。填入你的CUDA Tooklkit目录,我这里是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8
保存,即可发现include相关的错误消失了。
此时虽然有一个表达式错误的提示,但是实际上是可以直接编译,调试和运行的。但是接下来我们依旧需要解决这个问题,来获得最好的编码体验。
处理部分IntelliSense警告
解决VS代码对核函数调用参数的警告
这个错误是E0029 应输入表达式
,这是因为IntelliSense的语法检测不认为三尖括号的kernel execution configuration 语法是正确的,虽然好像有什么修改IntelliSense的配置来支持nvcc拓展的语法,但是为了简便起见,我使用一个StackOverflow的答案使用Variadic Macro实现。
解决VS代码对__syncthreads
符号的未定义警告
已过时
添加同名的展开后为空的宏。
代码
1 |
|
在Troubleshooting Tips for IntelliSense Slowness提到,启用IntelliSense后会定义这个宏。
这时展开CUDA_KERNEL_ARGS
后会把kernel函数视作普通的函数调用。但是vs最终会调用nvcc编译,编译时这个宏是未定义的,所以会将CUDA_KERNEL_ARGS
宏展开成kernel execution configuration的格式,从而既能正常运行,又能在开启IntelliSense的情况下不报错。
然后一个不知名的警告也消失了,不知道是什么,为什么
在学习 Cuda by Example的过程中
在跟着这本书的教程进行学习时,需要链接本书附带的代码压缩包中的动态库相关内容,通过不修改系统环境的情况下配置vs2022的opencv开发环境解决了。
随后产生了另一个问题,在TEXTURE MEMORY
章节,发现所有关于texture reference
的API都是未定义状态
看看这个
在已经安装了NSight插件的VS2022上部分符号显示未定义,但是依旧可以通过编译
此问题由Intellisense导致,由于nvcc编译时部分宏定义的不同导致一部分api无法被索引到,最终导致intellisense报错。
我翻了下源码,发现大部分无法被intellisense索引的api都是由于未定义__CUDACC__
宏导致,因此按照如下格式修改前文的宏
1 |
|
通过对intellisense定义一个__CUDACC__
的宏可以让它成功索引相关API,但是我认为这不是一个好的解决方案,或许可以去看看我的提问,或许你看到的时候已经有大神出手提出了更完美的解决方案。Any better ways to resolve the problems that Intellisense warns some special cuda symbols are undefined in VS2022