Cortex-A57 可以双发 128 位 neon 指令吗?

Posted

技术标签:

【中文标题】Cortex-A57 可以双发 128 位 neon 指令吗?【英文标题】:Can Cortex-A57 dual-issue 128-bit neon instructions? 【发布时间】:2015-12-02 08:23:06 【问题描述】:

Cortex-A57 优化指南指出,大多数在 128 位矢量数据上运行的整数指令都可以双发出(第 24 页,整数基本 F0/F1,逻辑 F0/F1,执行吞吐量 2)。

但是,在我们的内部(综合)基准测试中,吞吐量似乎仅限于 1 128 位霓虹整数指令,即使有大量可用的指令并行性(编写基准测试的目的是测试 128 位霓虹灯指令可以双重发布,所以这是我们注意的)。当混合 50% 的 128 位指令和 50% 的 64 位指令时,我们能够实现每个时钟 1.25 条指令(仅使用 neon 整数,没有加载/存储)。

在使用 128 位 ASIMD/Neon 指令时,是否需要采取特殊措施才能获得双发吞吐量?

谢谢,克莱门斯

【问题讨论】:

有相当多的指令只能发出一个管道,还有相当多的指令,Q 形式的周期比 D 形式的延迟更多/吞吐量更少 - 实际情况是什么 有问题的代码(反汇编)? 有问题的代码看起来例如比如:.loop: vand q2, q3, q2 vand q3, q4, q3 vand q4, q3, q4 vand q5, q6, q5 vand q6, q7, q6 vand q7, q8, q7 vand q8, q9, q8 vand q9, q10, q9 vand q10, q11, q10 vand q11, q12, q11 vand q12, q13, q12 vand q13, q14, q13 vand q14, q15, q14 vand q15, q1, q15 subs r0, r0, #1 bne .loop 不要在评论中粘贴代码。您可以为此编辑您的问题。 您的代码中有 vand q4, q3, q4 而不是 vand q4, q5, q4。这将添加对上一条指令的依赖。 感谢您的提示,这是一个错字。我再次进行了基准测试,使用pastebin.com/AQCN5uuM 的代码,我得到了大约 1.5 的 IPC。我真的很想知道这里出了什么问题... 【参考方案1】:

根据 ARM 支持,原因似乎是 NEON 寄存器文件只支持 3x 64 位写端口。

因此,尽管 NEON ALU 能够处理 2x128 位向量,但寄存器文件无法处理结果……这是多么(非常)奇怪的设计决定。

【讨论】:

我已经通过广泛的基准测试在实践中验证了这个限制,并在 Cortex-A72 内核(Raspberry Pi 4 中使用的 BCM2711 CPU)中观察到了相同的行为。此外,虽然您说的是“NEON 寄存器文件”,但这似乎是一个全局限制,而不是 NEON 特定的:完全独立的 2 NEON + 1 标量指令的多个副本的循环提供的性能甚至比单独的 2 NEON 指令更差。 【参考方案2】:

在实际代码中,并非所有指令结果都会写入寄存器文件,而是通过转发路径。如果您在代码中混合依赖和独立指令,您可能会看到更高的 IPC。

A57 优化指南指出,延迟转发发生在乘法累加指令链上,因此类似这样的事情可能会出现双重问题。

.loop
    vmla.s16 q0,q0,q1
    vmla.s16 q0,q0,q2
    vmla.s16 q0,q0,q3
    vmla.s16 q4,q4,q1
    vmla.s16 q4,q4,q2
    vmla.s16 q4,q4,q3
    ...etc

【讨论】:

以上是关于Cortex-A57 可以双发 128 位 neon 指令吗?的主要内容,如果未能解决你的问题,请参考以下文章

两年实现Nature和Science双发,这位电子科大博士火了

具有 128 位 UUID 的 startLeScan 不适用于本机 Android BLE 实现

ARM Cortex-A72 CPU All In One

Cortex-A

ARM中Cortex-A8,Cortex-M0,Cortex-M3 他们的区别在哪?

NEON 汇编代码在 Cortex-A72 与 Cortex-A53 上需要更多周期