Performance 浮点运算(FLOPs)的定义是什么
我试图用SIMD(在ARM CPU上)优化我的代码,并想知道它的算术强度(flops/byte,AI)和flops 为了计算AI和FLOPS,我必须计算浮点运算(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)等呢? 它们是处理浮点值的操作。我应该把它们算作失
当然,
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单元的同时,可维持的最大单芯涡轮;长期取决于冷却,短期取决于功率限制)
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
等结尾。可能重复我应该说的*,+,-,/
,我问的是关于触发器的更一般的问题。你问的是非浮点机器