不支持 CUDA 外部调用



我正在开发一个在费米卡上运行的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下的项目属性中的一个选项。

最新更新