2013-02-22 10 views
6

मैं सी # में काम कर रहा हूं और यदि संभव हो तो unsafe कोड से बचना चाहता हूं। यदि मेरे पास एक ऑब्जेक्ट या सरणी है जिसे कैश लाइन भरने के लिए आकार दिया गया है और मैं ऑब्जेक्ट के ऑब्जेक्ट या इंडेक्स के प्रत्येक फ़ील्ड को लिखना चाहता हूं, तो क्या सीपीयू लिखित-टू-लाइन को फ्लश करने से पहले सभी लिखने के लिए प्रतीक्षा करेगा या क्या यह शुरुआती फ्लश करेगा जब केवल एक या कुछ लिखने आए हैं?एक सीपीयू कैश लाइन लिखने के बाद स्मृति में फ़्लश कब होती है?

यदि मैं फ्लश करना चाहता हूं तो केवल एक बार लाइन पर लिखने के बाद ही, क्या मुझे जल्दी उत्तराधिकार में दिनचर्या के अंत में सभी लिखना चाहिए? मुझे पता है कि सीपीयू और कैश समेकन प्रोटोकॉल इस पर भिन्न हो सकते हैं, मैं अंगूठे के जवाब के आम तौर पर सही नियम की तलाश में हूं।

+0

आप क्या लिख ​​रहे हैं, आप इसे कहां लिख रहे हैं, और आप लिखने के लिए क्या उपयोग करते हैं? –

+0

नहीं, आपको इसके बारे में गलत विचार मिला है। एक के लिए, आप यह नियंत्रित नहीं कर सकते कि .NET ऑब्जेक्ट कैश लाइन कैसे फैलाता है। आपके पते पर प्रत्यक्ष नियंत्रण नहीं है, जीसी ढेर आवंटक ऐसा करता है। संरेखण x86 पर केवल 4 है, 8 x64 पर 8 और कैश लाइन 64 बाइट्स है। इसके अलावा, कचरा कलेक्टर ढेर को संकलित करता है ताकि पता यादृच्छिक रूप से बदल सके। बैक लिखें जब कैश लाइन प्रतिस्थापित होने वाली है।कुछ और आप सीधे खुद को प्रभावित नहीं कर सकते हैं। –

+0

मुझे पता है कि मैं सीधे नियंत्रित नहीं कर सकता कि जीसी आवंटक मेरी वस्तुओं को कैसे आवंटित करता है, लेकिन मुझे लगता है कि यदि मेरे पास ऑब्जेक्ट कैश लाइन के समान आकार है तो मुझे लगता है कि जीसी पूरी वस्तु को एकल में लोड करने की अधिक संभावना है कैश लाइन, नहीं? आवंटक वस्तु को तोड़ने की संभावना नहीं है। यह ठीक है अगर जीसी इसे चारों ओर ले जाना चाहता है, लेकिन अगर पूरी चीज कैश लाइन में ठीक से फिट बैठती है, तो मुझे लगता है कि जीसी इसे कैश लाइनों में तोड़ नहीं देगा, कम से कम ज्यादातर समय नहीं। – hatch22

उत्तर

1

स्वाभाविक रूप से सीपीयू के रूप में कुछ स्मृति संभव के रूप में पहुँचता बनाने की कोशिश करेंगे, लेकिन जरूरी मतलब नहीं है कि कि "अपने" स्मृति के ब्लॉक के रूप में जब तक आप इसे करना चाहते हैं कैश में रखा जाएगा।

आम तौर पर स्मृति ब्लॉक एक बार पढ़ा जाएगा और एक बार लिखा जाएगा, लेकिन इसके लिए कोई गारंटी नहीं है। कुछ ऐसा हो सकता है जो आपके कोड को बाधित करता है, और सिस्टम किसी अन्य चीज़ के लिए जगह बनाने के लिए उस कैश लाइन को फ्लश करने का निर्णय ले सकता है। पूरे मेमोरी एरिया को पूरी तरह से स्मृति से हटाया जा सकता है और डिस्क पर फिसल जा सकता है, ताकि जब आपका कोड contines हो, तो यह पेज गलती का कारण बन जाएगा जो स्मृति को फिर से लोड करेगा।

अपने लेखन समय के करीब होने के कारण निश्चित रूप से यह सुनिश्चित होगा कि उस ऑपरेशन की अवधि के लिए स्मृति को कैश में रखा जाएगा।

+0

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

+0

@ हैच 22: यह उस पर निर्भर करेगा कि कौन सी मेमोरी कोड के बीच कोड का उपयोग कर रही है, इतना समय नहीं है कि कितना समय लगता है। – Guffa

+0

हां, अगर मैं बीच में पूरी तरह से अलग चीजों तक पहुंच रहा था तो यह परेशानी होगी। – hatch22

2

क्या सीपीयू लिखित-रेखा को फ्लश करने से पहले सभी लिखने के लिए प्रतीक्षा करेगा या क्या यह केवल एक या कुछ लिखने के बाद शुरू हो जाएगा?

सीपीयू लाइन को जल्दी ही फ्लश कर सकता है, लेकिन केवल तभी यह सेट कैश में मौजूद अन्य एक्सेस से उच्च दबाव में है। यह असंभव है। कैश को हाल ही में एक्सेस किए गए डेटा को समय-समय पर फ़्लश करने से बचने में मदद के लिए संरचित किया गया है।

क्या मुझे त्वरित उत्तराधिकार में दिनचर्या के अंत में सभी लिखना चाहिए?

सामान्य हां में। टेम्पोरल इलाके महत्वपूर्ण है, जिसका मतलब है कि कैश सबसे अच्छा प्रदर्शन करते हैं जब एक्सेस समय पर बारीकी से समूहित होते हैं। अन्य चाल भी लागू हो सकती हैं। उदाहरण के लिए, आप आवश्यक लेखन के पहले अपनी संरचना में डमी लिखकर कैश लाइन को 'गर्म' करने का प्रयास कर सकते हैं। यह कुछ स्मृति स्तर समांतरता की अनुमति देता है जिसमें कोड निष्पादित करने के दौरान कोर कैश लाइन लोड करता है। जब तक आप वास्तविक लिखते हैं, तो संभावना बेहतर होती है कि कैश लाइन एल 1 में तैयार हो जाएगी।

सामान्य रूप से, कैश प्रदर्शन में सुधार के लिए अपने कोड में अप्राकृतिक कृत्यों के बारे में बहुत सावधान रहें। कैश सिर्फ एक सुंदर काम करते हैं जो खुद को छोड़ दिया जाता है। आपको किसी भी बदलाव से पहले और बाद में हमेशा माप प्रदर्शन करना चाहिए। आपको लगता है कि एक सुधार हो सकता है वास्तव में चोट लग सकती है। यदि आपका प्रोग्राम बहु-थ्रेडेड है, तो कोर के बीच कैश विवाद के साथ कीड़े का एक और बड़ा हिस्सा खेलता है।

+0

समयपूर्व अनुकूलन के बारे में विधिवत नोट किया गया। मैं सिर्फ अपनी ऑब्जेक्ट्स को आम तौर पर कैश अनुकूल बनाना चाहता हूं क्योंकि मैं बड़ी मात्रा में समान आकार की वस्तुओं पर काम कर रहा हूं जो एक दूसरे के साथ अधिक या कम यादृच्छिक रूप से (एक गेम में 2 डी टक्कर पहचान स्थिति अपडेट) के साथ बातचीत करेंगे। मुझे लगता है कि एक कैश लाइन में आकार देने वाली टक्कर वाली वस्तुएं कई कोरों में अनावश्यक थ्रैशिंग से बचकर प्रदर्शन में मदद कर सकती हैं। – hatch22

+0

@ हैच 22 - मुझे नहीं पता कि आप इनमें से किसी भी को सी # से कैसे नियंत्रित करते हैं, लेकिन 64 बी के तहत वस्तुओं को रखने से कोई दिक्कत नहीं होगी। यदि आपके पास एकाधिक धागे हैं, तो स्थानिक प्रीफेचिंग के लिए देखें। लाइन एक्स को छूते समय, कोर का प्रीफेच लॉजिक लाइन एक्स + 1 (और एक्स + 2) भी ले सकता है। यदि कोई अन्य कोर X + 1 को छू रहा है, तो आप सीधे विवाद से बचने के बावजूद थ्रैशिंग प्राप्त करेंगे। – srking

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