0

生成された x86 アセンブリ言語を C/C++ プログラムから分析し、1GHz または 3GHz プロセッサで実行しても問題にならないような方法でパフォーマンスを測定できる「ツール」を作成する方法はありますか?

私は命令スループットの線に沿ってもっと考えていますか? どうすればそのようなツールを作成できますか? それは可能でしょうか?

4

3 に答える 3

3

可能ですが、関連性は非常に限られています。説明書を見ただけでは、実行時間はわかりません。

  • キャッシュの使用状況はどうですか?「長い」コードは、よりキャッシュに適しているため、より高速になります。

  • 特定の CPU 命令は、並列に順不同で実行できますが、最終的な動作はハードウェアに大きく依存します。

本当に試してみたい場合は、valgrind 用のツールを作成することをお勧めします。基本的に、シミュレートされた環境でプログラムを実行し、実際の CPU の動作を確実に再現できるようにします (これが難しい部分です)。

編集:明確にするために、実際の入力から抽出された動的分析が必要だと仮定しています。静的分析が必要な場合は、他の回答が指摘したように「決定不能な土地」になります(特定のコードが永遠にループするかどうかを検出することさえできません)。

編集 2: 2 番目のポイントに順不同のケースを含めるのを忘れていました。

于 2013-07-17T20:56:24.840 に答える
1

それは可能ですが、ツールがパフォーマンスを予測しているプロセッサの内部構造をすべて認識している場合に限られます。内部の「すべて」を知ることは、独自のプロセッサを構築することと同じであるため、これは簡単な作業ではないと正しく推測できます。代わりに、多くの仮定を立てる必要があり、それらが答えにあまり影響を与えないことを願っています. 残念ながら、数百の命令よりも長い場合、これらの仮定 (たとえば、すべてのメモリ読み取りは L1 データ キャッシュで検出され、4 サイクルのレイテンシがある。すべての命令は L1 命令キャッシュにありますが、その後はトレース キャッシュにあります) は答えに大きく影響します。 . クロック速度はおそらく最も扱いやすい変数ですが、その他すべての詳細はプロセッサーごとに大きく異なります。

現在のプロセッサーは、「投機的」、「スーパースカラー」、および「順不同」です。投機的とは、正しい選択が計算される前にコード パスを選択し、推測が間違っている場合は戻って分岐からやり直すことを意味します。スーパースカラーとは、互いに依存しない複数の命令を同時に実行できる場合があることを意味しますが、特定の組み合わせでのみ実行できます。順不同とは、実行を待機している命令のプールがあり、プロセッサが入力の準備ができたときに基づいて命令をいつ実行するかを選択することを意味します。

さらに悪いことに、命令は瞬時に実行されず、命令が実行するサイクル数 (およびこの間に占有するリソース) も異なります。分岐予測の精度を予測するのは難しく、プロセッサが回復するのに必要なサイクル数は異なります。キャッシュはサイズが異なり、アクセスにかかる時間も異なり、何をキャッシュするかを決定するためのアルゴリズムも異なります。アセンブリが実行されているプロセッサを参照せずに、「アセンブリの実行速度」の意味のある概念はありません。

ただし、これは、理由を説明できないという意味ではありません。また、ターゲットとするプロセッサを絞り込むことができ、評価するコードを制限するほど、コードがどのように実行されるかをより正確に予測できます。Agner Fog は、現在の世代の x86 プロセッサの相違点と類似点について、中間レベルの優れた紹介をしています: http://www.agner.org/optimize/microarchitecture.pdf

さらに、Intel は、最近の世代のプロセッサに関するこれらの質問の多くに答える、非常に便利な (そして驚くほど知られていない) ツールを無料で提供しています。タイトなループで数十個の命令のパフォーマンスと相互作用を測定しようとしている場合、IACA はすでに目的を達成している可能性があります。インターフェースとデータの表示にはあらゆる種類の改善を加えることができますが、独自のものを作成する前に確認する価値があります。

http://software.intel.com/en-us/articles/intel-architecture-code-analyzer

私の知る限り、AMD に相当するものはありませんが、ある場合はそれについて知りたいです。

于 2013-07-19T06:34:35.793 に答える