2011-09-29 7 views
6

デュアルコアARMチップセットMSM8660のパフォーマンスを最大限に引き出すために、ARMアセンブリの最適化とマルチスレッドを使用するAndroid向けのネイティブライブラリを開発しています。私が気づいたいくつかの測定をしながら次クアルコムScorpionデュアルコアARM NEONコードの問題?

  1. NEONの最適化とシングルスレッドライブラリは、ARMv6のの最適化(予想通り)とシングルスレッドライブラリーより高速です。
  2. ARMv6の最適化とマルチスレッドライブラリはARMv6の最適化(予想通り)とシングルスレッドライブラリより高速です。
  3. NEONの最適化とマルチスレッドライブラリは、NEONの最適化(絶対に期待できない!)とシングルスレッドライブラリーより遅いです。

これはなぜこれが見つからなかったのかという理由で、ネット全体を検索してみました。すべてのコアが同じNEONパイプラインを共有しているかのように思えますが、すべての回路図は各コアが独自のNEONユニットを持つ必要があるようです。誰がなぜこれが起こっているのか知っていますか?

答えて

0

おそらくキャッシュミスが原因です。それ以上の情報なしで伝えるのは難しいです。

+0

これを置くもう1つの方法は、ボトルネックがおそらく外部メモリの帯域幅であることです。この場合、コアを追加することは役に立ちません。 –

+1

はい、しかし、それが外部メモリの帯域幅のみだった場合、パフォーマンスは少なくとも同等でなければなりません。もちろん、より多くのスレッドを追加することでより多くのコンテキスト切り替えが導入されますが、パフォーマンスにどれだけ影響を与えるかわかりません。 – onemasse

0

これは、NEONパイプラインをフラッシュする際に余分なサイクルペナルティが発生するためです。 NEONパイプラインはコアの残りの部分の後ろにありますので、欠落したブランチなどに対して余分なサイクルペナルティが発生します。

スレッドが頻繁に同期する必要がある場合、またはロックが多い場合は、NEONで大きな罰則が発生すると思います。

マルチスレッドコードでパフォーマンスを全体的に向上させるためにNEONを活用する唯一の方法は、コードが恥ずかしく並行していて、スレッド間の通信がごくわずかな場合です。

1

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

それぞれのコアには独自のNEONユニットがありますが、独自の「VeNum」ユニットがあり、それに関する情報はあまりありません.Cortex-A8ベースのScorpion用に8x50で設計されていました。 ARMが独自に実装したNEON SIMDよりもかなり優れていますが、基本的なリファレンスデザインと互換性のある方法でハードウェアを設計しているため、コーパス-A8のほとんどのコードはScorpionとうまく機能します可能性のある異なる命令タイミングのためにいくつかのパフォーマンスが低下しました。

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

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

さらに、コンパイラーからの最適な最適化、キャッシュミス、scorpionの二重問題機能の使用、命令スケジューリングの悪化、スレッド間の切り替えを繰り返し行うなどの要因があります。

関連する問題