2012-08-14 23 views
7

मेरे पास दोहरी सॉकेट ज़ीऑन ई 5522 2.26GHZ मशीन है (हाइपरथ्रेडिंग अक्षम के साथ) लिनक्स कर्नेल 3.0 पर NUMU का समर्थन करने वाले यूबंटू सर्वर चला रहा है। आर्किटेक्चर लेआउट प्रति सॉकेट 4 भौतिक कोर है। जब पर चल रहा है स्वचालित रूप सेओपनएमपी और NUMA संबंध?

  1. एक OpenMP कार्यक्रम लाभ ले करता है (यानी एक धागा और उसके निजी डेटा निष्पादन के साथ एक NUMA नोड पर रखा जाता है): एक OpenMP आवेदन इस मशीन में चलाता है और मैं निम्नलिखित प्रश्न हैं एक NUMA मशीन + जागरूक कर्नेल ?. यदि नहीं, तो क्या किया जा सकता है?

  2. NUMA और प्रति थ्रेड निजी सी ++ एसटीएल डेटा संरचनाओं के बारे में क्या?

+0

कृपया, परिभाषित करें कि "NUMA मशीन पर चलने पर लाभ" में आपका किस प्रकार का लाभ है। ओपनएमपी वर्तमान में NUMA से अवगत नहीं है, लेकिन ओपनएमपी 4.0 संभावित रूप से बेहतर थ्रेड बाध्यकारी के प्रावधान लाएगा। –

+0

मैंने सवाल अपडेट किया है, मुख्य रूप से आपने जो बताया है। 'टास्कसेट' के बारे में क्या? क्या यह थ्रेड को बांधने में मदद करेगा ताकि प्रति थ्रेड निजी डेटा स्थानीय रखा जा सके? – labotsirc

उत्तर

15

वर्तमान OpenMP मानक चर OMP_PROC_BIND एक बूलियन वातावरण है कि OpenMP धागे के बंधन नियंत्रण के परिभाषित करता है। यदि true पर सेट किया गया है, उदा।

shell$ OMP_PROC_BIND=true OMP_NUM_THREADS=12 ./app.x 

तो ओपनएमपी निष्पादन वातावरण प्रोसेसर के बीच धागे को स्थानांतरित नहीं करना चाहिए। दुर्भाग्यवश कुछ और कहा नहीं जाता है कि उन धागे को कैसे बंधना चाहिए और ओपनएमपी भाषा समिति में एक विशेष कार्यकारी समूह अभी संबोधित कर रहा है। ओपनएमपी 4.0 नए एनविरिएशन वैरिएबल और क्लॉज के साथ आएगा जो किसी को थ्रेड वितरित करने के लिए निर्दिष्ट करने की अनुमति देगा। बेशक, कई ओपनएमपी कार्यान्वयन अपने non-standard methods to control binding प्रदान करते हैं।

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

  • समानांतर for (C/C++)/DO (फोरट्रान) लूप के लिए dynamic निर्धारण का उपयोग न करें।
  • उसी थ्रेड में डेटा को प्रारंभ करने का प्रयास करें जो बाद में इसका उपयोग करेगा। यदि आप दो सीपारे समानांतर for लूप को एक ही टीम के आकार और उसी संख्या के साथ लोड करते हैं, static दोनों लूपों के शेड्यूलिंग चंक 0 को थ्रेड 0, खंड 1 - थ्रेड 1 द्वारा निष्पादित किया जाएगा, और इसी तरह।
  • यदि ओपनएमपी कार्यों का उपयोग करते हैं, तो कार्य निकाय में डेटा को शुरू करने का प्रयास करें, क्योंकि अधिकांश ओपनएमपी रनटाइम कार्य चोरी को कार्यान्वित करते हैं - निष्क्रिय धागे अन्य धागे की कार्य कतारों से कार्यों को चुरा सकते हैं।
  • NUMA- जागरूक स्मृति आवंटक का उपयोग करें।

मेरा कुछ सहयोगियों को अच्छी तरह से अलग OpenMP runtimes के NUMA behavious का मूल्यांकन किया है और विशेष रूप से इंटेल के कार्यान्वयन के NUMA जागरूकता में देखा है, लेकिन लेख अभी तक प्रकाशित नहीं कर रहे हैं तो मैं एक लिंक के साथ आप प्रदान नहीं कर सकते।

एक शोध परियोजना है, जिसे ForestGOMP कहा जाता है, जिसका उद्देश्य libgomp के लिए NUMA- जागरूक ड्रॉप-इन प्रतिस्थापन प्रदान करना है। हो सकता है कि आपको इसे देखना चाहिए।

+0

बहुत उपयोगी टिप्स, धन्यवाद।आपके आखिरी टिप के लिए आइटम के रूप में; "वस्तु एम = नई वस्तु (तर्क) के मामले के साथ क्या होता है;" सी ++ में ऑब्जेक्ट ऑलोकेटर, सी के लिए tcmalloc के बराबर है? – labotsirc

+0

'tcmalloc' सी और सी ++ दोनों का समर्थन करता है। सी ++ 'नया' ऑपरेटर के लिए, आप ऑब्जेक्ट को स्मृति में रखने के लिए प्लेसमेंट सिंटैक्स का उपयोग कर सकते हैं, जिसे पहले 'tcmalloc' द्वारा आवंटित किया गया था, या' tcmalloc' पर निर्भर करता है 'मानक' malloc() 'कॉल को प्रीलोडिंग द्वारा प्रतिस्थापित करता है (जैसा कि' नया 'तकनीकी रूप से' malloc' के आसपास एक रैपर है)। –

+0

धन्यवाद हिस्टो, टीसीएमएलओसी प्री-लोडिंग + टास्कसेट उसी सॉकेट के भीतर एप्लिकेशन को स्केल करने में मदद कर रहा है, हालांकि जब मैं दूसरी सॉकेट से अतिरिक्त कोर का उपयोग करना शुरू करता हूं (टास्कसेट के बिना, ओपनएमपी और ओएस हैंडल थ्रेड बाइंडिंग देना) गति में सुधार नहीं होता है या एक सॉकेट का उपयोग करने से भी बदतर हो सकता है। इस परिस्थिति में मैं (1) संस्करण 4.0 या (2) के लिए प्रतीक्षा कर सकता हूं ओपनएमपी ड्रॉप और पीआरटीहेड का उपयोग करता हूं, लेकिन मुझे यकीन नहीं है कि यह दूसरा विकल्प वास्तव में मुझे NUMA जागरूक समस्या हल करने देगा, मुझे – labotsirc