2013-02-06 6 views
6

मैं --physcpubind विकल्प के साथ numactl का उपयोग कर रहा था। मैनुअल का कहना है:numactl --physcpubind

--physcpubind=cpus, -C cpus 
Only execute process on cpus. Etc... 

मान लीजिए कि मैं 3 NUMA नोड्स, जहां उनमें से प्रत्येक के 4 कोर के साथ NUMA सिस्टम चला रहे हैं। NUMA नोड 0 में 0, 1, 2, 3 कोर संख्याओं के रूप में है। NUMA नोड 1 में 4,5,6,7 है, और NUMA नोड 2 में 8, 9, 10,11 है। मेरा प्रश्न चलो कहते हैं कि मैं इस कार्यक्रम को चलाने के रूप में निम्नानुसार जाने है:

export OMP_NUM_THREADS=6 
numactl --physcpubind=0,1,4,5,8,9 ./program 

यानी मैं 6 धागे के साथ अपने कार्यक्रम चलाएंगे और मैं उन्हें सीपीयू कोर 0,1,4,5,8 पर होने की विनती करता हूँ, 9। उदाहरण के लिए, यदि प्रोग्राम थ्रेड 0-5 के दौरान किसी बिंदु पर CPU कोर 0,1,4,5,8,9 (सेटअप 1) असाइन किया गया है। क्या यह संभव है कि प्रोग्राम निष्पादन थ्रेड 0 के दौरान किसी अन्य बिंदु पर उदाहरण के लिए सीपीयू कोर 9 पर चल रहा हो, और आगे? अर्थात। सीपीयू कोर के बीच थ्रेड माइग्रेशन होगा? या धागे विशिष्ट रूप से सीपीयू कोर (जैसे सेटअप 1 में) से बंधे हैं? धन्यवाद।

+0

फिजप्यूबिंड [sched_setaffinity] (http://linux.die.net/man/2/sched_setaffinity) के लिए एक इंटरफेस होना चाहिए, इसलिए यह प्रक्रिया और सभी धागे के cpuset को संशोधित करता है। किसी भी थ्रेड को cpuset से किसी भी CPU पर चलाने की अनुमति है, cpuset से किसी भी cpu के बीच माइग्रेशन की अनुमति है। यदि आप सीपीयू को बांधने के थ्रेड चाहते हैं, तो प्रत्येक थ्रेड में शेड_सेटफिनिटी या pthread_setaffinity_np का उपयोग करें। या ओएमपी लाइब्रेरी के माध्यम से एफ़िनिटी सेट करें: http://stackoverflow.com/a/8325730/196561 उदा। 'निर्यात OMP_PROC_BIND = true' कमांड के साथ। – osgx

+0

@osgx धन्यवाद। आपके पास इस सवाल का जवाब है? धन्यवाद। – tiki

उत्तर

5

physcpubind numactl की विकल्प sched_setaffinity प्रणाली अधिकार, जो प्रक्रिया शुरू करने के समय की प्रक्रिया के cpuset (अनुमति सीपीयू का सेट) को संशोधित करता है के लिए एक इंटरफेस होना चाहिए। प्रत्येक थ्रेड के पास स्वयं का cpuset होगा, लेकिन सभी थ्रेड पेरेंट प्रक्रिया से उनके cpuset मान का उत्तराधिकारी होगा।

तो, cpuset से किसी भी CPU पर थ्रेड को चलाने की अनुमति है, cpuset से किसी भी cpu के बीच माइग्रेशन की अनुमति है।

कोई भी थ्रेड शेड_सेटफिनिटी या pthread_setaffinity_np (सिंगल थ्रेड के लिए एफ़िनिटी बदलने के लिनक्स-विशिष्ट संस्करण) को संकीर्ण या यहां तक ​​कि अपने cpuset का विस्तार करने के लिए कॉल कर सकता है।

यदि आप सीपीयू को बांधने के थ्रेड चाहते हैं, तो प्रत्येक थ्रेड में शेड_सेटफिनिटी या pthread_setaffinity_np का उपयोग करें, या ओएमपी लाइब्रेरी के माध्यम से ओपनएमपी सेट एफ़िनिटी के मामले में: OpenMP and CPU affinity उदा। आदेश (OpenMP 3.1+)

export OMP_PROC_BIND=true 

साथ मुझे लगता है कि OMP पुस्तकालय omp पुस्तकालय प्रारंभ के समय में इस प्रक्रिया के cpuset से राउंड-रोबिन ढंग से सीपीयू का चयन करेंगे। OMP समर्थन पुस्तकालय जीसीसी द्वारा इस्तेमाल किया - -

libgomp के पुराने संस्करण के लिए

आप कमांड के साथ सीपीयू की अनुमति सेट पारित कर सकते हैं:

export GOMP_CPU_AFFINITY=0-1,4-5,8-9 

पुनश्च: अपने धागे प्लेसमेंट की जांच करना आप top शुरू करने और "सक्षम अंतिम सीपीयू कर सकते हैं प्रयुक्त "फ़ील्ड fj कुंजी और H के साथ थ्रेड डिस्प्ले चालू करें।