C प्रोग्राम से 100% CPU उपयोग कैसे प्राप्त करें


79

यह काफी दिलचस्प सवाल है तो मुझे सीन सेट करने दीजिए। मैं द नेशनल म्यूजियम ऑफ़ कम्प्यूटिंग में काम करता हूं, और हम 1992 से चल रहे क्रे वाई-एमपी ईएल सुपर कंप्यूटर पाने में कामयाब रहे हैं, और हम वास्तव में देखना चाहते हैं कि यह कितनी तेजी से चल सकता है!

हमने तय किया कि ऐसा करने का सबसे अच्छा तरीका एक साधारण सी प्रोग्राम लिखना है जो प्राइम नंबरों की गणना करेगा और यह दिखाएगा कि ऐसा करने में कितना समय लगा, फिर प्रोग्राम को तेज़ आधुनिक डेस्कटॉप पीसी पर चलाएं और परिणामों की तुलना करें।

प्राइम नंबर गिनने के लिए हम जल्दी से इस कोड के साथ आए:

हमारे दोहरे कोर लैपटॉप पर जो उबंटू चल रहा है (क्रे क्रे यूनिकोस चलाता है), पूरी तरह से काम करता है, 100% सीपीयू का उपयोग कर रहा है और लगभग 10 मिनट या तो ले रहा है। जब मुझे घर मिला तो मैंने अपने हेक्स-कोर आधुनिक गेमिंग पीसी पर इसे आजमाने का फैसला किया और यही वह जगह है जहां हमें अपने पहले मुद्दे मिलते हैं।

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

हालाँकि मुझे केवल 5% उपयोग मिला! तो मेरा सवाल यह है कि, मैं अपने गेमिंग मशीन पर चलने के लिए प्रोग्राम को विंडोज 7 या लाइव लिनक्स में 100% CPU उपयोग में कैसे अनुकूलित कर सकता हूं? एक और चीज जो बहुत अच्छी होगी लेकिन जरूरी नहीं है कि अंतिम उत्पाद एक .exe हो सकता है जिसे आसानी से वितरित किया जा सकता है और विंडोज मशीनों पर चलाया जा सकता है।

आपका बहुत बहुत धन्यवाद!

निश्चित रूप से इस कार्यक्रम वास्तव में Crays 8 विशेषज्ञ प्रोसेसर के साथ काम नहीं किया, और यह एक पूरी अन्य समस्या है ... यदि आप 90 के क्रे सुपर कंप्यूटरों पर काम करने के लिए कोड के अनुकूलन के बारे में कुछ भी जानते हैं तो हमें एक चिल्लाओ!


8
मुझे विश्वास नहीं हो रहा है कि यूनिकोस टैग नहीं है । ;)
एडवर्ड थॉमसन

32
यह एक अजीब बात है कि इस सिंगल थ्रेड प्रोग्राम ने DUAL कोर प्रोसेसर पर 100% CPU उपयोग किया)))
mikithskegg

24
क्या मैं अकेला हूँ जो इस सवाल को दिलचस्प नहीं पाता? एक आओ, एक एन-कोर मशीन पर एक भी थ्रेडेड प्रोग्राम चला रहे हैं और पूछ रहे हैं कि यह सीपीयू के 1 / n का उपयोग क्यों करता है ... बस कोई बात नहीं, मैं बस
नीचे उतरता हूं

16
@ श्रीश्री खैर, सवाल अनुसंधान के प्रयास को दर्शाता है। इसके लिए I + 1'ed - भले ही ओपी मल्टी-कोर कंप्यूटिंग के बारे में कुछ मौलिक याद कर रहा हो।
मिस्ट्री

9
@drhirsch साइट पर बहुत सारे निर्बाध प्रश्न हैं। हालांकि, दिलचस्प या व्यक्तिपरक नहीं है। वह मूल सिद्धांतों को याद कर रहा है और यह व्यक्तिपरक नहीं है। जैसा कि मिस्टिकल ने कहा, यह शोध के प्रयास को दिखाता है और इसका जवाब देना उतना आसान नहीं है जितना यह दिखाई देगा।
कार्ल

जवाबों:


81

यदि आप 100% सीपीयू चाहते हैं, तो आपको 1 से अधिक कोर का उपयोग करने की आवश्यकता है। ऐसा करने के लिए, आपको कई थ्रेड्स की आवश्यकता होती है।

यहाँ OpenMP का उपयोग करते हुए एक समानांतर संस्करण है:

मुझे 1000000अपनी मशीन पर इसे 1 सेकंड से अधिक लेने के लिए सीमा को बढ़ाना पड़ा ।

आउटपुट:

इस मशीन ने सभी 78498 अभाज्य संख्याओं की गणना 1000000 के तहत 29.753 सेकंड में की

यहाँ आपका 100% CPU है:

यहाँ छवि विवरण दर्ज करें


1
@ cha0site हाँ, मैंने मुख्य रूप से गेमिंग मशीन के लिए प्रश्न का उत्तर दिया। सीपीयू को खूंटी करने के लिए निश्चित रूप से अधिक दिलचस्प तरीके हैं। मेरे द्वारा किए गए अधिक कुख्यात बेंचमार्क में से एक इस सवाल का जवाब है - जो मैंने 4 में से 2 मशीनों का परीक्षण किया।
22

1
@ मिस्टिक ऑफॉप्टिक: आप किस हार्डवेयर में चल रहे हैं? मेरे हेक्स-कोर एएमडी @ 3.2Ghz ने 92 सेकंड में किया ...
बैग-मैन

1
@ ओवेन: उसके पास एक कोर i7 2600K है ... मुझे जलन हो रही है।
चेटीस

19
औघ! बहुत ... बहुत ... गुलाबी!
मतीन उलहाक

2
@MohammadFadin en.wikipedia.org/wiki/Parallel_computing मूल रूप से, आपको मल्टी-कोर कंप्यूटर का उपयोग करने में सक्षम होने के लिए समानांतर में कई कार्यों को करने में सक्षम होने की आवश्यकता है।
रहस्यपूर्ण

24

आप मल्टी-कोर मशीन पर एक प्रक्रिया चला रहे हैं - इसलिए यह केवल एक कोर पर चलती है।

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

उदाहरण

यहां कुछ कोड हैं जो NUM_OF_CORESसमानांतर में आपके प्रोग्राम को चलाते हैं। यह POSIXy कोड है - यह उपयोग करता है fork- इसलिए आपको लिनक्स के तहत चलना चाहिए। यदि मैं क्रे के बारे में जो पढ़ रहा हूं वह सही है, तो इस कोड को OpenMP कोड की तुलना में अन्य उत्तर में पोर्ट करना आसान हो सकता है।

उत्पादन


जब आप को प्राइम 95 चलाने की आवश्यकता होती है, तो इसके कई उदाहरण हैं ... निश्चित रूप से एक प्रक्रिया के लिए कई कोर का उपयोग करने का एक तरीका है? जैसे हैश क्रैकिंग प्रोग्राम करते हैं।
बैग-मैन

ठीक है, एक प्रक्रिया थ्रेड का उपयोग मल्टीप्रोसेसिंग करने के लिए कर सकती है, लेकिन मुझे नहीं लगता कि इस संदर्भ में एक अलग प्रक्रिया के बाद से आपका मतलब क्या है। हम यहां वास्तव में जिस बारे में बात कर रहे हैं वह "निष्पादन के प्रमुख" हैं, वे धागे या प्रक्रियाएं हैं। तो, नहीं, कई कोर पर एकल-थ्रेडेड प्रोग्राम चलाने का कोई तरीका नहीं है, आपको इसे फिर से लिखना होगा। और कभी-कभी यह वास्तव में कठिन होता है। और कभी-कभी यह वास्तव में असंभव है।
cha0site

वैसे मुझे लगता है कि क्रे के लिए भी काम करने का कार्यक्रम मिलना उतना कठिन नहीं होगा। यह देखते हुए कि मैं इसके लिए बहुत नया हूं (मुझे क्या दिया गया: P) जहां एक अच्छी जगह शुरू होगी?
बैग-मैन

@ ओवेन: ठीक है, UNICOSऐसा लगता है कि यह कुछ हद तक यूनिक्स के समान है (विकिपीडिया वैसे भी सोचता है), इसलिए यह संभवतः है fork()। आपको सीखना चाहिए कि इसका उपयोग कैसे करना है, मुझे लगता है।
cha0site

2
ऊह! + 1'द अब आपके पास उदाहरण है। :)
रहस्यमयी

7

हम वास्तव में देखना चाहते हैं कि यह कितनी तेजी से आगे बढ़ सकता है!

अभाज्य संख्याएँ उत्पन्न करने के लिए आपका एल्गोरिथ्म बहुत अक्षम है। इसकी तुलना प्रेजेन से करें जो एक पेंटियम II-350 पर केवल 8 सेकंड में 50847534 से 1000000000 तक उत्पन्न करता है।

आसानी से सभी सीपीयू का उपभोग करने के लिए आप एक शर्मनाक समानांतर समस्या को हल कर सकते हैं , जैसे, मैंडलब्रॉट सेट की गणना करें या एकाधिक थ्रेड्स (प्रक्रियाओं) में मोना लिसा को पेंट करने के लिए आनुवंशिक प्रोग्रामिंग का उपयोग करें ।

एक और तरीका यह है कि क्रे सुपर कंप्यूटर के लिए एक मौजूदा बेंचमार्क प्रोग्राम लिया जाए और इसे एक आधुनिक पीसी में पोर्ट किया जाए।


इससे कोई फर्क नहीं पड़ता कि एल्गोरिथ्म अक्षम है क्योंकि लक्ष्य वास्तव में primes की गणना करना नहीं है, यह एक सामान्य रूप से कठिन कार्य करना है और यह देखना है कि आधुनिक डेस्कटॉप की तुलना में यह कितना बेहतर या बुरा है। एक कुशल एल्गोरिथ्म बस उस तुलना को कठिन बना देगा, और परिणाम को बर्बाद भी कर सकता है यदि यह बहुत अच्छा है तो यह जानबूझकर आधुनिक सीपीयू सुविधाओं / quirks का लाभ उठाता है।
न्यूमेरॉन

5

हेक्स कोर प्रोसेसर पर आपको 15% का कारण मिल रहा है क्योंकि आपका कोड 100% पर 1 कोर का उपयोग करता है। 100/6 = 16.67%, जो प्रक्रिया निर्धारण के साथ एक चलती औसत का उपयोग कर रहा है (आपकी प्रक्रिया सामान्य प्राथमिकता के तहत चल रही होगी) आसानी से 15% के रूप में रिपोर्ट की जा सकती है।

इसलिए, 100% सीपीयू का उपयोग करने के लिए, आपको अपने सीपीयू के सभी कोर का उपयोग करने की आवश्यकता होगी - एक हेक्स कोर सीपीयू के लिए 6 समानांतर निष्पादन कोड पथ लॉन्च करें और इस पैमाने को सही करें, हालांकि आपके क्रे मशीन में कई प्रोसेसर हैं :)


ऐसा करने के साथ मुद्दा यह है कि मैं मशीन के प्रत्येक की गति का एक स्पष्ट आंकड़ा कैसे प्राप्त कर सकता हूं? इसके अलावा क्रे के पास "वेक्टर प्रोसेसर" जाहिरा तौर पर है, इसलिए इसे ठीक से चलाने के लिए इसे लोड करने के लिए अधिक कार्य की आवश्यकता होती है
बैग-मैन

पता नहीं। शेड्यूलिंग प्रक्रियाओं में संभवतः अंतर।
कार्ल

2

यह भी जान लें कि आप CPU को कैसे लोड कर रहे हैं। एक CPU कई अलग-अलग कार्य कर सकता है, और जब उनमें से कई को "CPU 100% लोड करना" के रूप में सूचित किया जाएगा, तो वे प्रत्येक CPU के विभिन्न भागों के 100% का उपयोग कर सकते हैं। दूसरे शब्दों में, प्रदर्शन के लिए दो अलग-अलग सीपीयू और विशेष रूप से दो अलग-अलग सीपीयू आर्किटेक्चर की तुलना करना बहुत कठिन है। निष्पादन कार्य A दूसरे पर एक CPU का पक्ष ले सकता है, जबकि कार्य B निष्पादित करते समय यह आसानी से दूसरे तरीके से हो सकता है (क्योंकि दो CPU में अलग-अलग संसाधन हो सकते हैं और कोड को बहुत अलग तरीके से निष्पादित कर सकते हैं)।

यही कारण है कि सॉफ्टवेयर उतना ही महत्वपूर्ण है जितना कि कंप्यूटर का प्रदर्शन उतना ही बेहतर है जितना कि हार्डवेयर। यह वास्तव में "सुपर कंप्यूटर" के लिए भी बहुत सही है।

सीपीयू प्रदर्शन के लिए एक उपाय प्रति सेकंड निर्देश हो सकता है, लेकिन फिर अलग सीपीयू आर्किटेक्चर पर फिर से निर्देश समान नहीं बनाए जाते हैं। एक और उपाय कैश IO प्रदर्शन हो सकता है, लेकिन कैश इन्फ्रास्ट्रक्चर समान नहीं है। तब एक माप प्रति वाट इस्तेमाल किए जाने वाले निर्देशों की संख्या हो सकती है, क्योंकि क्लस्टर कंप्यूटर को डिज़ाइन करते समय बिजली वितरण और अपव्यय अक्सर एक सीमित कारक होता है।

तो आपका पहला सवाल यह होना चाहिए: कौन सा प्रदर्शन पैरामीटर आपके लिए महत्वपूर्ण है? आप क्या मापना चाहते हैं? यदि आप यह देखना चाहते हैं कि कौन सी मशीन क्वेक 4 में से सबसे अधिक एफपीएस प्राप्त करती है, तो इसका उत्तर आसान है; अपने गेमिंग रिग होगा, क्योंकि क्रे उस कार्यक्रम को बिल्कुल भी नहीं चला सकता; ;-)

चीयर्स, स्टीन


2

TLDR; स्वीकृत उत्तर अक्षम और असंगत दोनों है। निम्नलिखित एल्गो 100x तेजी से काम करता है ।

मैक पर उपलब्ध gcc संकलक नहीं चल सकता omp। मुझे llvm इंस्टॉल करना था (brew install llvm )। लेकिन मैंने यह नहीं देखा कि OMP संस्करण चलाते समय CPU निष्क्रिय हो रहा था

यहाँ एक स्क्रीनशॉट है जबकि OMP संस्करण चल रहा था। यहाँ छवि विवरण दर्ज करें

वैकल्पिक रूप से, मैं बुनियादी POSIX धागा, कि किसी भी ग संकलक और का उपयोग कर चलाया जा सकता है इस्तेमाल किया देखा लगभग पूरे सीपीयू का इस्तेमाल किया जब nos of thread= no of cores= 4 (मैकबुक प्रो, 2.3 GHz इंटेल कोर i5)। यहाँ कार्यक्रम है -

ध्यान दें कि संपूर्ण CPU का उपयोग कैसे किया जाता है - यहाँ छवि विवरण दर्ज करें

PS - यदि आप थ्रेड्स की संख्या नहीं बढ़ाते हैं तो वास्तविक CPU उपयोग कम हो जाता है (कोशिश करें कि थ्रेड्स की संख्या = 20 न बनाएं।) क्योंकि सिस्टम वास्तविक कंप्यूटिंग की तुलना में संदर्भ स्विचिंग में अधिक समय का उपयोग करता है।

वैसे, मेरी मशीन @mystical (स्वीकृत उत्तर) के रूप में गोमांस नहीं है। लेकिन बेसिक POSIX थ्रेडिंग के साथ मेरा संस्करण OMP एक की तुलना में तेजी से काम करता है। यहाँ परिणाम है -

यहाँ छवि विवरण दर्ज करें

PS CPU उपयोग को देखने के लिए थ्रेडलोड को 2.5 मिलियन तक बढ़ाता है, क्योंकि यह एक सेकंड से भी कम समय में पूरा होता है।


0

उदाहरण के लिए, ओपनएमपी का उपयोग करके अपने प्रोग्राम को समानांतर करने की कोशिश करें। यह समानांतर कार्यक्रम बनाने के लिए एक बहुत ही सरल और प्रभावी ढांचा है।


0

एक कोर पर त्वरित सुधार के लिए, संदर्भ-स्विचिंग को कम करने के लिए सिस्टम कॉल निकालें। इन लाइनों को हटा दें:

पहला विशेष रूप से खराब है, क्योंकि यह हर पुनरावृत्ति को एक नई प्रक्रिया देगा।


0

बस एक बड़ी फ़ाइल को ज़िप और अनज़िप करने की कोशिश करें, भारी आई / ओ संचालन के रूप में कुछ भी सीपीयू का उपयोग नहीं कर सकता है।

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