我使用来自findPackageCUDA.cmake的CUDA_COMPILE_PTX转换我的.cu文件。当我尝试获取我的内核的函数指针时,我遇到了以下问题:
我的内核名为Kernel1只能通过cuModuleGetFunction正确加载,如果我从生成的.ptx文件中使用其.entry-label,例如_Z7Kernel1Pj
问题是每次我必须重新编译.cu文件时,此标签可能会更改。如果我在一个常量char *中按名称引用它们,这不是一个解决方案。
答案 0 :(得分: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_
如果您使用extern“C”
extern "C" __global__ void addKernel(int *c, const int *a, const int *b)
符号名称现在为
STT_FUNC STB_GLOBAL addKernel
使用extern“C”将导致函数重载和名称空间丢失