我有一个我在主机和设备代码上使用的类,以便更容易地传递数据。这个类有一些操作数据的方法。一个简单的例子是:
struct Vector {
float x, y, z;
__host__ __device__ Vector(float _x, float _y, float _z) {
//...
}
};
如果我在头文件上实现这个类,它工作正常,nvcc很高兴。但是,如果我尝试在源文件上实现构造函数,nvcc会抱怨构造函数是非内联的。无论如何都要绕过这个或那仅仅是编译器的限制?
答案 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或更晚)。