हार्डवेयर विभाजन गुणा से अधिक समय क्यों लेता है?


37

एक माइक्रोकंट्रोलर पर गुणन की तुलना में हार्डवेयर विभाजन को अधिक समय क्यों लगता है? उदाहरण के लिए, dsPIC पर, एक विभाजन में 19 चक्र होते हैं, जबकि गुणा में केवल एक घड़ी चक्र होता है।

मैं कुछ ट्यूटोरियल से गुजरा, जिसमें विकिपीडिया पर डिवीजन एल्गोरिथ्म और गुणा एल्गोरिथ्म शामिल था। यहाँ मेरा तर्क है।

एक विभाजन एल्गोरिथ्म, विकिपीडिया पर पुनर्स्थापित करने के साथ एक धीमी विभाजन विधि की तरह , एक पुनरावर्ती एल्गोरिथ्म है। इसका अर्थ है कि चरण से परिणाम (मध्यवर्ती) kका उपयोग चरण के इनपुट के रूप में किया जाता है k+1, जिसका अर्थ है कि इन एल्गोरिदम को समानांतर नहीं किया जा सकता है। इसलिए, nविभाजन को पूरा करने में कम से कम चक्र लगते हैं , जबकि nलाभांश में बिट्स की संख्या होती है। 16-बिट लाभांश के लिए, यह कम से कम 16 चक्रों के बराबर है।

एक गुणन एल्गोरिथ्म को पुनरावर्ती होने की आवश्यकता नहीं है, जिसका अर्थ है कि इसे समानांतर करना संभव है। हालांकि, कई अलग-अलग गुणन एल्गोरिदम हैं, और मेरे पास कोई सुराग नहीं है जिसका उपयोग माइक्रोकंट्रोलर द्वारा किया जा सकता है। हार्डवेयर / माइक्रोकंट्रोलर पर गुणन कैसे काम करता है?

मुझे एक दद्दा गुणक एल्गोरिदम मिला है , जिसे समाप्त करने के लिए केवल एक घड़ी चक्र लेना है। हालाँकि, जो मुझे यहां नहीं मिलता है वह यह है कि दद्दा का एल्गोरिथ्म तीन चरणों में आगे बढ़ता है, जबकि चरण 1 से परिणाम चरण 2 में उपयोग किए जाते हैं, आदि इसके अनुसार, इसे समाप्त करने के लिए कम से कम तीन घड़ी चक्र लगेंगे।


2
एल्गोरिदम वास्तव में घड़ी चक्र की संख्या को परिभाषित नहीं कर रहा है। आपके विशिष्ट सीपीयू में आंतरिक कार्यान्वयन की परवाह किए बिना एक चक्र या 20 चक्र में काम करने वाला हार्डवेयर गुणक / विभक्त हो सकता है।
यूजीन श।

1
ओपी, क्या आप एक लिंक प्रदान कर सकते हैं जो 19 बनाम 1 चक्र के बारे में अधिक जानकारी देता है जिसके बारे में आप बात करते हैं? आपके डीएसपी के बारे में कुछ खास।
व्लादिमीर क्रेवरो

1
उत्तर के लिए धन्यवाद। यहाँ मेरे माइक्रोकंट्रोलर के लिए एक डेटशीट है : ww1.microchip.com/downloads/en/DeviceDoc/70005127c.pdf । निर्देश सेट देखें, पृष्ठ 292 पर शुरू होने वाला अवलोकन। यह कहता है कि सभी DIV निर्देश 18 चक्र लेते हैं, जबकि सभी MUL निर्देश 1 चक्र लेते हैं। लेकिन केवल इस MCU के लिए आम नहीं है, मैंने इसे कई अन्य MCU में देखा है।
मार्को गुलिन

2
@ बेवकूफ, ठीक है, वे उसी के बारे में हैं, वे नहीं हैं। मेरे लिए हैं। मुझे नहीं लगता है कि यह दिखाता है के रूप में अच्छी तरह से आप कल्पना कर सकते हैं।
टोनीएम

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

जवाबों:


34

एक विभक्त मानचित्र बहुत कम सुरुचिपूर्ण ढंग से विशिष्ट हार्डवेयर के लिए। उदाहरण के रूप में जाली ICE40 FPGAs लें।

आइए हम दो मामलों की तुलना करें: यह 8x8 बिट से 16 बिट गुणक है:

module multiply (clk, a, b, result);
   input clk;
   input [7:0]a;
   input [7:0]b;
   output [15:0]result;
   always @(posedge clk)
     result = a * b;
endmodule // multiply

और यह डिवाइडर जो 8 और 8 बिट ऑपरेंड को घटाकर 8 बिट परिणाम करता है:

module divide(clk, a, b, result);
   input clk;
   input [7:0] a;
   input [7:0] b;
   output [7:0] result;
   always @(posedge clk)
     result = a / b;
endmodule // divide

(हाँ, मुझे पता है, घड़ी कुछ नहीं करती है)

ICE40 FPGA के गुणक की मैपिंग करते समय उत्पन्न योजनाबद्ध का अवलोकन यहाँ और विभक्त यहाँ पाया जा सकता है

Yosys से संश्लेषण आँकड़े हैं:

गुणा

  • तारों की संख्या: 155
  • तार बिट्स की संख्या: 214
  • सार्वजनिक तारों की संख्या: 4
  • सार्वजनिक तार बिट्स की संख्या: 33
  • यादों की संख्या: 0
  • मेमोरी बिट्स की संख्या: 0
  • प्रक्रियाओं की संख्या: 0
  • कोशिकाओं की संख्या: 191
    • SB_CARRY 10
    • SB_DFF 16
    • SB_LUT4 165

विभाजन

  • तारों की संख्या: 145
  • वायर बिट्स की संख्या: 320
  • सार्वजनिक तारों की संख्या: 4
  • सार्वजनिक तार बिट्स की संख्या: 25
  • यादों की संख्या: 0
  • मेमोरी बिट्स की संख्या: 0
  • प्रक्रियाओं की संख्या: 0
  • कोशिकाओं की संख्या: 219
    • SB_CARRY 85
    • SB_DFF 8
    • SB_LUT4 126

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


दृश्य इंप्रेशन प्राप्त करने के लिए आप इसे वैसे भी पढ़ नहीं पाएंगे। मुझे लगता है कि जटिलता में अंतर स्पॉट करना संभव है। ये एकल चक्र गुणक / विभक्त हैं!

गुणा

ICE40 पर गुणा करें (चेतावनी: ~ 100 Mpixel छवि)

गुणक की स्केल की गई छवि

फूट डालो

( एक ICE40 पर विभाजित ) (चेतावनी: ~ 100 Mpixel छवि)

डिवाइडर की स्केल्ड इमेज


4
नहीं, आप उन्हें गैर-पुनरावृति से लागू कर सकते हैं। लेकिन तर्क के माध्यम से वैध परिणाम "लहर" आने तक बस कुछ समय लगेगा। उपरोक्त कार्यान्वयन गैर-पुनरावृत्त हैं।
मार्कस मुलर

9
मुझे डिवाइडर का वॉल पोस्टर चाहिए।
इयान हॉवसन

5
वहाँ में एक पीडीएफ अब गुणा सार। यह 3378 × 3177 मिमी है, इसलिए बेडरूम की छत पर रखने से पहले कृपया अपने महत्वपूर्ण अन्य के साथ चर्चा करें।
मार्कस मुलर

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

4
यो, उन रेखांकन चार्ट हुक से दूर हैं, यो!
स्पेंसर विलियम्स

8

धीमा विभाजन स्वाभाविक रूप से पुनरावृत्त होता है इसलिए यह अधिक समय तक टिकता है। लुकअप तालिकाओं का उपयोग करते हुए साधारण लोगों की तुलना में कुछ धीमी गति से विभाजन एल्गोरिदम हैं। एसआरटी एल्गोरिथ्म प्रति चक्र दो बिट्स का उत्पादन करता है। ऐसी तालिका में एक त्रुटि कुख्यात पेंटियम FDIV बग (ca. 1994) का कारण थी। फिर तथाकथित तेज विभाजन एल्गोरिदम हैं।

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


लेकिन लब्बोलुआब यह है - गुणा एल्गोरिदम के विपरीत, विभाजन एल्गोरिदम को समानांतर नहीं किया जा सकता है, और यही कारण है कि वे इतने धीमे हैं?
मार्को गूलिन

2
@MarkoGulin "नहीं" एक बहुत मजबूत दावा है। यह निश्चित रूप से सीधा नहीं है।
स्पेरो पेफेनी

2
मुझे लगता है कि आप इसे "विभाजन एल्गोरिदम को समानांतर नहीं किया जा सकता" से कमजोर कर सकते हैं "जिस तरह से हमने विभाजन को समानांतर करने के लिए पाया है वह हार्डवेयर को समानांतर गुणा से विभाजन को लागू करने पर अधिक तनावपूर्ण है।" स्फेरो एक उदाहरण देता है कि ओ (2 ^ n) फाटकों का उपयोग करके एकल-चक्र विभाजन कैसे करें, एन-बिट संख्याओं को गुणा करने के लिए ... लेकिन यह सिर्फ व्यावहारिक नहीं है।
Cort Ammon

1
लंबे समय तक विभाजन किसी भी वांछित डिग्री की गणना करके समानता का शोषण कर सकता है, जो जब भाजक द्वारा गुणा किया जाता है, तो फॉर्म 1000 का परिणाम मिलता है ... xxxx, जब एन लीडर जीरो के साथ इस तरह के एक विभाजक के साथ काम करना, यह आसान है प्रत्येक चरण के साथ परिणाम के एन बिट्स की गणना करने के लिए।
सुपरकैट

8

हमारे पास प्रति घड़ी चक्र में तर्क की कई परतें हो सकती हैं, लेकिन एक सीमा होती है, तर्क की कितनी परतों में हम कितने जटिल हो सकते हैं कि वे परतें हमारी घड़ी की गति और हमारी अर्धचालक प्रक्रिया पर निर्भर होंगी।

हालांकि, कई अलग-अलग गुणन एल्गोरिदम हैं, और मेरे पास कोई सुराग नहीं है जिसका उपयोग माइक्रोकंट्रोलर द्वारा किया जा सकता है

कंप्यूटर में Afaict अधिकांश गुणा द्विआधारी लंबी गुणा के एक संस्करण का उपयोग करता है। बाइनरी लंबी गुणा में शामिल है

  • विभिन्न अलग-अलग ammounts द्वारा एक ऑपरेंड स्थानांतरण
  • दूसरे ऑपरेंड के आधार पर शिफ्ट किए गए नंबरों को मास्क करना
  • मास्किंग के परिणामों को एक साथ जोड़ना।

तो चलो हार्डवेयर में इसे लागू करने पर एक नज़र डालते हैं।

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

तो बॉलपार्क को 16 बिट परिणामों के साथ 8x8 गुणक के लिए कितने तर्क चरणों की आवश्यकता है। सादगी के लिए मान लें कि हम इस तथ्य के लिए प्रयास और अनुकूलन नहीं करते हैं कि सभी मध्यवर्ती परिणामों में सभी पदों में बिट्स नहीं हैं।

मान लेते हैं कि एक पूर्ण योजक दो "गेट चरणों" में लागू किया गया है।

  • 8 मध्यवर्ती परिणाम उत्पन्न करने के लिए मास्किंग के लिए 1।
  • 8 इंटरमीडिएट के रिजल्ट को 6 तक कम करने के लिए तीन नंबर के समूहों को जोड़ने के लिए 2
  • 6 इंटरमीडिएट के रिजल्ट को 4 तक कम करने के लिए तीन नंबर के समूहों को जोड़ने के लिए 2
  • 3 को 4 मध्यवर्ती परिणामों को कम करने के लिए तीन संख्याओं के समूह को जोड़ने के लिए 2
  • 2 को 3 मध्यवर्ती परिणामों को कम करने के लिए तीन संख्याओं के समूह को जोड़ने के लिए 2
  • 32 अंतिम दो परिणामों को जोड़ने के लिए।

तो कुल लगभग 46 तर्क चरण। जिनमें से अधिकांश अंतिम दो मध्यवर्ती परिणामों को जोड़कर खर्च किए जाते हैं।

इस तथ्य का फायदा उठाकर इसे और बेहतर बनाया जा सकता है कि सभी मध्यवर्ती परिणामों में सभी बिट्स मौजूद नहीं हैं (जो कि मूल रूप से दादा गुणक करता है), अंतिम चरण के लिए कैरी लुकहेड योजक का उपयोग करके। दो का उत्पादन करने के लिए तीन के बजाय 3 का उत्पादन करने के लिए 7 संख्याओं को जोड़कर (अधिक फाटकों और व्यापक फाटकों की कीमत पर चरणों की संख्या को कम करके)।

यह सब मामूली विवरण है, हालांकि, महत्वपूर्ण बिंदु यह है कि दो n बिट संख्या को गुणा करने और 2n बिट परिणाम उत्पन्न करने के लिए आवश्यक चरणों की संख्या लगभग n के समानुपाती है।


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

  1. एक पुनरावृत्ति पर क्या किया जाता है यह पिछले पुनरावृत्ति के परिणामों पर निर्भर करता है।
  2. तर्क को लागू करने के लिए आवश्यक तर्क चरणों की संख्या n के लिए लगभग समान है (घटाव और तुलना इसके अलावा जटिलता के समान हैं)
  3. पुनरावृत्तियों की संख्या भी लगभग n के समानुपाती है।

तो विभाजन को लागू करने के लिए आवश्यक तर्क चरणों की संख्या लगभग n वर्ग के समानुपाती है।


आपके उत्तर के लिए धन्यवाद। मैंने विकी पर पढ़ा है कि जब हार्डवेयर पर इस एल्गोरिथ्म को लागू करने के लिए आवश्यक गेटों की बात आती है तो दद्दा का एल्गोरिथ्म बहुत कुशल है। उसके बावजूद, अधिकांश हार्डवेयर "बाइनरी लॉन्ग गुणा" का उपयोग करते हैं?
मार्को गूलिन

1
मुझे लगता है कि दादा का अल्टीहैम बाइनरी लंबी गुणा का एक अनुकूलित संस्करण है।
पीटर ग्रीन

मैं 1 / x डिवीजन करने के लिए 8 चक्र जलाता हूं। मैं तब 16 चक्रों की एक निश्चित लागत के लिए 8 चक्र गुणा के खिलाफ उपयोग करता हूं।
b degnan

यह अच्छी तरह से दर्शाता है कि गुणा सब के बाद इसके अलावा इतना बुरा नहीं है।
हेगन वॉन एटिजन

1
एक पुनरावृत्ति को एक घटाव की आवश्यकता होती है जिसे O (NlgN) हार्डवेयर, या O (N) हार्डवेयर का उपयोग करके O (sqrt (N)) चरणों का उपयोग करके O (lgN) चरणों में किया जा सकता है। हालांकि, आवश्यक बिंदु यह है कि गुणन के लिए O (lgN) चरणों की आवश्यकता होती है, जबकि विभाजन के लिए O (NlgN) चरणों की आवश्यकता होती है। ओ (एन * एन) नहीं, लेकिन ओ (एन) के एक कारक द्वारा गुणा से बड़ा है जब तक कि एक अनुमानित पारस्परिक लेने से शुरू नहीं होता है ताकि प्रति चरण में अधिक काम करने की अनुमति मिल सके।
22

4

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

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

बेशक ऐसा न करने का कारण यह है कि यह बहुत सारे ट्रांजिस्टर का उपयोग करता है। उदाहरण के लिए 16 बिट डिवीजन के लिए यह लगभग 16 X अधिक ट्रांजिस्टर का उपयोग कर सकता है। इसके अलावा, फाटकों के अधिक चरणों में अधिकतम अनुमत घड़ी की आवृत्ति कम होती है (क्योंकि प्रसार में देरी के अधिक चरण हैं)।


4

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

  • संयोजी विधियाँ हैं, जैसे कि गैर-पुनर्स्थापना या एसआरटी जो भागफल में 2 ^ N जोड़कर या हटाकर काम करता है और आंशिक रूप से 2 ^ N * भाजक को तब तक जोड़ या हटाता है जब तक कि यह शून्य में परिवर्तित नहीं हो जाता।

  • न्यूटन-राफसन या गोल्डस्मिथ के रूप में गुणात्मक विधियां हैं, जो रूट खोजने के तरीके हैं जहां विभाजन को गुणा के व्युत्क्रम के रूप में गणना की जाती है।

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

"धीमी" और "तेज" संप्रदाय भ्रामक हैं, क्योंकि वास्तविक गति बिट्स की संख्या पर निर्भर करती है, कितना हार्डवेयर फ़ंक्शन के लिए समर्पित है (और एक तेज गुणक बहुत बड़ा है) ...

विभाजन गुणन की तुलना में धीमा है क्योंकि इसकी गणना के लिए कोई प्रत्यक्ष, समानांतर विधि नहीं है: या तो एक पुनरावृत्ति होती है, या हार्डवेयर को कैस्केड (या पाइपलाइड) ब्लॉकों के रूप में पुनरावृत्ति को लागू करने के लिए कॉपी किया जाता है।


0

एक माइक्रोकंट्रोलर पर गुणन की तुलना में हार्डवेयर विभाजन को अधिक समय क्यों लगता है?

यह एक इलेक्ट्रॉनिक्स प्रश्न नहीं है। सबसे अच्छा यह एक कंप्यूटर प्रश्न है, जिसे स्टैक ओवरफ्लो को संबोधित किया जाता है।

उदाहरण के लिए, यहां देखें: क्या फ्लोट डिवीजन की तुलना में गुणा अधिक तेज़ है?

वास्तव में, यह एक वास्तविक जीवन का प्रश्न है: विभाजन गुणा से अधिक समय क्यों लेता है?

जो आप कागज़ पर नहीं आंकेंगे?

51 * 82

या

4182 / 51

विभाजन गुणा से अधिक समय लेता है क्योंकि ऐसा करना कठिन है

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