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 内核上运行吗?

arm64和aarch64的区别

aarch64-linux-gnu-g++ 交叉编译为 arm64 错误

优化系列汇编优化技术:ARM架构64位(AARCH64)汇编优化及demo

在 64 位 Arm 上编译和安装 Chez 方案?

arm64(aarch64)下使用mysql