2

我使用 findPackageCUDA.cmake 中的 CUDA_COMPILE_PTX 转换我的 .cu 文件。当我尝试获取指向我的内核的函数指针时,我面临以下问题:

如果我使用生成的 .ptx 文件中的 .entry-label(例如 _Z7Kernel1Pj),我的名为 Kernel1 的内核只能通过 cuModuleGetFunction 正确加载

问题是每次我必须重新编译我的 .cu 文件时,这个标签可能会改变。如果我在常量 char* 中按名称引用它们,这不是解决方案。

4

1 回答 1

4

_Z7Kernel1Pj 是一个 C++ 错位名称。如果你想要一个简单的符号,你可以使用 extern "C"

extern "C" void Kernel1(...)

例如,如果您使用默认的 CUDA Visual Studio 项目包含内核

__global__ void addKernel(int *c, const int *a, const int *b)

如果您在此运行 cuobjdump -symbols,您将看到损坏的符号名称

STT_FUNC         STB_GLOBAL   _Z9addKernelPiPKiS1_

如果您使用外部“C”

extern "C" __global__ void addKernel(int *c, const int *a, const int *b)

符号名称现在将是

STT_FUNC         STB_GLOBAL   addKernel

使用 extern "C" 会导致函数重载和命名空间丢失

于 2012-08-01T20:21:27.313 回答