सीपीयू कैश (सी में) के लिए अनुकूलन करते समय क्या महत्वपूर्ण है?


13

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

सीपीयू कैश काम करने के तरीके के बारे में मुख्य बिंदु क्या हैं इसलिए मैं कोड लिख सकता हूं जो इसे समझदारी से उपयोग करता है? संबंधित, क्या कोड को देखने का एक तरीका है कि क्या खराब कैश उपयोग चीजों को धीमा कर रहा है?


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

जवाबों:


17

+1 के लिए "उन चीजों को रखें जिन्हें एक-दूसरे के बगल में एक साथ एक्सेस किया जाएगा"; यह एक ऐसा है जिसे भूलना आसान है।
डोनल फैलो

और कंपाइलर को ऑप्टिमाइज़ करने के लिए कहें।
राइटफॉल्ड

@TP: सही - जोड़ा गया।
माइकल बॉर्गवर्ड

इसके अलावा म्यूटेक्स को अच्छी तरह से अलग रखें। सभी CPU में, सभी कैश लाइनों को फ्लश करने के लिए एक म्यूटेक्स (चाहिए) को बदलना। यदि आप एक ही कैश लाइन में 2-3 म्यूटेक्स प्राप्त करने में कामयाब रहे तो यह एक बड़ा प्रदर्शन हो सकता है।
वेटिन

12

इस मुद्दे की गहनता इन दिनों मानवीय समझ से परे है। (यह पिछले 5 वर्षों से इस तरह से है।) कम-सदिश समानता (SIMD) के साथ संयोजन करें और आपको आशा है कि हाथ से कोड का अनुकूलन अब आर्थिक रूप से संभव नहीं है - ऐसा नहीं है कि यह संभव नहीं है, लेकिन अब लागत प्रभावी नहीं है।

वर्तमान दृष्टिकोण कंप्यूटर को सिखाने पर निर्भर है कि कैसे अनुकूलन करें - विभिन्न संरचनाओं (लूप, डेटा संरचना, एल्गोरिदम) के साथ एक ही उत्तर की गणना करने वाले कोड के रूपांतर करके और स्वचालित रूप से प्रदर्शन का मूल्यांकन करें। कोड परिवर्तन के नियम एक बहुत ही कठोर गणितीय मॉडल के साथ निर्दिष्ट किए गए हैं, ताकि यह कुछ ऐसा हो जिसे कंप्यूटर वैज्ञानिक समझ सकें और कंप्यूटर निष्पादित कर सकें।

निम्नलिखित उनके एक उत्तर में लैरी ओब्रायन द्वारा पोस्ट की गई लिंक है

http://onward-conference.org/2011/images/Pueschel_2011_AutomaticPerformanceProgramming_Onward11.pdf


2
सबसे तेज बीएलएएस कार्यान्वयन (गोटोब्लास) मैट्रिक्स गुणा के लिए अधिकतम कैश उपयोग सुनिश्चित करने के लिए हाथ से अनुकूलित कोड का उपयोग करता है
क्वांट_देव

2

कैश के लिए समझना और अनुकूलित करना काफी संभव है। यह हार्डवेयर को समझने के साथ शुरू होता है और सिस्टम के नियंत्रण में रहने के साथ जारी रहता है। सिस्टम पर आपका जितना कम नियंत्रण होगा, आपके सफल होने की संभावना उतनी ही कम होगी। लिनक्स या विंडोज अनुप्रयोगों / थ्रेड्स का एक गुच्छा जो निष्क्रिय नहीं हैं।

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

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

आप आसानी से अपनी स्मृति का प्रबंधन नहीं करके कैश को बेकार बना सकते हैं। उदाहरण के लिए, यदि आपके पास कई डेटा ब्लॉक हैं जिन्हें आप संसाधित कर रहे हैं, तो उन्हें कैश में रखने की उम्मीद है, लेकिन वे उन पते पर स्मृति में हैं जो कैश हिट / मिस चेकिंग के सापेक्ष भी हैं, 0x10000 0x20000 0x30000 कहते हैं, और आपके पास अधिक है कैश में इन तरीकों की तुलना में, आप बहुत तेज़ी से कुछ ऐसा बना सकते हैं जो कैश पर बहुत धीमी गति से चलता है, यह कैश बंद होने की तुलना में धीमा होगा। लेकिन इसे बदलकर शायद 0x10000, 0x21000, 0x32000 और जो कि कैश का पूरा फायदा उठाने के लिए पर्याप्त हो, बेदखली को कम कर सकता है।

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

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


1

दोनों nwong और माइकल Borgwardt के जवाब अच्छी सलाह देते हैं।

इसके अलावा, इन मुद्दों पर पहले कंपाइलर के अनुकूलन पर भरोसा करें।

यदि हाल ही में जीसीसी संकलक का उपयोग किया गया है, तो आप इसका उपयोग (पार्सिमनी के साथ) कर सकते हैं __builtin_prefetchस्टैकओवरफ़्लो पर यह उत्तर देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.