- read-time stamp counter (RDTSC)命令の利用方法 -
yosirin-hello / yosi-s@galaxy.ocn.ne.jp
| 1. はじめに |
|
| 自分が書いたプログラムが一体どれくらいクロックサイクルを消費しているのか気になったことはありませんか? もしそれが知ることができれば, 最適化前と後とでクロックサイクルを比較すればどの程度高速化したかはっきりわかるようになります. そこで今回はRDTSC命令でクロックサイクルを計測する方法を紹介します. | |
| 2. RDTSC命令とは |
|||||
RDTSC命令で, 現在のクロックサイクル数を取得することができます.
(1)LARGE_INTEGERは64ビットの変数です. 詳しくはMSDNライブラリーを参照して下さい. 別ににクロックサイクル数を格納する変数に32ビットの変数を使ってもよいのですが, 32ビットではオーバーフローを起こす可能性があるので, ここでは64ビットの変数を使用しました.今や, GHzの時代と言われていますから, 32ビットではすぐにオーバーフローしてしまう可能性があります. (2) RDTSC命令を実行する前にシリアライジング命令(ここではCPUID命令)を実行することで正確なクロックサイクル数を取得できるようになります. CPUID命令は, PentiumプロセッサとMMX Pentiumプロセッサで実行する場合必要ありません. (3) RDTSC命令を実行すると, EAXレジスタにクロックサイクル数の下位32ビットが, EDXレジスタにクロックサイクル数の上位32ビットが格納されます. (4) MOV命令でEAXとEDXの内容をcyclesに転送します. |
|||||
| 3. 関数のクロックサイクル数の計測 |
|||||
クロックサイクル数を調べたい関数の呼び出し前と後にList1.を使えば,
どれだけのクロックサイクルを消費したのか調べることができます.
(1) 現在のクロックサイクル数を格納します. (2) 関数を呼び出した後のクロックサイクル数と, 関数を呼び出す前のクロックサイクル数との差をとります. (3) MOV命令で関数が消費したクロックサイクル数を得たEAXとEDXの内容をcyclesに転送します. 落とし穴 : もし, "関数の呼び出し"の部分でEBXレジスタを使用する関数があると, デバッグモードでコンパイルしたときに"warning C4731: frame pointer register 'ebx' modified by inline assembly code"と表示されます. これを無視して実行するとアプリケーションエラーが発生してしまいます. |
|||||
| 4. 具体例 : DotProduct()のクロックサイクル数の計測 |
|||||||||
それでは, 具体例として内積(dot product)を計算する関数が消費したクロックサイクル数を計測してみます.
(1) 内積を求める関数です. |
|||||||||
| 5. 参考文献 |
|||||
|
|||||
| 6. 改訂履歴 |
|||||||
|
|||||||
Copyright © 2002 yosirin-hello All rights
reserved.