我正在尝试使用SIMD(在ARM CPU上)优化代码,并想知道其算术强度(触发器/字节,AI)和FLOPS。
为了计算AI和FLOPS,我必须计算浮点运算(FLOP)的数量。
但是,找不到FLOP的任何精确定义。
当然,mul
,add
,sub
,div
显然是FLOP,但是移动操作,随机操作(例如_mm_shuffle_ps
),设置操作(例如_mm_set1_ps
),转换操作(例如_mm_cvtps_pi32
)等?
它们是处理浮点值的操作。我应该把它们算作FLOP吗?如果没有,为什么?
像Intel VTune和Nvidia的nvprof
或PMU这样的分析器通常会进行哪些操作?
编辑:
What all operations does FLOPS include?
这个问题主要是关于数学上复杂的运算。
我还想知道处理以浮点值或向量作为输入的“非数学”运算的标准方法。
答案 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是
float
个元素)对于整个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可以作为两个费力的代码的比较指标,但是对于您的代码本身并没有说太多。