我使用 findPackageCUDA.cmake 中的 CUDA_COMPILE_PTX 转换我的 .cu 文件。当我尝试获取指向我的内核的函数指针时,我面临以下问题:
如果我使用生成的 .ptx 文件中的 .entry-label(例如 _Z7Kernel1Pj),我的名为 Kernel1 的内核只能通过 cuModuleGetFunction 正确加载
问题是每次我必须重新编译我的 .cu 文件时,这个标签可能会改变。如果我在常量 char* 中按名称引用它们,这不是解决方案。
_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" 会导致函数重载和命名空间丢失