CUDA 中的 FLOP 效率

FLOP efficiency in CUDA

根据flop_sp_efficiency

的定义

Ratio of achieved to peak single-precision floating-point operations

CUDA 手册涵盖了 FLOPS,here。公制收益率,例如10%。这就提出了关于术语 "peak" 的两个问题:

1- 这是硬件特定值吗?因此,nvprof 应该意识到,为了计算比率,分母对于特定设备上的所有应用程序应该保持不变 运行?根据手册,即No_CUDA_cores * Graphic_clock_freq * 2。那是 nvprof 设置分母的方式吗?

2- 这是否意味着在每个内核的程序 运行 时间内达到峰值?假设内核被调用 10 次。一次调用具有最高的 FLOPS(与硬件值无关),例如2GFLOPS。然后效率计算为 sum(FLOPS_i)/10,它给出 10 次调用的平均 FLOPS,然后将这个平均值除以 2,得到该内核的 FLOPS 效率。在这种假设下,一个内核可能达到 2 GFLOPS,而另一个内核可能达到 4 GFLOPS。我这么说是因为指标是在 nvprof 中按内核报告的。

对此有何评论?

  1. 是的,"FLOPS"的定义是the number of floating point operations per second,其中乘加运算可以算作一次或两次"ops"。 nvprof 将根据设备的属性(即 ALU 的数量)和设备报告的频率(我不相信它测量实际频率)在效率计算中简单地使用设备的峰值 Flop-rate即时的)。

  2. FLOPS 已经是时间平均值(并且会随着单个内核的执行而明显不同),因此当以每个内核为基础进行报告时,它也是所有调用的平均值有问题的内核。

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 既没有事件也没有持续时间的度量。可以使用跟踪 activity 在 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(但不是其他工具)使用非加权平均值汇总具有相同函数名称的内核的指标。