2012-03-15 36 views
3

Neon命令を使用してARMアセンブラで書かれたコードのパフォーマンスを向上させようとしています。 (?) http://pulsar.webshaker.net/ccc/sample-706454b3ARM Neonアセンブラ - 奇妙なパイプラインの問題

が、私はライン「n.34-0 1cはN0」で突然NEONユニットは10サイクルを待つ必要があるようです気づい:

テストのために、私は計算は、この計算機を使用します。その理由は何か、それとも電卓のバグですか?

また、ARM/Neonアセンブラのパフォーマンスを向上させる方法についていくつかの一般的な情報が必要です。

対象はARM Cortex-A9です。 コンパイルのために、最新のandroid-ndkをインラインアセンブラで使用します。ありがとうございました。

答えて

2

を評価します。 BitBankが正しいです、NEONはD4を待たなければなりません。

しかし、Neonにロード/ストアキューがあるため、10サイクルを待つ必要があります。 そして、あなたはD4を必要とするとき

vld1.64 d4, [r7, :64] 

だから、あなたがプッシュされ、以前のすべてのロード/ストア命令を実行する必要があり、この命令 の実行を待つ必要がありますが、この命令を実行する前に、キューは、他の命令で満たされていますNEONロード/ストアキューに格納します。

3

NEONユニットは、前のNEON命令(n.33-0 1c n0)でロードされたレジスタ(D4)を参照しているため、その命令を待機する必要があります。負荷は瞬間的ではなく、パイプライン化のために、キャッシュから来てもデータの可用性に遅延があります。レジスタをロードした直後にレジスタを使用しようとしないと、無駄なサイクル(パイプラインストール)に陥ることになるため、ARM命令とNEON命令の両方を並べ替える必要があります。

+1

これらのハザードは、キャッシュヒットした場合に1〜2サイクルしかありません。この場合、それは異なるものです。 –

1

NEONが動作している間は、ARM経由でメモリにアクセスすべきではありません。 NEONのフルブレーキが発生します。

明らかに、あなたは上記の理由で壊滅的な何らかの並列処理を試みています。

さらに、ldrbが多すぎます。 ARM上のバイトアクセスもほぼ罪です。私はあなたが完全に最初にCでコードを書き直す示唆

、32ビットのみメモリアクセスで、これはもう少しCOMPLEXEで、それがすべてでNEONのためであることを意味しているかどうかを実際に

+0

コメントありがとうございます。私はただ1つのByteしか必要としないので、32Bitを一度に読むと、Shift/ANDをもう一度やり直す必要があります。これは遅くなります。コードはすでにC&ARMアセンブラとして存在していますので、Neon命令で高速化できるかどうかを確認する必要があります。理論的には30〜40%速くなければなりません。どの操作を並行して行うことができるか。 ARM演算とNeonロード/ストア(Neon演算とARMロード/ストアではない) – HectorLector

+0

これは信じられません.32ビットの読み取り+マスキングは、バイト読み取りよりもはるかに高速です。 –

+0

並列処理は忘れてしまいます。 NeonからARMに値を移すと、11サイクルのパイプラインが無駄になります。 ARMはNeonが全体的な仕事をしている間、コントロールユニットとしてのみ機能します。 –