2011-12-23 10 views
11

मैं सी ++ में लिखे गए सिस्टम पर काम कर रहा हूं, जो लिनक्स पर ज़ीऑन पर चल रहा है, जिसे जितनी जल्दी हो सके चलाने की जरूरत है। 10 जीबी से अधिक रैम में आयोजित एक बड़ी डेटा संरचना (मूल रूप से structs की एक सरणी) है, और इसके तत्वों को समय-समय पर उपयोग करने की आवश्यकता है। मैं जितना संभव हो सके सिस्टम के कैशिंग तंत्र के साथ काम करने के लिए डेटा संरचना को संशोधित करना चाहता हूं।ज़ीऑन कितने बाइट प्रति मेमोरी एक्सेस कैश में लाता है?

वर्तमान में, संरचनाओं को ज्यादातर संरचनाओं में यादृच्छिक रूप से किया जाता है, और प्रत्येक बार 1-4 32-बिट इन्स पढ़े जाते हैं। एक ही स्थान पर एक और पढ़ने के पहले यह एक लंबा समय है, इसलिए कैश से कोई फायदा नहीं होता है।

अब मुझे पता है कि जब आप रैम में एक यादृच्छिक स्थान से बाइट पढ़ते हैं, तो बस उस बाइट को कैश में लाया जाता है। मेरा सवाल यह है कि कितने बाइट लाए जाते हैं? क्या यह 16, 32, 64, 40 9 6 है? क्या इसे कैश लाइन कहा जाता है?

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

अपडेट (अक्टूबर 2014): परियोजना के ऊपर सवाल उठाने के कुछ ही समय बाद इसे रोक दिया गया था। इसके बाद से यह फिर से शुरू हो गया है और नीचे दिए गए उत्तरों में सुझावों के आधार पर, मैंने रैम एक्सेस के आसपास कुछ प्रयोग किए हैं, क्योंकि ऐसा लगता है कि टीएलबी थ्रैश हो रहा था। मैंने कार्यक्रमों को विशाल पृष्ठों (मानक 4 केबी के बजाय 2 एमबी) के साथ चलाने के लिए संशोधित किया, और लगभग 2.5% की एक छोटी गति को देखा। मुझे विशाल पृष्ठों here और here के लिए सेट अप करने के बारे में अच्छी जानकारी मिली।

+5

हाँ, कैश लाइन। आप तब तक 64 बाइट्स मान सकते हैं जब तक आपको यह पता न लगे कि आपके पास ज़ीऑन प्रोसेसर मॉडल के दर्जनों दर्जनों हैं। एल 2 और एल 3 कैश भी एक भूमिका निभाते हैं। अनुक्रमिक मेमोरी एक्सेस पर फ़ोकस करें और कुछ भी न मानें।का आकलन करें। –

+0

आपके उत्तरों के लिए सभी को धन्यवाद। –

उत्तर

7

आज के सीपीयू कैश लाइन नामक (आमतौर पर) 64 बाइट्स के टुकड़ों में स्मृति प्राप्त करते हैं। जब आप कोई विशेष स्मृति स्थान पढ़ते हैं, तो संपूर्ण कैश लाइन मुख्य मेमोरी से कैश में लाई जाती है।

अधिक यहाँ: http://igoro.com/archive/gallery-of-processor-cache-effects/

+0

वास्तव में जानकारीपूर्ण लिंक आलेख, @ माइकल। +1। –

2

ओल्ड तो सवाल कुछ जानकारी (विशेष रूप से पहले उत्तर जहां लिनक्स सीपीयू की जानकारी देखने के लिए में है कि आप के लिए काम का हो सकता है कि - प्रत्युत्तर लाइन आकार उचित उल्लेख नहीं है, लेकिन सहयोगीता आदि के शीर्ष पर 'अन्य जानकारी')। प्रश्न x86 के लिए है, लेकिन उत्तर अधिक सामान्य हैं। देखने लायक।

Where is the L1 memory cache of Intel x86 processors documented?

+0

लिंक किए गए प्रश्न, @gnometorule पर उपयोगी टिप्स। +1। –

3

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

+0

आगे बढ़ सकता है, @ गैब्रियल? टीएलबी के लिए क्या खड़ा है, और बड़े पेज कैसे मदद करेंगे? –

+0

लुकसाइड बफर का अनुवाद करें - वे हार्डवेयर पेजिंग कम धीमी (लंबी कहानी, गूगल :)) बनाने में शामिल हैं। एक पृष्ठ, एक टीएलबी प्रविष्टि - सामान्य पृष्ठों (4 किलोबाइट) की तुलना में बड़ी मेमोरी (4 एमईजी या 2 एमईजी, सीपीयू मोड के आधार पर) के साथ मैपिंग करने पर आपको कम टीएलबी प्रविष्टियों की आवश्यकता होती है। – snemarch

+0

टीएलबी "अनुवाद लुकसाइड बफर" के लिए खड़ा है। जब आप मेमोरी एक्सेस करते हैं तो आपको वर्चुअल एड्रेस को भौतिक पते पर अनुवाद करना होगा। यह पृष्ठ ग्रैन्युलरिटी पर किया जाता है और x86 के लिए सामान्य पृष्ठ आकार 4KB है। टीएलबी वर्चुअल से भौतिक पते तक अनुवाद को कैश करता है लेकिन यह अपेक्षाकृत छोटी संरचना है (लगभग 200 प्रविष्टियां)। –

1

आप http://agner.org/optimize/ पर जा सकते हैं और वहां उपलब्ध अनुकूलन पीडीएफ को पकड़ सकते हैं - वहां बहुत अच्छी (निम्न-स्तर) जानकारी है। असेंबली भाषा स्तर पर बहुत ध्यान केंद्रित किया, लेकिन सी/सी ++ प्रोग्रामर के लिए भी सीखने के सबक हैं।

खंड 3, "इंटेल, एएमडी और के माध्यम से CPU की सूक्ष्म-संरचना" ब्याज की होनी चाहिए :-)

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