解决Windows环境下(VS2013)CUDA编程_syncthreads()函数未定义的方法

解决Windows环境下(VS2013)_syncthreads函数未定义的方法


最近开始学习GPU编程和高性能计算,看完了长达8小时的音频PPT课件后,兴冲冲的立马自己尝试了一下用GPU执行矩阵乘法的代码。在这个过程中遇到一个问题,那就是当我调用_syncthreads()函数时,VS2013编译器一直显示这个函数未定义,我的cuda版本是11.1,立刻百度一下,发现网上的说法主要有两种:

  1. 未包含头文件device_functions.h。
    有必要说一下,这个回答绝对是坑,因为你打开这个头文件 ,会发现里面其实啥也没有,只有一些注释,如下:
    解决Windows环境下(VS2013)CUDA编程_syncthreads()函数未定义的方法
    里面明明已经清清楚楚写着这个头文件不应该被直接引用!如果需要请调用cuda_runtime_api.h 或者 cuda_runtime.h!
    当然,即便发现这个然后去程序里调用这俩头文件,你会发现_syncthreads函数依然显示未定义,而且编译依旧无法通过。
    其实你用notepad++打开这两个头文件然后搜索文本“syncthreads”会发现这俩头文件里根本没有这个函数!
    综上,syncthreads函数和这几个头文件真的一点关系也没有!
  2. 第二种说法是出现“未定义标识符”的报错是因为VS编译器识别不到这个函数,但程序可以直接运行,我们可以忽略那条红色波浪线。可是我现在遇到的问题明明是编译根本通不过。
    那么问题究竟在哪里?

最后发现如果你的编译通不过,其实是因为你的链接器库目录没有加全,打开项目属性,在链接器附加库目录里添加:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\lib
当然如果你的安装目录不是默认的或者和我不一样你只要找到这个路径然后添加到你的链接器附加库目录里就行。

这个问题出现的原因我暂时还不清楚,虽然我创建工程的时候就选择了CUDA环境。感觉是真的让人很烦,搞了一天才解决。

而且我预感如果你用了上面的方法还是不行,那应该就是还有别的lib或者include目录没有加到你的工程项目里,你可以挨着试试。

最后,添加这个库目录以后,我的syncthreads函数依然显示未定义但是编译已经可以通过,现在才是网上之前的第二个说法里描述的情况,VS编译器识别不到这个函数,但程序可以直接运行,我们可以忽略那条红色波浪线。