2012-01-13 10 views
6

क्या सीपीयू कैश में स्पष्ट रूप से स्थैतिक ऑब्जेक्ट्स बनाना संभव है, यह सुनिश्चित करने के लिए कि वे ऑब्जेक्ट हमेशा कैश में रहते हैं, इसलिए RAM या God forbid - hdd वर्चुअल मेमोरी में सभी तरह तक पहुंचने से कोई प्रदर्शन हिट नहीं लिया जाता है?सी/सी ++ में सीपीयू कैश में स्थैतिक मेमोरी आवंटित करें: क्या यह संभव है?

मैं एल 1, एल 2, निर्देश या किसी अन्य कैश को लक्षित करने का इरादा नहीं रखते, बड़े एल 3 साझा कैश को लक्षित करने में विशेष रुचि रखता हूं, केवल स्मृति की सबसे बड़ी ऑन-डाई चब है।

और इसे पोस्ट करने से पहले मैंने खोजे गए अन्य धागे से अलग होने के लिए स्पष्ट करने के लिए, मुझे पूरे कैश का निजीकरण करने में कोई दिलचस्पी नहीं है, केवल कुछ छोटे, कुछ वर्ग के क्षेत्र के लायक हैं।

+2

मुझे लगता है कि आप सबसे अच्छा कर सकते हैं जीसीसी के [__builtin_prefetch मैक्रो] (http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html) का उपयोग करना है। आईआईआरसी कैश कोड द्वारा एड्रेसेबल नहीं है, सीपीयू इसे स्वयं प्रबंधित करता है (कम से कम x86 पर)। –

+1

किस प्रकार का प्रोसेसर? कुछ आर्किटेक्चर में डेटा की आवश्यकता होने से पहले कैश संकेत देने या कैश प्रीफेच को निर्देशित करने के निर्देश हैं। – TJD

+1

शॉर्ट एवर: नहीं आप नहीं कर सकते। केवल एक चीज जो आप कर सकते हैं वह संदर्भ के इलाके को तंग रखती है। स्मृति में होने की उम्मीद न करें, लेकिन पिछले ऑपरेशन द्वारा उपयोग किए गए डेटा के नजदीक डेटा तक पहुंचने का प्रयास करें। साथ ही: कैश सीमाओं पर आपके डेटा को गठबंधन रखने से आप एक और कैश लाने से बच सकते हैं। बीटीडब्ल्यू कैश * स्लॉट * लगातार नहीं होना चाहिए। X86 पर, आईआईआरसी चार एल 1 स्लॉट और सैकड़ों या हजारों एल 2 स्लॉट हैं। (जिसे आपको मल्टीप्रोसेस मशीन पर अन्य प्रक्रियाओं के साथ साझा करना है)। – wildplasser

उत्तर

12

नहीं कैश पता योग्य नहीं है, इसलिए आप इसमें ऑब्जेक्ट आवंटित नहीं कर सकते हैं।

ऐसा लगता है कि आप पूछना चाहते हैं: वर्चुअल मेमोरी में आवंटित स्थान होने के बाद, क्या मैं यह सुनिश्चित कर सकता हूं कि मुझे हमेशा कैश हिट मिलती है?

यह एक और जटिल सवाल है, और जवाब है: आंशिक रूप से।

इस क्षेत्र को गैर-पेजेबल के रूप में चिह्नित करने के लिए आप अपने ओएस के स्मृति प्रबंधन API (उदा। mlock()) का उपयोग कर डिस्क पर स्वैप किए जाने से बच सकते हैं। या शुरू करने के लिए "गैर-पजे हुए पूल" से आवंटित करें।

मुझे विश्वास नहीं है कि सीपीयू कैश में मेमोरी पिन करने के लिए एक समान एपीआई है। भले ही आप उस ब्लॉक के लिए सीपीयू कैश आरक्षित कर सकें, आप कैश मिस से बच नहीं सकते हैं। यदि कोई अन्य कोर स्मृति को लिखता है, तो स्वामित्व को स्थानांतरित कर दिया जाएगा, और आपको कैश मिस और संबंधित बस स्थानांतरण (संभावित रूप से मुख्य स्मृति, संभवतः अन्य कोर के कैश तक) भुगतना होगा।

जैसा कि मैथ्यू ने अपनी टिप्पणी में उल्लेख किया है, आप पाइपलाइन में अन्य उपयोगी काम के साथ समानांतर में कैश मिस को भी मजबूर कर सकते हैं, ताकि डेटा की आवश्यकता होने पर डेटा कैश में हो।

1

आप एक और धागा चला सकते हैं जो डेटा पर लूप करता है और इसे एल 3 कैश में लाता है।

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