这个问题与以下问题有很大关系:
A) 如何将CUDA代码分成多个文件 https://stackoverflow.com/questions/2090974/how-to-separate-cuda-code-into-multiple-files
B) 尝试同时编译多个 CUDA 文件时出现链接错误 LNK2005 https://stackoverflow.com/questions/1976587/link-error-lnk2005-when-trying-to-compile-several-cuda-files-togheter
以下建议来自这里:https://meta.stackexchange.com/questions/42343/same-question-but-not-quite https://meta.stackexchange.com/questions/42343/same-question-but-not-quite和这里https://meta.stackexchange.com/questions/8910/asking-a-similar-but-not-the-same-question https://meta.stackexchange.com/questions/8910/asking-a-similar-but-not-the-same-question
我问一个非常相似的问题,但我想绝对清楚我的问题和上面链接的问题之间的区别在哪里。
当包含头文件时,我从标题中收到链接器错误,其中包含 a 的定义__device__
函数,到多个源文件中。
这与链接 A) 不同,链接 A) 会发生相同的错误__kernel__
函数因为__device__
根据CUDA手册暗示inline
:
在为计算能力 1.x 的设备编译的设备代码中,__device__
默认情况下,函数始终是内联的。这__noinline__
然而,函数限定符可以用作编译器在可能的情况下不要内联函数的提示(请参见第 E.1 节)。
链接 B) 更相关(一个答案正确地指出,无论手册说什么,它似乎都不会内联),但链接 B) 指的是 NVIDIA 提供的标头而不是自己的标头,因此问题很可能是位于我的头文件中,它不太可能位于 NVIDIA 头文件中。换句话说,链接 B) 和我的问题很可能有不同的答案。
与此同时,我发现将函数声明为__device__ inline
解决了问题,因此以上内容只是为世界其他地区记录解决方案。
悬而未决的问题是这种行为的原因。
我想出的可能的解释:
- 说明书有误
-
nvcc -arch=compute_11
不符合“为计算能力 1.x 的设备进行编译”的资格,或者 nvcc 中存在错误
- 这是 MS-VS 特定的,并且可以在 NVIDIA 测试的平台上运行
- 我对如何做有一个严重的误解
inline
作品。可以在这里找到与 cuda 无关的示例:使用内联函数多重定义的链接器错误 https://stackoverflow.com/questions/3160484/multiply-defined-linker-error-using-inlined-functions我的理解是“caf”所表达的“编译器不应该生成函数的外部定义,因此它不应该打扰链接器”那里的其他人似乎不同意。
如果有更有洞察力的人能够澄清这里发生的事情,我将不胜感激。