CUDA:如何在多个文件中重用内核(用于单元测试)

zen*_*nna 2 linker cuda

如何重用同一个内核,而不会因多次定义符号而出现致命的链接器错误?

在 Visual Studio 中我得到:

"fatal error LNK1169: one or more multiply defined symbols found"
Run Code Online (Sandbox Code Playgroud)

我有三个文件:Interface.hKernel.cuWrapper.cu. 我当前的结构如下(ala “C++集成”SDK示例):

//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<<< ... >>>( ... );
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好。

但是,如果我在另一个包含Kernel.cu并使用这些内核的文件中添加另一个 C 函数,则会出现上述错误。例如

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

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

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

那么如何在Kernel.cu不同文件的许多 C 函数中重用内核呢?

顺便说一句,这样做的目的是单元测试,并将我的内核与 CPP 单元集成,如果无法重用内核(必须有!),那么在我现有的 CPP 单元框架内对单元测试内核的其他建议将不胜感激。

ker*_*rem 5

创建启动器函数并从标头引用它们,该标头将包含在多个位置。

在.cu 文件中:

__global__ myKernel(){...}

void myKernelLauncher(){ myKernel<<<...>>>()...}
Run Code Online (Sandbox Code Playgroud)

在.h文件中

void myKernelLauncher();
Run Code Online (Sandbox Code Playgroud)