Cortex-A57能否双发128位neon指令?
Can Cortex-A57 dual-issue 128-bit neon instructions?
Cortex-A57 优化指南指出,大多数对 128 位向量数据进行操作的整数指令都可以双重发出(第 24 页,整数基本 F0/F1,逻辑 F0/F1,执行吞吐量 2 ).
然而,对于我们的内部(综合)基准测试,吞吐量似乎仅限于 1 个 128 位 neon 整数指令,即使有大量可用的指令并行性(编写基准测试的目的是测试 128 位霓虹灯整数指令是否-bit neon 指令可以双重发出,所以这是我们注意的事情)。当混合 50% 的 128 位指令和 50% 的 64 位指令时,我们能够实现每个时钟 1.25 条指令(只有 neon 整数算术,没有 loads/stores)。
在使用 128 位 ASIMD/Neon 指令时,是否必须采取特殊措施才能获得双发射吞吐量?
谢谢,克莱门斯
根据 ARM 支持,原因似乎是 NEON 寄存器文件仅支持 3 个 64 位写入端口。
因此,尽管 NEON ALU 能够处理 2x128 位向量,但寄存器文件无法使用结果……多么(非常)奇怪的设计决定。
在实际代码中,并不是所有的指令结果都会写入寄存器文件,而是会通过转发路径。如果您在代码中混合依赖和独立指令,您可能会看到更高的 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 位向量数据进行操作的整数指令都可以双重发出(第 24 页,整数基本 F0/F1,逻辑 F0/F1,执行吞吐量 2 ).
然而,对于我们的内部(综合)基准测试,吞吐量似乎仅限于 1 个 128 位 neon 整数指令,即使有大量可用的指令并行性(编写基准测试的目的是测试 128 位霓虹灯整数指令是否-bit neon 指令可以双重发出,所以这是我们注意的事情)。当混合 50% 的 128 位指令和 50% 的 64 位指令时,我们能够实现每个时钟 1.25 条指令(只有 neon 整数算术,没有 loads/stores)。
在使用 128 位 ASIMD/Neon 指令时,是否必须采取特殊措施才能获得双发射吞吐量?
谢谢,克莱门斯
根据 ARM 支持,原因似乎是 NEON 寄存器文件仅支持 3 个 64 位写入端口。
因此,尽管 NEON ALU 能够处理 2x128 位向量,但寄存器文件无法使用结果……多么(非常)奇怪的设计决定。
在实际代码中,并不是所有的指令结果都会写入寄存器文件,而是会通过转发路径。如果您在代码中混合依赖和独立指令,您可能会看到更高的 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