1

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

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

如果我在头文件上实现这个类,它工作正常并且 nvcc 很高兴。但是,如果我尝试在源文件上实现构造函数,nvcc 会抱怨构造函数是非内联的。反正有没有绕过这个或者这只是编译器的一个限制?

4

1 回答 1

1

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

使用 CUDA 5.0,您可以分别编译这两个文件并将它们链接在一起。这仍然需要 Fermi 或更高版本(2.x 或更高版本)。

于 2012-09-11T12:35:25.170 回答