CUDA: как повторно использовать ядра в нескольких файлах (для модульного тестирования) - PullRequest
2 голосов
/ 12 апреля 2010

Как можно использовать повторно одно и то же ядро, не получая фатальных ошибок компоновщика из-за многократного определения символа?

В Visual Studio я получаю:

"fatal error LNK1169: one or more multiply defined symbols found"

У меня есть три файла: Interface.h, Kernel.cu и Wrapper.cu. Моя текущая структура выглядит следующим образом (пример SDK «Интеграция C ++» ):

//Interface.h 
extern "C" void myCfunction( ... );

//Kernel.cu
__global__ void my_kernel( ... );

//Wrapper.cu
#include "Interface.h"
#include "Kernel.cu"

extern "C" void myCfunction( ... );

void myCfunction( ... ) {
    // Call CUDA kernel in Kernel.cu
    my_kernel<<< ... >>>( ... );
}

Это все отлично работает.

Но если я добавлю еще одну функцию C в другой файл, который также включает Kernel.cu и использует эти ядра, я получу вышеуказанную ошибку. например,

//NewWrapper.cu
#include "Kernel.cu"

extern "C" void myNewCfunction( ... );

void myNewCfunction( ... ) {
    // Call CUDA kernel in Kernel.cu
    my_kernel<<< ... >>>( ... );
    // Now I get linker errors...
}

Так, как я могу повторно использовать ядра в Kernel.cu среди множества функций C в разных файлах.

Между прочим, целью этого является модульное тестирование и интеграция моих ядер с модулем CPP, если нет возможности повторно использовать ядра (должно быть!), Тогда другие предложения по модульному тестированию ядер в моей существующей структуре модулей CPP будьте благодарны.

Ответы [ 2 ]

4 голосов
/ 27 июня 2011

Создание функций запуска и ссылки на них из заголовка, который будет включен из нескольких мест.

В .cu файле:

__global__ myKernel(){...}

void myKernelLauncher(){ myKernel<<<...>>>()...}

В .h файле

void myKernelLauncher();
3 голосов
/ 13 апреля 2010

Решение, которое обычно работает для меня, состоит в том, чтобы скомпилировать библиотеку из всех файлов cu и создать точки входа для инициализации ядра.

В противном случае поместите все общие функции в .cuh и оберните его, если #IFDEF _MYHEADER_H

...