我怎样才能重用同一个内核,而不会因为多次定义符号而导致致命的链接器错误?
在 Visual Studio 中我得到:
"fatal error LNK1169: one or more multiply defined symbols found"
我有三个文件:Interface.h
、Kernel.cu
和 Wrapper.cu
。我当前的结构如下(ala "C++ integration" SDK example):
//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...
}
那么如何在不同文件中的许多 C 函数中重用 Kernel.cu
中的内核。
顺便说一句,这样做的目的是单元测试,并将我的内核与 CPP 单元集成,如果没有办法重用内核(必须有!),那么在我现有的 CPP 单元框架中对单元测试内核的其他建议将不胜感激。
最佳答案
创建启动器函数并从将包含在多个位置的 header 中引用它们。
在 .cu 文件中:
__global__ myKernel(){...}
void myKernelLauncher(){ myKernel<<<...>>>()...}
在.h文件中
void myKernelLauncher();
关于linker - CUDA:如何在多个文件中重用内核(用于单元测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2623388/