2016-03-09 103 views
2

我想使用ARM汇编指令和ASIMD指令并行地在汇编指令中实现代码。我的第一个问题是,这是否可以在ARMv8上完成?根据this线程,它可能在ARMv7上,但NEON和ARM寄存器之间的数据传输需要相当长的时间。其次,我正在寻找一种可以并行实现我的汇编代码的方法。这是我想要做的:AArch64 - 并行运行ARM和ASIMD指令

. 
. 
. 
<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,但我认为这些平台大致相同,并且具有相同的功能。

+1

Cortex-A53是一个大部分双重问题的有序设计; Cortex-A57通过3宽解码/调度阶段进行乱序执行;他们只是“大致相同”。 – Notlikethat

+0

@Notlikethat感谢您的澄清。我已经做了一些研究,现在我明白A57和A53有完全不同的架构 – A23149577

回答

4

我认为你对线程的评论在这里放错了位置,或者你有超线程(或其他同时多线程)架构的背景。 Cortex-A57或Cortex-A53都不是SMT微架构,所以任何时候只有一个线程在一个内核上执行。这意味着您拥有一个用于高级SIMD指令的线程和一个用于整数/ A32/T32(称为“ARM指令”)指令的线程的想法不会带来多核系统的良好整体利用率。

您链接到的线程讨论Cortex-A8微体系结构的模型,其中数据依赖性通过Neon指令传回到A32指令导致管道气泡(请注意,其他评论指出这与正在同步的内存有关是不正确的)。虽然将数据从高级SIMD寄存器移到核心寄存器会有一定的成本,但成本远低于线程建议的成本(例如,请参阅Cortex-A57 Software Optimisation Guide,它为每条指令提供延迟数)。

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

上面提出的指令交错是暴露指令级并行性的常用方法,并且很可能在单线程内很好地工作。

+1

感谢您的回答。我试图实现的主要算法是多字乘法等多精度算法。为了实现相对较大的整数,我使用ASIMD向量乘以我的操作数,但由于ASIMD中没有'ADCS',因此我正在考虑使用A32指令进行传播。我不确定这是否是一种好方法,但我会尝试并评估其性能 – A23149577

2

我不确定你的意思是“平行”。 Cortex-A53或Cortex-A57都不支持多线程(尽管在同一芯片中可能有多个CPU,这是另一回事)。

然而,你可以在Cortex-A57上做什么(在A53上肯定会少一点)就是使用这样一个事实,即执行大部分是乱序的。所以它没有指令之间的依赖关系,长指令可以执行,并且在此期间,您可以执行较短的指令。但真正使用它是非常困难的,最好的可能是相信CPU会尽可能地执行无序执行。