2012-10-16 10 views
8

में समांतर प्रसंस्करण समानांतर और doParallel संकुल के साथ मैं उबंटू 12.04 और आर 2.15.1 चला रहा हूं। जब मैं समानांतर में कुछ भी चलाता हूं, तो मैं 100% तक सीमित हूं, जब मुझे 800% तक होना चाहिए, क्योंकि मैं इसे 8 कोर के साथ चला रहा हूं। सिस्टम मॉनीटर पर जो दिखाता है वह यह है कि प्रत्येक बच्चे की प्रक्रिया केवल 12% हो रही है।आर सीमित

क्या चल रहा है यह मेरी निष्पादन गति को सीमित कर रहा है?

+1

आप कोड की अधिक पोस्ट करने के लिए होगा आप निश्चित रूप से जानना चाहते हैं। लेकिन उबंटू 12.04 पर मेरे पास यह मुद्दा बिल्कुल नहीं है और आपने सुखद रूप से 24 कोर पर 100 बार कई बार देखा है। – Justin

+0

यह किसी भी विशिष्ट कोड के लिए विशिष्ट नहीं है। –

+3

तो मैं ज्यादा मदद नहीं कर सकता। क्योंकि यह मेरे लिए काम करता है! आप 'डीएमएमसी' पैकेज को भी आजमा सकते हैं ... लेकिन जिस तरह से आप 'doParallel' का उपयोग कर रहे हैं और फिर कार्यान्वयन का उपयोग कर रहे हैं (' foreach'? '।' paller' से 'समानांतर'?) मैं नहीं ' टी सोचता है कि कोई भी मदद कर सकता है। – Justin

उत्तर

5

मुझे libblas.so(.3gf) पैकेजों की वजह से एक ही समस्या का अनुभव हुआ, और मुझे नहीं पता कि यह आपकी समस्या का कारण बनता है या नहीं। जब R प्रारंभ होता है तो यह रैखिक बीजगणितीय गणनाओं के संचालन के लिए आपके सिस्टम में BLAS सिस्टम स्थापित करता है। मेरे पास libopenblas.so(.3gf) है और यह "सीपीयू एफ़िनिटी" विकल्प के साथ अत्यधिक अनुकूलित है, जो कहने के लिए है, जब आप संख्यात्मक वेक्टर या मैट्रिक्स गणना करते हैं, तो ओपनब्लैस पैकेज केवल 8 धागे बना देगा और प्रत्येक थ्रेड को एक निर्दिष्ट में फंस जाएगा और कोड को तेज करने के लिए निश्चित CPU। हालांकि, इसे स्थापित करके, आपके सिस्टम को तब बताया जाता है कि सभी सीपीयू बहुत व्यस्त हैं, और इस प्रकार यदि आगे के समानांतर कार्य आते हैं, तो सिस्टम उन्हें एक सीपीयू में निचोड़ने का प्रयास करेगा ताकि व्यस्त CPU में हस्तक्षेप न करने के लिए सर्वोत्तम प्रयास किया जा सके। मैं एक openblas पैकेज स्रोत डाउनलोड किया है और फ़ाइल के साथ यह संकलित "Makefile.rule" में बदल:

तो यह मेरा समाधान जो काम किया था एक पंक्ति "#NO_AFFINITY = 1" है और मैं बस नष्ट कर दिया "#" इतना है कि के बाद संकलित, वहाँ है कोई एफ़िनिटी विकल्प नहीं चुना गया। तब मैंने पैकेज स्थापित किया और समस्या हल हो गई।

इस के संदर्भ के लिए, देखें https://github.com/ipython/ipython/issues/840

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

+0

हां, यह भी हो सकता है। – cbeleites

+0

मेरी मेकफ़ाइल.रूले में यह लाइन पहले से ही असम्बद्ध थी, इसलिए यह NO_AFFINITY = 1 के साथ संकलित है, फिर भी मेरे लिए समस्या अभी भी – Lindon

+0

हाय लिंडन बनी हुई है, क्या आप कृपया मुझे जांचने में मदद करेंगे, अगर आपने स्रोत फ़ाइल संकलित की है (संकलित होने पर, मेकफ़ाइल मल्टीथ्रेड का उपयोग करेगा ताकि आउटपुट बहुत तेजी से स्क्रॉल हो), और यदि आपने ओपनब्लैस को इंस्टॉल किया है तो आपने स्वयं संकलित किया है, और यदि आपने 'sudo update-alternatives --config libblas.so.3gf'' और' sudo अद्यतन-विकल्प --config libblas.so'', ताकि वर्तमान blas वास्तव में openblas प्रणाली है? उम्मीद है कि यह मदद करता है। –

10

समस्या यह हो सकती है कि आर प्रक्रिया एक कोर तक सीमित है (और उपप्रोसेस इसे प्राप्त करते हैं)।

इस प्रयास करें:

> system(sprintf("taskset -p 0xffffffff %d", Sys.getpid())) 
pid 3064's current affinity mask: fff 
pid 3064's new affinity mask: fff 

अब, आपकी मशीन पर है, वर्तमान आत्मीयता मुखौटा रिपोर्ट एक 1 है, तो इस समस्या थी। रेखा से ऊपर इसे हल करना चाहिए (दूसरी पंक्ति FFF (या समान) रिपोर्ट करना चाहिए अर्थात्।

साइमन Urbanek एक समारोह mcaffinity कि मल्टीकोर के लिए इस पर नियंत्रण की अनुमति देता है लिखा था। जहां तक ​​मुझे पता है, यह अभी भी आर-devel में है।

जानकारी के लिए, उदाहरण के लिए देखते हैं कि यह discussion on R-sig-hpc

अद्यतन, और जिन गुओ के जवाब के अलावा:।

आप openblas और स्पष्ट बनता है (समानांतर/बर्फ/मल्टीकोर के माध्यम से) के माध्यम से निहित बनता है एक साथ उपयोग करते हैं, आप कर सकते हैं Openblas depe का उपयोग करता है कि थ्रेड की संख्या को बदलना चाहते हैं इस पर निर्भर करते हुए कि आप स्पष्ट रूप से समानांतर भाग में हैं या नहीं।
यह संभव है (लिनक्स के तहत ओपनब्लैस के साथ, मुझे किसी भी अन्य अनुकूलित अनुकूलित बीएलएएस के बारे में पता नहीं है जो धागे की संख्या में एक फ़ंक्शन प्रदान करता है), विवरण के लिए Simon Fuller's blog post देखें।

0

मेरा अनुमान है कि आपके पास शायद गलत कोड था।मैं एक उदाहरण ऑनलाइन http://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/ से नकल पोस्ट करने के लिए करना चाहते हैं:

library(doMC) 
registerDoMC() 
x<- iris[which(iris[,5]!='setosa'),c(1,5)] 
trials<- 10000 
r<- foreach(icount(trials), .combine=cbind) %dopar% { 
    ind<- sample(100,100,replace=T) 
    result1<- glm(x[ind,2]~x[ind,1],family=binomial(logit)) 
    coefficients(result1) 
} 

और आप को परिभाषित कर सकते हैं कि कितने कोर आप समानांतर में उपयोग करना चाहते हैं:

options(cores=4) 
+1

लेकिन वह रिपोर्ट करता है कि वह 8% प्रक्रियाओं को 12% CPU उपयोग के साथ देखता है। – cbeleites