Pentium系のプロセッサにはタイムスタンプカウンタというカウンタがある。実は多くのアーキテクチャでこの手のカウンタはあるのだが、Pentium系のカウンタは64ビット幅なので、かなり時間が経ってもオーバフローすることが少なく使いやすいのである。
ちなみに、64ビットマシンのAlphaプロセッサでは設計者は何を思ったか32ビットのタイムスタンプカウンタにしてしまったので、長い時間の計測には全く使い物にならなかったのであった。
AMD64アーキテクチャにも当然ながらこのカウンタは継承されていて、命令の使い方は良く似ている。
が、64ビット値を読み出すというところで、32ビットマシンであるIA32とAMD64で高級言語からデータの読み出しをするときに注意が必要である。
64ビットの値を受け渡すのには、IA32ではEAX/EDXのペアでデータを渡すようにしているのであるが、64ビットアーキテクチャのAMD64が普通にC言語から64ビットデータを取得する時には、当然ながら1つのレジスタで読み出せるのである。
その部分が、トラブルの種になる。
RDTSC命令は、IA32との互換性を考えて、AMD64でもEAX/EDXペアにカウント値を読み出すので、64、32ビット共用の読み出し関数はこの点を考慮しないといけない。
inline long long rdtsc() {
int ax,dx;
asm(“rdtsc”:”=a”(ax),”=d”(dx));
return ((long long)dx<<32 | ax);
}
このカウンタ、実は利用時に注意が必要である。
というのは、単にクロック数をカウントしているだけのカウンタなので、ノートPCなどでSpeedStepをONにしていると、マシンの負荷状況によってクロック周波数が異なり、実時間に変換するときに、計測時点での実クロック周波数を読み出す手段がないと変換できないのである。
SpeedStepを用いていなければ何の問題もないのであるが・・
アセンブラから逃れたくて…
行き着いた先はやはりアセンブラ。 — 一昨日の続き 結局アルゴリズムの変化に…
コメント by Lyo.blog — 2006年7月28日 @ 1:31 AM