浮点运算(FLOPs)的定义是什么

时间:2018-09-10 12:59:27

标签: performance benchmarking simd hpc flops

我正在尝试使用SIMD(在ARM CPU上)优化代码,并想知道其算术强度(触发器/字节,AI)和FLOPS。

为了计算AI和FLOPS,我必须计算浮点运算(FLOP)的数量。 但是,找不到FLOP的任何精确定义。
当然,muladdsubdiv显然是FLOP,但是移动操作,随机操作(例如_mm_shuffle_ps),设置操作(例如_mm_set1_ps),转换操作(例如_mm_cvtps_pi32)等?
它们是处理浮点值的操作。我应该把它们算作FLOP吗?如果没有,为什么?
像Intel VTune和Nvidia的nvprof或PMU这样的分析器通常会进行哪些操作?

编辑:
What all operations does FLOPS include?
这个问题主要是关于数学上复杂的运算。
我还想知道处理以浮点值或向量作为输入的“非数学”运算的标准方法。

2 个答案:

答案 0 :(得分:2)

在FP值上混洗/混合不视为FLOP。它们只是在不完全“垂直”问题上使用SIMD的开销,或者在混合时无分支地进行分支的问题。

FP AND / OR / XOR都不一样。您可以尝试使用andps_mm_and_ps)来证明对FP绝对值的计数是合理的,但通常不对其进行计数。 FP abs不需要查看指数/有效位数或对结果进行规范化,也不需要任何使FP执行单元变得昂贵的事情。绝对(AND)/符号翻转(XOR)或设为负数(OR)都是琐碎的按位操作,而且不需要


FMA通常被视为两个浮点运算(mul和add),即使它是一条与SIMD FP add或mul具有相同(或相似)性能的指令。原始FLOP/s的瓶颈最重要的问题是matmul,它确实需要mul和add的均等混合,并且可以完美地利用FMA。

因此Haswell核心的FLOP是

  • 其SIMD向量宽度(每个向量8 float个元素)
  • 每个时钟两次SIMD FMA(2)
  • 每个FMA(2)的FLOP次数
  • 时钟速度(在使两个FMA单元最大化时,它可以维持的最大单核睿频;长期取决于冷却,短期仅取决于功率限制)。

对于整个CPU,不仅是单个内核:乘以内核数量,并在所有内核繁忙时使用最大持续时钟速度,通常比完全具有Turbo的CPU的单核Turbo速度低。)

英特尔和其他CPU供应商没有想到这样一个事实,即他们的CPU还可在每个时钟周期内同时维持2条vandps指令的同时并行运行vfma132ps,因为FP abs操作并不困难。

另请参见How do I achieve the theoretical maximum of 4 FLOPs per cycle?。 (实际上在现代CPU上是4个以上:P)


如果您有大量其他开销占用前端带宽或造成其他瓶颈,则无法实现峰值FLOPS(每秒FP ops或FLOP / s)。指标只是您直线运行时可以完成的数学操作的原始数量,而不是针对任何特定的实际问题。

尽管人们会认为,如果理论上的峰值触发器比经过精心手工调整的matmul或Mandelbrot所能达到的结果高得多,即使对于编译时间恒定的问题大小,这也是愚蠢的。例如如果前端跟不上商店以及FMA。例如如果Haswell有四个FMA执行单元,那么如果实际上每个指令都是FMA,则它只能维持最大FLOP。内存源操作数可以微熔接负载,但是在不损害吞吐量的情况下没有存储空间。

Intel甚至没有3个FMA单元的原因是,大多数实际代码很难使2个FMA单元饱和,特别是只有2个装载端口和1个存储端口时。它们几乎总是被浪费掉,而256位FMA单元需要很多晶体管。

答案 1 :(得分:0)

在优化方面,通常的做法是仅在代码的热点上测量FLOP,例如卷积中的浮点乘法和累加操作数。这主要是因为其他操作可能微不足道或无法替代,因此无法用于任何优化。

例如,ARMv7 Reference Manual中A4.13中矢量浮点指令下的所有指令都属于浮点运算,因为FPU指令的FLOP /周期通常在处理器中是恒定的。

不仅ARM,而且许多微处理器都有专用的浮点单元,因此,在测量FLOP时,就是在测量该单元的速度。借助此操作和FLOP /周期,您可以或多或少地计算理论峰值性能。

但是,由于FLOP不能考虑处理器在其下运行的其他条件,因此只能用于近似估计代码的速度,因此应加一小撮盐。这就是为什么在大多数情况下,只为您的热点(通常为算术运算)计数FLOP足够了。

话虽如此,但FLOP可以作为两个费力的代码的比较指标,但是对于您的代码本身并没有说太多。