Эффективность FLOP в CUDA - PullRequest
       21

Эффективность FLOP в CUDA

0 голосов
/ 11 апреля 2019

Согласно определению flop_sp_efficiency

Соотношение достигнутых и максимальных операций с плавающей запятой одинарной точности

Руководство CUDA охватывает FLOPS, здесь .Коэффициент метрической доходности, например, 10%.Это поднимает два вопроса о термине «пик»:

1- Это аппаратное значение?Следовательно, nvprof должен знать, что для того, чтобы рассчитать соотношение и знаменатель должен быть постоянным для всех приложений, запущенных на конкретном устройстве?Согласно инструкции, это No_CUDA_cores * Graphic_clock_freq * 2.Это способ, которым nvprof устанавливает знаменатель?

2 - Означает ли это, что пиковое значение достигается во время выполнения программы на ядро?Предположим, ядро ​​вызывается 10 раз.Один вызов имеет самые высокие значения FLOPS (не имеет отношения к аппаратному значению), например, 2GFLOPS.Затем эффективность вычисляется как sum(FLOPS_i)/10, что дает среднее значение FLOPS из 10 вызовов, а затем это среднее значение делится на 2, и это дает эффективность FLOPS для этого ядра.При таком предположении ядро ​​может достигать 2 GFLOPS, тогда как другое ядро ​​может достигать 4 GFLOPS.Я говорю это, потому что метрика сообщается для каждого ядра в nvprof.

Любой комментарий по этому поводу?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2019

NVPROF (и другие профилировщики CUDA) вычисляют FLOPS путем повторного воспроизведения ядра два раза. За один проход инструмент собирает время и прошедшие SM циклы. Во втором проходе инструмент модифицирует ядро ​​для вычисления общего количества FLOPS.

SMCOUNT = CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT

flops_sp_efficiency = flop_count_sp / (elapsed_cycles_sm * SM_MAX_FLOP_PER_CYCLE)
SM_MAX_FLOP_PER_CYCLE = CUDA_CORES x 2 / SMCOUNT

flops = flop_count_sp / gpu__time_duration x NANOSECONDS_PER_SECOND

gpuclk_hz = elapsed_cycles_sm / SMCOUNT / gpu_time_duration x NANOSECONDS_PER_SECOND

elapsed_cycles_sm - это количество циклов, прошедших в тактовой области SM, суммированных по всем SM. Тактовый домен SM такой же, как у графических часов.

NVPROF не имеет ни события, ни метрики для продолжительности времени. Длительность времени может быть зафиксирована в NVPROF с использованием активности трассировки. В Perfworks метрика gpu__time_duration - это продолжительность ядра в настенных часах.

Nsight VSE CUDA Profiler позволяет разработчику настраивать веса для каждой инструкции или определять совершенно новые эксперименты с использованием регулярных выражений SASS. Смотри https://docs.nvidia.com/nsight-visual-studio-edition/Nsight_Visual_Studio_Edition_User_Guide.htm#Analysis/Report/CudaExperiments/KernelLevel/AchievedFlops.htm

ОТВЕТ 1 - Да, инструменты используют измерения в реальном времени для определения теоретического максимума. Это рассчитывается при воспроизведении ядра.

ОТВЕТ 2 - Метрика собирается для каждого выполнения ядра. NVPROF (но не другие инструменты) объединяет метрики по ядрам с одинаковыми именами функций, используя невзвешенное среднее.

2 голосов
/ 11 апреля 2019
  1. Да, определение "FLOPS" равно числу операций с плавающей запятой в секунду , где операции умножения и сложения можно считать одним или двумя "операциями".nvprof будет просто использовать пиковую частоту провала устройства при расчете эффективности, которую он определяет на основании свойств устройства (т. е. количества ALU) и частоты, о которой сообщает устройство (я не верю, что он измеряет фактическую частоту вв режиме реального времени).

  2. FLOPS уже является усредненным по времени (и будет явно варьироваться в зависимости от выполнения одного ядра), поэтому, когда сообщается для каждого ядра, он также является средним по всемвызовы рассматриваемого ядра.

...