Cortex-A57能否发出128位霓虹灯指令?

时间:2015-12-02 08:23:07

标签: assembly arm pipeline

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

然而,使用我们的内部(合成)基准测试,吞吐量似乎仅限于1 128位氖整数指令,即使有足够的指令并行性可用(基准测试的目的是测试128位是否霓虹灯指令可以双重发布,所以这是我们照顾的事情)。当将50%128位与50%64位指令混合使用时,我们每个时钟能够达到1.25条指令(只有霓虹灯整数,无负载/存储)。

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

Thx,Clemens

2 个答案:

答案 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