कितने धागे का उपयोग करने के लिए?


11

जब मैं (फिर से) एक डेस्कटॉप / लैपटॉप कंप्यूटर पर बड़े सिस्टम का निर्माण करता हूं, तो मैं makeसंकलन गति को बढ़ाने के लिए एक से अधिक थ्रेड का उपयोग करने के लिए कहता हूं , जैसे:

$ make -j$[ $K * $C ]

कहाँ $Cकी संख्या का संकेत माना जाता है कोर , मशीन है (जिसे हम एक अंक के साथ एक नंबर होने के लिए मान सकते हैं), जबकि $Kकुछ मैं से भिन्न है 2करने के लिए 4, मेरे मूड पर निर्भर करता है।

इसलिए, उदाहरण के लिए, मैं कह सकता हूं कि make -j12अगर मेरे पास 4 कोर हैं, तो make12 धागे तक उपयोग करने का संकेत मिलता है ।


मेरा तर्क यह है कि अगर मैं केवल $Cधागे का उपयोग करता हूं , तो कोर बेकार हो जाएगा जबकि प्रक्रियाएं ड्राइव से डेटा लाने में व्यस्त हैं। लेकिन अगर मैं थ्रेड्स की संख्या (यानी make -j) को सीमित नहीं करता हूं, तो मैं समय स्विचिंग संदर्भों को बर्बाद करने के लिए जोखिम को चलाता हूं, स्मृति से बाहर चला जाता हूं, या इससे भी बदतर । मान लेते हैं कि मशीन में $Mमेमोरी की गिग्स है (जहां $M10 के क्रम में है)।

इसलिए मैं सोच रहा था कि चलाने के लिए सबसे कुशल थ्रेड चुनने के लिए एक स्थापित रणनीति है या नहीं।


कई मामलों में, थ्रेड्स की संख्या के लिए सही उत्तर कोर की संख्या है। लेकिन सुनिश्चित करने के लिए पता करने का एकमात्र तरीका कुछ परीक्षण चलाने के लिए है, जब तक कि आप मीठे स्थान को नहीं पाते तब तक थ्रेड्स की संख्या अलग-अलग होती है।
रॉबर्ट हार्वे

@RobertHarvey: हां, मैं शायद जाऊंगा और रात भर में सभी तरह की सेटिंग्स के साथ एक शेल स्क्रिप्ट कंपाइल करूंगा, लेकिन मुझे लगा कि मैं पूछूंगा कि क्या इस बारे में कुछ पता है।
बिटमस्क

4
कई लोग $ कोर + 1 का भी सुझाव देते हैं, इसलिए 1 संकलक प्रक्रिया डिस्क से पढ़ती है जबकि 4 संकलन। एक सामान्य सुझाव कठिन है, कोड बेस (C ++ टेम्प्लेट का उपयोग बनाम कुछ संकलन के साथ छोटी संकलन इकाइयाँ), कंपाइलर चेन (प्री-कंपाइल हेडर इत्यादि) और बिल्ड स्ट्रक्चर पर भी निर्भर करता है (क्या यह सिर्फ एक बड़ी बात है? अंत या बीच में कई छोटी चीजें)
जोहान्स

1
यदि आप गंभीरता से प्रदर्शन की तलाश कर रहे हैं, तो मैं सुझाव दूंगा कि आप अपने आई / ओ को कम करने के लिए एक रैम डिस्क या किसी अन्य विधि की स्थापना करें। मुझे नहीं लगता कि CPU उपयोग आपका हॉट स्पॉट है।
TMN

@TMN: रैम डिस्क कैसे मदद करती है? लिनक्स सामान कैशिंग (आप पर बहुत अच्छी है करना , सही हेडर फाइल मतलब है?), ड्राइव कैश उल्लेख करने के लिए नहीं। मुझे पहले सब कुछ शम में लोड करना होगा, या तो मैन्युअल रूप से या बिल्ड स्क्रिप्ट को बदलकर (जो पूरी तरह से ओवरकिल होगा)।
बिटमस्क

जवाबों:


15

मैंने दो कोर और 8 जीबी रैम के साथ एक मशीन पर llvm (डिबग + एसेर्ट्स मोड में) परीक्षण की एक श्रृंखला चलाई।

नौकरियों की संख्या के आधार पर llvm समय संकलन

अजीब तरह से, यह 10 तक चढ़ने लगता है और फिर अचानक दो नौकरियों के साथ निर्माण में लगने वाले समय से नीचे चला जाता है (एक नौकरी दोहरे समय के बारे में लेती है, ग्राफ़ में शामिल नहीं)।

7*$coresइस मामले में न्यूनतम लगता है ।


1
वास्तविक परीक्षण के लिए +1 और अटकलें नहीं।
मार्टिन विकमैन

3

मैं जेंटू लिनक्स (स्रोत-आधारित वितरण) चला रहा हूं और अपने अनुभव से मैं कह सकता हूं कि (कम या ज्यादा हालिया हार्डवेयर के साथ) n*2 + xसबसे अच्छा मूल्य है। मुझे यह समझाने दो:

  • n*2: यहां तक ​​कि धीमी सीपीयू में एक समय में 2 कार्य चलाने की पर्याप्त शक्ति होती है। अधिकांश संकलन कार्य बहुत तेजी से पूरे होते हैं।
  • +xयह संख्या आपके सिस्टम (मुख्य रूप से मेमोरी और डिस्क) पर निर्भर करती है। यदि आपके पास पर्याप्त रैम और एक तेज़ डिस्क है, तो सेट करें x=n। हालांकि, यह स्रोत कोड (ओपन ऑफिस, मैं आपको देख रहा हूं!) और प्रयुक्त भाषा (सी / सी ++ का संकलन बहुत स्मृति गहन है) पर निर्भर करता है।

हालांकि, आपको -jसर्वश्रेष्ठ नंबर प्राप्त करने के लिए कुछ मूल्यों के साथ कुछ परीक्षण चलाने होंगे । इसके अलावा, बिल्ड प्रक्रिया के अन्य चरणों को समानांतर करने का प्रयास करें: अनपैकिंग, रनिंग configureऔर इसी तरह।


मैं इस समय C ++ से ज्यादातर चिंतित हूं, और मेरे डिस्क सबसे तेज नहीं हैं, मुझे लगता है।
बिटमैस्क

फिर n * 1.5 से शुरू करें और इसे तब तक बढ़ाएं जब तक कि संकलन समय कम न हो जाए (सुनिश्चित करें कि आप हर बार डिस्क कैश / संकलन कैश को साफ करते हैं)। इसके अलावा, संकलन को गति देने के लिए ccache ( ccache.samba.org ) का उपयोग करने के बारे में सोचें ।
जर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.