आधुनिक सीपीयू पर एकल-असाइनमेंट एडीटी उन्मुख कोड का प्रदर्शन


32

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

लेकिन मैंने अब कुछ समय सुना है कि प्रदर्शन में होने वाले नुकसान इस तरह से प्राप्त होते हैं कि सीपीयू (इसकी मेमोरी कंट्रोलर विशेष रूप से) इस तथ्य का फायदा उठा सकती है कि मेमोरी म्यूट नहीं की गई है (जितना अधिक)।

मैं उम्मीद कर रहा था कि कोई व्यक्ति कुछ प्रकाश डाल सकता है कि यह कैसे सच है (या अगर यह नहीं है?)।

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


2
यह ज्यादातर मल्टीथ्रेडिंग में उपयोगी है, जहां एक पाठक स्नैपशॉट को हड़प सकता है और इस ज्ञान में सुरक्षित रह सकता है कि वह इसे पढ़ते समय म्यूट नहीं करेगा
शाफ़्ट फ्रीक

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

यहां तक ​​कि अगर यह सच था, तो मुझे नहीं लगता कि स्मृति का कम संशोधन अपरिवर्तनीयता के लिए सबसे अच्छा विक्रय बिंदु है। मेमोरी को संशोधित करना है, आखिरकार, और सीपीयू और मेमोरी मैनेजर ने वर्षों में इसे बहुत अच्छा दिया है।
रीन हेनरिच्स

1
मैं यह भी बताना चाहता हूं कि अपरिवर्तनीय संरचनाओं का उपयोग करते समय मेमोरी दक्षता को अनिवार्य रूप से संकलक अनुकूलन पर निर्भर नहीं होना पड़ता है। इस उदाहरण में let a = [1,2,3] in let b = 0:a in (a, b, (-1):c)साझाकरण मेमोरी आवश्यकताओं को कम करता है, लेकिन इसकी परिभाषा पर निर्भर करता है (:)और []संकलक नहीं। मुझे लगता है? इसके बारे में पक्का भरोसा नहीं है।

जवाबों:


28

सीपीयू (इसका मेमोरी कंट्रोलर विशेष रूप से) इस तथ्य का लाभ उठा सकता है कि मेमोरी उत्परिवर्तित नहीं है

फायदा यह है कि यह तथ्य संकलक को डेटा के एक्सेस होने पर मेम्बर निर्देशों का उपयोग करने से बचाता है।

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

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


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

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

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

नीचे दिए गए नोट को थोड़ा सा सरल करते हुए , यहां मेमबर के लिए मल्टी-कोर प्रोसेसर पर क्या होता है:

  1. सभी कोर प्रसंस्करण बंद कर देते हैं - गलती से कैश करने के लिए लिखने से बचने के लिए।
  2. स्थानीय कैश के लिए किए गए सभी अपडेट वैश्विक एक पर वापस लिखे गए हैं - यह सुनिश्चित करने के लिए कि वैश्विक कैश में सबसे हाल का डेटा है। इसमें कुछ समय लगता है।
  3. अपडेट किए गए डेटा को वैश्विक कैश से स्थानीय लोगों को वापस लिखा जाता है - यह सुनिश्चित करने के लिए कि स्थानीय कैश में सबसे हाल का डेटा है। इसमें कुछ समय लगता है।
  4. सभी कोर के निष्पादन को फिर से शुरू करते हैं।

आप देखिए, वैश्विक और स्थानीय कैश के बीच डेटा को कॉपी किए जाने के दौरान सभी कोर कुछ नहीं कर रहे हैं । यह सुनिश्चित करने के लिए आवश्यक है कि उत्परिवर्तनीय डेटा ठीक से सिंक्रनाइज़ किया गया है (थ्रेड सुरक्षित)। यदि 4 कोर हैं, तो सभी 4 बंद हो जाते हैं और इंतजार करते हैं जबकि कैश सिंक किए जा रहे हैं। यदि 8 हैं, तो सभी 8 बंद हो जाते हैं। अगर वहाँ 16 हैं ... अच्छी तरह से आप 15 कोर मिल गया है, जबकि इनमें से किसी एक पर करने के लिए आवश्यक सामान की प्रतीक्षा कर रहे हैं।

अब, देखते हैं कि डेटा अपरिवर्तनीय होने पर क्या होता है? कोई फर्क नहीं पड़ता कि कौन सा धागा इसे एक्सेस करता है, यह समान होने की गारंटी है। प्रोग्रामर के लिए, इसका मतलब है कि जब वे विशेष थ्रेड में डेटा (एक्सेस) एक्सेस करते हैं तो सिंक्रोनाइज़ेशन कंस्ट्रक्शन सम्मिलित करने की आवश्यकता नहीं होती है ।

संकलक के लिए, बदले में इसका मतलब एक ज्ञापन निर्देश सम्मिलित करने की आवश्यकता नहीं है

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


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



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