2010-10-09 24 views
10

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() फ़ंक्शन कैसे काम करता है?

उत्तर

11

फ़ंक्शन x86 निर्देश RTDSC निष्पादित करता है, जो 0x0f, 0x31 का ऑपोड होता है। प्रोसेसर घड़ी चक्रों को आंतरिक रूप से ट्रैक रखता है, और यह उस संख्या को पढ़ता है।

बेशक, यह केवल x86 procs पर काम करता है, अन्य प्रोसेसर को विभिन्न निर्देशों की आवश्यकता होगी।

टाइम स्टाम्प काउंटर पेंटियम के बाद से सभी x86 प्रोसेसर पर 64-बिट रजिस्टर मौजूद है। यह रीसेट के बाद से टिक की संख्या की गणना करता है। निर्देश आरडीटीएससी ईडीएक्स में टीएससी लौटाता है: ईएक्स। इसका ऑपोड 0 एफ 31 है। [1] पिक्सियम प्रतियोगियों जैसे कि साइरिक्स 6x86 में हमेशा एक टीएससी नहीं था और आरडीटीएससी को एक अवैध निर्देश पर विचार कर सकते हैं। साइरिक्स में उनके एमआईआई में टाइम स्टाम्प काउंटर शामिल था।

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

+0

'" = एक "' भाग क्या करता है? – Lazer

+2

इसमें कुछ मोल्टिकोर एएमडी प्रोसेसर पर भी समस्याएं हैं, क्योंकि उनमें से प्रत्येक का अपना काउंटर सिंक्रनाइज़ नहीं होता है, इसलिए यदि आप टाइमस्टैम्प लेते समय अलग-अलग कोरों पर दौड़ते हैं, तो आपको आश्चर्य हो सकता है। तो, इस थ्रेड के लिए ओएस से एक ही कोर पर चलने के लिए एक अच्छा विचार होगा। – ruslik

+0

@ लाज़र, यह एक छोटा जीसीसी जादू है जो कहता है कि ईडीएक्स में मूल्य: ईएक्स को सी चर एक्स में रखा जाना चाहिए - http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints । इंटेल सेक्शन के तहत "ए" एंट्री देखें। – dsolimano