3

ネオン命令を使用してARMアセンブラで記述されたコードのパフォーマンスを向上させようとしています。

テストと計算には、次の計算機を使用します:http: //pulsar.webshaker.net/ccc/sample-706454b3

行"n.34-01c n0"で、突然ネオンユニットが10サイクル待機(?)しなければならないように見えることに気づきました。その理由は何でしょうか、それとも電卓のバグなのですか?

また、ARM/Neonアセンブラのパフォーマンスを向上させるための一般的な情報も必要です。

ターゲットはARMCortex-A9です。コンパイルには、インラインアセンブラを備えた最新のandroid-ndkを使用します。ありがとうございました。

4

3 に答える 3

3

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

于 2012-03-15T16:45:38.903 に答える
2

NEONがその仕事をしている間は、ARMを介してメモリにアクセスしないでください。NEONにフルブレーキがかかります。

どうやら、あなたは上記の理由で壊滅的なある種の並列処理を試みています。

その上、あまりにも多くのldrbがあります。ARMでのバイトアクセスもほとんど罪です。

最初にコードを完全にCで書き直し、32ビットのみのメモリアクセスを使用してから、それがNEON用であるかどうかを評価することをお勧めします。

于 2012-03-18T08:27:31.750 に答える
2

実際、これはもう少し複雑です。BitBankは正しいです、NEONはD4を待たなければなりません。

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

vld1.64 d4, [r7, :64]

したがって、D4が必要な場合は、この命令の実行を待つ必要がありますが、この命令を実行するには、NEONロード/ストアキューにプッシュされた以前のすべてのロード/ストア命令を実行する必要があります。

于 2012-03-19T08:58:43.493 に答える