2011-03-29 24 views
7

गैर-NUMA/मानक पीसी पर मेरे अनुप्रयोगों की गति को बढ़ाने की कोशिश करते समय मैंने हमेशा पाया कि बाधा malloc() पर कॉल थी क्योंकि बहु-कोर मशीनों में भी यह सभी कोरों के बीच साझा/सिंक होता है।क्या malloc/memcpy फ़ंक्शन NUMA पर स्वतंत्र रूप से चलते हैं?

मैं उपलब्ध लिनक्स और सी और का उपयोग कर NUMA वास्तुकला के साथ एक पीसी है मैं दो प्रश्न हैं: के बाद से प्रत्येक कोर अपनी ही स्मृति प्रदान की जाती है,

  1. एक NUMA मशीन में, malloc() प्रत्येक कोर पर स्वतंत्र रूप से निष्पादित करेंगे/अन्य कोर अवरुद्ध किए बिना स्मृति?
  2. इन आर्किटेक्चर में memcpy() पर कॉल कैसे की जाती हैं? क्या इसे प्रत्येक कोर पर स्वतंत्र रूप से कहा जा सकता है या इसे कोर में बुलाकर कोर को दूसरों को अवरुद्ध कर दिया जाएगा? मैं शायद गलत लेकिन मुझे याद है कि memcpy() को malloc() की एक ही समस्या मिली है, यानी जब एक कोर इसका उपयोग कर रहा है तो दूसरों को इंतजार करना होगा। अलग प्रक्रियाओं में malloc के लिए

उत्तर

4

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

1 के लिए, यह पूरी तरह से ओएस और मॉलोक लाइब्रेरी पर निर्भर करता है। ओएस प्रति-कोर/प्रति-प्रोसेसर मेमोरी को एक एकीकृत स्थान या NUMA के रूप में प्रस्तुत करने के लिए ज़िम्मेदार है। मॉलोक NUMA- जागरूक हो सकता है या नहीं भी हो सकता है। लेकिन मूल रूप से, मॉलोक कार्यान्वयन अन्य अनुरोधों के साथ एक साथ निष्पादित करने में सक्षम हो सकता है या नहीं। और अल (और संबंधित चर्चा) का उत्तर इस बिंदु को अधिक विस्तार से संबोधित करता है।

2 का सवाल है, के रूप में memcpy भार और दुकानों की एक श्रृंखला से मिलकर बनता है, केवल प्रभाव फिर से, अन्य प्रोसेसर 'स्मृति नियंत्रक का उपयोग करने का संभावित वास्तु प्रभाव होगा आदि

+0

हाय ब्रायन। बहुत बहुत धन्यवाद। क्या आप किसी भी अच्छी मॉलोक लाइब्रेरी से अवगत हैं जो NUMA को अवगत है? मैंने गुगल किया और मुझे एमपीसी मिली ... क्या यह आपकी राय में अच्छा है? –

+0

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

+0

बहुत बहुत धन्यवाद मैं इसे आज़मा दूंगा। –

2
  1. कॉल स्वतंत्र रूप से कि क्या आप एक NUMA वास्तुकला पर हैं की परवाह किए बिना निष्पादित करेंगे। एक ही प्रक्रिया के विभिन्न धागे में malloc करने के लिए कॉल स्वतंत्र रूप से निष्पादित नहीं कर सकते हैं क्योंकि लौटाई गई स्मृति प्रक्रिया के भीतर सभी धागे के लिए समान रूप से सुलभ है। यदि आप किसी विशेष थ्रेड के लिए स्थानीय स्मृति चाहते हैं, तो थ्रेड स्थानीय संग्रहण पर पढ़ें। मैं लिनक्स वीएम और शेड्यूलर कोर, थ्रेड्स, स्थानीय मेमोरी और थ्रेड स्थानीय स्टोरेज के बीच संबंध को अनुकूलित करने में सक्षम हैं या नहीं, इस पर कोई स्पष्ट दस्तावेज नहीं मिला है।
+0

"अलग धागे में malloc के लिए कॉल एक ही प्रक्रिया के स्वतंत्र रूप से निष्पादित नहीं हो सकते हैं "- गैर-NUMA पर वे प्रति-थ्रेड मेमोरी पूल के साथ कर सकते हैं, फिर भी विभिन्न थ्रेड में 'फ्री' पर कॉल स्वतंत्र नहीं हो सकते हैं, बेशक आप एक अलग थ्रेड में स्मृति को मुक्त कर सकते हैं आपने इसे आवंटित किया –

+0

लेकिन यह पूरी तरह से मॉलोक कार्यान्वयन तक है। लोग आम तौर पर मल्टी थ्रेडेड एप्लिकेशन में प्रदर्शन को बेहतर बनाने के लिए 3. पार्टी मॉलोक लाइब्रेरीज़ (उदा। टीसीएमएलओसी) का उपयोग करते हैं (हालांकि न तो tcmalloc और न ही glibc malloc खाते में NUMA लेते हैं) – nos

+0

हाय स्टीव। जहां तक ​​मुझे पता है कि मेमोरी पूल लगातार स्मृति के खंडों को रोकते हैं जिन्हें कभी मुक्त नहीं किया जाता है (.. कम से कम इस प्रकार हमने गैर-NUMA आर्किटेक्चर में उपयोग किया था)। ऐसा लगता है कि आप जो प्रस्ताव दे रहे हैं वह कुछ लाइब्रेरी पर आधारित कुछ समाधान है: ए = मेमोरी पूल प्रति-थ्रेड बी = मॉलोक व्यवहार को फिर से परिभाषित करें। क्या मैं सही हूं या यह वास्तव में उस तरह के हार्डवेयर के लिए ओएस स्तर पर निर्दिष्ट कुछ है? –