3

私はWindowsモバイルデバイスでコードのパフォーマンスについていくつかのベンチマークを行っていましたが、一部のアルゴリズムが一部のホストで大幅に向上し、他のホストでは大幅に低下していることに気付きました。もちろん、クロック速度の違いを考慮に入れます。

参照用の統計(すべての結果は、ARMv4を対象とするVisual Studio 2005によってコンパイルされた同じバイナリから生成されます):

Intel XScale PXA270

  • アルゴリズムA:22642ミリ秒
  • アルゴリズムB:29271ミリ秒

ARM1136EJ-Sコア(MSM7201Aチップに組み込まれています)

  • アルゴリズムA:24874ミリ秒
  • アルゴリズムB:29504ミリ秒

ARM926EJ-Sコア(OMAP 850チップに組み込まれています)

  • アルゴリズムA:70215ミリ秒
  • アルゴリズムB:31652ミリ秒(!)

考えられる原因として浮動小数点を調べました。アルゴリズムBは浮動小数点コードを使用していますが、内部ループからは使用しておらず、どのコアにもFPUがないようです。

だから私の質問は、どのメカニックがこの違いを引き起こしているのかということです。できれば、問題のボトルネックを修正/回避する方法についての提案があります。

前もって感謝します。

4

4 に答える 4

2

クロック速度は1つの要因にすぎません。バスの幅と待ち時間は、大きな要因ではないにしても大きなものです。キャッシュが要因です。メモリではなくメディアから実行する場合、プログラムが実行されるメディアの速度。

このテストでは、テストの任意の時点で共有ライブラリを使用していますか、それともすべて内部コードですか?プラットフォームごとに異なるメディア上の共有ライブラリをフェッチします(同じSDカードと言っても)。

これは、プラットフォームごとに個別にコンパイルされた同じアルゴリズムですか、それとも同じバイナリですか?コンパイラによって引き起こされる変動も見られますし、見られるでしょう。コンパイラの設定を変えることで、同じプラットフォーム上の同じコンパイラから簡単に50%速く、遅くすることができます。可能であれば、同じバイナリを実行し、テスト対象のループで共有ライブラリが使用されていないことを確認します。同じバイナリでない場合は、各プラットフォームのテスト対象のループを分解し、レジスタの選択以外のバリエーションがないことを確認します。

于 2009-10-06T17:05:51.147 に答える
2

考えられる原因の1つは、926のパイプラインが短いため(1136、iircの場合は8サイクルに対して5サイクル)、926ではブランチの予測ミスのコストが低くなることです。

とは言うものの、これらのプロセッサの間にはアーキテクチャ上の違いがたくさんあり、実際に実行している命令について何も知らなくても、なぜこの効果が見られるのかをはっきりと言うには多すぎます。

于 2009-10-07T00:21:29.130 に答える
1

あなたが提示したデータから、正確な問題を指摘することは困難ですが、私たちは以前の経験のいくつかを共有することができます

  • キャッシュ設定(すべてのプロセッサが同じCACHE設定を持っているかどうかを確認してください)
  • D-CacheとI-Cacheの両方をチェックする必要があります

分析のために、

アルゴリズムとしてだけでなく、ブロックレベルでコードをさらに細かく分類し、ボトルネックの原因となるブロックを理解してください。ボトルネックの原因となるブロックを見つけたら、ブロックのソースコードを逆アセンブルして、アセンブリを確認します。それは役立つかもしれません。

于 2009-10-07T05:02:33.797 に答える
0

問題はキャッシュ設定またはメモリ関連のもの(おそらくI-Cacheの「オーバーフロー」)にあるようです。パイプラインストール、ブランチのミス予測は、通常、それほど大きな違いはありません。

たとえば、各アルゴリズムで実行されるいくつかの基本的な操作を数えることができます。

  1. 「簡単な」算術/ビット演算(+-| ^&)の数と定数によるシフト
  2. 変数によるシフト数
  3. 掛け算の数
  4. 「ハード」算術演算の数(除算、浮動小数点演算)
  5. アラインされたメモリ読み取りの数(32ビット)
  6. バイトメモリ読み取り数(8ビット)(32ビットより遅い)
  7. アラインされたメモリ書き込みの数(32ビット)
  8. バイトメモリ書き込み数(8ビット)
  9. 支店数
  10. 他の何か、もっと覚えてはいけません:)

そして、あなたは物事がはるかに遅くなるという情報を得るでしょう。この後、疑わしいブロックをチェックして、それらを多かれ少なかれ集中的に使用することができます。そして、あなたは答えを得るでしょう。

さらに、VSでアセンブリリストの生成を有効にして、調査のベースとして使用することをお勧めします(ただし、高レベルのソースコードは使用しないでください)。

ps:問題はOS /ソフトウェア/ファームウェアにあるのでしょうか?クリーンなシステムでテストしましたか?OSはすべてのデバイスで同じですか?

于 2009-10-07T21:41:50.363 に答える