-1

このコードが正確に何をするのかわかりません:

int rdtsc(){
    __asm__ __volatile__("rdtsc");

誰か説明してくれませんか?なぜ「rdtsc」なのですか?

4

2 に答える 2

9

実際、それはあまり良いコードではありません。

RDTSCx86命令「ReadD TimeStamp Counter」です。プロセッサのクロックサイクルごとにカウントアップする64ビットカウンターを読み取ります。

しかし、これは 64 ビットの数値であるため、EAX(下位部分) とEDX(上位部分) に格納されます。このコードがインライン化されている場合に使用されたとしても、コンパイラはそれが上書きされていることを知りませんEDXvoidまたは、インライン アセンブリが非関数の最後に落ちる前に 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 サイクル数を取得しますか?を参照してください。.

于 2014-05-01T06:05:55.973 に答える