दिलचस्प पोस्ट
सी # में वृद्धिशील JSON पार्सिंग मैं डेटाटाइम पायथन मॉड्यूल का उपयोग करते हुए वर्तमान दिनांक से छह महीने की तारीख कैसे गणना करूं? एकाधिक फ़ील्ड्स द्वारा ऑब्जेक्ट्स की तुलना कैसे करें सी ++ विन्सॉक पी 2 पी Async का उपयोग / कई कार्यों के लिए इंतजार Preg_match के साथ एक सरणी में कैसे खोजें? एंड्रॉइड स्टूडियो में जेएनआई और ग्रेडल एंड्रॉइड टुकड़े स्क्रीन रोटेशन या कॉन्फ़िगरेशन परिवर्तन के दौरान एक AsyncTask को बनाए रखना इंस्टॉल कंसोल में त्रुटि दिखाता है: फ़ाइलेड कन्फ्लिक्टिंग प्रदाता इंस्टॉल करें पता लगाएँ कि कोई तत्व दृश्यमान है MFMailComposeViewController के MailComposer शीट में एक UIImage कैसे जोड़ें मैं जावास्क्रिप्ट ऑब्जेक्ट के गुणों को कैसे गिनता हूं? Utf16 को द्विआधारी मोड में लिखना AsyncTask: doInBackground () के वापसी मूल्य कहां जाता है? पीएसपी और लिनक्स के माध्यम से पीडीओ का उपयोग करके mssql से कनेक्ट करना

"मल्टीकोर" असेंबली भाषा क्या दिखती है?

एक बार, एक समय पर x86 कोडल लिखने के लिए, उदाहरण के लिए, आपके पास "मान 5 के साथ एडीएक्स रजिस्टर लोड करें", "ईडीएक्स बढ़ाना" रजिस्टर, इत्यादि बताते हुए निर्देश होंगे।

आधुनिक सीपीयू जिनके पास 4 कोर (या इससे भी ज्यादा) हैं, मशीन कोड स्तर पर, यह सिर्फ दिखता है कि वहाँ 4 अलग सीपीयू हैं (यानी सिर्फ 4 भिन्न "एडीएक्स" रजिस्टरों हैं)? यदि हां, तो जब आप "ईडीएक्स रजिस्टर बढ़ाना" कहते हैं, तो क्या तय करता है कि किस ईडीएक्स रजिस्टर में वृद्धि हुई है? क्या अब एक "सीपीयू संदर्भ" या "धागा" अवधारणा अब x86 कोडल में है?

कोर के बीच संचार / सिंक्रनाइज़ेशन कैसे काम करता है?

यदि आप एक ऑपरेटिंग सिस्टम लिख रहे थे, तो हार्डवेयर के माध्यम से कौन-सी तंत्र को अलग-अलग कोर पर निष्पादन शेड्यूल करने के लिए अनुमति दी जाती है? क्या यह कुछ विशेष निजीकृत निर्देश (ओं) है?

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

बहु-कोर कार्यक्षमता का समर्थन करने के लिए x86 मशीन कोड में कौन से परिवर्तन किए गए हैं?

वेब के समाधान से एकत्रित समाधान ""मल्टीकोर" असेंबली भाषा क्या दिखती है?"

यह सवाल का सीधा जवाब नहीं है, लेकिन यह एक ऐसे प्रश्न का उत्तर है जो टिप्पणियों में प्रकट होता है। मूलतः, सवाल यह है कि हार्डवेयर का समर्थन बहु-थ्रेडेड ऑपरेशन को देता है।

निकोलस फ्लैंट ने इसे ठीक किया था , कम से कम एक्स 86 के बारे में। बहु थ्रेडेड वातावरण (हाइपर-थ्रेडिंग, मल्टि कोर या मल्टी-प्रोसेसर) में, बूटस्ट्रैप धागा (आमतौर पर प्रोसेसर 0 में कोर 0 में थ्रेड 0) 0xfffffff0 पते से कोड प्राप्त करना शुरू करता है। सभी अन्य थ्रेड्स एक विशेष नींद राज्य में शुरू होती हैं, जिसे प्रतीक्षा-के-एसआईपीआई कहते हैं । अपने आरम्भिकरण के एक भाग के रूप में, प्राथमिक धागा एक विशेष अंतर-प्रोसेसर-इंटरप्ट (आईपीआई) को APIC पर भेजता है जिसे एक एसआईपीआई (स्टार्टअप आईपीआई) कहा जाता है जो कि प्रत्येक थ्रेड WFS में है एसआईपीआई में वह पता शामिल है जिसमें से थ्रेड को कोड लाया जाना चाहिए।

यह तंत्र प्रत्येक थ्रेड को किसी भिन्न पते से कोड निष्पादित करने की अनुमति देता है। सभी की जरूरत है प्रत्येक धागे के लिए सॉफ्टवेयर का समर्थन करने के लिए अपने स्वयं के टेबल और संदेश कतारों को स्थापित करने के लिए। ओएस वास्तविक बहु-थ्रेडेड शेड्यूलिंग करने के लिए उन का उपयोग करता है

जहां तक ​​वास्तविक विधानसभा का संबंध है, निकोलस ने लिखा है, एक एकल थ्रेडेड या मल्टी थ्रेडेड एप्लीकेशन के लिए असेंबलियों में कोई अंतर नहीं है। प्रत्येक तार्किक धागा का अपना रजिस्टर सेट है, इसलिए लिखना:

 mov edx, 0 

वर्तमान चल रहे थ्रेड के लिए केवल EDX को अपडेट करेगा एकल विधानसभा अनुदेश का उपयोग करते हुए किसी अन्य प्रोसेसर पर EDX को संशोधित करने का कोई तरीका नहीं है। ओएस से पूछने के लिए आपको कुछ प्रकार की सिस्टम कॉल की जरूरत है ताकि कोड को चलाने के लिए दूसरे थ्रेड को बताने की आवश्यकता हो जो अपने स्वयं के EDX अपडेट करे।

जैसा कि मैं इसे समझता हूं, प्रत्येक "कोर" एक पूर्ण प्रोसेसर है, अपने स्वयं के रजिस्टर सेट के साथ मूल रूप से, BIOS आपको एक कोर चलने से शुरू कर देता है, और फिर ऑपरेटिंग सिस्टम अन्य कोरों को शुरू करके और उन्हें चलाने के लिए कोड पर इशारा कर सकता है।

सिंक्रनाइज़ेशन ओएस द्वारा किया जाता है आम तौर पर, प्रत्येक प्रोसेसर ओएस के लिए एक अलग प्रक्रिया चल रहा है, इसलिए ऑपरेटिंग सिस्टम की बहु-थ्रेडिंग कार्यक्षमता यह तय करने के प्रभारी है कि किस प्रक्रिया को याद किया जाता है और स्मृति टकराव के मामले में क्या करना है।

अनौपचारिक एसएमपी अकसर किये गए सवाल स्टैक अतिप्रवाह लोगो


एक बार, एक्स 86 कोडर लिखने के लिए, उदाहरण के लिए, आपके पास निर्देश होंगे कि "मान 5 के साथ एडीएक्स रजिस्टर लोड करें", "ईडीएक्स बढ़ाना" रजिस्टर आदि। आधुनिक सीपीयू के साथ जो 4 कोर (या अधिक) , मशीन कोड स्तर पर क्या यह सिर्फ दिखता है कि वहाँ 4 अलग सीपीयू हैं (यानी सिर्फ 4 भिन्न "एडीएक्स" रजिस्टरों हैं)?

ठीक ठीक। 4 अलग निर्देश पॉइंटर्स सहित 4 रजिस्टरों के सेट हैं

यदि हां, तो जब आप "ईडीएक्स रजिस्टर बढ़ाना" कहते हैं, तो क्या तय करता है कि किस ईडीएक्स रजिस्टर में वृद्धि हुई है?

उस निर्देश को निष्पादित करने वाले CPU, स्वाभाविक रूप से इसके बारे में 4 पूरी तरह से अलग माइक्रोप्रोसेसरों के बारे में सोचें जो केवल एक ही स्मृति साझा कर रहे हैं।

क्या अब एक "सीपीयू संदर्भ" या "धागा" अवधारणा अब x86 कोडल में है?

नहीं। कोडांतरक सिर्फ निर्देशों का अनुवाद करता है जैसे हमेशा किया। वहाँ कोई बदलाव नहीं है

कोर के बीच संचार / सिंक्रनाइज़ेशन कैसे काम करता है?

चूंकि वे समान स्मृति साझा करते हैं, इसलिए यह ज्यादातर कार्यक्रम तर्क का विषय है। यद्यपि अब एक अंतर-प्रोसेसर तंत्र में बाधा है, यह आवश्यक नहीं है और मूल रूप से पहले दोहरे-सीपीयू एक्स 86 प्रणालियों में मौजूद नहीं था।

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

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

क्या यह कुछ विशेष विशेषाधिकार प्राप्त निर्देश है?

नहीं। कोर एक ही मेमोरी में ही पुराने निर्देशों के साथ चल रहे हैं।

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

आप समान कोड को पहले से चलाते हैं यह यूनिक्स या विंडोज कर्नेल है जिसे बदलने की जरूरत है।

आप मेरे प्रश्न का सारांश "मल्टी-कोर फंक्शनैलिटी को समर्थन देने के लिए x86 मशीन कोड में किए गए परिवर्तनों के रूप में संक्षेपित कर सकते हैं?"

कुछ भी आवश्यक नहीं था पहले एसएमपी सिस्टम ने एक ही अनुदेश सेट एक्यूप्रोसेसरों के रूप में निर्धारित किया था। अब, एक्स 86 आर्किटेक्चर विकास और चीजों को तेजी से बनाने के लिए नए निर्देशों के ज़िलियंस का एक बड़ा सौदा रहा है, लेकिन एसएमपी के लिए कोई भी आवश्यक नहीं था।

अधिक जानकारी के लिए, इंटेल मल्टीप्रोसेसर विनिर्देश देखें ।


अद्यतन: सभी अनुवर्ती प्रश्नों को पूरी तरह से स्वीकार करते हुए उत्तर दिया जा सकता है कि एक एन-वे मल्टीकोर सीपीयू लगभग 1 है जो एक अलग प्रोसेसर के समान है जो सिर्फ एक ही मेमोरी साझा करते हैं। 2 एक महत्वपूर्ण सवाल नहीं पूछा गया: एक प्रोग्राम को अधिक प्रदर्शन के लिए एक से अधिक कोर चलाने के लिए कैसे लिखा जाता है? और इसका उत्तर है: इसे थ्रेड लाइब्रेरी जैसे पीथ्रेड्स का उपयोग करते हुए लिखा गया है । कुछ थ्रेड लाइब्रेरी "हरी धागे" का उपयोग करते हैं जो ओएस में दिखाई नहीं दे रहे हैं, और उनको अलग-अलग कोर नहीं मिलेगा, लेकिन जब तक थ्रेड लाइब्रेरी कर्नेल थ्रेड सुविधाओं का उपयोग करता है, तब तक आपके थ्रेडेड प्रोग्राम स्वचालित रूप से मल्टीकोर होगा


1. पिछली संगतता के लिए, केवल पहला कोर रीसेट पर शुरू होता है, और शेष ड्राइवरों को आग लगाने के लिए कुछ चालक-प्रकार की चीजों की आवश्यकता होती है।
2. वे सभी बाह्य उपकरणों को भी साझा करते हैं, स्वाभाविक रूप से

न्यूनतम रननेबल इंटेल x86 बेअर मेटल उदाहरण

सभी आवश्यक बॉयलरप्लेट के साथ रननबल बेअर मेटल उदाहरण सभी प्रमुख भागों नीचे शामिल हैं

Ubuntu 15.10 QEMU 2.3.0 और लेनोवो थिंकपैड T400 पर परीक्षण किया गया।

इंटेल मैनुअल वॉल्यूम 3 सिस्टम प्रोग्रामिंग गाइड – 325384-056 सितंबर 2015 अध्याय 8, 9 और 10 में एसएमपी को कवर करता है।

तालिका 8-1 "प्रसारण आईआईटी-एसआईपीआई-एसआईपीआई अनुक्रम और टाइमआउट का विकल्प" में एक ऐसा उदाहरण है, जो मूलतः बस काम करता है:

 MOV ESI, ICR_LOW ; Load address of ICR low dword into ESI. MOV EAX, 000C4500H ; Load ICR encoding for broadcast INIT IPI ; to all APs into EAX. MOV [ESI], EAX ; Broadcast INIT IPI to all APs ; 10-millisecond delay loop. MOV EAX, 000C46XXH ; Load ICR encoding for broadcast SIPI IP ; to all APs into EAX, where xx is the vector computed in step 10. MOV [ESI], EAX ; Broadcast SIPI IPI to all APs ; 200-microsecond delay loop MOV [ESI], EAX ; Broadcast second SIPI IPI to all APs ; Waits for the timer interrupt until the timer expires 

उस कोड पर:

  1. अधिकांश ऑपरेटिंग सिस्टम रिंग 3 (यूजर प्रोग्राम्स) से उन कार्यों में से सबसे ज्यादा असंभव बनायेंगे।

    तो आपको इसके साथ स्वतंत्र रूप से खेलने के लिए अपना खुद का कर्नेल लिखना होगा: एक यूज़रलैंड लिनक्स प्रोग्राम काम नहीं करेगा।

  2. सबसे पहले, एक एकल प्रोसेसर चलाता है, जिसे बूटस्ट्रैप प्रोसेसर (बीएसपी) कहा जाता है।

    इंटर प्रोसेसर इंटरप्ट्स (आईपीआई) नामक विशेष इंटरप्ट के माध्यम से इसे अन्य लोगों (एपीआई प्रोसेसर्स (एपी)) को जागृत करना चाहिए।

    इंटरप्ट कमांड रजिस्टर (आईसीआर) के माध्यम से प्रोग्रामन एडवांस्ड प्रोग्रेमबल इंटरप्ट कंट्रोलर (एपीआईसी)

    आईसीआर का प्रारूप इस प्रकार है: 10.6 "ISSUING INTERPROCESSOR इंटररर्ट्स"

    जैसे ही हम आईसीआर को लिखते हैं, जैसे ही आईपीआई होता है।

  3. ICR_LOW को 8.4.4 "MP प्रारंभिक उदाहरण" पर परिभाषित किया गया है:

     ICR_LOW EQU 0FEE00300H 

    जादू मूल्य 0FEE00300 आईसीआर का मेमोरी पता है, जैसा कि तालिका 10-1 "लोकल एपीआईसी रजिस्टर पता नक्शा"

  4. उदाहरण में सरलतम संभव विधि का उपयोग किया जाता है: यह आईसीआर को प्रसारित करता है जो प्रसारण आईपीआई भेजता है जो वर्तमान एक को छोड़कर अन्य सभी प्रोसेसरों को वितरित किया जाता है।

    लेकिन यह भी संभव है, और कुछ लोगों द्वारा सिफारिश की गई है , एसीपीआई तालिकाओं या इंटेल की एमपी कॉन्फ़िगरेशन टेबल जैसी BIOS द्वारा सेटअप किए जाने वाले विशेष डेटा संरचनाओं के माध्यम से प्रोसेसर के बारे में जानकारी प्राप्त करने के लिए और केवल उन लोगों को जागृत करें जिनकी आपको एक-एक आवश्यकता है

  5. XX में 000C46XXH पहले निर्देश के पते को एन्कोड करता है जो कि प्रोसेसर के रूप में निष्पादित करेगा:

     CS = XX * 0x100 IP = 0 

    याद रखें कि सीएस गुणक 0x10 संबोधित करते हैं , इसलिए पहला निर्देश का वास्तविक मेमोरी पता है:

     XX * 0x1000 

    इसलिए यदि उदाहरण के लिए XX == 1 , प्रोसेसर 0x1000 से शुरू होगा।

    हमें तब यह सुनिश्चित करना होगा कि 16-बिट वास्तविक मोड कोड उस मेमोरी स्थान पर चलाया जा सकता है, उदाहरण के साथ:

     cld mov $init_len, %ecx mov $init, %esi mov 0x1000, %edi rep movsb .code16 init: xor %ax, %ax mov %ax, %ds /* Do stuff. */ hlt .equ init_len, . - init 

    एक लिंकर स्क्रिप्ट का उपयोग करना एक और संभावना है।

  6. देरी लूप काम करने के लिए एक कष्टप्रद हिस्सा हैं: ऐसा करने के लिए कोई अति आसान तरीका नहीं है, ठीक से सोता है

    संभावित तरीकों में शामिल हैं:

    • पिट (मेरे उदाहरण में प्रयोग किया जाता है)
    • HPET
    • उपरोक्त के साथ एक व्यस्त लूप का समय जांचना, और इसका उपयोग इसके बजाय

    संबंधित: स्क्रीन पर नंबर प्रदर्शित करने और डॉस एक्स 86 विधानसभा के साथ एक सेकंड के लिए सोए कैसे?

  7. मुझे लगता है कि प्रारंभिक प्रोसेसर को इसके लिए सुरक्षित मोड में रखने की आवश्यकता है क्योंकि हम 0FEE00300H पते पर 0FEE00300H जो 16-बिट के लिए बहुत अधिक है

  8. प्रोसेसर के बीच संवाद करने के लिए, हम मुख्य प्रक्रिया पर स्पिनलॉक का उपयोग कर सकते हैं, और दूसरे कोर से लॉक को संशोधित कर सकते हैं।

    हमें यह सुनिश्चित करना चाहिए कि स्मृति लिखना वापस किया गया है, जैसे wbinvd माध्यम से।

प्रोसेसर के बीच साझा राज्य

8.7.1 "स्टेट ऑफ द लॉजिकल प्रोसेसर" कहता है:

इंटेल हाइपर-थ्रेडिंग टेक्नोलॉजी का समर्थन करने वाले इंटेल 64 या आईए -32 प्रोसेसर के अंदर निम्न विशेषताएं लॉजिकल प्रोसेसर के वास्तुकला अवस्था का हिस्सा हैं। सुविधाओं को तीन समूहों में विभाजित किया जा सकता है:

  • प्रत्येक तार्किक प्रोसेसर के लिए डुप्लिकेट किया गया
  • भौतिक प्रोसेसर में लॉजिकल प्रोसेसर द्वारा साझा किया गया
  • कार्यान्वयन के आधार पर साझा या डुप्लिकेट किया गया

प्रत्येक लॉजिकल प्रोसेसर के लिए निम्नलिखित विशेषताओं को डुप्लिकेट किया गया है:

  • सामान्य प्रयोजन रजिस्टर (ईएक्स, ईबीएक्स, ईसीएक्स, ईडीएक्स, ईएसआई, ईडीआई, ईएसपी, और ईबीपी)
  • सेगमेंट रजिस्टरों (सीएस, डीएस, एसएस, ईएस, एफएस और जीएस)
  • ईफलैज और ईआईपी रजिस्टरों नोट करें कि प्रत्येक तार्किक प्रोसेसर के लिए सीएस और ईआईपी / आरआईपी रजिस्टरों तार्किक प्रोसेसर द्वारा निष्पादित थ्रेड के लिए निर्देश स्ट्रीम को इंगित करता है।
  • x87 एफपीयू रजिस्टर्स (एसटी0 से एसटी 7, स्टेटस वर्ड, कंट्रोल वर्ड, टैग शब्द, डाटा ऑपरैण्ड पॉइंटर, और निर्देश पॉइंटर)
  • एमएमएक्स रजिस्टरों (MM0 से MM7)
  • एक्सएमएम रजिस्टरों (एक्सएमएम 7 एक्सएमएम 7 के माध्यम से) और एमएक्ससीएसआर रजिस्टर
  • नियंत्रण रजिस्टर और सिस्टम तालिका सूचक रजिस्टर (जीडीटीआर, एलडीटीआर, आईडीटीआर, कार्य रजिस्टर)
  • डीबग रजिस्टरों (डीआर 0, डीआर 1, डीआर 2, डीआर 3, डीआर 6, डीआर 7) और डिबग नियंत्रण एमएसआर
  • मशीन की जांच वैश्विक स्थिति (IA32_MCG_STATUS) और मशीन की जांच क्षमता (IA32_MCG_CAP) MSRs
  • थर्मल क्लॉक मॉड्यूलेशन और एसीपीआई पावर प्रबंधन कंट्रोल एमएसआर
  • टाइम स्टैंप काउंटर MSRs
  • पेज एट्रिब्यूट टेबल (पीएटी) सहित अन्य एमएसआर रजिस्टरों में से अधिकांश। नीचे अपवाद देखें
  • स्थानीय एपीआईसी रजिस्टरों
  • अतिरिक्त सामान्य प्रयोजन रजिस्टर (R8-R15), एक्सएमएम रजिस्टरों (एक्सएमएम 8-एक्सएमएम 15), नियंत्रण रजिस्टर, IA32_EFER इंटेल 64 प्रोसेसर पर।

निम्नलिखित विशेषताएं तार्किक प्रोसेसर द्वारा साझा की जाती हैं:

  • मेमोरी टाइप रेंज रजिस्टरों (एमटीआरआर)

निम्नलिखित विशेषताएं साझा या डुप्लिकेट हैं या नहीं कार्यान्वयन-विशिष्ट है:

  • IA32_MISC_ENABLE एमएसआर (एमएसआर पता 1 ए 0 एच)
  • मशीन चेक आर्किटेक्चर (एमसीए) एमएसआर (IA32_MCG_STATUS और IA32_MCG_CAP MSRs को छोड़कर)
  • प्रदर्शन निगरानी नियंत्रण और काउंटर MSRs

कैश साझाकरण पर चर्चा की गई है: मल्टीकोर सीपीयू में कैश मेमोरी

इंटेल हाइपरथ्रेड के पास अलग-अलग कोर की तुलना में अधिक कैश और पाइपलाइन साझाकरण है: https://superuser.com/questions/133082/hyper-threading-and-dual-core-whats-the-difference/995858#995858

लिनक्स कर्नेल 4.2

मुख्य इनिशियलाइज़ेशन कार्रवाई arch/x86/kernel/smpboot.c

प्रत्येक कोर एक अलग स्मृति क्षेत्र से कार्यान्वित करता है। आपका ऑपरेटिंग सिस्टम आपके प्रोग्राम में एक कोर इंगित करेगा और कोर आपके प्रोग्राम को निष्पादित करेगा। आपके प्रोग्राम को यह नहीं पता होगा कि एक से अधिक कोर हैं या किन कोर पर इसे क्रियान्वित किया जा रहा है।

ऑपरेटिंग सिस्टम के लिए कोई अतिरिक्त निर्देश उपलब्ध नहीं है। ये कोर सिंगल कोर चिप्स के समान हैं प्रत्येक कोर ऑपरेटिंग सिस्टम का एक हिस्सा चलाता है जो संचार के लिए अगले स्मृति क्षेत्र को निष्पादित करने के लिए जानकारी इंटरचेंज के लिए उपयोग किए जाने वाले सामान्य स्मृति क्षेत्रों में संचार को संभालना होगा।

यह एक सरलीकरण है लेकिन यह आपको बुनियादी तरीके से बताता है कि यह कैसे किया जाता है। एंबेडेड.कॉम पर मल्टीकोरेस और मल्टीप्रोसेसरों के बारे में अधिक इस विषय के बारे में बहुत सारी जानकारी है … यह विषय बहुत जल्दी जटिल हो गया है!

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

जैसा कि कोई व्यक्ति जो अनुकूलक संकलक / बाइटकोड वी एम एस लिखता है, मैं यहां आपकी सहायता कर सकता हूं।

आपको एक्स-एक्स के बारे में विशेष रूप से कुछ भी जानने की आवश्यकता नहीं है ताकि यह कोड उत्पन्न कर सके जो सभी कोर में कुशलता से चलता है।

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

आपको एक्स 86 के बारे में कुछ जानने की ज़रूरत हो सकती है ताकि यह कोड उत्पन्न कर सके जो सामान्य तौर पर x86 पर कुशलता से चलता है।

आपके लिए सीखने के लिए अन्य चीजें भी उपयोगी होंगी:

आपको ओएस (लिनक्स या विंडोज या ओएसएक्स) की सुविधा के बारे में जानना चाहिए ताकि आप कई धागे चला सकें। आप समानांतर API के बारे में सीखना चाहिए जैसे ओपनएमपी और थ्रेडिंग बिल्डिंग ब्लॉकों, या OSX 10.6 "हिम तेंदुए" का आगामी "ग्रैंड सेंट्रल"

आपको विचार करना चाहिए कि क्या आपका कंपाइलर स्वत: समानांतर होना चाहिए, या यदि आपके कंपाइलर द्वारा संकलित एप्लिकेशन के लेखक को एकाधिक कोर का लाभ उठाने के लिए अपने प्रोग्राम में विशेष वाक्यविन्यास या एपीआई कॉल जोड़ने की आवश्यकता है।

विधानसभा कोड मशीन कोड में अनुवाद करेगा जो एक कोर पर निष्पादित होगा। यदि आप चाहते हैं कि यह बहुस्तरीय हो तो आपको इस कोड को विभिन्न प्रोसेसरों पर कई बार या विभिन्न कोर के अलग-अलग टुकड़ों पर शुरू करने के लिए ऑपरेटिंग सिस्टम प्राइमिटिव्स का उपयोग करना होगा – प्रत्येक कोर अलग थ्रेड को निष्पादित करेगा प्रत्येक थ्रेड केवल एक कोर दिखाई देगा जो वर्तमान में इसे चालू कर रहा है।

यह बिल्कुल मशीन निर्देशों में नहीं है; कोर विशिष्ट CPU होने का दिखावा करते हैं और एक दूसरे से बात करने के लिए किसी विशेष क्षमता नहीं होती है। दो तरीके वे संवाद कर रहे हैं:

  • वे भौतिक पता स्थान साझा करते हैं हार्डवेयर संचय कैश की संभालता है, इसलिए एक सीपीयू एक मेमोरी एड्रेस को लिखता है जो दूसरा पढ़ता है।

  • वे एपीआईसी (प्रोग्रामेबल इंटरप्ट कंट्रोलर) साझा करते हैं। यह मेमोरी भौतिक पता स्थान में मैप है, और एक प्रोसेसर द्वारा दूसरों को नियंत्रित करने, उन्हें चालू या बंद कर सकते हैं, इंटरप्ट्स आदि भेज सकते हैं।

http://www.cheesecake.org/sac/smp.html एक मूर्ख यूआरएल के साथ एक अच्छा संदर्भ है

एकल और एक बहु-थ्रेडेड अनुप्रयोग के बीच मुख्य अंतर यह है कि पूर्व में एक स्टैक है और बाद के प्रत्येक थ्रेड के लिए एक है। कोड कुछ अलग तरीके से उत्पन्न होता है क्योंकि संकलक यह मान देगा कि डेटा और स्टैक सेगमेंट रजिस्टरों (डीएस और एसएस) समान नहीं हैं। इसका मतलब यह है कि ईबीपी और एएसपी रजिस्टरों के माध्यम से indirection जो कि एसएस रजिस्टर में डिफ़ॉल्ट रूप से डीएस (डिफ़ॉल्ट रूप से डीएस! = एसएस) के लिए डिफ़ॉल्ट नहीं होगा। इसके विपरीत, अन्य रजिस्टरों के माध्यम से भ्रष्टाचार जो डी एस के लिए डिफ़ॉल्ट है, एस एस के लिए डिफ़ॉल्ट नहीं होगा।

धागे डेटा और कोड क्षेत्रों सहित बाकी सब कुछ साझा करते हैं। वे ओब दिनचर्या भी साझा करते हैं ताकि सुनिश्चित करें कि वे धागा-सुरक्षित हैं। एक प्रक्रिया जो रैम में एक क्षेत्र की तरह होती है, चीजों को गति देने के लिए बहु-थ्रेडेड हो सकती है। धागे तब एक ही भौतिक मेमोरी क्षेत्र में डेटा को एक्सेस, तुलना और ऑर्डर करेंगे और एक ही कोड को निष्पादित करेंगे, लेकिन इस तरह के अपने संबंधित भाग को नियंत्रित करने के लिए अलग-अलग स्थानीय चर का उपयोग करेंगे। यह निश्चित रूप से है क्योंकि धागे के अलग-अलग स्टैक हैं जहां स्थानीय चर शामिल हैं। इस तरह के प्रोग्रामिंग को कोड की सावधानीपूर्वक ट्यूनिंग की आवश्यकता होती है ताकि अंतर-कोर डेटा टकराव (कैश और रैम में) कम हो जाए, जो बदले में एक कोड का परिणाम होता है जो कि दो या दो से अधिक थ्रेड्स के मुकाबले तेजी से एक के साथ होता है। बेशक, एक अप्रयुक्त कोड अक्सर दो या दो से अधिक की तुलना में एक प्रोसेसर के साथ तेज़ हो जाएगा डीबग करने के लिए और अधिक चुनौतीपूर्ण है क्योंकि मानक "इंट 3" ब्रेकपॉइंट लागू नहीं होगा क्योंकि आप किसी विशेष थ्रेड को बाधित करना चाहते हैं और सभी के नहीं। डीबग रजिस्टर ब्रेकपॉइंट इस समस्या का समाधान नहीं करते हैं, जब तक कि आप उन विशिष्ट थ्रेश को निष्पादित करने वाले विशिष्ट प्रोसेसर पर सेट नहीं कर सकते जो आप को बीच में करना चाहते हैं।

अन्य बहु-थ्रेडेड कोड में प्रोग्राम के विभिन्न हिस्सों में चलने वाले विभिन्न धागे शामिल हो सकते हैं। इस प्रकार की प्रोग्रामिंग को उसी प्रकार की ट्यूनिंग की आवश्यकता नहीं होती है और इसलिए सीखना इतना आसान है

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

लेकिन मूल एक-धागा सिमेंटिक समान हैं, आप सिंक्रनाइज़ेशन और अन्य कोर के साथ संचार को संभालने के लिए अतिरिक्त सुविधाओं को जोड़ते हैं।