Как я могу получить время выполнения ядра с помощью командной строки NSight Compute 2019?

#cuda #command-line-interface #profiling #nsight-compute

#cuda #интерфейс командной строки #профилирование #nsight-вычислить

Вопрос:

Предположим, у меня есть исполняемый myapp файл, который не нуждается в аргументе командной строки и запускает ядро CUDA mykernel . Я могу вызвать:

 nv-nsight-cu-cli -k mykernel myapp
  

и получить вывод, выглядящий следующим образом:

 ==PROF== Connected to process 30446 (/path/to/myapp)
==PROF== Profiling "mykernel": 0%....50%....100% - 13 passes
==PROF== Disconnected from process 1234
[1234] myapp@127.0.0.1
  mykernel(), 2020-Oct-25 01:23:45, Context 1, Stream 7
    Section: GPU Speed Of Light
    --------------------------------------------------------------------
    Memory Frequency                      cycle/nsecond      1.62
    SOL FB                                %                  1.58
    Elapsed Cycles                        cycle              4,421,067
    SM Frequency                          cycle/nsecond      1.43
    Memory [%]                            %                  61.76
    Duration                              msecond            3.07
    SOL L2                                %                  0.79
    SM Active Cycles                      cycle              4,390,420.69
    (etc. etc.)
    --------------------------------------------------------------------
    (etc. etc. - other sections here)
  

пока — все хорошо. Но теперь мне просто нужна общая продолжительность ядра mykernel — и никакого другого вывода. Глядя на nv-nsight-cu-cli --query-metrics , я вижу, среди прочих:

 gpu__time_duration           incremental duration in nanoseconds; isolated measurement is same as gpu__time_active
gpu__time_active             total duration in nanoseconds 
  

Итак, это должно быть одно из них, верно? Но когда я запускаю

 nv-nsight-cu-cli -k mykernel myapp --metrics gpu__time_duration,gpu__time_active
  

Я получаю:

 ==PROF== Connected to process 30446 (/path/to/myapp)
==PROF== Profiling "mykernel": 0%....50%....100% - 13 passes
==PROF== Disconnected from process 12345
[12345] myapp@127.0.0.1
  mykernel(), 2020-Oct-25 12:34:56, Context 1, Stream 7
    Section: GPU Speed Of Light
    Section: Command line profiler metrics
    ---------------------------------------------------------------
    gpu__time_active                                   (!) n/a
    gpu__time_duration                                 (!) n/a
    ---------------------------------------------------------------
  

Мои вопросы:

  • Почему я получаю значения «n / a»?
  • Как я могу получить фактические значения, которые мне нужны, и ничего больше?

Примечания: :

  • Я использую CUDA 10.2 с NSight Compute версии 2019.5.0 (сборка 27346997).
  • Я понимаю, что могу фильтровать стандартный поток вывода неквалифицированного вызова, но это не то, что мне нужно.
  • На самом деле мне просто нужно исходное число, но я готов согласиться на использование --csv и использование последнего поля.
  • Не удалось найти ничего подходящего в руководстве по переходу nvprof.

Комментарии:

1. @RobertCrovella Я думаю, что это для вас 🙂

2. Подобные показатели обычно имеют квалификатор, определяющий тип арифметики, используемой при измерении. Попробуйте запросить gpu__time_active.max . В более новых версиях nsight compute (например, 2020.2) Также можно запросить базовую метрику gpu__time_active , т.Е. И он выводит все известные ему варианты метрик: .max , .avg , .sum , и т.д. Но я тестировал версию 2019.5.0, и она этого не делает; если вы не укажете полную метрику, она будет напечатана n/a . Я не знаю, как получить фактические значения и ничего больше, если вы не используете какой-либо метод фильтрации, который, как вы заявили, вам не нужен.

3. @RobertCrovella: Как мне перечислить все варианты для произвольной метрики? Или все показатели?

4. один из возможных методов, согласно моему тестированию: переключитесь на более новую версию nsight compute, и, если вы попросите gpu__time_active , он предоставит вам метрику для всех доступных вариантов. Я ответил на ваши вопросы как можно лучше, и теперь вы достигли как минимум 4 в этом вопросе. Я не смогу ответить здесь дальше, это выходит за рамки, ПОЭТОМУ ожидается, что сайт Q A будет работать. что касается ваших последних вопросов, я бы также сослался на это: docs.nvidia.com/cupti/Cupti /…

5. @RobertCrovella: Черт возьми, ни отклонений, ни стандартного отклонения:- (

Ответ №1:

tl; dr: вам нужно указать соответствующий «субметрический»:

 nv-nsight-cu-cli -k mykernel myapp --metrics gpu__time_active.avg
  

(На основе комментариев @RobertCrovella)

Механизм профилирования CUDA собирает «базовые метрики», которые действительно перечислены с. --list-metrics Для каждого из них берется несколько выборок. В версии 2019.5 NSight Compute вы не можете просто получить необработанные выборки; вы можете получить только «субметрические» значения.

«Субметрики» — это, по сути, некоторая агрегация последовательности выборок в скалярное значение. Разные показатели имеют разные виды субметрик (см. Этот список); например gpu__time_active , это: .min , .max , .sum , .avg . Да, если вам интересно — в них отсутствуют показатели второго момента, такие как дисперсия или стандартное отклонение выборки.

Итак, вы должны либо указать одну или несколько подметрик (см. Пример выше), либо, в качестве альтернативы, перейти на более новую версию NSight Compute, с помощью которой вы, по-видимому, можете просто получить все образцы.