कई कोर का उपयोग करने के लिए ओएस के थ्रेड-स्तरीय समानता को स्पष्ट रूप से उजागर करने की आवश्यकता होती है, जिसे आमतौर पर प्रोग्रामर को बहु-थ्रेडेड प्रोग्राम लिखने की आवश्यकता होती है। (या अलग-अलग इनपुट पर कई बार एकल-थ्रेडेड प्रोग्राम चलाने के लिए, जैसे संकलन make -j4
)
कुछ भाषाओं के कंपाइलर ऑटो-समानांतरकरण का समर्थन करते हैं, हालांकि। उदाहरण के लिए, OpenMP के साथ C या C ++ एक साधारण for()
लूप को एक प्रोग्राम में संकलित कर सकता है जो कई थ्रेड्स शुरू करता है।
#pragma omp parallel for
for(int i = 0; i < 1000000; ++i)
{
A[i] = B[i] * constant + C[i];
}
लेकिन फिर भी, यह तब होता है जब आपने प्रोग्राम लिखा या संकलित किया। वर्तमान हार्डवेयर और OSes के लिए एक-पिरोया प्रोग्राम को गति देने के लिए कई कोर का उपयोग करने का कोई तरीका नहीं है।
संबंधित: एकाधिक कोर पर एक एकल धागा कैसे चलता है? : उत्तर: वे नहीं। लेकिन दूसरी तरह के समानांतरवाद हैं, जैसे इंस्ट्रक्शन-लेवल समानता जो एक सिंगल सीपीयू कोर एक बार में एक इंस्ट्रक्शन से एक सिंगल थ्रेड को तेजी से चलाने के लिए पाता है और उसका शोषण करता है।
उस सवाल पर मेरा जवाब कुछ विवरणों में जाता है कि आधुनिक सीपीयू कैसे ठीक-ठीक निर्देश-स्तर की समानता को पाते हैं और उसका फायदा उठाते हैं। (ज्यादातर x86 पर ध्यान केंद्रित कर रहा है)। एक ही बार में उड़ान में कई निर्देश होने से यह सामान्य सीपीयू कैसे काम करता है, इसका कुछ हिस्सा है, और कुछ ऐसा नहीं है जिसे आपको विशेष रूप से सक्षम करने की आवश्यकता है। (प्रदर्शन काउंटर हैं जो आपको यह देखने में मदद कर सकते हैं कि प्रोग्राम को निष्पादित करते समय आपका सीपीयू प्रति घड़ी कितने निर्देशों को चलाने में कामयाब रहा, हालांकि, या अन्य उपाय।)
ध्यान दें कि RPi3 एआरएम कॉर्टेक्स-ए 53 सीपीयू कोर का उपयोग करता है । प्रत्येक कोर 2-वाइड सुपरकेल्कर है (ILP की अनुमति के अनुसार प्रति घड़ी 2 निर्देश), लेकिन अधिक निर्देश-स्तरीय समानता खोजने और विलंबता को छिपाने के लिए निर्देशों को पुन: व्यवस्थित नहीं कर सकता है।
फिर भी, सीपीयू को पाइपलाइन किया जाता है, इसलिए उड़ान में निर्देशों की कुल संख्या (भ्रूण से और पाइपलाइन के अंत में राइट-बैक स्टेज के लिए सभी तरह से डिकोड होती है) महत्वपूर्ण है। जब डेटा निर्भरता चीजों को सीमित नहीं करती है, तो प्रत्येक पाइपलाइन चरण में 2 निर्देश हो सकते हैं जो सीपीयू पर काम कर रहा है, प्रत्येक घड़ी के दौरान 2 निर्देशों के माध्यम से। (यही 2-वाइड का मतलब है।)
यह निर्देशों को आदेश से बाहर निष्पादित नहीं कर सकता है, लेकिन सावधानीपूर्वक निर्देश के आदेश के साथ (आमतौर पर एक कंपाइलर द्वारा) यह अभी भी एक निर्देश की विलंबता को छिपा सकता है जो इसके उत्पादन के लिए कई चक्र लेता है तैयार होने के लिए। (उदाहरण के लिए अगर यह कैश में हिट होता है या एक मल्टीपल साइकल लेगा, तो भी एक लोड (जैसे कि अगला चक्र तैयार हो रहा है)। चाल एएसएम निर्देशों का आदेश देने के लिए है, इसलिए परिणाम और इसे उपयोग करने वाले के बीच कई स्वतंत्र निर्देश हैं।
सॉफ्टवेयर होने के बाद (संकलक) सांख्यिकीय रूप से शेड्यूल किए गए निर्देश हार्डवेयर के मुकाबले अधिक भंगुर होते हैं जो प्रोग्राम ऑर्डर में चलने के भ्रम को संरक्षित करते हुए आंतरिक रूप से पुन: व्यवस्थित कर सकते हैं। संकलक के लिए यह बहुत कठिन है कि वह अच्छा काम करे, साथ ही निर्देश को पुनः व्यवस्थित करने के लिए एक छोटी सी आउट-ऑफ-ऑर्डर विंडो भी क्योंकि कैश-मिस अप्रत्याशित हैं, और संकलन समय पर फ़ंक्शन कॉल पर निर्भरता श्रृंखलाओं का विश्लेषण करना कठिन है। और रजिस्टरों की संख्या हार्डवेयर रजिस्टर-नाम बदलने के बिना सीमित है।
जब आपका कोड आपकी इच्छानुसार धीमा हो जाता है, तो यह सब बहुत कम होता है। यकीन है कि एक कोर्टेक्स-ए 53 में हुड के तहत बहुत अधिक ठंडा सामान है, लेकिन कोर्टेक्स-ए 57 में हुड के नीचे और अधिक ठंडा सामान है (जैसे प्रति घड़ी 3 से अधिक निर्देशों का निष्पादन), और यहां तक कि अधिक Skylake जैसा बड़ा x86 CPU (घड़ी की गति के अंतर का उल्लेख नहीं करने के लिए)।
Cortex-A53 एक https://en.wikipedia.org/wiki/Classic_RISC_pipeline की तुलना में बहुत शानदार है , जो कि मूल MIPS की तरह है, जिनके बारे में आप कंप्यूटर-आर्किटेक्चर वर्ग में सीखेंगे, लेकिन आधुनिक मानकों से यह बहुत कम है।