Как рассчитать Gflops ядра - PullRequest
       34

Как рассчитать Gflops ядра

13 голосов
/ 24 октября 2011

Я хочу измерить, насколько пиковая производительность моего архива ядра.

Допустим, у меня есть NVIDIA Tesla C1060, у которого пик GFLOPS составляет 622,08 (~ = 240Core * 1300MHz * 2). Теперь в моем ядре я посчитал для каждого потока 16000 флопов (4000 x (2 вычитания, 1 умножение и 1 sqrt)). Поэтому, когда у меня есть 1 000 000 потоков, я получу 16GFLOP. А поскольку ядро ​​занимает 0,1 секунды, я бы заархивировал 160GFLOPS, что составляет четверть пиковой производительности. Теперь мои вопросы:

  • Является ли этот подход правильным?
  • А как насчет сравнений (if(a>b) then....)? Должен ли я их учитывать?
  • Можно ли использовать профилировщик CUDA для более простых и точных результатов? Я попробовал счетчик instructions, но не мог понять, что означает цифра.

сестра вопрос: Как рассчитать достигнутую пропускную способность ядра CUDA

Ответы [ 2 ]

21 голосов
/ 25 октября 2011

Первые общие замечания:

В общем, то, что вы делаете, - это в основном бесполезное упражнение, и оно противоположно тому, как большинство людей, вероятно, будут проводить анализ производительности.

Первое, что нужно отметить, это то, что пиковое значение, которое вы цитируете, предназначено исключительно для инструкций умножения-сложения с плавающей запятой (FMAD), которые считаются двумя FLOPS и могут быть удалены с максимальной скоростью, равной одному за цикл. Другие операции с плавающей запятой, которые удаляются с максимальной скоростью, равной одному за цикл, формально будут классифицироваться только как один FLOP, в то время как другие могут потребовать вывода многих циклов. Поэтому, если вы решили сравнить производительность ядра с этим пиком, вы действительно сравниваете производительность своего кода с потоком чистых инструкций FMAD, и не более того.

Второй момент заключается в том, что когда исследователи цитируют значения FLOP / s из фрагмента кода, они обычно используют модель подсчет FLOP для операции, а не пытаются подсчитать инструкции. Матричное умножение и эталонные показатели Linpack LU являются классическими примерами такого подхода к сравнительному анализу производительности. Нижняя граница количества операций этих вычислений точно известна, поэтому вычисленная пропускная способность - это просто нижняя граница, деленная на время. Фактическое количество команд не имеет значения. Программисты часто используют всевозможные методы, в том числе случайные вычисления, умозрительные или прогнозные вычисления и множество других идей для ускорения работы кода. Фактический счетчик FLOP такого кода не имеет значения, ссылка всегда равна счетчику FLOP модели.

Наконец, если посмотреть на количественную оценку производительности, обычно есть только две точки сравнения, представляющие реальный интерес

  • Версия А кода работает быстрее, чем версия B на том же оборудовании?
  • Работает ли аппарат A лучше, чем аппарат B, выполняющий интересующую задачу?

В первом случае вам действительно нужно только измерить время выполнения. Во втором подходящей мерой обычно является не FLOP / с, это полезные операции в единицу времени (количество записей в секунду при сортировке, количество ячеек в секунду при механическом моделировании жидкости и т. Д.). Иногда, как упомянуто выше, полезными операциями могут быть модель FLOP-счет операции известной теоретической сложности. Но фактическое число команд с плавающей запятой редко, если вообще когда-либо, входит в анализ.

Если вы действительно заинтересованы в оптимизации и понимании производительности вашего кода, то, возможно, эта презентация Паулюса Микикявичюса из NVIDIA могла бы заинтересовать.

Обращение к пунктам маркированного списка:

Правильный ли этот подход?

Строго говоря, нет. Если вы подсчитываете операции с плавающей запятой, вам нужно знать точное число FLOP из кода, который выполняет GPU. Операция sqrt может потреблять намного больше, чем один FLOP, в зависимости от ее реализации и характеристик числа, на котором она работает, например. Компилятор также может выполнить много оптимизаций, которые могут изменить фактическое количество операций / команд. Единственный способ получить действительно точный счетчик - это дизассемблировать скомпилированный код и подсчитывать отдельные операнды с плавающей запятой, возможно, даже требующие предположений о характеристиках значений, которые будет вычислять код.

А как насчет сравнений (если (a> b) тогда ....)? Должен ли я их также учитывать?

Они не являются операциями умножения и сложения с плавающей запятой, поэтому нет.

Можно ли использовать профилировщик CUDA для более простых и точных результатов? Я попробовал счетчик инструкций, но не мог понять, что означает цифра.

Не совсем. Профилировщик не может различить вторжение с плавающей запятой и любые другие типы команд, поэтому (по состоянию на 2011 год) подсчет FLOP из фрагмента кода через профилировщик невозможен. [РЕДАКТИРОВАТЬ: см. Превосходный ответ Грега ниже для обсуждения средств подсчета FLOP, доступных в версиях инструментов профилирования, выпущенных с момента написания этого ответа]

10 голосов
/ 24 июля 2014

Nsight VSE (> 3.2) и Visual Profiler (> = 5.5) поддерживают вычисление достигнутых FLOP. Чтобы собрать метрику, профилировщики запускают ядро ​​дважды (используя воспроизведение ядра). В первом воспроизведении собирается количество выполненных команд с плавающей запятой (с пониманием предикации и активной маски). во втором повторе собрана длительность.

nvprof и Visual Profiler имеют жесткое определение. FMA считается за 2 операции. Все остальные операции - 1 операция. Счетчики flops_sp_ * являются счетчиками выполнения инструкций потока, тогда как flops_sp является взвешенной суммой, поэтому некоторые взвешивания могут применяться с использованием отдельных метрик. Однако flops_sp_special содержит несколько различных инструкций.

Конфигурация эксперимента Nsight VSE позволяет пользователю определять операции для каждого типа инструкций.

Nsight Visual Studio Edition

Настройка сбора Достигнутых ШАГОВ

  1. Выполните команду меню Nsight> Запустить анализ производительности ... , чтобы открыть редактор действий
  2. Набор Вид деятельности - Профиль CUDA Application
  3. В настройках эксперимента установите Эксперименты для запуска в Пользовательские
  4. В Список экспериментов добавить Достигнутые FLOPS
  5. В средней панели выберите Выполнено FLOPS
  6. В правой панели вы можете настроить FLOPS для каждой выполненной инструкции. Взвешивание по умолчанию для FMA и RSQ, чтобы считать как 2. В некоторых случаях я видел RSQ до 5.
  7. Запустить сеанс анализа.

Nsight VSE Achieved FLOPS Experiment Configuration

Просмотр достигнутых FLOPS

  1. В отчете nvreport откройте страницу отчета CUDA .
  2. На странице CUDA Launch выберите ядро.
  3. В области корреляции отчета (внизу слева) выберите Выполнено FLOPS

Nsight VSE Achieved FLOPS Results

nvprof

Метрики доступны (на K20)

nvprof --query-metrics | grep flop
flops_sp:            Number of single-precision floating-point operations executed by non-predicated threads (add, multiply, multiply-accumulate and special)
flops_sp_add:        Number of single-precision floating-point add operations executed by non-predicated threads
flops_sp_mul:        Number of single-precision floating-point multiply operations executed by non-predicated threads
flops_sp_fma:        Number of single-precision floating-point multiply-accumulate operations executed by non-predicated threads
flops_dp:            Number of double-precision floating-point operations executed non-predicated threads (add, multiply, multiply-accumulate and special)
flops_dp_add:        Number of double-precision floating-point add operations executed by non-predicated threads
flops_dp_mul:        Number of double-precision floating-point multiply operations executed by non-predicated threads
flops_dp_fma:        Number of double-precision floating-point multiply-accumulate operations executed by non-predicated threads
flops_sp_special:    Number of single-precision floating-point special operations executed by non-predicated threads
flop_sp_efficiency:  Ratio of achieved to peak single-precision floating-point operations
flop_dp_efficiency:  Ratio of achieved to peak double-precision floating-point operations

Коллекция и результаты

nvprof --devices 0 --metrics flops_sp --metrics flops_sp_add --metrics flops_sp_mul --metrics flops_sp_fma matrixMul.exe
[Matrix Multiply Using CUDA] - Starting...
==2452== NVPROF is profiling process 2452, command: matrixMul.exe
GPU Device 0: "Tesla K20c" with compute capability 3.5

MatrixA(320,320), MatrixB(640,320)
Computing result using CUDA Kernel...
done
Performance= 6.18 GFlop/s, Time= 21.196 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block
Checking computed result for correctness: OK

Note: For peak performance, please refer to the matrixMulCUBLAS example.
==2452== Profiling application: matrixMul.exe
==2452== Profiling result:
==2452== Metric result:
Invocations                               Metric Name                        Metric Description         Min         Max         Avg
Device "Tesla K20c (0)"
        Kernel: void matrixMulCUDA<int=32>(float*, float*, float*, int, int)
        301                                  flops_sp                             FLOPS(Single)   131072000   131072000   131072000
        301                              flops_sp_add                         FLOPS(Single Add)           0           0           0
        301                              flops_sp_mul                         FLOPS(Single Mul)           0           0           0
        301                              flops_sp_fma                         FLOPS(Single FMA)    65536000    65536000    65536000

ПРИМЕЧАНИЕ. Flops_sp = flops_sp_add + flops_sp_mul + flops_sp_special + (2 * flops_sp_fma) (приблизительно)

Визуальный Профилировщик

Visual Profiler поддерживает показатели, показанные в разделе nvprof выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...