#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, с помощью которой вы, по-видимому, можете просто получить все образцы.