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

Using Template classes in cuda / c++ code

本文关键字:cuda c++ 代码      更新时间:2023-10-16

我是新来的cuda编码,(并没有大量的经验在c++中),所以我一直在阅读,试图找到一个解决这个问题的方法,但一般不理解人们尝试和解释,还没有得到它的工作。

基本上,我有一个.cu文件,它包含两个内容:
template <class ModelType>
__global__ void Stepkernel(ModelType *particles)

:

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

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

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

,然后在头文件中有一个函数,其中包含了对上面的调用。

头文件和相关文件在库libdnest中编译,我用NVCC -c步骤编译.cu文件。Cu,然后链接到:

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

现在,如果模板不存在(即我只是有一个没有提及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*)’

和我不知道该做什么来尝试修复它…

有人有什么想法吗?如果我解释得不够好,请让我知道,我会尽量包括更多的信息,我真的不知道什么是重要的。

干杯林德利

你需要在同一个源文件中有一个模板来让编译器实例化它。

注意c++ 11引入了"extern",但并非所有编译器都支持。