1

我正在通过 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后缀(还有一个问题是应该如何分解这些名称的前缀,但让我们忘记这一点)。

  • 我可以做些什么来强制 c++filt 也适用于参数名称/标签吗?更一般地说,对于 PTX 文件中所有损坏的 C++ 名称?
  • 除了它已经具有的“格式”([-s|--format {none,auto,gnu,lucid,arm,hp,edg,gnu-v3,java,gnat,dlang}])之外,是否有可能/容易通过对 CUDA“格式”的认识来增强 c++filt?
  • 如果 c++filt 在这种情况下不能使用或不能适应使用,我应该如何进行解构?
4

1 回答 1

3

文档中引用

设备功能的 C++ 实现遵循 Itanium C++ ABI。

c++filt实现了 Itanium C++ ABI 符号的解组,因此,它可以从 PTX 源或 ELF 对象中解组内核名称和设备函数名称。

但是,您发布的其他符号是 CUDA ABI 符号。c++filt不支持这些,因为它不支持 CUDA ABI。它们是否看起来相似是无关紧要的。如果你真的需要这个,请请求 NVIDIA 为工具链添加一个 CUDA ABI 符号的解译器,就像他们对 ELF 实用程序和其他内部组件所做的那样。

于 2016-08-31T14:59:08.220 回答