2

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

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

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

4

2 回答 2

3

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

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


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

所以 Haswell 核心的 FLOP/s 是

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

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

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

另请参阅如何实现每个周期 4 次 FLOP 的理论最大值?. (在现代 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 uop/时钟,但也使用 AVX-512 将 SIMD 执行单元扩大到 512 位,而不是添加第三个 256 位 FMA 单元。它有 2 个/时钟负载2 个/clock 存储,尽管存储吞吐量仅对 32 字节或更窄存储的 L1d 缓存可持续,而不是 64 字节。)

于 2018-09-10T18:45:58.090 回答
0

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

例如, ARMv7 参考手册A4.13 中向量浮点指令下的所有指令都属于浮点操作,因为 FPU 指令的 FLOPs/Cycle 通常在处理器中是恒定的。

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

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

话虽如此,FLOPs 可以作为两个费力代码的比较指标,但并不能说明您的代码本身。

于 2018-09-10T18:47:07.917 回答