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

时间:2010-04-12 15:53:20

标签: linker cuda

如何重复使用相同的内核而不会因为多次定义符号而导致致命的链接器错误?

在Visual Studio中,我得到:

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

我有三个文件:Interface.hKernel.cuWrapper.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<<< ... >>>( ... );
}

一切正常。

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

//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 个答案:

答案 0 :(得分:4)

创建启动器功能,并从将从多个位置包含的标头中引用它们。

在.cu文件中:

__global__ myKernel(){...}

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

在.h文件中

void myKernelLauncher();

答案 1 :(得分:3)

通常适用于我的解决方案是从所有cu文件中编译库 创建入口点来初始化内核。

否则将所有常用函数放在.cuh中并在#IFDEF _MYHEADER_H

时将其换行