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

问题描述 投票:0回答:2

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

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

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

performance benchmarking simd hpc flops
2个回答
2
投票

FP值上的随机/混合不被视为FLOP。它们只是在使用SIMD而不是纯粹的“垂直”问题,或者使用混合物无分支地执行分支问题。

FP和/或/ XOR都不是。您可以尝试使用andps_mm_and_ps)来计算FP绝对值,但通常不会计算。 FP abs不需要查看指数/有效数,或规范化结果,或任何使FP执行单元昂贵的事情。 abs(AND)/ sign-flip(XOR)或make negative(OR)是平凡的按位操作,也不需要


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

所以Haswell核心的FLOP / s是

  • 它的SIMD矢量宽度(每个矢量8个float元素)
  • 时代信德法马拉时钟(2)
  • 每FMA次FLOP(2)
  • 倍时钟速度(最大单核涡轮增压,它可以维持最大化两个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操作或FLOP / s)。度量标准只是在直线运行时可以执行的原始数学量,而不是任何特定的实际问题。

虽然人们会认为理论上的峰值失误远远高于精心手工调整的matmul或Mandelbrot所能实现的,即使对于编译时常数问题大小也是如此。例如如果前端无法跟上任何商店以及FMA。例如如果Haswell有四个FMA执行单元,那么只要每个指令都是FMA,它就只能维持最大FLOP。内存源操作数可以为负载进行微熔合,但是在没有损害吞吐量的情况下没有存储空间。

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


0
投票

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

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

不仅仅是ARM,而且许多微处理器都有专用的浮点单元,因此在测量FLOP时,您需要测量本机的速度。通过这个和FLOP /循环,您可以或多或少地计算理论峰值性能。

但是,FLOP应该用一些盐,因为它们只能用于近似估计代码的速度,因为它们没有考虑到处理器运行的其他条件。这就是为什么在大多数情况下,仅为您的热点(通常是算术运算)计算FLOP或多或少。

话虽如此,FLOP可以作为两个剧烈代码的比较指标,但对代码本身并没有太多说明。

© www.soinside.com 2019 - 2024. All rights reserved.