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

Linker CUDA:如何在多个文件中重用内核(用于单元测试),linker,cuda,Linker,Cuda,我怎样才能重用同一个内核而不会因为多次定义符号而导致致命的链接器错误呢 在Visual Studio中,我得到: "fatal error LNK1169: one or more multiply defined symbols found" 我有三个文件:Interface.h,Kernel.cu,和Wrapper.cu。我目前的结构如下(ala): 那么如何在不同文件中的许多C函数中重用Kernel.cu中的内核呢 顺便说一句,这样做的目的是单元测试,并将我的内核与CPP单元集成,如果没

我怎样才能重用同一个内核而不会因为多次定义符号而导致致命的链接器错误呢

在Visual Studio中,我得到:

"fatal error LNK1169: one or more multiply defined symbols found"
我有三个文件:
Interface.h
Kernel.cu
,和
Wrapper.cu
。我目前的结构如下(ala):

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


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

通常对我有效的解决方案是用所有cu文件和 创建入口点以初始化内核


否则,将所有常用函数放在.cuh中,如果#IFDEF _MYHEADER _H

创建启动器函数并从多个位置包含的标题引用它们,则将其包装

在.cu文件中:

__global__ myKernel(){...}

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

我发现这有点难以理解——当你说“C函数”时,你真正的意思是“调用CUDA内核的.cu文件中的C接口函数”,是吗?与“纯C函数在.C文件中”相反?(还有
Wrapper.cu
定义了
myCfunction()
?)另外,这也是我认为区分
.cu
.cuh
文件很有用的原因之一;如果您不是直接编译
Kernel.cu
,而是将其包含在其他
.cu
文件中,那么它应该有一个
.cuh
扩展名来说明这一点。抱歉,这有点复杂。h只包含一个C函数myCfunction()的外部接口,该函数在Wrapper.cu中定义,它本身调用在kernel.cu中定义的内核。问题是我想创建另一个不同的C函数来调用kernel.cu中定义的内核,比如在wrapper.cu以外的文件中定义的myNewCfunction()。真正的目标是创建一个单元测试代码,在其中我可以包含在不同位置定义的内核,并独立于在正常操作中调用它们的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...
}
__global__ myKernel(){...}

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