2008-10-20 15 views
9

आज जब मैं कंप्यूटर संगठन वर्ग में था, तो शिक्षक ने मुझे कुछ दिलचस्प बताया। जब यह क्यों कैश स्मृति काम करता है के बारे में बात करने के लिए आता है, उन्होंने कहा कि:कैसे कैश मेमोरी काम करता है?

for (i=0; i<M; i++) 
    for(j=0; j<N; j++) 
     X[i][j] = X[i][j] + K; //X is double(8 bytes) 

यह दूसरी के साथ पहली पंक्ति को बदलने के लिए अच्छा नहीं है। इस पर आपकी राय क्या है? और ऐसा क्यों है?

+1

यह पिछले कुछ दिनों में मैंने आपके द्वारा देखा गया तीसरा मूल होमवर्क-प्रकार प्रश्न है। यदि आप संघर्ष कर रहे हैं, तो आप एक शिक्षक को किराए पर लेना चाहेंगे। – tvanfosson

+0

अरे, आदमी! यह होमवर्क नहीं है ... मैंने कक्षा में इस पर ठोकर खाई! चूंकि शिक्षक चीनी में बात कर रहा था, इसलिए मुझे वास्तव में वह नहीं मिला जो वह बात कर रहा था। यही कारण है कि मैं आपसे सभी से पूछना चाहता हूं ... – israkir

+2

हालांकि, अगर यह होमवर्क है, तो मैं अपने द्वारा 'होमवर्क' टैग डाल सकता हूं; जैसा कि मैंने इसे अपने कुछ हालिया प्रश्नों के लिए पहले रखा है ... – israkir

उत्तर

9

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

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

[संपादित करें] उपर्युक्त उत्तर सी के लिए विशिष्ट है और अन्य भाषाओं के लिए भिन्न हो सकता है। केवल एक जिसे मैं जानता हूं वह अलग है फोरट्रान। फोरट्रान कॉलम प्रमुख क्रम में चीजें संग्रहीत करता है (उपरोक्त पंक्ति प्रमुख है) और फोरट्रान में बयानों के क्रम को बदलने के लिए सही होगा। यदि आप दक्षता चाहते हैं/चाहते हैं, तो यह जानना महत्वपूर्ण है कि आपकी भाषा डेटा संग्रहण कैसे लागू करती है।

+0

क्या यह वास्तव में ओएस है जो इसे संभालता है? मैं इस धारणा के तहत था कि प्रोसेसर ने स्वयं अपने कैश को प्रबंधित किया था, और ओएस ने इसे कुछ पृष्ठों के लिए अक्षम कर दिया था, आदि –

+0

"ओएस आम तौर पर स्मृति से एक संपूर्ण पृष्ठ लोड करेगा" - होहो, यह एल 1/एल 2/एल 3 डेटा कैश। यह प्राचीन टीएलयू (एमएमयू) के साथ टीएलबी कैश के लिए आंशिक रूप से सच है जो हार्डवेयर – osgx

7

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

इस विषय के बारे में जानकारी का एक धन उपलब्ध है, उदाहरण के लिए this wikipedia entry on locality of reference देखें। या, मुझे लगता है, आपकी खुद की पाठ्यक्रम पाठ्य पुस्तक। :)

+0

जानकारी के लिए धन्यवाद। अच्छा संसाधन;) – israkir

2

सी में, एन-आयामी मैट्रिस पंक्ति प्रमुख हैं, जिसका अर्थ है कि मैट्रिक्स में अंतिम अनुक्रमणिका स्मृति में आसन्न रिक्त स्थान का प्रतिनिधित्व करती है। यह कुछ अन्य भाषाओं से अलग है, उदाहरण के लिए फोरट्रान, जो कॉलम प्रमुख हैं। FORTRAN में, यह इस तरह एक 2D मैट्रिक्स के माध्यम से पुनरावृति करने के लिए और अधिक कुशल है:

do jj = 1,N 
    do ii = 1,M 
    x(ii,jj) = x(ii,jj) + K; 
    enddo 
enddo 
+0

में पृष्ठ तालिका प्रविष्टि लोड नहीं कर सकता है यह गलत है। Http://en.wikipedia.org/wiki/Row-major_order देखें। सी सरणी पंक्ति प्रमुख हैं और फोरट्रान सरणी कॉलम प्रमुख हैं। – tvanfosson

+0

मुझे लगता है, स्कॉटीटी 812 ने इसे दुर्घटना से गलत लिखा: पी उनके संपादन के लिए प्रतीक्षा कर रहा है;) दिलचस्प पेपर के लिए – israkir

1

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

आपके लूप को आपके पास रखकर, आप बाइट्स को क्रम में पढ़ते हैं ताकि वे स्मृति में संग्रहीत हो सकें। इसका मतलब है कि वे कैश में हैं, और सीपीयू द्वारा बहुत जल्दी पढ़ा जा सकता है। यदि आप लाइन 1 और 2 के चारों ओर बदल जाते हैं, तो आप प्रत्येक बार लूप के चारों ओर हर "एन" बाइट पढ़ेंगे। जो बाइट आप पढ़ रहे हैं वे अब स्मृति में लगातार नहीं हैं, और इसलिए वे कैश में नहीं हो सकते हैं। सीपीयू उन्हें (धीमी) रैम से लाने के लिए है, और इसलिए आपका प्रदर्शन घटता है।

12

रेड हैट और ग्लिबैक प्रसिद्धि के Ulrich Drepper द्वारा एक बहुत अच्छा पेपर है, What Every Programmer Should Know About Memory। एक खंड ने विस्तार से कैश पर चर्चा की। उदाहरण के लिए, एसएमपी सिस्टम में कैश प्रभाव होते हैं जहां सीपीयू एक संशोधित कैश लाइन के पीछे और पीछे, स्वामित्व प्रदर्शन को नुकसान पहुंचाते हैं।

+0

+1 – psihodelia

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