كيف يحسب هذا الرمز عدد دورات وحدة المعالجة المركزية؟

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 ، والتي تصادف أن تحتوي على رمز opcode 0x0f, 0x31. يتابع المعالج دورات الساعة داخليًا ، وهذا يقرأ هذا الرقم.

بالطبع ، يعمل هذا فقط على X86 Procs ، ستحتاج المعالجات الأخرى إلى تعليمات مختلفة.

عداد الطوابع الزمنية هو سجل 64 بت على جميع معالجات X86 منذ Pentium. إنه يحسب عدد القراد منذ إعادة تعيين. تعليمات RDTSC إرجاع TSC في edx: eax. رمز Opcode هو 0F 31. [1] لم يكن لدى منافسي Pentium مثل Cyrix 6x86 دائمًا TSC وقد يعتبرون RDTSC تعليمات غير قانونية. شملت Cyrix عداد طابع زمني في MII.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top