2013-02-28 3 views
0

Я новичок в кодировании в cuda (и не очень опытный в C++), поэтому я читал, чтобы попытаться найти решение этой проблемы, но обычно не понимаю, что люди пытаются объяснить и еще не заработали.Использование классов шаблонов в коде cuda/C++

В принципе, у меня есть .CU файл, который содержит две вещи:

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

и:

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

Я тогда заголовочный файл, SamplerI.h который я не писал, но я пытаюсь включить вызов функции ничтожной выше, поэтому ниже всех директив #includes я есть:

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

и n позже в заголовке есть функция, в которой я включил вызов выше.

заголовок и связанные с ним файлы собраны в библиотеке libdnest, я скомпилировать файл .CU с NVCC -c step.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*)’ 

и я не знаю, что делать, чтобы исправить это ...

У кого-нибудь есть идеи? Если я не объясню достаточно хорошо, дайте мне знать, и я постараюсь включить дополнительную информацию, я действительно не знаю, что важно.

Приветствия Линдли

+0

Вы говорите, что вы не очень опытный в C++. Если вы больше комфортабельны в C#, вы можете проверить [CUDAfy.NET] (http://cudafy.codeplex.com/), инструментарий C# для программирования CUDA. –

ответ

1

Вы должны иметь шаблон в том же исходном файле, который использует его для компилятора, чтобы создать его экземпляр.

Обратите внимание, что C++ 11 вводит «extern», но они не поддерживаются всеми компиляторами.

+0

особенно при работе с CUDA, которая не поддерживает C++ 11 еще – jopasserat

+0

Так подожди, в данный момент в моей main.cpp У меня есть следующий вызов: Sampler пробоотборник = установки (ARGC, ARGV); Sampler - это класс, который содержит вызов кода cuda, но Banana относится к классу ModelType, для которого создан шаблон. Итак, я создаю сэмплер с использованием ModelType, поэтому, где мне нужно поставить ссылку на функцию в файле cu, я действительно не понимаю .. – LindleyLentati

+0

Хорошо, я закончил копирование всего материала из cu в заголовок и просто скомпилировал все это с помощью nvcc, по крайней мере, он скомпилировал ... просто нужно посмотреть, работает ли это сейчас! – LindleyLentati

Смежные вопросы