組み込まれたエンジニア

我輩は石である。名前はまだ無い。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

RDTSC命令

2006-02-15 00:35:34 | 組込みシステム
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を用いていなければ何の問題もないのであるが・・
ジャンル:
ウェブログ
コメント   トラックバック (1)   この記事についてブログを書く
« 組み込みソフトウェア開発ス... | トップ | インドからのメール »
最近の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

組込みシステム」カテゴリの最新記事

関連するみんなの記事

トラックバック

アセンブラから逃れたくて... (Lyo.blog)
行き着いた先はやはりアセンブラ。 --- 一昨日の続き 結局アルゴリズムの変化に...