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

Performance 浮点运算(FLOPs)的定义是什么,performance,benchmarking,simd,hpc,flops,Performance,Benchmarking,Simd,Hpc,Flops,我试图用SIMD(在ARM CPU上)优化我的代码,并想知道它的算术强度(flops/byte,AI)和flops 为了计算AI和FLOPS,我必须计算浮点运算(FLOPS)的数量。 然而,我找不到任何关于失败的精确定义。 当然,mul、add、sub、div显然是失败的,但是移动操作、随机操作(例如\um\u shuffle\u ps)、设置操作(例如\u mm\u set1\u ps)、转换操作(例如\u mm\u cvtps\u pi32)等呢? 它们是处理浮点值的操作。我应该把它们算作失

我试图用SIMD(在ARM CPU上)优化我的代码,并想知道它的算术强度(flops/byte,AI)和flops

为了计算AI和FLOPS,我必须计算浮点运算(FLOPS)的数量。 然而,我找不到任何关于失败的精确定义。

当然,
mul
add
sub
div
显然是失败的,但是移动操作、随机操作(例如
\um\u shuffle\u ps
)、设置操作(例如
\u mm\u set1\u ps
)、转换操作(例如
\u mm\u cvtps\u pi32
)等呢?
它们是处理浮点值的操作。我应该把它们算作失败吗?如果没有,原因是什么?
英特尔VTune和Nvidia的
nvprof
或PMU等探查器通常计算哪些操作

编辑:

这个问题主要是关于数学上复杂的运算。

我还想知道处理以浮点值或向量作为输入的“非数学”运算的标准方法。

浮点值上的洗牌/混合不被视为触发器。它们只是在不单纯的“垂直”问题上使用SIMD的开销,或者在混合中无分支地进行分支的问题上使用SIMD的开销

FP和/或/XOR都不是。您可以尝试使用
和ps
\u mm\u和\u ps
)来证明计算FP绝对值的合理性,但通常不计算FP绝对值。FP abs不需要查看指数/有效位,也不需要规范化结果,也不需要任何使FP执行单元变得昂贵的事情。abs(AND)/符号翻转(XOR)或make-negative(or)是简单的按位运算


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

所以Haswell核的FLOP/s是

  • 其SIMD向量宽度(每个向量8个
    float
    元素)
  • 每个时钟的SIMD FMA次数(2)
  • 每个FMA的次触发器(2)
  • 倍时钟速度(在最大化两个FMA单元的同时,可维持的最大单芯涡轮;长期取决于冷却,短期取决于功率限制)
对于整个CPU,而不仅仅是单核:乘以核数,在所有核都忙的情况下使用最大持续时钟速度,通常低于有turbo的CPU上的单核turbo。)

英特尔和其他CPU供应商不考虑这样一个事实,即他们的CPU还可以支持一个
vandps
,每个时钟并行2条
vfma132ps
指令,因为FP abs不是一个困难的操作

另见。(在现代CPU上,它实际上超过了4个:P)


如果您有许多其他开销占用前端带宽或造成其他瓶颈,则无法实现峰值浮点运算(每秒浮点运算,或浮点/秒)。这个指标只是你在直线上运行时所能做的原始数学量,而不是任何具体的实际问题

尽管人们会认为,如果理论上的峰值失败率远远高于手工调优的matmul或Mandelbrot所能达到的水平,即使对于编译时常量问题大小,这也是愚蠢的。e、 g.如果前端不能跟上任何商店以及FMA的步伐。e、 如果Haswell有四个FMA执行单元,那么它只能在每个指令都是FMA的情况下维持最大的FLOPs。内存源操作数可以对负载进行微融合,但在不影响吞吐量的情况下,将没有存储空间

英特尔甚至没有3个FMA单元的原因是,大多数实际代码难以饱和2个FMA单元,尤其是只有2个加载端口和1个存储端口。它们几乎浪费了所有的时间,256位FMA单元需要很多晶体管


(Ice Lake将管道的发布/重命名阶段扩展至5 uops/时钟,但也将SIMD执行单元扩展至512位,使用AVX-512,而不是添加第三个256位FMA单元。它具有2/时钟负载和2/时钟存储,尽管对于32字节或更窄的存储,该存储吞吐量仅适用于L1d缓存,而不是64字节。)

当谈到优化时,通常只测量代码热点上的触发器,例如,卷积中浮点乘法和累加运算的数量。这主要是因为其他操作可能无关紧要或不可替代,因此无法用于任何类型的优化

例如,A4.13中矢量浮点指令下的所有指令都属于浮点操作,作为FPU指令的触发器/周期,在处理器中通常是常量

不仅是ARM,而且许多微处理器都有一个专用的浮点单元,所以当你测量触发器时,你就是在测量这个单元的速度。通过这个和触发器/周期,您可以或多或少地计算理论峰值性能

但是,浮点运算是要谨慎对待的,因为它们只能用于大致估计代码的速度,因为它们没有考虑处理器运行时的其他条件。这就是为什么在大多数情况下,只计算热点(通常是算术运算)的失败次数就足够了


话虽如此,触发器可以作为两段复杂代码的比较指标,但并不能说明代码本身。

mul
add
sub
div
不是浮点操作。它们对整数进行运算。触发器以
ps
sd
等结尾。可能重复我应该说的
*,+,-,/
,我问的是关于触发器的更一般的问题。你问的是非浮点机器