私はCでプログラムを書いています。研究の結果として作成されたプログラムです。プログラムが消費する正確な CPU サイクルを計算したい。正確なサイクル数。どうすればそれを見つけることができますか?
5 に答える
valgrind
ツールcachegrind
( ) は、valgrind --tool=cachegrind
実行された命令の数、キャッシュ ミス、分岐予測ミスなどの詳細な出力を提供します。これらは、アセンブラーの個々の行に分類できるため、原則として (正確なアーキテクチャーの知識があれば)、この出力から正確なサイクル数を導き出すことができます。
キャッシュ効果により、実行ごとに変化することを知っておいてください。
cachegrind ツールのドキュメントはこちらです。
いいえ、できません。「CPUサイクル」の概念は明確に定義されていません。最新のチップは複数のクロックレートで動作する可能性があり、それらのさまざまな部分がさまざまな時間にさまざまなことを実行する可能性があります。
「パイプラインの合計ステップ数」という質問は、場合によっては意味があるかもしれませんが、それを取得する方法はない可能性があります。
OProfileを試してください。CPU 上のさまざまなハードウェア カウンターを使用して、実行された命令の数と経過したサイクル数を測定します。その使用例については、記事「メモリ パート 7: メモリ パフォーマンス ツール」を参照してください。
あなたが何をしようとしているのか正確にわかっているかどうかは完全にはわかりませんが、最新の x86 プロセッサでできることは、関心のあるコード ブロックの前後のタイム スタンプ カウンター(TSC) を読み取ることです。アセンブリ レベルでは、これはレジスタ ペアRDTSC
の TSC の値を提供する命令を使用して行われます。edx:eax
ただし、このアプローチにはいくつかの注意点があることに注意してください。たとえば、プロセスが CPU0 で開始し、CPU1 で終了する場合、得られる結果RDTSC
は命令を実行した特定のプロセッサ コアを参照するため、比較できない場合があります。(また、命令のシリアライゼーションの欠如もありRDTSC
ますが、ここでのこのコンテキストでは、それはそれほど問題ではないと思います。)
申し訳ありませんが、少なくともほとんどの実用的な目的ではありません。ほとんどの通常の OS では不可能です。たとえば、かなりの数の OS が割り込みを処理するために完全なコンテキスト スイッチを実行しないため、割り込みの処理に費やされた時間は、割り込みが発生したときに実行されていたプロセスに費やされた時間のように見えることがよくあります。
「実用的な目的ではない」ということは、プログラムを正確なサイクル シミュレーターで実行できる可能性があることを示しています。これらは利用可能ですが、主にリアルタイム組み込みシステムで使用される CPU 用であり、本格的な PC などには使用できません。さらに悪いことに、それらは (一般的に) 本格的な OS のようなものを実行するためのものではなく、「ベア メタル」で実行されるコードのためのものです。
理論的には、Windows や Linux などを実行している仮想マシンで何かを実行できる可能性がありますが、それを試みている既存の仮想マシンを私は知りません。パフォーマンスにも影響します(控えめに言っても)。