浮点运算 (FLOPs) 的定义是啥

Posted

技术标签:

【中文标题】浮点运算 (FLOPs) 的定义是啥【英文标题】:What is the definition of Floating Point Operations ( FLOPs )浮点运算 (FLOPs) 的定义是什么 【发布时间】:2018-09-10 12:59:27 【问题描述】:

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

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

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

【问题讨论】:

muladdsubdiv不是浮点运算。它们对整数进行操作。 FLOPs 以pssd 等结尾。 What all operations does FLOPS include?的可能重复 我应该说*, +, -, /,我问的是更多关于 FLOP 的一般性问题。 你是在问非浮点机器码,如软浮点等是否算作浮点运算。 不,我的问题很简单:例如,_mm_shuffle_ps 将 2 个 浮点 向量作为输入,所以这个操作是一个浮点操作。是这样吗? 【参考方案1】:

对 FP 值的随机/混合不被视为 FLOP。它们只是在不纯粹的“垂直”问题上使用 SIMD 的开销,或者对于您使用混合无分支进行的分支问题。

FP AND/OR/XOR 都不是。您可以尝试使用andps (_mm_and_ps) 来证明计算 FP 绝对值的合理性,但通常不计算在内。 FP abs 不需要查看指数/有效数,或标准化结果,或任何使 FP 执行单元变得昂贵的事情。 abs (AND) / sign-flip (XOR) 或 makenegative (OR) 是微不足道的按位运算。


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

所以 Haswell 核心的 FLOP/s 是

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

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

Intel 和其他 CPU 供应商没有考虑到他们的 CPU 还可以维持一个 vandps 与每个时钟 2 个 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 单元需要大量的晶体管。

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

【讨论】:

【参考方案2】:

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

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

不仅仅是 ARM,许多微处理器都有一个专用的浮点单元,因此当您测量 FLOP 时,您就是在测量这个单元的速度。有了这个和 FLOPs/cycle,您可以或多或少地计算出理论上的峰值性能。

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

话虽如此,FLOP 可以作为两段繁重代码的比较指标,但并不能说明您的代码本身。

【讨论】:

以上是关于浮点运算 (FLOPs) 的定义是啥的主要内容,如果未能解决你的问题,请参考以下文章

神经网络学习小记录72——Parameters参数量FLOPs浮点运算次数FPS每秒传输帧数等计算量衡量指标解析

算法基础TOPSTOPS和FLOPs的区别

机器学习笔记:FLOPs

整型除以浮点型是啥型?

PyTorch 打印模型的FLOPs(torchstat)

性能指标——运算速率