2

出力を後処理objdump --disassembleしてサイクル数で注釈を付けるためのスクリプトはありますか? 特にARMファミリーの場合。 ほとんどの場合、これはカウントのテーブル ルックアップを伴うパターン マッチのみです。+5M5 メモリ サイクルのような注釈が必要になる可能性があると思います。 Perl、python、bashCなどは問題ありません。これは一般的に実行できると思いますが、直交命令セットを持つARMに興味があります。これは、同じことをしている68HC11のスレッドです。スクリプトには、適切なサイクル数を選択するための CPUモデルオプションが必要です。これらの数は、マシンの説明に既に存在していると思います。gcc

これに対するスイッチはないと思いますがobjdump、RTFM は素晴らしいでしょう。

編集:明確にするために、コードがキャッシュから実行される場合のように、メモリ サブシステムの最適なケースなどの仮定は問題ありません。目標は、一部の実行中のマシンのように 100% 正確なサイクル カウントではありません。合理的な見積もりを取得することは可能です。そうでなければ、コンパイラの設計は不可能です。

DWelch指摘しているように、最近の Cortex チップのようにパイプライン化された深いアーキテクチャでは、単純な累計は不可能です。objdump後処理では、周囲のオペコードを調べる必要があります。gcc プラグインはこれを達成できる可能性が高く、それは新しい (4.5+) であるため、そのようなものは存在しないと思います。ARM926 用のスクリプトは確かに可能であり、かなり単純です。

メモリのレイテンシは問題ではありません。メモリ コントローラは別のCPU. CPUが算術演算などを行っている間、それはビジネスを行っています。適切に調整されたアルゴリズムは、メモリアクセスと計算を並行させます。ロード/ストアとサイクルをカウントすることで、タイマーを使用してアクティブにプロファイリングするときに、どの程度の並列処理が達成されたかを判断できます。パイプラインはレジスタ間のインターロックのために重要ですが、基本ブロックのサイクル カウントは最新の ARM プロセッサでも確実に計算して使用できます。これは単純なスクリプトには複雑すぎます。

4

2 に答える 2

2

サイクルカウントは、最新のハイエンドARMで命令だけを見て評価できるものではありません。命令の実際のリタイア率に影響を与える実行時の状態はたくさんあります。必要なデータはキャッシュに存在しますか?命令は以前の命令結果に依存していますか?もしそうなら、転送ユニットはどのようなレイテンシーを削除しますか?ロード/ストアバッファはどのくらいいっぱいですか?どのようなメモリマッピングに触れていますか?この命令に必要なプロセッサパイプラインはどのくらいいっぱいですか?ストリームに同期命令はありますか?憶測はそれが依存するいくつかのデータをもたらしましたか?レジスタリネームの状態はどうなっていますか?条件付き命令がパイプラインを埋めていましたか、それともデコーダーはそれらを完全にスキップするのに十分スマートでしたか?コアクロックとバスおよびメモリクロックの比率はどのくらいですか?分岐予測テーブルのサイズはどれくらいですか?

完全なプロセッサシミュレーションがなければ、推測しか得られません。それらの数字があなたにとって意味があるかどうかは、あなたがそれらで何を達成しようとしているのかによって異なります。

于 2013-02-18T19:22:19.173 に答える
2

Cortex-A8 のサイクル数を見積もるオンライン ツールがあります。ただし、この CPU はかなり古いものであり、この CPU 用に最適化されたプログラムは、新しい CPU では最適ではない可能性があります。

AFAIK ARMは、RVDSソフトウェアでCortex-A9およびCortex-A5のサイクル精度のエミュレーターも提供していますが、非常に高価です。

于 2013-02-18T20:26:35.150 に答える