2016-03-09 147 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會盡可能地執行無序執行。