Cortex-A57优化指南指出,在128位矢量数据上运行的大多数整数指令可以是双重发布的(第24页,整数基本F0 / F1,逻辑F0 / F1,执行吞吐量2)。
然而,使用我们的内部(合成)基准测试,吞吐量似乎仅限于1 128位氖整数指令,即使有足够的指令并行性可用(基准测试的目的是测试128位是否霓虹灯指令可以双重发布,所以这是我们照顾的事情)。当将50%128位与50%64位指令混合使用时,我们每个时钟能够达到1.25条指令(只有霓虹灯整数,无负载/存储)。
在使用128位ASIMD / Neon指令时,是否需要采取特殊措施才能获得双重吞吐量?
Thx,Clemens
答案 0 :(得分:0)
根据ARM支持,原因似乎是NEON寄存器文件仅支持3x 64位写端口。
因此,尽管NEON ALU能够处理2x128位向量,但寄存器文件无法消耗结果......这是一种(非常)奇怪的设计决策。
答案 1 :(得分:0)
在实际代码中,并非所有指令结果都将写入寄存器文件,而是通过转发路径。如果在代码中混合使用相关和独立的指令,则可能会看到更高的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