6

デュアルコア ARM チップセット MSM8660 で最大のパフォーマンスを得るために、ARM アセンブリの最適化とマルチスレッドを使用する Android 用のネイティブ ライブラリを開発しています。いくつかの測定を行っているときに、次のことに気付きました。

  1. NEON最適化を使用したシングルスレッドライブラリは、 ARMv6最適化を使用したシングルスレッドライブラリよりも高速です(予想どおり)。
  2. ARMv6最適化を使用したマルチスレッドライブラリは、ARMv6最適化を使用したシングルスレッドライブラリよりも高速です(予想どおり)。
  3. NEON最適化を使用したマルチスレッドライブラリは、NEON最適化を使用したシングルスレッドライブラリよりも遅くなります(絶対に予想外です!)。

これがなぜなのかについての説明を求めてネット全体を検索してみましたが、これまでのところ何も見つかりませんでした。すべてのコアが同じ NEON パイプラインなどを共有しているように見えますが、すべての回路図は、各コアに独自の NEON ユニットが必要であることを示しているようです。なぜこれが起こっているのか誰にも分かりますか?

4

3 に答える 3

1

まず、どのライブラリを使用していますか?

正解です。各コアには独自のNEONユニットがありますが、独自の「VeNum」ユニットであり、情報はあまり提供されていません。8x50のCortex-A8ベースのScorpion用に設計されており、ARMよりもはるかに優れていました。 NEON SIMDの独自の実装ですが、彼ら(qcom)は、ベースrefrence設計と互換性のある方法でハードウェアを設計しているため、cortex-A8のほとんどのコードは、パフォーマンスに多少の影響はありますが、Scorpionで問題なく動作します。可能な異なる命令タイミングに。

「softfp」を使用してプログラムをコンパイルしている場合、浮動小数点引数を使用したり、NEONユニットをARMコアからNeonユニットへのレジスタデータの転送として使用したりする関数を呼び出すたびに、約20サイクルのオーバーヘッドが発生します。逆もまた同様で、非常に遅く、パイプラインがフラッシュするのを待つ多くのサイクルでコアをストールさせることがあります。

また、浮動小数点ユニットを使用するスレッドプログラムの場合、カーネルはコンテキストスイッチ中にFPレジスタを保存する必要があります。これにより、レジスタのネオンからアームへの移動が遅く、パイプラインストールが発生することがわかっているため、スレッドに追加のペナルティが発生します。

さらに、コンパイラからの最適化の誤り、キャッシュミス、スコーピオンの二重発行機能の使用の失敗、命令スケジューリングの誤り、あるコアから別のコアへのスレッドの繰り返しの切り替えなど、他の多くの要因がこれにつながる可能性があります。

于 2012-08-05T13:22:22.140 に答える
0

おそらくキャッシュミスが原因です。詳しい情報がないとわかりにくいです。

于 2011-10-02T10:43:07.450 に答える
0

私の推測では、NEON パイプラインのフラッシュに関連する余分なサイクル ペナルティが原因であると思われます。NEON パイプラインはコアの残りの部分の背後にあるため、分岐の失敗などにより余分なサイクル ペナルティが発生します。

スレッドを頻繁に同期する必要がある場合、またはロックが多い場合は、NEON を使用すると大きな問題が生じると思います。

マルチスレッド コードで全体的なパフォーマンスを向上させるために NEON を活用する唯一の方法は、コードが途方もなく並列であり、スレッド間の通信がほとんどまたはまれにしかない場合です。

于 2011-11-25T12:09:17.117 に答える