2009-11-18 9 views
43

मुझे विंडोज़ में एक सीपीयू कैश फ्लश को मजबूर करने में दिलचस्पी है (बेंचमार्किंग कारणों के लिए, मैं सीपीयू कैश में कोई डेटा नहीं शुरू करना चाहता हूं), अधिमानतः एक बुनियादी सी कार्यान्वयन या Win32 कॉल।मैं x86 विंडोज़ में सीपीयू कैश फ्लश कैसे कर सकता हूं?

क्या सिस्टम कॉल के साथ ऐसा करने का कोई ज्ञात तरीका है या यहां तक ​​कि कुछ बड़े memcpy कहने के रूप में स्नीकी के रूप में कुछ भी है?

इंटेल i686 प्लेटफार्म (पी 4 और ऊपर भी ठीक है)।

उत्तर

49

सौभाग्य से, वहाँ एक से अधिक एक ही रास्ता स्पष्ट रूप से कैश फ्लश करने के लिए देखते हैं।

निर्देश "wbinvd" संशोधित कैश सामग्री को वापस लिखता है और कैश को खाली करता है। यह बाहरी कैश को अपने डेटा को फ्लश करने के लिए बस चक्र चलाता है। दुर्भाग्य से, यह एक विशेषाधिकार प्राप्त निर्देश है। लेकिन यदि डॉस जैसे कुछ के तहत परीक्षण कार्यक्रम चलाने के लिए संभव है, तो यह रास्ता तय करना है। इसका "ओएस" के कैश पदचिह्न को बहुत छोटा रखने का लाभ है।

इसके अतिरिक्त, "invd" निर्देश है, जो कैश को बिना किसी मुख्य स्मृति में फ़्लश करने के लिए अमान्य करता है। यह मुख्य स्मृति और कैश की समेकन का उल्लंघन करता है, इसलिए आपको इसका ख्याल रखना होगा। वास्तव में अनुशंसित नहीं है।

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

आप Test programs for measuring clock cycles and performance monitoring. पर कम दिनचर्या बेंचमार्किंग

+1

ओह, मैं सही खड़ा हूं, साफ-सुथरा मुझे इस निर्देश के बारे में पता नहीं था। – Falaina

+1

wbinvd निर्देश 2000-5000 घड़ी चक्रों को पूरा करने के क्रम में लेता है! अधिकतर निर्देश औसतन 2-5 लेते हैं। – unixman83

7

सीपीयू को कुछ कैश लाइनों (जैसे CLFLUSH) को फ्लश करने के लिए मजबूर करने के लिए x86 असेंबली निर्देश हैं, लेकिन वे बहुत अस्पष्ट हैं। CLFLUSH विशेष रूप से केवल एल 1 कैश से एक चुने हुए पते को फहराता है।

एक बड़ी मेमकोपी कहने के रूप में चुपके के रूप में कुछ?

हां, यह सबसे आसान तरीका है, और यह सुनिश्चित करेगा कि सीपीयू कैश के सभी स्तरों को फहराएगा। बस अपने बेंचमेकर से कैश फ्लशिंग समय को बाहर निकालें और आपको एक अच्छा विचार होना चाहिए कि आपका प्रोग्राम कैश दबाव के तहत कैसा प्रदर्शन करता है।

+1

के बारे में कुछ संसाधन प्राप्त कर सकते "यकीन है कि कर देगा कि सीपीयू flushes कैश के सभी स्तरों।" जैसा कि मैंने कहा, आधुनिक वाणिज्यिक सीपीयू, विशेष रूप से जब एक ऑपरेटिंग सिस्टम द्वारा सारणित किया गया है, (और शायद ऐसा) बहुत जटिल कैशिंग रणनीतियों के बारे में सच नहीं है। – marr75

+4

मुझे विश्वास है कि आप अन्य ओएस-स्तरीय कैश के साथ सीपीयू कैश को भ्रमित कर रहे हैं। ओएस मूल रूप से कोई भी नहीं कहता है कि सीपीयू कैश करेगा या कैश नहीं करेगा, क्योंकि इन निर्णयों को इतनी जल्दी होने की आवश्यकता है, कर्नेल इंटरप्ट्स या इस तरह के कुछ भी नहीं है। सीपीयू कैश पूरी तरह सिलिकॉन में लागू किया जाता है। – intgr

+1

एक संदर्भ स्विच वास्तव में अन्य प्रक्रियाओं को चलाने देगा और इस प्रकार कैश को प्रदूषित करेगा। लेकिन यह ओएस व्यवहार का सामान्य हिस्सा है - यह बेंचमार्क के साथ या उसके बिना होगा, इसलिए यह आपके समय में वैसे भी शामिल करना समझ में आता है। – intgr

2

दुर्भाग्य से कैश को स्पष्ट रूप से फ़्लश करने का कोई तरीका नहीं है। आपके कुछ विकल्प हैं:

1.) आपके द्वारा बेंचमार्किंग कोड के पुनरावृत्तियों के बीच कुछ बहुत बड़े मेमोरी ऑपरेशंस करके कैश को थ्रैश करें।

2.) x86 Control Registers में अक्षम कैश सक्षम करें और बेंचमार्क करें। यह शायद निर्देश कैश को भी अक्षम कर देगा, जो कि आप जो चाहते हैं वह नहीं हो सकता है।

3.) Non-Temporal instructions का उपयोग करके अपने कोड के हिस्से को अपने बेंचमार्किंग (यदि संभव हो) लागू करें। हालांकि, कैश का उपयोग करने के बारे में प्रोसेसर को संकेत संकेत हैं, फिर भी यह वही करना है जो वह चाहता है।

1 संभवतः आपके उद्देश्यों के लिए सबसे आसान और पर्याप्त है।

संपादित: ओह, मैं ठीक किया मानी 86 कैश रद्द करने के लिए एक निर्देश है, drhirsch के जवाब

+1

आपका दावा है कि कैश फ्लशिंग के लिए कोई निर्देश गलत नहीं है। और बेंचमार्किंग के लिए गैर अस्थायी निर्देशों का उपयोग करके एक नियमित रूप से फिर से लिखना बकवास है। यदि डेटा नियमित रूप से कैश में फिट बैठता है, तो यह बेंचमार्किंग के दौरान धीरे-धीरे रास्ता तय करेगा, माप को बेकार बना देगा। – hirschhornsalz

+0

विंडोज़ से कैश को स्पष्ट रूप से फ़्लश करने का कोई तरीका नहीं है। आपको हार्डवेयर तक सीधी पहुंच से इंकार कर दिया गया है ... गैर-पोर्टेबल असेंबली निर्देश हैं जो इसे कर सकते हैं। – marr75

+2

आप आसानी से विंडोज 95,98, एमई में कर सकते हैं। और यहां तक ​​कि आधुनिक विंडोज वेरिएंट के लिए आप इसे ड्राइवर का उपयोग करके रिंग 0 में कार्यान्वित कर सकते हैं। – hirschhornsalz

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