不支持CUDA外部呼叫

时间:2011-05-13 15:13:17

标签: cuda

我正在开发一个在Fermi卡上运行的CUDA 4.0应用程序。根据规范,Fermi具有Compute Capability 2.0,因此应该支持非内联函数调用。

我在一个不同的obj文件中用nvcc 4.0编译我的每个类。然后,我用g ++ - 4.4链接它们。

请考虑以下代码:

[File A.cuh]

#include <cuda_runtime.h>

struct A
{
    __device__ __host__ void functionA();
};

[File B.cuh]

#include <cuda_runtime.h>

struct B
{
    __device__ __host__ void functionB();
};

[File 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输出Error: External calls are not supported (found non-inlined call to _ZN1B9functionBEv)编译A.cu。

必须做错事,但是什么?

3 个答案:

答案 0 :(得分:10)

正如this thread on the NVidia forums所解释的那样,即使Fermi支持非内联函数,nvcc仍然需要在编译期间拥有所有可用的函数,即在同一个源文件中:没有链接器(是的,真可惜......)。

答案 1 :(得分:1)

functionB未声明,因此被视为外部呼叫。由于错误表示不支持外部呼叫。实施functionB,它将起作用。

答案 2 :(得分:1)

是的,CUDA 5.0做到了。我不能让它暴露外部设备变量,但设备方法工作得很好。 默认不是。

nvcc选项为“-rdc = true”。在Visual Studio和Nsight中,它是Configuration Properties - &gt;下项目属性中的一个选项。 CUDA C / C ++ - &gt;常见 - &gt;生成可重定位设备代码。