在cuda / c ++代码中使用模板类

时间:2013-02-28 19:44:08

标签: c++ class templates cuda

我是cuda编码的新手,(并且在c ++方面没有大量经验)所以我一直在四处寻找尝试找到这个问题的解决方案,但一般都不了解人们尝试和解释的内容,并且还没有让它运作起来。

基本上,我有一个.cu文件,其中包含两件事:

template <class ModelType>
__global__ void Stepkernel(ModelType *particles)

template <class ModelType>
void runTest(ModelType *particles)

然后我有一个头文件,SamplerI.h,我没有写,但我试图包含对上面的void函数的调用,所以,在所有#includes下面我有:

template <class ModelType>
void runTest(ModelType *particles);

然后在标题中有一个函数,其中我已经包含了对上面的调用。

标题和相关文件在库libdnest中编译,我使用nvcc -c step.cu编译.cu文件,然后链接:

g++ -o main main.cpp step.o -ldnest

现在,如果模板不存在(即我只有一个void函数而没有提到ModelType),所有这一切都很好,它编译并运行,但是一旦我尝试包含模板,我得到以下编译错误:

../../include/SamplerImpl.h: In member function ‘bool       DNest3::Sampler<ModelType>::step() [with ModelType = Banana]’:
../../include/SamplerImpl.h:121:   instantiated from ‘void DNest3::Sampler<ModelType>::run() [with ModelType = Banana]’
main.cpp:37:   instantiated from here
../../include/SamplerImpl.h:159: error: no matching function for call to     ‘runTest(Banana*)’

并且我不知道如何尝试修复它......

有没有人有任何想法?如果我没有足够的解释让我知道,我会尝试包含更多信息,我真的不知道什么是重要的。

干杯 林德利

1 个答案:

答案 0 :(得分:1)

您需要在同一源文件中使用模板,以便编译器对其进行实例化。

请注意,C ++ 11引入了“extern”,但并非所有编译器都支持这些。