模板类的CUDA链接器错误

时间:2013-06-03 18:10:03

标签: templates cuda

在ubuntu上使用CUDA 5.0和gcc / g ++ 4.6,我在使用模板链接CUDA代码时遇到错误。

cu_array.cu:

#include "cu_array.hpp"
template<class T>
CuArray<T>::CuArray(unsigned int n) {
  cudaMalloc(&data,n*sizeof(T));
}

cu_array.hpp:

#pragma once
template<class T>
class CuArray {
public:
   CuArray(unsigned int n);
private:
  T* data;
};

main.cu:

#include "cu_array.hpp"
int main() {
  CuArray<float> a(10);
}

这些与nvcc -c一起正常编译,但与nvcc cu_array.o main.o的关联可以undefined reference to CuArray<float>::CuArray(unsigned int)。如果我将cu_array.cu的内容移动到标题中并且只构建main,它就可以正常使用模板。或者,如果我完全删除模板,代码自然会很好地链接。

我确信这有一个简单的答案。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您没有在定义它的编译单元中实例化该类,因此编译器不会为类成员函数发出任何代码,并且链接失败。这不是CUDA特有的,这种贪婪的实例化方式是g ++使用的编译/链接模型,很多人都被它抓住了。

正如您已经发现的那样,最简单的解决方案是将所有内容都包含在同一个编译单元中,问题就会消失。

否则,如果您在CuArray::CuArray的底部显式实例化cu_array.cu,请执行以下操作:

template CuArray<float>::CuArray(unsigned int);

编译器将发出代码否则不会发出代码,并且链接问题将得到修复。您需要为代码中其他地方使用的每种类型实例化每个类函数,以使此方法有效。