CUDA 中的 FLOP 效率



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

对此有何评论?

NVPROF(和其他CUDA分析器)通过重播内核两次来计算FLOPS。该工具一次性收集时间和 SM 经过的周期。在第二遍中,该工具修改内核以计算 FLOPS 的总数。

短信计数 = 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 翻牌 = 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

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

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

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

相关内容

  • 没有找到相关文章

最新更新