2012-05-24 21 views
6

मैं सी ++ में एक एप्लीकेशन लिख रहा हूं जिसे कई धागे से कई बार एक ही स्मृति से पढ़ने की जरूरत है। मेरा प्रश्न एक प्रदर्शन बिंदु से है, यह प्रत्येक धागे के लिए स्मृति की प्रतिलिपि बनाना या सभी धागे को एक ही सूचक देने के लिए बेहतर होगा और उनमें से सभी एक ही स्मृति तक पहुंच सकते हैं।मेमोरी एक्सेस बनाम मेमोरी कॉपी

धन्यवाद

+1

मशीन NUMA है? – Mysticial

+1

स्पष्ट प्रश्न यह है: क्या यह स्मृति निरंतर पढ़ी जा रही है, या यह परिवर्तनों के अधीन है? –

+1

@ माइस्टिसियल, कोई उम्मीद करेगा कि सभी आर्किटेक्चर कुशलतापूर्वक एक NUMA सिस्टम न केवल पढ़ने वाले डेटा को कुशलतापूर्वक संभालते हैं। –

उत्तर

6

वहाँ कम जानकारी आप अपने लक्ष्य प्रणाली के बारे में दिए गए और इतने पर है से कोई निश्चित जवाब है, लेकिन एक सामान्य पीसी पर, सबसे अधिक संभावना सबसे तेजी से कॉपी नहीं किया जाएगा।

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

कैशिंग के दृष्टिकोण के लिए इंटेल द्वारा स्पष्ट रूप से सूचीबद्ध लाभों में से एक "Allows more data-sharing opportunities for threads running on separate cores that are sharing cache" है। अर्थात। वे एक अभ्यास को प्रोत्साहित करते हैं जहां आपको डेटा को स्पष्ट रूप से कैश करने के लिए थ्रेड प्रोग्राम करने की आवश्यकता नहीं होती है, सीपीयू आपके लिए यह करेगा।

1

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

जब आप डेटा आवंटित करते हैं, तो आम तौर पर पहली बार लिखने वाली नीति का उपयोग यह निर्धारित करने के लिए किया जाता है कि आपके डेटा को कौन से मेमोरी बैंक आवंटित किए जाएंगे, जिसका अर्थ है कि यह इसे दूसरे की तुलना में तेज़ी से एक्सेस कर सकता है प्रोसेसर।

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

मुझे यकीन नहीं है कि एक प्रोसेसर पर प्रत्येक थ्रेड के लिए डेटा की प्रतिलिपि कैसे प्रदर्शन को प्रभावित करेगी, लेकिन मुझे लगता है कि प्रतिलिपि न करने वाले उच्च स्तर के कैश की सामग्री को साझा करने की क्षमता में सुधार कर सकती है, जो कोर के बीच साझा की जाती हैं।

किसी भी मामले में, बेंचमार्क और वास्तविक माप के आधार पर निर्णय लेते हैं।

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