1

根据定义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 中按内核报告的。

对此有何评论?

4

2 回答 2

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

于 2019-04-13T02:13:58.763 回答
2
  1. 是的,“FLOPS”的定义是每秒浮点运算的数量,其中乘加运算可以算作一个或两个“ops”。nvprof 将在效率计算中简单地使用设备的峰值 Flop-rate,它根据设备的属性(即 ALU 的数量)和设备报告的频率(我不相信它测量实际频率即时的)。

  2. FLOPS 已经是时间平均值(并且显然会随着单个内核的执行而变化),因此当基于每个内核报告时,它也是相关内核的所有调用的平均值。

于 2019-04-11T18:32:35.360 回答