आधुनिक प्रोसेसर में बिट-वार संचालन जितना तेज़ क्यों है?


72

मुझे पता है कि आधुनिक प्रोसेसर पर बिट-वार ऑपरेशन बहुत तेज़ हैं, क्योंकि वे समानांतर पर 32 या 64 बिट्स पर काम कर सकते हैं, इसलिए बिट-वार ऑपरेशन केवल एक घड़ी चक्र लेते हैं। हालांकि इसके अलावा एक जटिल ऑपरेशन है जिसमें कम से कम एक और संभवतः एक दर्जन बिट-वार ऑपरेशन शामिल हैं, इसलिए मैंने स्वाभाविक रूप से सोचा कि यह 3-4 गुना धीमा होगा। मैं एक साधारण बेंचमार्क के बाद यह देखकर आश्चर्यचकित था कि इसके अलावा बिट-वार ऑपरेशन (XOR, OR, AND etc) में से भी उतना ही तेज है। क्या कोई इसे स्पष्ट कर सकता है?




1
हां, गुणा मेरे परीक्षणों में भी बहुत तेज था। यह केवल 2x से लगभग धीमा था, जबकि विभाजन लगभग 30x (!) गुना धीमा था।
सोलोनासस

अत्याधुनिक समानांतर उपसर्ग वृक्ष योजक का संक्षिप्त अवलोकन: डेविड हैरिस द्वारा समानांतर उपसर्ग नेटवर्क का एक वर्गीकरण: Pages.hmc.edu/harris/research/taxonomy.pdf
फ्रेंकी

अधिक विस्तृत: पीएचडी जून चेन की डॉक्टरेट थीसिस "बाइनरी और मोडुलो के लिए समानांतर-उपसर्ग संरचनाएं {2n 2 1, 2n, 2n + 1} योजक" digital.library.okstate.edu
etd/

जवाबों:


104

जोड़ तेज है क्योंकि सीपीयू डिजाइनरों ने इसे तेजी से बनाने के लिए आवश्यक सर्किटरी में डाल दिया है। यह बिटवाइज़ ऑपरेशंस की तुलना में काफी अधिक फाटक लेता है, लेकिन यह अक्सर पर्याप्त होता है कि सीपीयू डिजाइनरों ने इसे इसके लायक होने के लिए आंका है। Https://en.wikipedia.org/wiki/Adder_(electronics) देखें ।

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


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
डीडब्ल्यू

38

इसके कई पहलू हैं।

  • एक बिटवाइज़ ऑपरेशन की सापेक्ष लागत और एक जोड़। एक भोले योजक में एक गेट-गहराई होगी जो शब्द की चौड़ाई के रैखिक रूप से निर्भर करती है। वैकल्पिक दृष्टिकोण हैं, फाटकों के संदर्भ में अधिक महंगा है, जो गहराई को कम करते हैं (IIRC गहराई तब शब्द की चौड़ाई के लघुगणकीय निर्भर करती है)। अन्य लोगों ने इस तरह की तकनीकों के लिए संदर्भ दिए हैं, मैं सिर्फ यह बताऊंगा कि यह अंतर भी कम महत्वपूर्ण है क्योंकि यह नियंत्रण तर्क की आवश्यकता के कारण ऑपरेशन की लागत पर विचार कर सकता है जो देरी को जोड़ता है।

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

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


6
+1। हां, अधिकांश प्रोसेसर देखे जाते हैं, लेकिन कुछ घड़ी रहित सीपीयू व्यावसायिक रूप से उपलब्ध हैं।
डेविड कैरी

2
एक और संभावना यह है कि एक प्रोसेसर 64-बिट रजिस्टर को एक 16-बिट टुकड़े और तीन 17-बिट टुकड़ों के रूप में संग्रहीत कर सकता है, जहां प्रत्येक टुकड़े के अतिरिक्त बिट्स नीचे से एक आस्थगित कैरी को पकड़े हुए हैं। इसके अलावा एक बिटवाइज ऑपरेशन या एक स्टोर के बाद कैरी को प्रचारित करने के लिए 1-2 अतिरिक्त चक्रों की आवश्यकता हो सकती है, लेकिन इसके अलावा एक और इसके अलावा अन्य कोई अतिरिक्त कदम नहीं होगा। इसके अलावा, "स्टोर" मामले में, अतिरिक्त प्रसार समय स्टोर के प्रदर्शन में देरी कर सकता है, लेकिन इसके लिए "प्रतीक्षा" करने के लिए कोड की आवश्यकता नहीं होगी।
सुपरकैट

3
@supercat पेंटियम 4 ने कुछ ऐसा किया, जिसमें एक डबल-स्पीड (बाकी प्रोसेसर के सापेक्ष) एएलयू है जो निम्न 16 या 32 बिट्स होगा जो ऊपरी आधे के बिट्स से पहले आधे चक्र के बाद के ऑपरेशन के लिए तैयार होगा।
जेफरी बोसबोम

2
क्या आप सुनिश्चित हैं कि आप जो चाहते हैं उसे मापेंगे? इस मामले में, माप से ओपी का निष्कर्ष सीपीयू के विशाल बहुमत के लिए सही होना चाहिए। जोड़ इतना सामान्य है कि सुपरस्क्लेयर CPUs में सभी निष्पादन बंदरगाहों पर इकाइयाँ हैं, और बूलियन्स लागू करने के लिए इतने सस्ते हैं (ट्रांजिस्टर काउंट में) कि वे सभी बंदरगाहों पर भी मौजूद हैं। तो जोड़ें और बूलियन लगभग हमेशा एक ही थ्रूपुट होते हैं (जैसे कि इंटेल हैवेल में प्रति घड़ी 4)।
पीटर कॉर्ड्स

2
SIMD पूर्णांक जोड़ अक्सर SIMD बूलियन की तुलना में कम थ्रूपुट होता है, हालांकि, भले ही वे आमतौर पर एक ही विलंबता रखते हैं। ब्रॉडवेल के माध्यम से पेंटियमियम से इंटेल सीपीयू केवल paddwप्रति घड़ी 2 पर वेक्टर-इंट (जैसे ) चला सकते हैं, लेकिन pand3 प्रति घड़ी बूलियन (जैसे )। (स्काईलेक सभी तीन वेक्टर निष्पादन बंदरगाहों पर एक वेक्टर योजक डालता है।)
पीटर कॉर्ड्स

24

सीपीयू साइकिल में काम करते हैं। प्रत्येक चक्र पर, कुछ होता है। आमतौर पर, एक निर्देश निष्पादित करने के लिए अधिक चक्र लेता है, लेकिन कई निर्देश एक ही समय में, विभिन्न राज्यों में निष्पादित किए जाते हैं।

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

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

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

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


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

12

प्रोसेसर पर नजर रखी जाती है, इसलिए भले ही कुछ निर्देश स्पष्ट रूप से दूसरों की तुलना में तेजी से किए जा सकें, लेकिन वे समान संख्या में चक्र ले सकते हैं।

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

ध्यान दें कि सरल एमओवी (रजिस्टर करने के लिए रजिस्टर) निर्देश बिटवाइज लॉजिक की तुलना में कम गणना करता है, फिर भी एमओवी और एडीडी दोनों आमतौर पर एक चक्र लेते हैं। यदि MOV को दो बार तेजी से बनाया जा सकता है, तो CPU को दो बार तेज और ADD को दो चक्र के रूप में देखा जाएगा।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
गाइल्स

1
चर्चा का सारांश: कुछ आउट-ऑफ-ऑर्डर सीपीयू विशेष रूप से शून्य-विलंबता के साथ रजिस्टर-रीनेमिंग के साथ विशेष रूप से एमओवी को संभालते हैं। देखें Can 86 के MOV वास्तव में "मुक्त" हो सकता है? मैं यह सब क्यों नहीं कर सकता? MOV वास्तव में क्या लागत का पूरा विवरण के लिए।
पीटर कॉर्डेस

12

जोड़-घटाव इतना महत्वपूर्ण है कि इसे 64-बिट संचायक के माध्यम से रिप करने के लिए कैरी बिट का इंतजार नहीं करना चाहिए: इसके लिए शब्द कैरी-लुकहेड योजक है और वे मूल रूप से 8-बिट सीपीयू (और उनके ALU) का हिस्सा हैं और ऊपर की तरफ हैं। वास्तव में, आधुनिक प्रोसेसर को पूर्ण गुणा के लिए अधिक निष्पादन समय की आवश्यकता नहीं है: कैरी-लुकहेड वास्तव में एक प्रोसेसर डिजाइनर टूलबॉक्स में वास्तव में पुराना (और तुलनात्मक रूप से सस्ती) उपकरण है।


पूर्णांक गुणा निश्चित रूप से उच्च विलंबता और x86 पर ADD की तुलना में कम प्रवाह है। लेकिन यह आश्चर्यजनक रूप से तेजी से विचार कर रहा है कि एक तेज गुणक बनाने के लिए कितने योजक लगते हैं: जैसे कि नेहेलम के बाद से इंटेल, और एएमई के बाद से रायज़ेन, 8/16/32/64-बिट स्केलर पूर्णांक 3 चक्र विलंबता है, प्रति 1c थ्रूपुट के साथ (एक पूरी तरह से pipelined निष्पादन इकाई)। यह 3 या 4 प्रति घड़ी के ADD थ्रूपुट की तुलना में बेकार है, लेकिन Intel Pentium 5 में 9 चक्र IMUL विलंबता की तुलना में आश्चर्यजनक है। SIMD के लिए चीजें समान हैं: वेक्टर-इंट गुणा अधिक विलंबता और निचले थ्रूपुट जोड़ की तुलना में है, लेकिन अभी भी तेज है।
पीटर कॉर्डेस

तो, हाँ, अन्य निर्देशों की तुलना में कई गुना अधिक महंगा हुआ करता था। 2 से अधिक निर्देशों की कीमत पर इसे टालना आम तौर पर इसके लायक नहीं होता है, और कभी-कभी 2-अनुदेश विकल्प भी इसके लायक नहीं होता है (उदाहरण के लिए शिफ्ट + ऐड leaनिर्देश)।
पीटर कॉर्डेस

9

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

(निर्देश चक्र, घड़ी चक्र नहीं - उदाहरण के लिए 6502 गैर-पाइपलाइन होने और अनुदेश कैश नहीं होने के कारण निर्देश के अनुसार न्यूनतम दो घड़ी चक्र लेता है)

आपके द्वारा गायब की जा रही वास्तविक अवधारणा महत्वपूर्ण पथ है : एक चिप के भीतर, एक चक्र के भीतर किया जाने वाला सबसे लंबा ऑपरेशन, हार्डवेयर स्तर पर, कितनी तेजी से चिप को देखा जा सकता है।

इसका अपवाद अतुल्यकालिक तर्क है (शायद ही कभी इस्तेमाल किया जाता है और शायद ही व्यावसायिक रूप से), जो वास्तव में तर्क प्रसार समय, डिवाइस तापमान आदि के आधार पर अलग-अलग गति से निष्पादित होता है।


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

एक अतिरिक्त अंकगणितीय अनुदेश की तुलना में कार्यक्रम काउंटर पर जोड़ बहुत सरल हो जाता है, क्योंकि ऑपरेंड्स में से एक छोटा है (या तो एक अनुदेश आकार, या एक रिश्तेदार कूद ऑफसेट जो आकार-सीमित भी है)
बेन वायगेट

6502 को पाइपलाइन किया गया था - यह पिछले एक के आखिरी चक्र के दौरान अगले निर्देश का पहला बाइट पढ़ा था। अन्यथा कम से कम तीन चक्र होते तो भ्रूण / डिकोड / निष्पादित होता।
gnasher729

8

गेट स्तर पर, आप सही हैं कि इसके अतिरिक्त काम करने में अधिक समय लगता है, और इस प्रकार अधिक समय लगता है। हालाँकि, यह लागत पर्याप्त रूप से मामूली है जो मायने नहीं रखती है।

आधुनिक प्रोसेसर देखे जाते हैं। आप इस घड़ी की दर के गुणकों को छोड़कर कुछ भी निर्देश नहीं दे सकते। यदि घड़ी की दरों को अधिक बढ़ा दिया गया था, तो बिटवाइज़ ऑपरेशन की गति को अधिकतम करने के लिए, आपको इसके अतिरिक्त कम से कम 2 चक्र खर्च करने होंगे। इस समय का अधिकांश समय प्रतीक्षा में बिताना होगा क्योंकि आपको वास्तव में पूरे 2 चक्रों की आवश्यकता नहीं थी। आपको केवल 1.1 (या उस तरह कुछ संख्या) की आवश्यकता थी। अब आपकी चिप बाजार में मौजूद सभी लोगों की तुलना में धीमी है।

इससे भी बुरी बात यह है कि बिटवाइज़ ऑपरेशंस को जोड़ने या करने का केवल एक ही छोटा सा हिस्सा है जो एक चक्र के दौरान चल रहा है। आपको एक चक्र के भीतर निर्देश प्राप्त / डिकोड करने में सक्षम होना चाहिए। आपको एक चक्र के भीतर कैश संचालन करने में सक्षम होना चाहिए। अन्य चीजों के बहुत ही सरल या बिटवाइज ऑपरेशन के रूप में एक ही समय पर चल रहे हैं।

निस्संदेह, समाधान एक व्यापक रूप से गहरी पाइपलाइन विकसित करना है, इन कार्यों को छोटे भागों में तोड़ना है जो एक बिटवाइज़ ऑपरेशन द्वारा परिभाषित छोटे चक्र समय में फिट होते हैं। पेंटियम 4 ने प्रसिद्ध रूप से इन गहरी पाइपलाइन शर्तों में सोच की सीमाएं दिखाईं। सभी तरह के मुद्दे सामने आते हैं। विशेष रूप से शाखाओं में बंटना बेहद मुश्किल हो जाता है क्योंकि आपको एक बार पाइपलाइन को फ्लश करना पड़ता है जब आपके पास यह पता लगाने के लिए कि कौन सी शाखा लेनी है।


7

आधुनिक प्रोसेसर देखे जाते हैं: प्रत्येक ऑपरेशन कुछ अभिन्न संख्या में घड़ी चक्र लेता है। प्रोसेसर के डिजाइनर एक घड़ी चक्र की लंबाई निर्धारित करते हैं। वहाँ दो विचार हैं: एक, हार्डवेयर की गति, उदाहरण के लिए एक नंद-द्वार की देरी के रूप में मापा जाता है। यह इस्तेमाल की गई तकनीक पर निर्भर करता है, और गति बनाम बिजली के उपयोग की तरह ट्रेडऑफ पर। यह प्रोसेसर डिजाइन से स्वतंत्र है। दो, डिजाइनर तय करते हैं कि एक घड़ी चक्र की लंबाई एक एकल नंद-द्वार के एन देरी के बराबर होती है, जहां एन 10, या 30, या कोई अन्य मूल्य हो सकता है।

यह विकल्प n को सीमित करता है कि कैसे जटिल ऑपरेशन हो सकते हैं जिन्हें एक चक्र में संसाधित किया जा सकता है। ऐसे ऑपरेशन होंगे जो 16 में किए जा सकते हैं लेकिन 15 नंद देरी में नहीं। तो n = 16 का मतलब है कि इस तरह के ऑपरेशन को एक चक्र में किया जा सकता है, n = 15 को चुनने का मतलब यह नहीं किया जा सकता है।

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

अब आपका प्रश्न: जोड़ और घटाना इतने सामान्य ऑपरेशन हैं कि आप उन्हें एक ही चक्र में निष्पादित करना चाहते हैं। नतीजतन, यह कोई फर्क नहीं पड़ता कि और, या आदि तेजी से निष्पादित कर सकते हैं: उन्हें अभी भी उस एक चक्र की आवश्यकता है। बेशक यूनिट "गणना" और, आदि के पास अपने अंगूठे को मोड़ने के लिए बहुत समय है, लेकिन यह मदद नहीं कर सकता है।

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

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


6

मुझे उन कुछ चीजों को ठीक करने दें जिनका उल्लेख नहीं किया गया था जो आपके मौजूदा उत्तरों में स्पष्ट रूप से हैं:

मुझे पता है कि आधुनिक प्रोसेसर पर बिटवाइज़ ऑपरेशन बहुत तेज़ हैं, क्योंकि वे समानांतर पर 32 या 64 बिट्स पर काम कर सकते हैं,

यह सच है। सीपीयू को "XX" बिट के रूप में आमतौर पर (हमेशा नहीं) लेबल करने का मतलब है कि इसकी अधिकांश सामान्य संरचनाएं (रजिस्टर चौड़ाई, पता योग्य रैम आदि) आकार में XX बिट्स हैं (अक्सर "+/- 1" या सोमेसुच)। लेकिन आपके सवाल के संबंध में, आप सुरक्षित रूप से मान सकते हैं कि 32 बिट या 64 बिट वाला सीपीयू निरंतर समय में 32 या 64 बिट्स पर कोई बुनियादी बिट ऑपरेशन करेगा।

इसलिए बिटवाइज़ ऑपरेशन केवल एक घड़ी चक्र लेते हैं।

यह निष्कर्ष जरूरी नहीं कि मामला है। विशेष रूप से समृद्ध अनुदेश सेट (google CISC बनाम RISC) वाले CPU आसानी से साधारण कमांड के लिए एक से अधिक चक्र ले सकते हैं। इंटरलेइंग के साथ, यहां तक ​​कि सिम कमांड 3 घड़ियों (उदाहरण के रूप में) के साथ भ्रूण-निष्पादन-स्टोर में टूट सकते हैं।

हालांकि लत एक जटिल ऑपरेशन है

नहीं, पूर्णांक जोड़ एक सरल ऑपरेशन है; घटाव भी। पूर्ण हार्डवेयर में योजक को लागू करना बहुत आसान है, और वे अपना सामान मूल बिट संचालन के रूप में तुरंत करते हैं।

जिसमें कम से कम एक और संभवतः एक दर्जन बिटवाइज ऑपरेशन शामिल हैं, इसलिए मैंने स्वाभाविक रूप से सोचा कि यह 3-4 गुना धीमा होगा।

यह कई ट्रांजिस्टर के रूप में 3-4 बार ले जाएगा, लेकिन बड़ी तस्वीर की तुलना में जो उपेक्षित है।

मैं एक साधारण बेंचमार्क के बाद यह देखकर हैरान था कि इसके अलावा बिटवाइज ऑपरेशंस (XOR, OR, AND etc) में से भी उतना ही तेज है। क्या कोई इसे स्पष्ट कर सकता है?

हाँ: पूर्णांक अलावा है एक बिटवाइज़ आपरेशन (दूसरों की तुलना में कुछ अधिक बिट के साथ, लेकिन अभी भी)। चरणों में कुछ भी करने की आवश्यकता नहीं है, जटिल एल्गोरिदम, घड़ियों या कुछ और की आवश्यकता नहीं है।

यदि आप अपने सीपीयू आर्किटेक्चर की तुलना में अधिक बिट्स जोड़ना चाहते हैं, तो आप इसे चरणों में करने के लिए जुर्माना लगा सकते हैं। लेकिन यह जटिलता के दूसरे स्तर पर है (प्रोग्रामिंग भाषा स्तर, असेंबली / मशीन कोड स्तर नहीं)। यह अतीत (या आज छोटे एम्बेडेड सीपीयू पर) में एक आम समस्या थी। पीसी आदि के लिए, उनके 32 या 64 बिट्स सबसे सामान्य डेटा प्रकारों के लिए पर्याप्त हैं जो एक मूट बिंदु बनना शुरू करते हैं।


यह ध्यान रखना दिलचस्प है कि O (N) से O (sqrt (N)) के अतिरिक्त समय की लागत को कम करने से ट्रांजिस्टर या रूटिंग जटिलता की आवश्यक संख्या में वृद्धि नहीं होती है (प्रत्येक चरण में नीचे से एक ले जाने के लिए वायर स्नीक की आवश्यकता होती है) , और वहाँ sqrt (N) अतिरिक्त विलय चरणों की आवश्यकता है। समय लागत O (lgN) ट्रांजिस्टर की लागत को घटाकर O (lgN) किया जा सकता है, लेकिन कई मामलों में यह 64 की तरह कुछ संसाधित करने में मददगार हो सकता है। जैसे कि आठ आठ-बिट जोड़ (sqrtN अग्रेषण का उपयोग करके) विलय तर्क की तीन परतों के साथ शामिल हो गए, बल्कि 64 1-बिट के रूप में विलय की छह परतों के साथ जोड़ता है।
सुपरकैट

हाँ, योजक काफी सरल हैं। क्या वास्तव में प्रभावशाली है एक पूरी तरह से पाइपलाइन 3-चक्र विलंबता 64-बिट पूर्णांक गुणक के साथ आधुनिक x86 सीपीयू है । (उदाहरण imul rax, rcxमें 3 सी विलंबता है, और इंटेल सैंडिब्रिज-परिवार और एएमडी राइज़ेन पर 1 सी थ्रूपुट है।) यहां तक ​​कि 64-बिट पूर्ण-गुणन (rdx में 128 बिट परिणाम का उत्पादन: rax) में एक ही विलंबता और प्रवाह है, लेकिन 2 uops (जो अलग-अलग बंदरगाहों पर समानांतर में चलता है) के रूप में कार्यान्वित किया जाता है। ( अनुदेश तालिकाओं और एक उत्कृष्ट सूक्ष्म गाइड के लिए agner.org/optimize देखें )।
पीटर कॉर्ड्स

[Add-with-carry] एक अन्य स्तर की जटिलता पर है (प्रोग्रामिंग भाषा स्तर, असेंबली / मशीन कोड स्तर नहीं । यह भाषा पर है। 16-बिट सीपीयू को लक्षित करने वाले AC कंपाइलर को आपके लिए ऐड / adc का संकलन करना पड़ता है जब वह संकलित होता है। दो के अलावा uint32_t।।: मान यह अभी भी प्रासंगिक आज 32-बिट ठिकानों पर int64_t के लिए है AVR एक 8 बिट RISC माइक्रोकंट्रोलर है, इसलिए 32-बिट पूर्णांक 4 निर्देश की आवश्यकता होती है godbolt.org/g/wre0fM
पीटर Cordes

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