2012-03-15 51 views
3

我想提高使用Neon指令在ARM彙編器中編寫的一段代碼的性能。ARM Neon Assembler - 奇怪的管線問題

爲了測試和計算我用這個計算器: http://pulsar.webshaker.net/ccc/sample-706454b3

我注意到,在行「n.34-0 1C NO」突然NEON單元似乎已經等待了10個週期(?)。這可能是什麼原因或者它只是計算器中的一個錯誤?

另外我還需要一些關於如何提高ARM/Neon彙編器性能的一般信息。

目標是ARM Cortex-A9。 編譯我使用最新的android-ndk與內聯彙編器。謝謝。

回答

2

事實上,這是一點點的配合物。 BitBank是對的,NEON必須等待D4。

但是你必須等待10個週期,因爲氖具有加載/存儲隊列。 和隊列充滿了其他指令之前,

vld1.64 d4, [r7, :64] 

所以,當你需要D4,你必須等待該指令 的執行,但要執行這個指令,你必須執行所有之前的加載/存儲指令推進入NEON加載/存儲隊列。

3

NEON單元必須等待該指令,因爲您正在引用在之前的NEON指令(n.33-0 1c n0)中加載的寄存器(D4)。負載不是即時的,並且由於流水線操作,即使數據來自緩存,數據的可用性也會延遲。您需要對ARM和NEON指令重新排序,以便在加載它們後不立即嘗試使用寄存器,否則將導致浪費的週期(流水線延遲)。

+1

如果緩存命中,那些危險只有1〜2個週期。在這種情況下,它有些不同。 – 2012-03-18 08:15:15

1

當NEON正在完成工作時,您不應該通過ARM訪問內存。它會導致NEON全面制動。

顯然,您正在嘗試某種並行處理,這種處理對於上述原因具有破壞性。

此外,有太多的ldrb的。 ARM上的字節訪問也幾乎是一種罪過。

我建議你用C完全重寫代碼首先,與32位唯一內存訪問,然後評估它是否意味着是NEON可言,

+0

感謝您的評論。我只需要一個字節,所以如果我一次讀32Bit,我需要再次移動/移動整個事物,這會變慢。該代碼已經作爲C&ARM彙編程序存在,我需要檢查是否可以使用Neon指令加速它。理論上它應該快30-40%。可以並行完成哪些操作。 ARM算術和Neon加載/存儲,但不是(?)Neon算術和ARM加載/存儲? – HectorLector 2012-03-18 15:07:45

+0

你不會相信這一點:32位讀取+屏蔽比字節讀取快得多。 – 2012-03-18 22:52:22

+0

忘記並行處理。將值從Neon移動到ARM也會導致管道沖刷浪費11個週期。 ARM將作爲控制單位,而Neon正在完成整個工作。 – 2012-03-18 22:59:03