c++filt недостаточно агрессивен для некоторых искаженных имен в файлах PTX.

Я фильтрую свой скомпилированный PTX через c++filt, но он только меняет некоторые имена/метки, а некоторые оставляет как есть. Например, это:

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 также применялся к именам/меткам параметров? И вообще, ко всем искаженным именам C++ в файле PTX?
  • Возможно ли/легко дополнить c++filt информацией о «формате» CUDA в дополнение к уже имеющимся «форматам» ([-s|--format {none,auto,gnu,lucid,arm,hp,edg,gnu-v3,java,gnat,dlang}])?
  • Если c++filt нельзя использовать или адаптировать для использования в этом случае, как мне выполнить разборку?

person einpoklum    schedule 31.08.2016    source источник
comment
Они не разделены, потому что они не являются допустимыми именами в стиле gnu C++.   -  person talonmies    schedule 31.08.2016
comment
@talonmies: Действительно... см. правку.   -  person einpoklum    schedule 31.08.2016
comment
Итак, ваш вопрос: действительно ли c++filt поддерживает CUDA ABI?, и ответ явно нет, судя по всему.   -  person talonmies    schedule 31.08.2016
comment
@talonmies: Мой вопрос в том, могу ли я получить больше, чем по умолчанию, например. с его параметрами командной строки или даже путем определения для него дополнительного формата. И если ответ не очень без переписывания, то - какие у меня другие варианты.   -  person einpoklum    schedule 31.08.2016
comment
Я считаю, что ответ, предоставленный @talonmies, хороший, и я проголосовал за него. Некоторые инструменты CUDA имеют встроенную возможность разборки. Я не знаю конкретно для этого случая, поможет ли это для этих символов, и, к сожалению, этот вопрос не дает мне удобного тестового примера. Однако на простом тестовом примере, возможно, стоит посмотреть, какой вывод может быть доступен из некоторых бинарных утилит CUDA. Возможно, конечно, что они не помогут, поэтому в этом случае я бы вернулся к ответу, уже данному ниже.   -  person Robert Crovella    schedule 31.08.2016
comment
минимальный воспроизводимый пример часто полезен в вопросе SO. Да, многие такие вопросы можно преобразовать в гипотетические, что, по-видимому, устраняет необходимость в MCVE, но при этом вы затрудняете работу над вопросом для других, которые могут попытаться вам помочь. Да, если я знаю ответ на ваш точный вопрос, мне не нужен MCVE, и если вам нужна помощь только от таких людей, достаточно справедливо. Я не знаю ответа на каждый вопрос, но я часто готов работать над хорошо задокументированными вопросами, которые позволяют мне делать это без необходимости создавать собственный тестовый пример и задаваться вопросом, отражает ли он ваш.   -  person Robert Crovella    schedule 31.08.2016
comment
@RobertCrovella: см. редактирование.   -  person einpoklum    schedule 31.08.2016


Ответы (1)


Цитата из документации

Реализация C++ для функций устройства соответствует Itanium C++ ABI.

c++filt реализует разбор символов Itanium C++ ABI, поэтому он может разделять имена ядра и имена функций устройства из исходного кода PTX или объектов ELF.

Однако другие символы, которые вы разместили, являются символами CUDA ABI. c++filt не поддерживает их, потому что не поддерживает CUDA ABI. Могут ли они быть похожими или нет, не имеет значения. Если вам это действительно нужно, попросите NVIDIA добавить в цепочку инструментов деманглер для символов CUDA ABI, как они сделали с утилитами ELF и другими внутренними компонентами.

person Community    schedule 31.08.2016