AArch64 - 并行运行 ARM 和 ASIMD 指令
Posted
技术标签:
【中文标题】AArch64 - 并行运行 ARM 和 ASIMD 指令【英文标题】:AArch64 - Running ARM and ASIMD instructions in parallel 【发布时间】:2016-03-09 21:52:05 【问题描述】:我想同时使用 ARM 汇编指令和 ASIMD 指令在汇编指令中实现代码。我的第一个问题是,这是否可以在 ARMv8 上完成?基于this 线程,在 ARMv7 上是可能的,但是 NEON 和 ARM 寄存器之间的数据传输需要相当长的时间。 其次,我正在寻找一种可以并行实现汇编代码的方法。这是我想要做的:
.
.
.
<ASIMD instruction>
<ASIMD instruction>
<ASIMD instruction>
<Data MOV between ASIMD vectors and ARM Reg>
<ARM assembly instruction> ------- <ASIMD instruction>
<ARM assembly instruction> ------- <ASIMD instruction>
<ARM assembly instruction> ------- <ASIMD instruction>
<Data MOV between ARM Reg and ASIMD vectors>
<ARM assembly instruction> ------- <ASIMD instruction>
<ARM assembly instruction> ------- <ASIMD instruction>
<ARM assembly instruction> ------- <ASIMD instruction>
.
.
.
我想知道我是否可以使用两个线程来做到这一点。我正在研究 ARM-CortexA53 微处理器。我也可以使用 ARM-CortexA57,但我认为这些平台大致相同,并且具有相同的功能。
【问题讨论】:
Cortex-A53 是一种多为双发的有序设计; Cortex-A57 具有由 3 宽解码/调度阶段提供的乱序执行;它们绝不是“大致相同”。 @Notlikethat 感谢您的澄清。我做了一些研究,现在我了解 A57 和 A53 具有完全不同的架构 【参考方案1】:我认为您在线程方面的 cmets 在这里放错了位置,或者您具有超线程(或其他同时多线程)架构的背景。 Cortex-A57 或 Cortex-A53 都不是 SMT 微架构,因此任何时候您都只会在一个内核上执行一个线程。这意味着您的想法让一个线程用于高级 SIMD 指令,一个线程用于整数/A32/T32(您称之为“ARM 指令”)指令不会导致多核系统的整体利用率良好。
您链接到的线程讨论了 Cortex-A8 微架构的模型,在该模型中,通过 Neon 指令传递回 A32 指令的数据依赖关系会导致流水线气泡(请注意,另一条评论说这与正在同步的内存有关是不正确的) .虽然将数据从高级 SIMD 寄存器移动到核心寄存器需要一些成本,但成本远低于该线程建议的成本(例如,参见Cortex-A57 Software Optimisation Guide,它给出了每条指令的延迟数)。
使用矢量化高级 SIMD 指令获得的性能优势取决于您打算在算法的 A32 和高级 SIMD 部分中使用的指令的混合。过于频繁地移动数据会对您的执行速度产生明显影响 - 您花费在移动数据上的时间越多,花费在您打算做的工作上的时间就越少!
您在上面提出的指令交错是公开指令级并行性的常用方法,并且很可能在单个线程中运行良好。
【讨论】:
感谢您的回答。我试图实现的主要算法是多精度算术,如多字乘法。为了对相对较大的整数执行此操作,我使用 ASIMD 向量将操作数相乘,但由于 ASIMD 中没有ADCS
,因此我正在考虑使用 A32 指令进行进位传播。我不确定这是否是一个好方法,但我会试一试并评估性能【参考方案2】:
我不确定您所说的“并行”是什么意思。 Cortex-A53 或 Cortex-A57 都不支持多线程(尽管在同一个芯片中可以有多个 CPU,这是另一回事)。
但是,在 Cortex-A57 上(在 A53 上肯定更少)你可以做的是利用执行大多是无序的这一事实。因此,如果您在指令之间没有依赖关系,则可以执行长指令,并且在此期间,您可以执行较短的指令。但真正使用它是非常困难的,最好的办法可能是相信 CPU 会尽可能多地进行乱序执行。
【讨论】:
以上是关于AArch64 - 并行运行 ARM 和 ASIMD 指令的主要内容,如果未能解决你的问题,请参考以下文章
旧的 ARM32 二进制文件可以在 AARCH64 内核上运行吗?
aarch64-linux-gnu-g++ 交叉编译为 arm64 错误