10

このSOスレッドから取得したこのコードは、行//1との間でコードを実行して経過したCPUサイクル数を計算します//2

$ cat cyc.c 
#include<stdio.h>

static __inline__ unsigned long long rdtsc(void)
{
  unsigned long long int x;
     __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
     return x;
}

int main() {
    unsigned long long cycles = rdtsc(); //1
    cycles = rdtsc() - cycles;           //2
    printf("Time is %d\n", (unsigned)cycles);
    return 0;
}

$ gcc cyc.c -o cyc
$ ./cyc
Time is 73
$ ./cyc
Time is 74
$ ./cyc
Time is 63
$ ./cyc
Time is 73
$

関数はどのようにrdtsc()機能しますか?

4

1 に答える 1

11

この関数は、オペコードがたまたまあるx86命令RTDSCを実行し0x0f, 0x31ます。プロセッサは内部でクロックサイクルを追跡し、これによりその数値が読み取られます。

もちろん、これはx86 procでのみ機能し、他のプロセッサでは異なる命令が必要になります。

タイムスタンプカウンタは、Pentium以降のすべてのx86プロセッサに存在する64ビットレジスタです。リセット後のティック数をカウントします。命令RDTSCは、EDX:EAXでTSCを返します。そのオペコードは0F31です。[1] Cyrix 6x86などのPentiumの競合他社は、必ずしもTSCを持っているわけではなく、RDTSCを違法な命令と見なす可能性があります。CyrixはMIIにタイムスタンプカウンターを含めました。

http://en.wikipedia.org/wiki/Time_Stamp_Counter

于 2010-10-09T22:28:38.240 に答える