AArch64 - 运行 并行的 ARM 和 ASIMD 指令

AArch64 - Running ARM and ASIMD instructions in parallel

我想同时使用 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-A57 或 Cortex-A53 都不是 SMT 微架构,因此在任何时候您都只会在一个内核上执行一个线程。这意味着您拥有一个线程用于高级 SIMD 指令和一个线程用于 integer/A32/T32(您称之为 "ARM instructions")指令的想法不会导致多核系统的良好整体利用率。

您链接到的线程讨论了 Cortex-A8 微体系结构的模型,其中通过 Neon 指令返回 A32 指令的数据依赖性导致管道气泡(请注意,另一条评论说这与同步的内存有关)不正确)。虽然将数据从高级 SIMD 寄存器移动到核心寄存器会产生一些成本,但成本远低于该线程建议的成本(参见 Cortex-A57 Software Optimisation Guide,它给出了每条指令的延迟数).

您通过使用矢量化高级 SIMD 指令获得的性能优势将取决于您打算在算法的 A32 和高级 SIMD 部分中使用的指令混合。过于频繁地移动数据会对您的执行速度产生明显的影响 - 您移动数据所花费的时间越多,您花在做您打算做的工作上的时间就越少!

您在上面提出的交错指令是公开指令级并行性的常用方法,并且很可能在单个线程中运行良好。

我不确定 "In parallel" 是什么意思。 None 的 Cortex-A53 或 Cortex-A57 支持多线程(虽然可以在同一个芯片中有多个 CPU,这是另一回事)。

但是在 Cortex-A57 上(在 A53 上肯定更少)你可以做的是利用执行大部分是乱序的事实。因此,如果指令之间没有依赖关系,则可以执行长指令,并且在此期间,您可以执行较短的指令。但真正使用它非常困难,最好相信 CPU 会尽可能多地执行乱序执行。