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 中按内核报告的。
对此有何评论?
是的,"FLOPS"的定义是the number of floating point operations per second,其中乘加运算可以算作一次或两次"ops"。 nvprof 将根据设备的属性(即 ALU 的数量)和设备报告的频率(我不相信它测量实际频率)在效率计算中简单地使用设备的峰值 Flop-rate即时的)。
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(但不是其他工具)使用非加权平均值汇总具有相同函数名称的内核的指标。
根据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 中按内核报告的。
对此有何评论?
是的,"FLOPS"的定义是the number of floating point operations per second,其中乘加运算可以算作一次或两次"ops"。 nvprof 将根据设备的属性(即 ALU 的数量)和设备报告的频率(我不相信它测量实际频率)在效率计算中简单地使用设备的峰值 Flop-rate即时的)。
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(但不是其他工具)使用非加权平均值汇总具有相同函数名称的内核的指标。