我正在通过c ++ filt过滤我编译的PTX,但它只能解析一些名称/标签并保留一些原样。例如,这个:
func (.param .b32 func_retval0) _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c6__shflEiii(
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c6__shflEiii_param_0,
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c6__shflEiii_param_1,
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c6__shflEiii_param_2
)
被解构为:
.func (.param .b32 func_retval0) _INTERNAL_19_gather_bits_cpp1_ii_56538e7c::__shfl(int, int, int)(
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c6__shflEiii_param_0,
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c6__shflEiii_param_1,
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c6__shflEiii_param_2
)
而不是至少这个:
.func (.param .b32 func_retval0) _INTERNAL_19_gather_bits_cpp1_ii_56538e7c::__shfl(int, int, int)(
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c::__shfl(int, int, int)_param_0,
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c::__shfl(int, int, int)_param_1,
.param .b32 _ZN41_INTERNAL_19_gather_bits_cpp1_ii_56538e7c::__shfl(int, int, int)_param_2
)
我意识到c ++ filt没有明确支持CUDA PTX;但请注意,未示出的名称与示例中的解码名称的区别仅在于添加_param_0
,_param_1
等后缀(还有这些名称的前缀应该如何去除的问题,但是让我们看看忘掉那个)。
[-s|--format {none,auto,gnu,lucid,arm,hp,edg,gnu-v3,java,gnat,dlang}]
)?答案 0 :(得分:3)
设备功能的C ++实现遵循Itanium C ++ ABI。
c++filt
实现了对Itanium C ++ ABI符号的解码,因此,它可以从PTX源或ELF对象中解析内核名称和设备函数名称。
但是,您发布的其他符号是CUDA ABI符号。 c++filt
不支持这些,因为它不支持CUDA ABI。它们看起来是否相似是无关紧要的。如果你确实需要这个,那就请求NVIDIA将CUDA ABI符号的解码器添加到工具链中,就像他们使用ELF实用程序和其他内部组件一样。