我正在开发一个在费米卡上运行的CUDA 4.0应用程序。根据规范,Fermi 具有计算能力 2.0,因此应该支持非内联函数调用。
我将使用 nvcc 4.0 的每个类编译在一个不同的 obj 文件中。然后,我将它们全部与 g++-4.4 链接起来。
考虑以下代码:
[文件A.cuh]
#include <cuda_runtime.h>
struct A
{
__device__ __host__ void functionA();
};
[文件B.cuh]
#include <cuda_runtime.h>
struct B
{
__device__ __host__ void functionB();
};
[文件 A.cu]
#include "A.cuh"
#include "B.cuh"
void A::functionA()
{
B b;
b.functionB();
}
尝试编译具有nvcc -o A.o -c A.cu -arch=sm_20
输出 A.cu Error: External calls are not supported (found non-inlined call to _ZN1B9functionBEv)
.
我一定是做错了什么,但是什么?
正如 NVidia 论坛上这个线程所解释的那样,似乎即使 Fermi 支持非内联函数,nvcc 仍然需要在编译期间拥有所有可用的函数,即在同一个源文件中:没有链接器(是的,这很遗憾......
functionB
未声明,因此被视为外部调用。由于错误说不支持外部调用。实施functionB
,它将起作用。
没错,CUDA 5.0 做到了。我无法让它公开外部设备变量,但设备方法工作得很好。不是默认的。
nvcc 选项是 "-rdc=true"。在Visual Studio和Nsight中,它是配置属性->CUDA C/C++ -> Common -> Generate Reloccatable Device Code下的项目属性中的一个选项。