2012-02-23 10 views
20

के अंदर मिंगव का उपयोग करके एकाधिक कोरों पर संकलन कैसे करें मेरे पास मेरे विंडोज डेस्कटॉप पर क्वाड-कोर i7 CPU है। मैं जितना संभव हो उतना कोर का उपयोग करके संकलन करने के लिए mingw32-make प्राप्त करने की कोशिश कर रहा हूं। मैंने बिल्ड सेटिंग्स-> बिल्ड चरणों के तहत "तर्क बनाएं" फ़ील्ड में -j8 जोड़ा है। mingw32-make पूरी तरह से विकल्प को अनदेखा करता है क्योंकि मुझे इससे कोई गति सुधार नहीं मिलता है। जब मैं कार्य प्रबंधक में CPU उपयोग को देखता हूं, तो यह 13% पर रहता है और मुझे केवल g ++ चलने का एक उदाहरण दिखाई देता है।QTCreator

अभी, मिंगव का उपयोग कर पूरे प्रोजेक्ट का पुनर्निर्माण 3 पूर्ण मिनट लेता है। एमएसवीसी का उपयोग करके इसे पुनर्निर्माण करने में केवल 15 सेकंड लगते हैं।

आपकी जानकारी के लिए, मैंने प्रोजेक्ट सेटिंग्स में प्रीकंपिल्ड हेडर विकल्प सक्षम किया है। इससे वीसी के साथ चीजें बहुत तेज हो जाती हैं। लेकिन मैं अभी भी mingw के साथ precompiled शीर्षलेख का लाभ देखने के लिए अभी भी हूँ।

अगर आपने कभी QTCreator से समानांतर में एकाधिक स्रोत फ़ाइलों को संकलित करने के लिए mingw मिल गया है, तो कृपया अपनी टिप्पणियां साझा करें। धन्यवाद!

उत्तर

22

यहाँ मैं क्या किया है।

टूल्स -> क्यूटी निर्माता में विकल्प मेनू "बिल्ड और रन" अनुभाग के तहत एक विकल्प है जो कहता है "एनएमके के बजाय जॉम का उपयोग करें"। मैंने उस बॉक्स को चेक किया, लेकिन कुछ भी नहीं बदला।तो इसके बजाय, मैं प्रोजेक्ट की बिल्ड सेटिंग्स पर गया और बिल्ड स्टेप श्रेणी के तहत एक "मेक" आइटम है। उस पर विवरण विस्तृत करें और आपको "mingw32-make.exe ओवरराइड करें:" आइटम मिलेगा। मैंने वहां "सी: \ QtSDK \ QtCreator \ bin \ jom.exe" चिपकाया, और अचानक मैं कई कोर के साथ निर्माण कर रहा था।

क्यूटी निर्माता 2.4.1 पर मेरे लिए काम किया। कोशिश करो।

+0

mingw32-make के बजाय JOM का उपयोग करना बहुत अच्छा काम करता है! यद्यपि यह अभी भी वीसी संकलन की तुलना में बहुत धीमी है, यह पहले की तुलना में बहुत तेज है। –

+0

ऐसा इसलिए है क्योंकि माइक्रोस्कोफ्ट कंपाइलर एक कॉल के साथ कई सी ++ फाइलें खाना चाहता है। परंपरागत 1 9 70 की तकनीक जैसे कि इसका समर्थन नहीं करता है, वे संकलक को प्रति फ़ाइल एक फ़ाइल के साथ कहते हैं जो प्रीकंपील्ड हेडर के लिए खराब है जैसा आप देख सकते हैं। एक बेहतर बिल्ड सिस्टम पर स्विच करें। – Lothar

10

-j8 शायद जीएनयू में एक सीमा के कारण काम नहीं कर रहा है Win32 पर बनाओ।

मेक तर्क फ़ील्ड में केवल -j डालने का प्रयास करें। यह बताता है कि कई संकलन प्रक्रियाओं के रूप में इसे बनाने के लिए मेक करें - यदि आपके पास इसे संभालने के लिए पर्याप्त RAM और CPU है, तो यह एक संकलन से तेज़ होना चाहिए।

दुर्भाग्य से इनमें से केवल दो विकल्प (Makefiles को संशोधित करने के बिना) कर रहे हैं: या तो -j1, या असीमित -j

पूर्ण विवरण: जीएनयू Win32 पर बनाओ काम सर्वर का समर्थन नहीं करता है, तो एक माता पिता की प्रक्रिया कर सकते हैं ' किसी उप-मेक द्वारा उत्पन्न संकलन प्रक्रियाओं की संख्या को ट्रैक न करें। सुरक्षित होने के लिए, उप-मेक केवल -j1 के साथ चलाया जाता है। मेरा मानना ​​है कि qmake/Qt निर्माता के जेनरेट मेकफ़ाइल मेकफ़ाइल के कई परतों का उपयोग करते हैं। मैं पहली बार माइक्रोचिप के MPLAB एक्स आईडीई के साथ इस मुद्दे पता लगा, अधिक जानकारी के लिए this thread की जाँच

README.W32 से यह बोली जीएनयू साथ वितरित किया जाता है समानांतर के लिए

समर्थन

समानांतर बनाता है बनाता है बनाएँ (-jN) 2 सीमाओं के साथ इस बंदरगाह में समर्थित हैं,:

  • समवर्ती प्रक्रियाओं की संख्या 64 की एक हार्ड सीमा होती है, इस बंदरगाह के कारण सबप्रोसेसेस के लिए इंतजार कर रहा है;

  • काम सर्वर विधि (उपलब्ध बनाने प्लेटफार्मों Posix पर चलता है जब) समर्थित नहीं है, जिसका अर्थ है आप एक पुनरावर्ती Makefile में उप बनाने के लिए एक स्पष्ट -jN स्विच गुजरना होगा। यदि उप-मेक को एक स्पष्ट-जेएन स्विच प्राप्त नहीं होता है, तो यह डिफ़ॉल्ट रूप से -j1 होगा, यानी उप-मेक में कोई समांतरता नहीं है।

+1

का उपयोग करना -j बहुत अच्छा काम करता है हालांकि यह मेरे कंप्यूटर पर संकलन प्रक्रियाओं की एक बड़ी संख्या उत्पन्न करता है। इनपुट के लिए धन्यवाद! –

+1

यह एक महान स्टॉप-गैप उपाय है जबतक कि आप एक बड़ी परियोजना नहीं बना रहे हैं। यदि आप एक दर्जन से अधिक स्रोतों के लिए संकलित कर रहे हैं तो आप प्रमुख CPU मुद्दों को हिट करने के लिए बाध्य हैं। यदि आप तीन या चार दर्जन से अधिक स्रोतों को संकलित कर रहे हैं तो आप स्मृति समस्याओं को हिट करने के लिए लगभग बाध्य हैं। – inetknght

3

उपयोग MAKE_COMMAND वातावरण चर:

set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS% 
+1

नहीं। यह mingw32-make के लिए काम नहीं करता है। विकल्प -जेएन को केवल अनदेखा किया जाता है। –

+1

पता नहीं कि आपको क्या कहना है लेकिन यह मेरे और दूसरों के लिए काम करता है: http://stackoverflow.com/questions/1247162/gnu-make-jobs-option-in-qmake –

0

-j जाने का रास्ता, परियोजना दुर्भाग्य से मेरे लिए इतनी बड़ी यह मेरे उपलब्ध स्मृति और मेरे कंप्यूटर फ्रीज़ के सभी का उपयोग करता है है है, इसलिए कि बारे में पता होना । ब्रेंडन ने कहा कि उदाहरण के लिए केवल आधे कोर का उपयोग करने का कोई तरीका नहीं है, जो सत्य होने पर दयालु है।

4

-j9 जोड़ें (की जगह 9NUMBER_OF_PROCESSORS का मूल्य (विंडोज़)/$(nproc) (लिनक्स) के अलावा एक करने के लिए - यह इष्टतम है) qmake \ जनरेटर में सभी

QString makefilein = " -f " + subtarget->makefile; 

लाइनों के लिए \ makefile.cpp (लगता है तुम्हरे द्वारा)।

यह परिणाम के रूप में

QString makefilein = " -j9 -f " + subtarget->makefile; 

तो उचित parametres साथ configure.exe चलाने (! और अतिरिक्त -qmake -dont-process makefiles की पीढ़ी बहुतायत से बचने के लिए!)।

समस्या यह है कि आपको "डीबग और रिलीज" बिल्ड के दौरान प्रक्रियाओं के दो सेट मिलते हैं। इस प्रकार, उत्पन्न प्रक्रियाओं की कुल गणना 18+ है।

0

मुद्दा यह है कि मूल बनाने में नौकरियों का समर्थन नहीं होता है। तो mingw32 पोर्ट में यह भी नहीं था। तब से इसे जोड़ा गया है। मेरा मानना ​​है कि 'सही' नौकरियों के समर्थन के साथ सबसे पुराना संस्करण 3.82.90 है। आप नीचे दिए गए लिंक पर पा सकते हैं।

http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82.90-cvs-20120823/

0

क्यूटी निर्माता में परियोजनाओं के लिए जाने -> बिल्ड & भागो -> अपने विशिष्ट MinGW सेटअप का निर्माण -> पर्यावरण (नीचे जनरल/बिल्ड कदम/साफ चरणों इस स्क्रीन पर है ..) और फिर बनाएँ एक चर MAKEFLAGS जोड़ें और इसे -j8 पर सेट करें। मैंने अपनी दो कोर मशीन पर -j4 और क्यूटी क्रिएटर 4.4.1 और मिनजीडब्लू 5.3.0 के साथ इसका परीक्षण किया। जब मेरा प्रोसेसर संकलित करता है तो कार्य प्रबंधक में 100% प्रदर्शन पर चलाया जा सकता है। इस विकल्प के बिना यह लगभग 25% था इसलिए मुझे लगता है कि यह ठीक वैसे ही काम करता है। निर्माण अब बहुत तेज है।

संबंधित मुद्दे