根据flop_sp_efficiency
单精度浮点运算达到峰值的比率
CUDA手册涵盖了FLOPS here。公制屈服比,例如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中的每个内核报告的。
对此有何评论?
答案 0 :(得分:3)
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既没有and事件,也没有持续时间的度量。可以使用跟踪活动在NVPROF中捕获持续时间。在Perfworks中,度量gpu__time_duration是内核的挂钟持续时间。
Nsight VSE CUDA Profiler允许开发人员自定义每条指令的权重或使用SASS regex定义全新的实验。参见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 :(得分:2)
是的,“ FLOPS”的定义为the number of floating point operations per second,其中乘法加法运算可以计为一或两个“ ops”。 nvprof只会在效率计算中使用设备的峰值跳变率,它是根据设备的属性(即ALU的数量)和设备报告的频率确定的(我不认为它会测量设备中的实际频率)即时的)。
FLOPS已经是时间平均值(并且在单个内核的执行过程中显然会有所不同),因此,以每个内核为基础进行报告时,它还是所涉及内核的所有调用的平均值