#optimization #cuda #nsight-compute
#оптимизация #cuda #nsight-вычислять
Вопрос:
Два вопроса:
-
Согласно Nsight Compute, мое ядро привязано к вычислениям. Минимальный процент использования по отношению к пиковой производительности составляет 74%, а использование памяти — 47%. Однако, когда я смотрю на процент использования каждого конвейера, загрузка LSU намного выше, чем у других (75% против 10-15%). Не будет ли это признаком того, что мое ядро ограничено памятью? Если использование вычислительных ресурсов и памяти не соответствует использованию конвейера, я не знаю, как интерпретировать эти термины.
-
Планировщики выдают только каждые 4 цикла, не означает ли это, что мое ядро ограничено задержкой? Люди обычно определяют это с точки зрения использования вычислительных ресурсов и памяти. Какова взаимосвязь между обоими?
Ответ №1:
В Nsight вычисления на графических процессорах CC7.5
SM% определяется sm__пропускной способностью, а% памяти определяется gpu__compute_memory_throughtput
sm_throughput — это максимальное значение из следующих показателей:
- sm__инструкция_пропускная способность
- sm__inst_выполнено
- sm__проблема_активна
- sm__mio_inst_выдано
- sm__pipe_alu_cycles_активный
- sm__inst_executed_pipe_cbu_pred_на_любом
- sm__pipe_fp64_циклы_активны
- sm__pipe_тензорный_цикл_активный
- sm__inst_executed_pipe_xu
- sm__pipe_fma_циклы_активны
- sm__inst_executed_pipe_fp16
- sm__pipe_shared_cycles_активный
- sm__inst_выполняется_по каналу_единообразно
- sm__инструкция_пропускная способность_внутренняя_активность
- sm__память_пропускная способность
- idc__request_cycles_активен
- sm__inst_executed_pipe_adu
- sm__inst_executed_pipe_ipa
- sm__inst_executed_pipe_lsu
- sm__inst_executed_pipe_tex
- sm__mio_pq_read_cycles_активный
- sm__mio_pq_запись_циклы_активны
- sm__mio2rf_обратная запись_активна
- sm__память_пропускная способность_внутренняя_активность
пропускная способность gpu__compute_memory_ является максимальной из следующих показателей:
- графический процессор__вычисляет_память_доступ_пропускная способность
- l1tex__data_bank_считывает
- l1tex__data_bank_записывает
- l1tex__data_pipe_lsu_волновые фронты
- l1tex__data_pipe_tex_волновые фронты
- l1tex__f_волновые фронты
- lts__d_атомарный_ввод_циклов_активен
- lts__d_сектора
- lts__t_секторов
- запросы lts__t_tag_
- графический процессор__вычисляет_доступкпамяти_пропускнаяспособность_внутренняя_активность
- графический процессор__вычисляет_память_доступ_пропускная способность
- запросы l1tex__lsuin_
- l1tex__texin_sm2tex_req_cycles_активный
- l1tex__lsu_обратная запись_активна
- l1tex__tex_обратная запись_активна
- l1tex__m_l1tex2xbar_req_cycles_активный
- l1tex__m_xbar2l1tex_read_сектора
- lts__lts2xbar_циклы_активны
- lts__xbar2lts_циклы_активны
- lts__d_сектора_заполняют_устройство
- lts__d_sectors_fill_sysmem
- пропускная способность gpu__dram_
- графический процессор__вычисляет_память_запрос_пропускнуюспособность_внутреннюю_активность
В вашем случае ограничителем является sm__inst_executed_pipe_lsu, который представляет собой пропускную способность команды. Если вы просмотрите sections/SpeedOfLight.py ограничение задержки определяется как при __ пропускной способности sm__ и__вычислительной_памяти_ gpu__через пропускную способность < 60%.
Некоторые наборы конвейеров команд имеют меньшую пропускную способность, такие как fp64, xu и lsu (зависит от чипа). Использование конвейера является частью пропускной способности sm__. Для повышения производительности возможны следующие варианты:
- Сократить инструкции до конвейера с избыточной подпиской или
- Выдавать инструкции другого типа для использования пустых циклов выдачи.
ГЕНЕРАЦИЯ РАЗБИВКИ
Начиная с Nsight Compute 2020.1, не существует простой командной строки для генерации списка без запуска сеанса профилирования. На данный момент вы можете собрать один показатель пропускной способности с помощью breakdown:<throughput metric>avg.pct_of_peak_sustained.elapsed
и проанализировать выходные данные, чтобы получить имена подметрик.
Например:
ncu.exe --csv --metrics breakdown:sm__throughput.avg.pct_of_peak_sustained_elapsed --details-all -c 1 cuda_application.exe
генерирует:
"ID","Process ID","Process Name","Host Name","Kernel Name","Kernel Time","Context","Stream","Section Name","Metric Name","Metric Unit","Metric Value"
"0","33396","cuda_application.exe","127.0.0.1","kernel()","2020-Aug-20 13:26:26","1","7","Command line profiler metrics","gpu__dram_throughput.avg.pct_of_peak_sustained_elapsed","%","0.38"
"0","33396","cuda_application.exe","127.0.0.1","kernel()","2020-Aug-20 13:26:26","1","7","Command line profiler metrics","l1tex__data_bank_reads.avg.pct_of_peak_sustained_elapsed","%","0.05"
"0","33396","cuda_application.exe","127.0.0.1","kernel()","2020-Aug-20 13:26:26","1","7","Command line profiler metrics","l1tex__data_bank_writes.avg.pct_of_peak_sustained_elapsed","%","0.05"
...
Ключевое слово breakdown
может использоваться в файлах раздела Nsight Compute для расширения показателя пропускной способности. Это используется в SpeedOfLight.section.
Комментарии:
1. Мне трудно найти определения, которые вы дали для sm_throughput и gpu__compute_memory_throughput в документации Nsight. Есть ли ресурс, где это определено?
2. Я обновил ответ, чтобы показать, как генерировать разбивку с помощью командной строки, и попросил команду Nsight Compute добавить автономную командную строку для генерации информации.