このコードは、CPUサイクルの数をどのように計算しますか?

StackOverflow https://stackoverflow.com/questions/3898107

  •  29-09-2019
  •  | 
  •  

質問

から取られた これはスレッドです, 、このコードは、行間の実行コードを経過したCPUサイクルの数を計算します //1//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() 機能は機能しますか?

役に立ちましたか?

解決

関数はx86命令RTDSCを実行します。 0x0f, 0x31. 。プロセッサは、クロックサイクルを内部的に追跡します。これにより、その数は読み取ります。

もちろん、これはX86 Procでのみ機能し、他のプロセッサは異なる指示が必要です。

タイムスタンプカウンターは、ペンティウム以来、すべてのX86プロセッサに存在する64ビットレジスタです。リセット後のダニの数をカウントします。命令RDTSCは、EDX:EAXのTSCを返します。そのオペコードは0F 31です。[1] Cyrix 6x86などのPentiumの競合他社は常にTSCを持っているわけではなく、RDTSCを違法な指導と見なす場合があります。 Cyrixには、MIIにタイムスタンプカウンターが含まれていました。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top