Как можно использовать повторно одно и то же ядро, не получая фатальных ошибок компоновщика из-за многократного определения символа?
В 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 будьте благодарны.