Lấy từ this SO thread, đoạn mã này tính toán số chu kỳ CPU đã trôi qua chạy mã giữa các dòng //1
và //2
.Mã này tính toán số chu kỳ CPU đã trôi qua như thế nào?
$ 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
$
Chức năng rdtsc()
hoạt động như thế nào?
nào ' "= A"' phần làm gì? – Lazer
Nó cũng có vấn đề đối với một số bộ xử lý AMD cực đoan, bởi vì mỗi bộ đếm của nó không được đồng bộ, vì vậy nếu bạn tình cờ chạy trên các lõi khác nhau khi bạn lấy dấu thời gian, bạn có thể có bất ngờ. Vì vậy, yêu cầu hệ điều hành cho thread này chạy trên cùng một lõi sẽ là một ý tưởng tốt. – ruslik
@Lazer, đó là một chút phép thuật GCC mà nói rằng các giá trị trong EDX: EAX nên được đặt vào biến C x - http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints . Nhìn vào mục "A" trong phần Intel. – dsolimano