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

标签 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<<< ... >>>( ... );
}

一切正常。

但如果我在另一个文件中添加另一个 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/

相关文章:

linux - 将 Clapack 链接到 cmake 项目 Linux

c++ - 链接 SFML 时出错。 LNK2001

c++ - 多个文件中的 Cuda 内核函数

c - 允许与 Throw The Switch 的 Unity 单元测试框架进行双浮点比较

optimization - 减少 CUDA 内核中使用的寄存器数量

assembly - 当您需要调用大于 2^32 位的函数时会发生什么?

c++ Cuda代码不运行内核

cuda - 推力与 CUDPP

cuda - 'compute capability' 是什么意思 w.r.t. CUDA?

c++ - 使用构造函数中本地声明的 device_vector 中的 device_vector::data() 方法初始化结构内部的指针是否安全?