10
取自this SO thread,這段代碼計算行//1
和//2
之間的運行代碼所耗用的CPU週期數。這段代碼如何計算經過的CPU週期數?
$ 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()
功能工作?
什麼是' 「= A」'的一部分嗎? – Lazer 2010-10-10 06:25:45
它在一些molticore AMD處理器上也有問題,因爲它們每個都有自己的計數器不同步,所以如果你碰巧在不同的內核上運行時間戳,你可能會有驚喜。因此,要求操作系統的這個線程運行在同一個核心上是一個好主意。 – ruslik 2010-10-10 10:54:27
@Lazer,這是一個有點GCC魔術,說EDX中的值:EAX應該放入C變量x - http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints 。查看英特爾部分下的「A」條目。 – dsolimano 2010-10-10 18:58:55