2013-02-28 22 views
0

我是cuda編程的新手(而不是在C++中經驗豐富),所以我一直在閱讀以嘗試找到解決此問題的方法,但通常不瞭解人們嘗試和解釋,並沒有得到它的工作。在cuda/c + +代碼中使用模板類

基本上,我有一個包含兩件事.CU文件:

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

和:

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

我然後有一個頭文件,其中SamplerI.h我沒寫,但我試圖包含上面的void函數的調用,所以,低於所有#包括我有:

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

和在後面的標題裏有一個函數,其中包含了對上述的調用。

頭和相關文件在庫libdnest被編譯,我編譯NVCC -c step.cu的.CU文件,然後用鏈接:

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

現在,如果模板心不是存在(即我只是有沒有提到ModelType的void函數)所有這一切都變大了,它編譯和運行,但只要我嘗試,包括模板,我得到以下編譯錯誤:

../../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*)’ 

和我不知道該怎麼做來修復它...

有沒有人有任何想法?如果我沒有解釋得夠好,讓我知道,我會嘗試,幷包括更多的信息,我真的不知道什麼是重要的。

乾杯 林德利

+0

你說你在C++中不是很有經驗。如果你在C#中更加舒適,你可以看看CUDA編程的C#工具包[CUDAfy.NET](http://cudafy.codeplex.com/)。 – 2013-02-28 19:48:16

回答

1

你需要有模板使用它的編譯器初始化它同一個源文件英寸

請注意,C++ 11引入了「extern」,但所有編譯器都不支持這些。

+0

尤其是CUDA處理時不支持C++ 11尚未 – jopasserat 2013-02-28 21:14:39

+0

所以死守,在我main.cpp中的那一刻,我有以下電話: 採樣採樣=設置(ARGC,ARGV); 採樣器是包含對cuda代碼調用的類,但Banana是爲其生成模板的類ModelType。 所以,我使用ModelType實例化一個採樣器,所以我需要在cu文件中引用該函數,我真的不明白。 – LindleyLentati 2013-02-28 22:57:38

+0

好吧,我最終將所有的東西從cu複製到頭文件,然後用nvcc編譯整個內容,至少在veyr編譯過的時候,只需要看看它現在是否可用! – LindleyLentati 2013-03-01 00:50:23