this SO thread से लिया गया, कोड का यह टुकड़ा सीपीयू चक्रों की संख्या //1
और //2
के बीच चल रहे कोड को समाप्त कर देता है।यह कोड कैप्चर किए गए 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()
फ़ंक्शन कैसे काम करता है?
'" = एक "' भाग क्या करता है? – Lazer
इसमें कुछ मोल्टिकोर एएमडी प्रोसेसर पर भी समस्याएं हैं, क्योंकि उनमें से प्रत्येक का अपना काउंटर सिंक्रनाइज़ नहीं होता है, इसलिए यदि आप टाइमस्टैम्प लेते समय अलग-अलग कोरों पर दौड़ते हैं, तो आपको आश्चर्य हो सकता है। तो, इस थ्रेड के लिए ओएस से एक ही कोर पर चलने के लिए एक अच्छा विचार होगा। – ruslik
@ लाज़र, यह एक छोटा जीसीसी जादू है जो कहता है कि ईडीएक्स में मूल्य: ईएक्स को सी चर एक्स में रखा जाना चाहिए - http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints । इंटेल सेक्शन के तहत "ए" एंट्री देखें। – dsolimano