2010-06-01 10 views
11

मैं जानना चाहता हूं कि एक प्रोग्राम जिसका मैं उपयोग कर रहा हूं और जिसके लिए मेमोरी बैंडविड्थ द्वारा बहुत सारी मेमोरी सीमित है।स्मृति बैंडविड्थ द्वारा सीमित प्रोग्राम कब होता है?

आप यह कब होने की उम्मीद करते हैं? क्या यह वास्तविक जीवन परिदृश्य में आपके साथ कभी हुआ?

मैंने पाया कई लेख इस समस्या पर चर्चा, सहित:

पहले लिंक थोड़ा पुराना है, लेकिन पता चलता है कि आप करने की आवश्यकता इस प्रभाव को देखने के लिए प्रति फ्लोटिंग पॉइंट वेरिएबल प्रति 1-40 फ्लोटिंग पॉइंट ऑपरेशंस से कम (अगर मैं गलत हूं तो मुझे सही करें)।

मैं मेमोरी बैंडविड्थ को कैसे माप सकता हूं कि एक दिया गया प्रोग्राम उपयोग कर रहा है और मैं अपने सिस्टम की पेशकश (पीक) बैंडविड्थ को कैसे मापूं?

मैं यहां किसी भी जटिल कैश मुद्दों पर चर्चा नहीं करना चाहता हूं। मैं केवल सीपीयू और स्मृति के बीच संचार में रूचि रखता हूं।

+2

दुर्भाग्यवश, यदि आप अपने प्रश्न – erikkallen

+0

एचएम का उत्तर चाहते हैं तो आप जटिल कैश जारी करने में शामिल नहीं हो सकते हैं, मान लीजिए कि मैं पूरी मेमोरी 1.0s के साथ शुरू करता हूं। फिर मैं प्रत्येक तत्व को निरंतर संख्या से गुणा करता हूं। और उस प्रक्रिया को दोहराएं .. – hanno

+0

सभी मेमोरी एक्सेस करना आपको स्मृति बैंडविड्थ द्वारा सीमित किया जा रहा है, जब तक कि एक्सेस किए गए तत्वों के बीच अंतराल बहुत लंबा न हो। जो, यह कैसा लगता है, यह नहीं होगा। –

उत्तर

7

अपने सिस्टम के मेमोरी प्रदर्शन को बेंचमार्क करने के लिए STREAM benchmark आज़माएं। बेंचमार्क कार्यों और परिणामों को सावधानीपूर्वक पढ़ें क्योंकि वे आपकी याददाश्त के बारे में मूलभूत डेटा प्रदान करते हैं जिन्हें आपको कुछ और करने की आवश्यकता है। आपको कैश के प्रभाव (ओं) को समझने की आवश्यकता है - आपको उन्हें समझना होगा - और जब बैंडविड्थ एक चोटी को मारता है।

  1. उपाय समस्या आकार की एक सीमा के लिए निष्पादन समय:

    अपने कार्यक्रम की स्मृति प्रदर्शन पता लगाने के लिए।

  2. हाथ से गणना करें, आपके प्रोग्राम को कितना डेटा पढ़ता है और समस्या आकारों की एक ही श्रृंखला के लिए स्मृति से लिखता है।
  3. समय के साथ स्मृति उपयोग विभाजित करें।

चेतावनी: यह एक कच्चा दृष्टिकोण है और केवल यह पता लगाने के लिए उपयोग किया जाना चाहिए कि आपको स्मृति बैंडविड्थ मुद्दों पर ध्यान देना चाहिए या नहीं। यदि आपका कच्चा चित्र आपको बताता है कि आपका प्रोग्राम उपलब्ध स्मृति बैंडविड्थ के 50% से कम (स्ट्राइक बेंचमार्क से प्राप्त आंकड़े) का उपयोग करता है तो आपको इसे और अधिक विचार नहीं देना चाहिए।

यह क्रूड दृष्टिकोण सबसे अच्छा काम करता है जब आपका प्रोग्राम अपेक्षाकृत कुछ बहुत बड़ी डेटा संरचनाओं को सरल पहुंच पैटर्न के साथ जोड़ता है। यह बहुत से उच्च प्रदर्शन वाले वैज्ञानिक कार्यक्रमों का वर्णन करता है लेकिन शायद अन्य कई प्रकार के कार्यक्रम नहीं।

यदि आपका प्रोग्राम वर्चुअल मेमोरी का उपयोग कर रहा है या यदि यह निष्पादित होने पर I/O कर रहा है, तो स्मृति बैंडविड्थ कोई समस्या नहीं है, जब तक आप डिस्क बैंडविड्थ को सॉर्ट नहीं करते हैं।

अंत में, हाँ, हर बार जब हम अपने वैज्ञानिक कोडों में से एक चलाते हैं तो निष्पादन की गति मेमोरी बैंडविड्थ द्वारा सीमित होती है। अंगूठे के नियम के रूप में, यदि कोई कोड FLOPS का 10% निष्पादित करता है जो प्रोसेसर विनिर्देश का वादा करता है तो मैं खुश हूं।

+0

धन्यवाद। मैं कोशिश करूंगा ... – hanno

3

आपके प्रश्न का व्यापक और सामान्य दायरा व्यापक अर्थ से किसी भी जवाब में लगभग असंभव बनाता है।

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

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

6

मेमोरी गहन अनुप्रयोगों या अनुप्रयोगों स्मृति का एक बहुत की आवश्यकता द्वारा प्रतिबंधित कर रहे: प्रोसेसर के अंदर प्रोसेसर बाहर रैम

  1. स्पीड कैश की
  2. स्पीड
  3. साझा करने स्मृति संस्थाओं की संख्या बस
  4. वर्चुअल मेमोरी

दुर्भाग्य से, एचटीएमएल ई कार्यक्रम एक कार्यक्रम के प्रदर्शन में प्रमुख खिलाड़ी नहीं हैं। बड़े प्रभाव हैं: सीपीयू की मात्रा, आई/ओ संचालन और आपके कार्यक्रम के साथ चल रहे अन्य कार्यों। इन आइटम्स को बदलना आपके प्रोग्राम को मेमोरी बैंडविड्थ को प्रभावित करने वाले आइटम बदलने से अधिक प्रभावित करेगा।

1. प्रोसेसर
प्रोसेसर इसके खोल और हड़पने निर्देश और डेटा के बाहर रैम से जाना चाहिए बाहर रैम की गति। रैम की अलग-अलग गति होती है जिस पर यह कोशिकाओं तक पहुंच सकती है और बिट्स को प्रोसेसर पर वापस कर सकती है। आम तौर पर, यह एचजे की इकाइयों में चिह्नित है। जितनी तेजी से स्मृति, आपकी प्रक्रिया लोड कम निर्देश और डेटा खर्च करती है और तेज़ी से आपके प्रोग्राम को निष्पादित करती है।

नोट: प्रोसेसर की क्षमताओं से परे स्मृति की गति को बढ़ाने से प्रदर्शन में वृद्धि नहीं होगी। यह रैम से प्रोसेसर तक बाधा को बदल देता है। यह भी देखें # 3।

2. प्रोसेसर के अंदर कैश की गति कैश मेमोरी प्रोसेसर के खोल के अंदर रहता है। यह उपलब्ध स्मृति की सबसे तेज़ प्रकारों में से एक है। रैम खोजने से पहले प्रोसेसर इस मेमोरी को खोजेंगे। इस मेमोरी की गति और मात्रा में सुधार करने से आपके प्रोसेसर, के प्रदर्शन में सुधार होगा जब तक कि अन्य कोर इस स्मृति को तक भी एक्सेस न कर रहे हों। स्मृति को एक्सेस करने वाले एकाधिक कोरों के लिए, संघर्ष समाधान होना आवश्यक है, जो आपके अनुप्रयोग प्रदर्शन को धीमा कर सकता है।

नोट: कोई अन्य प्रोसेसर प्राप्त करने के अलावा कैश मेमोरी के आकार को तेज़ या बदलने के लिए आप कुछ भी नहीं कर सकते हैं। कैश ऐसा कुछ नहीं है जिसे मानव या रोबोटिक हाथों से आसानी से बदला जा सके।

3. स्मृति बस
स्मृति बस एक राजमार्ग है कि संस्थाओं राम को पाने के लिए उपयोग करने की तरह है साझा करने संस्थाओं की संख्या। एक राजमार्ग के साथ, अधिक लेन का मतलब तेज़ थ्रुपुट (उदाहरण के लिए 16-बिट चौड़ाई बनाम 32-बिट) है। कई बसों में गति सीमा भी होती है, फिर सीमा जितनी अधिक होती है, उतनी तेज़ी से पहुंच होती है। शायद सबसे उल्लेखनीय अवधारणा बस से जुड़ी संस्थाओं की संख्या है। राजमार्गों के साथ, अधिक उपयोगकर्ता यातायात को धीमा कर देते हैं। अधिकांश मेमोरी बसों में, केवल एक इकाई एक समय में इसका उपयोग कर सकती है; अन्य संस्थाओं को इंतजार करना होगा। मेमोरी बस का उपयोग करने की आवश्यकता वाले इकाइयों की संख्या को कम करने से आपके कार्यक्रम में तेजी आएगी।

स्मृति बस साझा करने वाली कुछ सामान्य संस्थाएं: सीपीयू, डीएमए नियंत्रक, वीडियो प्रोसेसर, ध्वनि प्रोसेसर और नेटवर्क या आई/ओ प्रोसेसर।

4. वर्चुअल मेमोरी। कई आधुनिक कंप्यूटर वर्चुअल मेमोरी पर काम करते हैं। यदि कार्यक्रम में रैम में उपलब्ध होने की तुलना में अधिक मेमोरी की आवश्यकता है, तो ऑपरेटिंग सिस्टम हार्ड ड्राइव पर क्षेत्रों के साथ मेमोरी के अनुभागों को स्वैप करेगा। मेमोरी ऑपरेटिंग गति को कम करने की तुलना में यह अधिक प्रदर्शन समय खर्च करता है। एक मेमोरी गहन कार्यक्रम केवल उस स्मृति को उपयोग करके अधिक कुशल होता है, जिसकी आवश्यकता हो सकती है। इन वर्चुअल मेमोरी स्वैप को कम करने से एक प्रोग्राम तेज हो जाएगा।


संक्षेप में, अधिकतम गति है जिस पर आपका आवेदन निष्पादित हो सकता है। मेमोरी, आंतरिक कैश और बाहरी रैम दोनों, ऊपरी सीमा में कारक योगदान कर रहे हैं। ऐसे बड़े कारक हैं जो अनुप्रयोगों को इस सीमा तक पहुंचने से रोकते हैं। इनमें से कुछ कारक I/O संचालन हैं, और अन्य समवर्ती कार्य हैं। एक कार्यक्रम का डिजाइन और कार्यान्वयन धीमेपन में भी योगदान दे सकता है। I/O संचालन, समवर्ती कार्यों को समाप्त करने और स्मृति पहुंच गति की ऊपरी सीमा को बदलकर सॉफ़्टवेयर को फिर से डिज़ाइन करके अधिक प्रदर्शन प्राप्त किया जा सकता है। इन सीमाओं को बदलने से आपके प्रोग्राम के प्रदर्शन में वृद्धि होगी, लेकिन अन्य तकनीकों के रूप में उतना ही कठोर नहीं होगा।

+1

यह एक अच्छा सारांश है, लेकिन वास्तव में मेरे प्रश्न का उत्तर नहीं देता है: मैं मेमोरी बैंडविड्थ को कैसे माप सकता हूं कि दिया गया प्रोग्राम उपयोग कर रहा है? – hanno

+0

आप डिबगर या प्रोसेसर से जुड़े एक JTAG डीबगर का उपयोग करके बैंडविड्थ को मापने में सक्षम हो सकते हैं। अन्यथा यह मुश्किल हो जाता है। मैं कोड के उन अनुभागों को प्रोफाइल करने का सुझाव देता हूं जो स्मृति गहन हैं। एक और विचार है कि राम बस के चिप चयन पर एक लाइन के साथ डेटा बस पर एक तर्क विश्लेषक डालना है। –

1

मेमोरी बैंडविड्थ द्वारा सीमित प्रोग्राम में अंकगणितीय/तर्क परिचालनों के लिए उच्च स्मृति संदर्भ (लोड और/या स्टोर ऑपरेशंस) हैं। उदाहरण बीएएलएस 1 दिनचर्या जैसे डैक्सी, डीडॉट, इत्यादि

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

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