浮点运算 (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 定义。
当然,mul
、add
、sub
、div
显然是 FLOP,但是移动操作、洗牌操作(例如 _mm_shuffle_ps
)、设置操作(例如 _mm_set1_ps
)、转换操作(例如_mm_cvtps_pi32
) 等?
它们是处理浮点值的操作。我应该把它们算作 FLOPs 吗?如果不是,为什么?
Intel VTune 和 Nvidia 的 nvprof
或 PMU 等分析器通常计算哪些操作?
编辑:What all operations does FLOPS include? 这个问题主要是关于数学上的复杂运算。 我还想知道处理以浮点值或向量作为输入的“非数学”运算的标准方法。
【问题讨论】:
mul
、add
、sub
和 div
是不是浮点运算。它们对整数进行操作。 FLOPs 以ps
或sd
等结尾。
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) 的定义是啥的主要内容,如果未能解决你的问题,请参考以下文章