2009-03-25 13 views
6

ऑपरेटिंग सिस्टम के लिए यह निर्धारित करना संभव है कि स्मृति का एक पृष्ठ DRAM में है या स्वैप में है; उदाहरण के लिए, बस इसे एक्सेस करने का प्रयास करें और यदि कोई पृष्ठ गलती होती है, तो यह नहीं था।यह निर्धारित करें कि स्मृति स्थान CPU कैश में है

हालांकि, सीपीयू कैश के साथ भी वही बात संभव है?

क्या यह बताए जाने का कोई प्रभावी तरीका है कि किसी दिए गए मेमोरी स्थान को कैश लाइन में लोड किया गया है, या यह जानने के लिए कि यह कब होता है?

उत्तर

6

सामान्यतः, मुझे नहीं लगता कि यह संभव है। यह डीआरएएम और पेजफाइल के लिए काम करता है क्योंकि यह एक ओएस प्रबंधित संसाधन है, कैश को सीपीयू द्वारा ही प्रबंधित किया जाता है।

ओएस एक मेमोरी पढ़ने का एक कसौटी समय लूप कर सकता है और यह देखने का प्रयास कर सकता है कि क्या यह कैश में होने के लिए पर्याप्त तेज़ हो जाता है या अगर इसे मुख्य मेमोरी में जाना पड़ता है - यह बहुत ही त्रुटि प्रवण होगा।

बहु-कोर/बहु-प्रो सिस्टम पर, cache coherency protocols हैं जिनका उपयोग प्रोसेसर के बीच एक दूसरे के कैश को अमान्य करने की आवश्यकता के निर्धारण के लिए किया जाता है, मुझे लगता है कि आपके पास एक कस्टम डिवाइस हो सकता है जो इस प्रोटोकॉल को स्नूप करेगा पूछताछ करेंगे।

आप क्या करने की कोशिश कर रहे हैं? यदि आप मेमोरी में कुछ मजबूर करना चाहते हैं, तो मौजूदा x86 प्रोसेसर गैर-अवरुद्ध तरीके से कैश में प्रीफेचिंग मेमोरी का समर्थन करते हैं, उदाहरण के लिए विजुअल सी ++ के साथ आप कैश में लाइन लाने के लिए _mm_prefetch का उपयोग कर सकते हैं।

संपादित करें: मैंने इसे स्वयं नहीं किया है, इसलिए अपने जोखिम पर उपयोग करें। प्रोफाइलिंग के लिए कैश मिस निर्धारित करने के लिए, आप कुछ आर्किटेक्चर-विशिष्ट रजिस्टरों का उपयोग करने में सक्षम हो सकते हैं। http://download.intel.com/design/processor/manuals/253669.pdf, परिशिष्ट ए "प्रदर्शन ट्यूनिंग घटनाक्रम" देता है। इसका उपयोग यह निर्धारित करने के लिए नहीं किया जा सकता है कि कैश में कोई व्यक्तिगत पता है या कैश में लोड होने पर, लेकिन समग्र आंकड़ों के लिए इसका उपयोग किया जा सकता है। मेरा मानना ​​है कि यह vTune (इस स्तर के लिए एक अभूतपूर्व प्रोफाइलर) का उपयोग करता है।

+0

धन्यवाद प्रदान करेगा। मुझे दिलचस्पी है क्योंकि मैं लेखन कर्नेल के साथ चारों ओर घूम रहा हूं। मुझे वास्तविक हार्डवेयर पर कैश लाइन मिस प्रोफाइलिंग में दिलचस्पी है। मुझे एहसास नहीं हुआ कि वे आधुनिक CPUs पर कितने हानिकारक हैं जब तक कि मैंने हर्ब सटर की स्लाइड नहीं देखी: http://is.gd/oWwp –

+0

हार्डवेयर में इसे प्रोफाइल करने के तरीके हैं, vtune करता है। – Michael

+0

बहुत सारे आधुनिक सीपीयू में प्रदर्शन काउंटर हैं जो कैश से संबंधित आंकड़ों सहित सभी प्रकार की जानकारी प्रदान कर सकते हैं। – sigjuice

6

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

यह उन मामलों में से एक है जो वैज्ञानिक सिद्धांत को प्रतिबिंबित करते हैं कि आप जो माप रहे हैं उसे प्रभावित किए बिना कुछ माप नहीं सकते हैं।

+0

अच्छा, यह सत्यापित करना बहुत आसान है कि कैश में एक स्थान * है *। बस इसे पढ़ें, और voila, यह कैश में होगा। ;) यह चाल परीक्षण में है कि कैश में कुछ * नहीं * है। :) – jalf

+1

यदि आप सुनिश्चित करते हैं कि आपका कोड अनचाहे स्मृति से चल रहा है, तो प्रोग्राम चलाने का केवल कार्य कैश को प्रभावित नहीं करेगा। –

+0

अच्छा अंक। तो मूल रूप से मुझे यह जानने के लिए कि क्या कैश मिस ने प्रश्न में स्मृति को लोड किया है या नहीं, सबकुछ के लिए मुझे खाता लेना होगा। –

1

X86 न जानते हैं कि कैसे पता कैश में है, लेकिन यहाँ

rdtsc 
save timestamp 
mov eax,address 
rdtsc read timestamp counter 
calculate timestamp difference 
if < threshold then was in cache 

सीमा प्रलेखन से निर्धारित किया जाना है या अनुभव

कुछ मशीनों का पता कैश में गया था, तो कैसे बताने के लिए है अगर यह बताने के लिए कैश हिट/मिस काउंटर है जो समान रूप से

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