CUDA 中的 FLOP 效率

mah*_*ood 1 cuda nvprof

根据定义 flop_sp_efficiency

单精度浮点运算达到峰值的比率

CUDA 手册涵盖了 FLOPS,请点击此处。公制收益率,例如 10%。这引发了关于“峰值”一词的两个问题:

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 中的每个内核都报告了该指标。

对此有何评论?

Gre*_*ith 5

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(但不是其他工具)使用非加权平均值在具有相同函数名称的内核上汇总指标。