我正在开发一个在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。
我必须做错事,但是什么?
答案 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;生成可重定位设备代码。