Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda cuModuleGetFunction don';t只接受简单的内核名;。条目“-来自.ptx文件的标记_Cuda_Cmake - Fatal编程技术网

Cuda cuModuleGetFunction don';t只接受简单的内核名;。条目“-来自.ptx文件的标记

Cuda cuModuleGetFunction don';t只接受简单的内核名;。条目“-来自.ptx文件的标记,cuda,cmake,Cuda,Cmake,我使用findPackageCUDA.cmake中的CUDA_COMPILE_PTX转换.cu文件。当我尝试获取指向内核的函数指针时,我面临以下问题: 如果我使用生成的.ptx文件中的.entry标签,则只能通过cuModuleGetFunction正确加载名为Kernel1的内核,例如Z7Kernel1Pj 问题是,每次我必须重新编译.cu文件时,此标签可能会更改。如果我在常量字符中引用它们,这不是解决办法。 p>ωZ7Keln1pJ是一个C++被忽略的名称。如果你想要一个简单的符号,你可以使

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

如果我使用生成的.ptx文件中的.entry标签,则只能通过cuModuleGetFunction正确加载名为Kernel1的内核,例如Z7Kernel1Pj


问题是,每次我必须重新编译.cu文件时,此标签可能会更改。如果我在常量字符中引用它们,这不是解决办法。 p>ωZ7Keln1pJ是一个C++被忽略的名称。如果你想要一个简单的符号,你可以使用外部的“C”

例如,如果使用默认的CUDA visual studio项目,则该项目包含内核

__global__ void addKernel(int *c, const int *a, const int *b)
如果您在上面运行cuobjdump-symbols,您将看到损坏的符号名称

STT_FUNC         STB_GLOBAL   _Z9addKernelPiPKiS1_
如果使用外部“C”

符号名称现在将为

STT_FUNC         STB_GLOBAL   addKernel

使用外部“C”会导致函数重载和命名空间丢失

< P>αZ7Keln1PJ是C++的被损坏名称。如果你想要一个简单的符号,你可以使用外部的“C”

例如,如果使用默认的CUDA visual studio项目,则该项目包含内核

__global__ void addKernel(int *c, const int *a, const int *b)
如果您在上面运行cuobjdump-symbols,您将看到损坏的符号名称

STT_FUNC         STB_GLOBAL   _Z9addKernelPiPKiS1_
如果使用外部“C”

符号名称现在将为

STT_FUNC         STB_GLOBAL   addKernel

使用extern“C”将导致函数重载和名称空间丢失

好的,谢谢!但是,是否有可能预测我的内核名称的C++被破坏的版本,以便我可以在我的代码中硬编码它们作为字符串?顺便问一下,如何用驱动程序API加载内核函数?我不可能是第一个遇到这个问题的人,是吗?CUDA使用GNU3 demangler,所以你可以学习格式,但这很容易出错。最好的方法是编译程序并在可执行文件上运行cuobjdump-symbols,以获得符号名称列表。如果您不能选择正确的,您可以在符号名称上运行demangler实用程序。好吧,这似乎是一个巨大的过载,我甚至无法从代码内部执行此操作,但据我所知,只能使用外部命令行工具。所以我更喜欢“extern C”-解决方案,但也谢谢你!您的选项是(1)添加一个构建步骤,使用CUAdObjDup或PARES.PTX文件来命名,(2)使用EXTEN“C”,或者(3)编写一个MangLever并将完整的C++名称传递给函数。我会推荐(1)和(2)。我经常使用驱动程序API,我使用选项2和选项1。好的,谢谢!但是,是否有可能预测我的内核名称的C++被破坏的版本,以便我可以在我的代码中硬编码它们作为字符串?顺便问一下,如何用驱动程序API加载内核函数?我不可能是第一个遇到这个问题的人,是吗?CUDA使用GNU3 demangler,所以你可以学习格式,但这很容易出错。最好的方法是编译程序并在可执行文件上运行cuobjdump-symbols,以获得符号名称列表。如果您不能选择正确的,您可以在符号名称上运行demangler实用程序。好吧,这似乎是一个巨大的过载,我甚至无法从代码内部执行此操作,但据我所知,只能使用外部命令行工具。所以我更喜欢“extern C”-解决方案,但也谢谢你!您的选项是(1)添加一个构建步骤,使用CUAdObjDup或PARES.PTX文件来命名,(2)使用EXTEN“C”,或者(3)编写一个MangLever并将完整的C++名称传递给函数。我会推荐(1)和(2)。我经常使用驱动程序API,并使用选项2和选项1。