दोहरे कोर CPU होने पर लोग -j3 विकल्प की सिफारिश क्यों करते हैं?


18

Gentoo Linux में MAKEOPTSचर को सेट करते समय कितने समानांतर में चलना चाहिए, यह /etc/portage/make.confबताने के लिए चर को सेट करना संभव makeहै। चूंकि मेरे पास एक ड्यूल-कोर सीपीयू है, इसलिए मैंने -j2विकल्प का उपयोग करने के लिए भोलेपन से चुना : प्रति कोर एक काम, इसलिए दोनों को कुछ करना है। "समस्या" बहुत सारे संदर्भ हैं जो उपयोगकर्ताओं को -j3विकल्प के बजाय सेट करने के लिए दोहरे कोर सीपीयू के बारे में बताते हैं । उनमें से कुछ हैं:

उदाहरण के लिए, जेंटू पुस्तिका कहती है:

एक अच्छा विकल्प आपके सिस्टम प्लस एक में सीपीयू (या सीपीयू कोर) की संख्या है, लेकिन यह दिशानिर्देश हमेशा सही नहीं होता है।

लेकिन "सीपीयू + 1" नियम के लिए तर्क क्या है? अतिरिक्त नौकरी क्यों?

Make.conf (5) मैन पेज भी कहता है:

सुझाए गए सेटिंग्स CPU + 1 और 2 * CPU + 1 के बीच हैं।

मैंने विकल्प makeपेज और विकल्प के makeलिए मैन पेज स्पष्टीकरण में खंड 5.4 (समानांतर निष्पादन) भी पढ़ा -j, लेकिन ऐसा लगता है कि वहां कोई जवाब नहीं है।



जवाबों:


13

एक सरल नियम नहीं है जो हमेशा काम करता है। लोग किसी विशेष आकृति की सिफारिश कर सकते हैं क्योंकि उन्होंने एक विशेष मशीन पर एक विशेष संकलन के साथ प्रयोग किया था और यह सबसे अच्छी सेटिंग थी, या क्योंकि उन्होंने कुछ तर्क का पालन किया था जो वास्तविकता के साथ कुछ संबंध हो सकता है या नहीं।

यदि आप बहुत अधिक रैम के साथ धन्य हैं, तो एक लंबे संकलन में सीमित कारक सीपीयू समय होगा। तब सीपीयू प्रति एक कार्य, और कभी-कभार I / O ब्लॉक के लिए एक लंबित कार्य, एक अच्छी सेटिंग है। यह -j3एक दोहरे कोर सीपीयू के लिए बनाता है (या अधिक सटीक रूप से, एक दोहरे सीपीयू मशीन के लिए - यदि प्रत्येक कोर हाइपरथ्रेडेड है, तो वह 4 सीपीयू होगा, इसलिए -j5)।

यदि आपके पास बहुत कम रैम है, तो एक सीमित कारक यह हो सकता है कि आपके पास कई समवर्ती नौकरियां नहीं हो सकती हैं, या फिर वे एक-दूसरे को स्वैप करते रहेंगे। उदाहरण के लिए, यदि आप आराम से मेमोरी में दो कंपाइलर इंस्टेंस फिट नहीं कर सकते हैं, तो make -j2पहले से ही धीमा हो सकता है make। चूँकि यह इस बात पर निर्भर करता है कि आप कितने संकलक प्रक्रियाओं को एक बार में रैम में फिट कर सकते हैं, इसलिए सामान्य आंकड़ा प्राप्त करने का कोई तरीका नहीं है।

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


मुझे नहीं पता था कि यदि सीपीयू कोर हाइपरथ्रेडेड है, तो उनमें से प्रत्येक दो के रूप में गिना जाता है। वैसे भी, ऐसा लगता है कि मेरा सीपीयू हाइपर थ्रेडिंग का समर्थन नहीं करता है।
फ्रांसेस्को तुर्को

मैंने इस जवाब को स्वीकार कर लिया। वैसे भी मैंने -j2अपने सिस्टम पर रहना पसंद किया । इसका कारण यह है मैं दोनों उभरते की कोशिश की है gccऔर firefoxसे सेटिंग्स के साथ -j1अप करने के लिए -j5(10 उभरने आदेशों कुल के लिए), और ऐसा लगता है कि जब तक -j2निश्चित रूप से तेजी से है -j1अन्य तीन सेटिंग्स, के साथ बराबरी पर हैं -j2
फ्रांसेस्को टर्बो

7

मुझे लगता है कि यह थोड़े हेयुरिस्टिक है - प्रक्रियाओं makeको लॉन्च करने की अनुमति CPUs + 1यह सुनिश्चित करने के लिए है कि:

  1. एक कार्यकर्ता-प्रक्रिया के बीच एक अंतर नहीं होगा जो अभी समाप्त हो गया है और एक कार्यकर्ता अभी तक चलाने के लिए है - कुछ हद तक पूर्व-भरने रन कतार की तरह।
  2. उस रन-क्यू पूर्व-भरने के साथ ध्यान देने योग्य ओवरहेड में लाने के लिए बहुत अधिक प्रतिस्पर्धी प्रक्रियाएं नहीं होंगी।

लेकिन, फिर से, यह अनुमानी है और फ्रीबीएसडी की हैंडबुक अभी भी एकल सीपीयू के लिए सिफारिश करती है make -j4


5

आमतौर पर, कोर की संख्या से अधिक नौकरियां शुरू करने के कारण हैं। सीसीसी के लिए जीसीसी का उपयोग करते हुए, यदि -पाइप को सीसीसी विकल्पों में परिभाषित नहीं किया गया है, तो यह अस्थायी फ़ाइलों का उपयोग करके अपने कार्यों (प्रीप्रोसेसिंग, पहले रन, ऑप्टिमाइज़ेशन और असेंबली) को करता है; -पाइप यह सबप्रोसेस के बीच पाइप का उपयोग करने के लिए बदलता है। (जोड़ना -पाइप करना डिफ़ॉल्ट है जैसे FreeBSD के लिए लेकिन लिनक्स पर पारंपरिक नहीं है।) इसलिए, यदि आपके पास 2 कोर हैं और समानांतर में 2 नौकरियों की अनुमति देते हैं, तो वे डिस्क I / O में कुछ समय बिताएंगे। 1 नौकरी जोड़ने की सिफारिश इस बारीकियों से संबंधित लगती है। लेकिन अंतिम उत्तर पाने के लिए आपको यह पता लगाना चाहिए कि इस सिफारिश को किसने और कब जोड़ा है और उससे पूछें :) या जेंटू डेवेल्स की मेलिंग सूची में पूछें।


2

मूल रूप से वह संख्या है जिसे लेखक सामान्य ज्ञान कहते हैं। सबसे अच्छा, यह एक अच्छा अनुमान है। जहां तक ​​मुझे पता है कि जब आप टाइप करते हैं, makeतो पहले से ही गिने जाने वाले मेक प्रोसेस को पहले ही काउंट कर लिया जाता है ताकि -j3आप मुख्य प्रक्रिया के इंतजार के साथ समाप्त हो सकें, जबकि दो अन्य लोग संकलन कर रहे हैं।

हालाँकि, जब मैंने Gentoo का उपयोग किया था, तो अंगूठे का नियम था <#cpus>*2 + 1

यह सब आपके चिकन ट्रेल्स, चाय की पत्ती या जादू 8 बॉल पर टिका होता है, जो आपको उस डिस्क I / O के बारे में बताता है जो आपके वर्तमान लाइनक्स कर्नेल के स्थान और समय-निर्धारण के लिए आवश्यक है। [इस पोस्ट के मूल को शुरू करें] मेरे व्यक्तिगत अनुभव से ( -jजेंटू विशिष्ट नहीं है), #cpus + 1 और #cpus * 2 +1 के बीच सब कुछ ठीक परिणाम देता है [इस पोस्ट के कोर को समाप्त करें] और औसतन आप शायद ही कोई अंतर नोट करेंगे। इन दिनों प्रोसेसर और कर्नेल काफी अच्छे हैं।

यह सब परिवर्तन तब करें जब: a) आप वास्तव में संकलन करने के लिए एक से अधिक बॉक्स का उपयोग करते हैं (du'h) या b) अपना कोड विकसित कर रहे हैं

एक उच्च -jविशेषता पहले अज्ञात निर्भरता दिखाने की अधिक संभावना है।

और एक तरफ ध्यान दें: कोर की संख्या से मत जाओ, लेकिन समवर्ती धाराओं की संख्या से सीपीयू लेते हैं। (Hypertheading!)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.