私のコンピュータには2つのプロセッサがあり、各プロセッサが1.86 GHzで動作していることがわかります。
私のPCプロセッサのクロックパルスを手動で測定したいと思います。アイデアは、私のプログラムのアセンブララインの数と私のコンピュータがそれを実行するのにかかる時間の間の商を計算することです。 time 組み立て手順の数です(これは「クロックサイクル」として理解されます)。次のように進めたいです。
- Cプログラムを作成し、それをアセンブリコードに変換しました。
- I do:
$gcc -S my_program.c
は gcc コンパイラに、最後のステップ my_program.c をバイナリオブジェクトに変換することを除いて、完全なコンパイルプロセスを実行するように指示します。したがって、アセンブリコードに変換されたCプログラムのソースコードを含むmy_program.sというファイルがあります。 私はプログラムの行数を数えます(この数をNと呼びます)。私はそうしました。
$ nl -l my_program.s | tail -n 1
そして私は以下を得ました:1000015 .section .note.GNU-stack,"",@progbits
つまり、このプログラムには百万行のコードがあります。
- 私はこれをする:
$gcc my_program.c
それで私はそれを練習できる。 私はこれを行います:(
$time ./a.out
"a.out"はmy_program.cのバイナリオブジェクト名です。)プログラムを実行するのにかかる時間を取得するには(Tと呼びます)、次のようにします。real 0m0.059s user 0m0.000s sys 0m0.004s
私が探している時間が最初にリストに表示された時間だとしましょう。 「実際」は、他の時間が実行と同時に私のシステムで実行されている他のリソースを参照するためです./a.out
。
したがって、N = 1000015行とT = 0.059秒があります。 N / T分割を行うと、17MHzに近い周波数が得られますが、これは明らかに間違っています。
その後、私のコンピュータで別のプログラムが実行され、ハードウェアリソース(さらにはオペレーティングシステム自体ではない)を消費するという事実によって、プロセッサが「処理能力」を「分割」してクロックパルスを発生させる可能性があると考えました。 。もう少しゆっくり行ってください。しかし、よくわかりません。
しかし、これが正しい場合は、私のプログラムが消費するCPUリソース(またはメモリ)の割合も見つける必要があると思います。なぜなら、そうすれば実際のCPU速度に対する(良い)近似値を得ようと熱望できるからです。
これは私のプログラムの「リソース消費価値」を見つける方法について質問をします。このコマンドについて考えてみましたが、$ top
私のプログラムの実行時間が非常に短いので(0.059秒)、この間のメモリ使用量の急増を簡単な視覚的に区別する方法はありません。
それでは、これについてどう思いますか?それとも私に何をするように提案しますか?私がやろうとしていることを実行できるプログラムがあることを知っていますが、最も一般的な方法(より安定しているように見える)を実行することに興味があるので、生のbashを使用して実行することを好みます。
答え1
それは動作しません。各命令の実行にかかるクロックサイクルの数(1つではなくかなりのクロックサイクルを要する)は、その命令を取り囲む命令の正確な組み合わせによって大きく異なり、特定のCPUモデルによって異なります。また、割り込みが発生し、カーネルやその他の操作がユーザーと混在するコマンドを実行します。さらに、周波数は負荷と温度に応じて動的に変化します。
最新のCPUには、クロックサイクルを正確に計算できるモデル固有のレジスタがあります。これを読み、高解像度タイマーを使用して一定時間後に再び読み込み、2つの値を比較して、その期間の(平均)頻度を見つけることができます。