2009-02-22 7 views
8

मैं सी में कुछ बहुत ही कम संचालन के लिए कुछ माइक्रो-बेंचमार्किंग कोड लिख रहा हूं। उदाहरण के लिए, एक चीज जिसे मैं माप रहा हूं वह है कि पास किए गए तर्कों की संख्या के आधार पर खाली फ़ंक्शन को कॉल करने के लिए कितने चक्र की आवश्यकता है।इंटेल कोर 2 डुओ की निर्देश पाइपलाइन निकालें?

वर्तमान में, मैं सीपीयू की चक्र गणना प्राप्त करने के लिए प्रत्येक ऑपरेशन से पहले और बाद में आरडीटीएससी निर्देश का उपयोग कर रहा हूं। हालांकि, मुझे चिंता है कि पहले आरडीटीएससी से पहले जारी किए गए निर्देश वास्तविक मापों को धीमा कर सकते हैं जिन्हें मैं माप रहा हूं। मैं भी चिंतित हूं कि दूसरे आरडीटीएससी जारी होने से पहले पूरा ऑपरेशन पूरा नहीं हो सकता है।

क्या किसी को x86 निर्देश के बारे में पता है जो किसी भी नए निर्देश जारी किए जाने से पहले सभी इन-फ्लाइट निर्देशों को प्रतिबद्ध करने के लिए मजबूर करता है? मुझे बताया गया है कि सीपीयूआईडी ऐसा कर सकता है, लेकिन मैं ऐसा कोई दस्तावेज नहीं ढूंढ पाया जो ऐसा कहता है।

उत्तर

9

मेरे ज्ञान के लिए, कोई निर्देश नहीं है जो विशेष रूप से पाइपलाइन को "नाली" करता है। एक धारावाहिक निर्देश का उपयोग करते हुए इसे आसानी से पूरा किया जा सकता है।

सीपीयूआईडी एक क्रमबद्ध निर्देश है, जिसका अर्थ है कि आप वास्तव में क्या खोज रहे हैं। इसके पहले प्रत्येक निर्देश मुद्दे को CPUID निर्देश से पहले निष्पादित करने की गारंटी है।

तो निम्नलिखित कर वांछित प्रभाव मिलना चाहिए:

cpuid 
rdtsc 
# stuff 
cpuid 
rdtsc 

, एक के रूप में अलग लेकिन, मुझे सलाह नहीं देते आप यह करते हैं कि। आपकी "सामग्री" अभी भी आपके नियंत्रण के बाहर कई अन्य चीजों से प्रभावित हो सकती है (जैसे सीपीयू कैश, सिस्टम पर चल रही अन्य प्रक्रियाएं आदि), और आप कभी भी उन सभी को खत्म करने में सक्षम नहीं होंगे। सटीक प्रदर्शन आंकड़े प्राप्त करने का सबसे अच्छा तरीका ऑपरेशन (ओं) को कम से कम कई मिलियन बार मापना है और बैच के निष्पादन समय को औसत करना है।

संपादित करें: CPUID के लिए अधिकांश निर्देश संदर्भ इसकी धारावाहिक गुणों का उल्लेख करेंगे, जैसे NASM manual appendix B

संपादित करें: this related question पर भी एक नज़र डालना चाहेंगे।

+1

आप बाड़ निर्देशों के बारे में सही हैं। सीपीयूआईडी वास्तव में उन्हें इंगित करता है (मैंने इसके बारे में मेरा जवाब हटा दिया है)। ध्यान दें कि CPUID क्रमबद्ध होने पर, यह कैश को साफ़ नहीं करता है, जो प्रदर्शन को भी प्रभावित कर सकता है। डब्ल्यूबीआईएनवीडी के साथ कैश को साफ़ किया जा सकता है। आप इसे अपने उत्तर में जोड़ना चाहेंगे। –

+0

wbinvd विशेषाधिकार प्राप्त है ... हालांकि आप clflush का उपयोग कर सकते हैं। पिछले हफ्ते से इस तरह की चीज के बारे में एक अलग सवाल है .... http://stackoverflow.com/questions/558848/can-i-force-cache-coherency-on-a-multicore-x86-cpu/558900# 558900 – SoapBox

+0

ग्रेट उत्तर। धन्यवाद। –

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