2015-06-15 9 views
6

मैं एक कर्नेल मॉड्यूल में दो समय बिंदुओं के बीच घड़ी काउंटर के अंतर को मापने की कोशिश कर रहा हूँ। मैं get_ccnt() नामित निम्नलिखित फ़ंक्शन का उपयोग एक निश्चित समय पर एक घड़ी काउंटर मूल्य प्राप्त करने के:मल्टीकोर घड़ी काउंटर स्थिरता

static __inline__ long long int get_ccnt(void) 
{ 
    #if defined(__i386__) 
     long long int x; 
     __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 
     return x; 

    #elif defined(__x86_64__) 
     unsigned int hi, lo; 
     __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi)); 
     return ((long long int)lo)|(((long long int)hi)<<32); 

    #endif 
} 

क्या मैं चिंता का विषय है, मैं हिमाचल प्रदेश EliteBook 2530p का उपयोग कर रहा है, जिसमें इंटेल कोर 2 डुओ SL9400 (spec. reference)

मैंने सुना है कि Nehalem के बाद CPUs सभी कोरों पर लगातार घड़ी काउंटर है। (यदि मुझे गलत लगता है, तो कृपया इसे इंगित करें।) लेकिन, इंटेल कोर 2 डुओ SL 9400 का कोड नाम Penryn है।

इस प्रकार, मुझे लगता है कि एक कर्नेल मॉड्यूल एक और करने के लिए दो समय बिंदुओं के बीच, तो दो कोर के बीच स्थिरता समझौता किया है एक कोर से ले जाता है और मैं एक सही घड़ी अंतर नहीं प्राप्त कर सकते हैं।

यह सही है कि मैं क्या सोच रहा हूँ? यदि ऐसा है, तो इसे ठीक करने का कोई तरीका है (उदाहरण के लिए कोर को कोर को स्थानांतरित करने के लिए कर्नेल मॉड्यूल को ठीक करें?)

+0

मुझे पता चला [इस] (https://aufather.wordpress.com/2010/09/08/high-performance-time-measuremen-in-linux/) लेख। – LPs

+0

बहुत बहुत धन्यवाद। ऐसा लगता है कि वह किसी प्रोसेसर को एक निश्चित CPU एफ़िनिटी को बाध्य करके समस्या को हल करने का प्रयास करता है। मैं इसे बाद में कोशिश करूँगा। – Jeon

+0

आपका ऐप बहु-थ्रेडेड होने पर भी "कोर के बीच स्विचिंग" नहीं होना चाहिए। (प्रत्येक थ्रेड स्वतंत्र रूप से चलता है।) यदि विभिन्न कोरों पर दो धागे को प्रोफाइल करने का प्रयास कर रहे हैं, तो आप प्रत्येक कोर के उपयोग को स्वतंत्र रूप से समय दे सकते हैं और कुल परिणामों को एक साथ जोड़ सकते हैं। (मान लीजिए कि आप आरडीटीएससी के साथ रहना चाहते हैं।) या सभी धागे को उसी कोर पर बल दें। अन्यथा, मुख्य धागे पर आरडीटीएससी करने से किसी अन्य धागे की परवाह किए बिना, उस थ्रेड पर वापस जाने के लिए सही समय बीतने चाहिए। हालांकि यह लगभग हर मामले में जिटर देगा, क्योंकि कर्नेल/ओएस आवंटित करता है और फिट बैठता है। – rdtsc

उत्तर

1

लिंक से जुड़ी टिप्पणियों में से एक का उल्लेख है कि प्रक्रिया संबंध स्थापित करने से आप जो चाहते हैं उसे प्राप्त कर सकते हैं। मैं भी जिससे RDTSCP साथ RDTSC जगह get_ccnt() के एक कस्टम संस्करण बनाने का सुझाव देते हैं। उत्तरार्द्ध पूर्व का एक रूप है जो चक्र काउंटर के साथ सीपीयूड भी देता है। आप जांच सकते हैं कि आपका प्रारंभिक माप का cpuid अंतिम माप के cpuid के बराबर है।

this Intel manual की धारा 3.2 पर एक नज़र डालें। यह सुनिश्चित करने के लिए कि आपका प्रोसेसर इस निर्देश का समर्थन करता है, पहले परीक्षण करना सुनिश्चित करें।

संबंधित मुद्दे