このコードが正確に何をするのかわかりません:
int rdtsc(){
__asm__ __volatile__("rdtsc");
誰か説明してくれませんか?なぜ「rdtsc」なのですか?
実際、それはあまり良いコードではありません。
RDTSC
x86命令「ReadD TimeStamp Counter」です。プロセッサのクロックサイクルごとにカウントアップする64ビットカウンターを読み取ります。
しかし、これは 64 ビットの数値であるため、EAX
(下位部分) とEDX
(上位部分) に格納されます。このコードがインライン化されている場合に使用されたとしても、コンパイラはそれが上書きされていることを知りませんEDX
。void
または、インライン アセンブリが非関数の最後に落ちる前に EAX を設定します。
コンパイラはアセンブラ コードを「理解」しません。これは入力/出力オペランドで記述しなければならないブラック ボックスであり、出力が にあることを認識しEDX:EAX
ます。(または、上書きされた状態での出力EAX
) EDX
。私はこれを行います:
uint64_t rdtsc()
{
uint32_t hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (uint64_t)lo)|( ((uint64_t)hi)<<32 );
}
したがって、最新のマシンで1秒または2秒ごとにラップアラウンドしない時間カウントを提供し、asm
ステートメントの変更を登録するコンパイラーに通知します。
または、__rdtsc()
組み込み関数を使用して、コンパイラにrdtsc
命令自体を発行させ、出力がどこにあるかを認識させます。CPU サイクル数を取得しますか?を参照してください。.