Как указано в статистике ветвления руководство, существует две метрики: эффективность ветвления и эффективность потока управления.
У первого есть аппаратный счетчик branch_efficiency. Однако, похоже, что прямого аппаратного противодействия последнему нет. Можно ли найти соотношение выполненных и выданных инструкций потока управления и использовать его в качестве второго показателя эффективности? Или показатель использования потока управления cf_fu_utilization?
Поскольку эффективность потока управления можно интерпретировать как количество потоков, активных для одной инструкции в варпе, я предполагаю, что warp_execution_efficiency также можно использовать, поскольку определение гласит:
Ratio of the average active threads per warp to the maximum number of threads per warp supported on a multiprocessor
Любой комментарий по этому поводу?





И эффективность ветвления, и эффективность потока управления являются метриками. Эффективность филиала может быть собрана в одном psd и показана в соответствии со значениями SM. Эффективность потока управления составляет smsp__thread_inst_executed / smsp__inst_executed / WARP_SIZE * 100.0. Эти счетчики не могут быть собраны со всех SM за один проход на всем оборудовании, поэтому метрика отображается на диаграмме как среднее значение по всем SM.
При использовании CUPTI/NVPROF аппаратные события:
Эти события можно использовать для расчета либо medium_threads_executed_per_inst_executed, либо medium_threads_executed_not_predicated_off_per_inst_executed. Это можно преобразовать в % на / 32 x 100,0.
Компилятор будет использовать предикацию вместо перехода, если тело условного оператора небольшое (несколько инструкций).
Правильный. Если вы запустите нечетное количество потоков на блок, вы увидите, что значение уменьшается, даже если у вас нет потока управления в ядре. Я обновил ответ аппаратными счетчиками и формулами для nvprof/CUPTI.
Что касается inst_executed, nvprof сообщает число, например. 100 для ядра, которое вызывается 50 раз. Итак, я предполагаю, что это общее количество удаленных инструкций 50 раз из всех потоков. Разве это не так? В противном случае я должен знать, каково количество деформаций в вызовах.
Я не вижу никакой метрики для второй и третьей пули. Я имею в виду здесь docs.nvidia.com/cuda/profiler-users-guide/…
В документе перечислены показатели. Он не перечисляет события. Запустите nvprof --query-events, чтобы получить список всех событий. Событие inst_executed возвращает сумму всех инструкций, выполненных (отложенных) на всех SM за 1 запуск сетки. Если вы хотите, чтобы инструкции выполнялись за варп, используйте формулу inst_executed / warps_launched. Пользовательский интерфейс напечатает название события, а затем мин., макс., среднее, общее. Они рассчитываются для всех запусков одного и того же ядра и находятся на уровне сетки/графического процессора для минимального/максимального/среднего значения, а общее количество представляет собой сумму всех запусков.
Об эффективности филиала сообщает nvprof. Таким образом, 100% для ядра, которое вызывается 10 раз, означает, что для всех 10 вызовов было активным 32 потока без расходящихся ветвей. Что такое аппаратная метрика для
smsp__thread_inst_executed?