CUDA - 源文件上的__device__方法

时间:2012-07-20 20:43:41

标签: c++ cuda

我有一个我在主机和设备代码上使用的类,以便更容易地传递数据。这个类有一些操作数据的方法。一个简单的例子是:

struct Vector {
  float x, y, z;
  __host__ __device__ Vector(float _x, float _y, float _z) {
    //...
  }
};

如果我在头文件上实现这个类,它工作正常,nvcc很高兴。但是,如果我尝试在源文件上实现构造函数,nvcc会抱怨构造函数是非内联的。无论如何都要绕过这个或那仅仅是编译器的限制?

1 个答案:

答案 0 :(得分:1)

直到CUDA 5.0,CUDA编译器已经限制内核所需的所有内容(即__global__函数)必须位于单个翻译单元中。对于pre-Fermi器件(即计算能力1.x),编译器还必须内联所有__device__函数。因此,如果您在文件a.cu中定义了结构,并且__global__内核使用了b.cu中定义的结构,那么当编译器处理b.cu时,它将无法找到{{1}功能。

使用CUDA 5.0,您可以单独编译这两个文件并将它们链接在一起。这仍然需要费米或更晚(2.x或更晚)。