4

在带有 gcc/g++ 4.6 的 ubuntu 上使用 CUDA 5.0,在使用模板链接 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 的内容移动到标题中并且只构建主目录,它使用模板就好了。或者,如果我完全删除模板,代码自然会很好地链接。

我确信对此有一个简单的答案。有任何想法吗?

4

1 回答 1

3

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

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

否则,如果您CuArray::CuArray在底部显式实例化,cu_array.cu如下所示:

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

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

于 2013-06-03T18:46:59.037 回答