मल्टिप्लाई–एक्यूम्युलेट ऑपरेशन

कम्प्यूटिंग में, विशेष रूप से डिजिटल सिग्नल प्रसंस्करण (प्रोसेसिंग) में, मल्टिप्लाई–एक्यूम्युलेट (एमएसी) या मल्टिप्लाई–एड (एमएडी) संक्रिया एक सामान्य चरण है जो दो संख्याओं का गुणन करता है और उस गुणनफल को एक्यूम्युलेटर में जोड़ता है। संक्रिया करने वाली हार्डवेयर इकाई को मल्टीप्लायर–एक्युमुलेटर (एमएसी यूनिट) के रूप में जाना जाता है; स्वयं संक्रिया को प्रायः एमएसी या एमएडी संक्रिया भी कहा जाता है। एमएसी संक्रिया एक एक्यूम्युलेटर a को संशोधित करता है:


 * $$\ a \leftarrow a + ( b \times c )$$

फ्लोटिंग पॉइंट संख्याओं के साथ काम करने पर, इसे दो रोउंडिंग्स (बहुत से DSP में सामान्य) के साथ किया जा सकता है, या एक रोउंडिंग्स के साथ किया जा सकता है। एकल रोउंडिंग्स के साथ किया जाने पर, इसे फ्यूज्ड मल्टिप्लाई–एड (एफएमए) या फ्यूज्ड मल्टिप्लाई–एक्यूम्युलेट (एफएमएसी) कहा जाता है।

आधुनिक कंप्यूटर में एक विशेषित एमएसी (मल्टिप्लाई–एक्यूम्युलेटर) हो सकता है, जिसमें एक कम्बिनेशनल लॉजिक में लागू मल्टिप्लायर, एक एडर और रिजिस्टर होता है जो परिणाम को संग्रहीत करता है। रिजिस्टर का आउटपुट एडर के एक इनपुट में पुनर्वितरण किया जाता है, इस प्रकार प्रत्येक घड़ी के साइकिल पर, मल्टिप्लायर का आउटपुट रजिस्टर में जोड़ा जाता है। कम्बिनेशनल मल्टिप्लायर बड़े मात्रा में लॉजिक की आवश्यकता होती है, लेकिन पहले के कंप्यूटरों के उनके शिफ्टिंग और जोड़ने के तरीके की तुलना में वे उत्पाद को बहुत तेजी से निर्धारित कर सकते हैं। 1909 में पर्सी लज्गेट ने अपनी एनालिटिकल मशीन में पहले एमएसी की विचारधारा को अभिज्ञात किया था, और विभाजन के लिए पहले एमएसी का उपयोग किया (जो रूपांतरित श्रृंगांतक्रम $(1+x)^{−1}$ के माध्यम से प्रारंभिक गुणना उपयुक्त करती थी)। पहले आधुनिक प्रोसेसर जो एमएसी यूनिट के साथ संपन्न हुए थे, वे डिजिटल सिग्नल प्रोसेसर थे, लेकिन यह तकनीक अब सामान्य उद्देश्य प्रोसेसरों में भी आम हो गई है।

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

फ्यूज्ड मल्टिप्लाई–एड
फ्यूज्ड मल्टिप्लाई–एड (एफएमए या एफएमएडीडी) एक फ्लोटिंग–पॉइंट मल्टिप्लाई–एड संक्रिया है जो एक ही कदम में किया जाता है और एकल रोउंडिंग्स के साथ होता है। अर्थात्, जहां एक अफ्यूज्ड मल्टिप्लाई–एड गणना $b × c$ का गुणन करेगा, उसे N महत्वपूर्ण बिटों में रोउंडिंग्स के साथ देखेगा, फिर इसे a के साथ जोड़ेगा और फिर आखिरी परिणाम को फिर से N महत्वपूर्ण बिटों में रोउंडिंग्स के साथ देखेगा, वहीं एक फ्यूज्ड मल्टिप्लाई–एड भागफलस्वरूप व्यक्ति ने पूरे प्रकार से अभिव्यक्ति $a + (b × c)$ की गणना करेगा और अंतिम परिणाम को N महत्वपूर्ण बिटों में रोउंडिंग्स के साथ देखेगा।

एक तेज़ एफएमए उत्पादों के संचय को सम्मिलित करने वाली कई संगणनाओं की यथार्थता को तेज़ और बेहतर कर सकता है:


 * अदिश गुणनफल
 * मैट्रिक्स गुणन
 * बहुपद मूल्यांकन (उदाहरण के लिए, हॉर्नर के नियम के साथ)
 * फलनों के मूल्यांकन के लिए न्यूटन की विधि (व्युत्क्रम फलन से)
 * कनवल्शन और कृत्रिम तंत्रिका नेटवर्क
 * डबल–डबल अंकगणित में गुणन

फ्यूज्ड मल्टिप्लाई–ऐड सामान्यतः अधिक यथार्थ परिणाम देने पर निर्भर किया जा सकता है। हालांकि, विलियम कहान ने इसका संकेत किया है कि यदि यह बिना सोचे–समझे उपयोग किया जाए तो इससे समस्याएँ हो सकती हैं। यदि $x^{2} − y^{2}$ को $((x × x) − y × y)$ (जिसमें कहान द्वारा सुझाया गया नोटेशन अनुसरण किया जाता है जिसमें अतिरिक्त ब्रैकेट द्वारा कम्पाइलर को दिशा दी जाती है कि पहले $(x × x)$ शब्द को रोउंडिंग्स में देखा जाए) के रूप में फ्यूज्ड मल्टिप्लाई–एड का उपयोग किया जाए, तो परिणाम नकारात्मक हो सकता है, भले ही $x = y$ हो। इसका अर्थ है कि पहली गुणना निम्न महत्वपूर्णता बिट को छोड़ देगी। यदि इसके बाद परिणाम का वर्गमूल निकाला जाए तो यह त्रुटि के लिए कारण बन सकता है।

जब एक माइक्रोप्रोसेसर के अंदर लागू किया जाता है, तो एफएमए एक ऐड के बाद होने वाले मल्टीपल संक्रिया से तेज हो सकता है। हालाँकि, मूल आईबीएम RS/6000 डिज़ाइन पर आधारित मानक औद्योगिक कार्यान्वयन के लिए योग की ठीक से गणना करने के लिए 2N–बिट योजक की आवश्यकता होती है।

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

अदिश गुणनफल निर्देश
विभिन्न मशीनों में कुछ मशीनें कई फ्यूज्ड मल्टिप्लाई–एड संक्रियाों को एक स्टेप में संयुक्त करती हैं, उदाहरण के लिए एक 128–बिट एसआईएमडी रजिस्टर में  के दो चार–घटक डॉट–गुणनफल का एकल साइकिल द्वारा प्रवाहशीलता से प्रदर्शन करती हैं।

आलम्बन
एफएमए संक्रिया आईईईई 754–2008 में सम्मिलित है।

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

C प्रोग्रामिंग भाषा की 1999 की मानक एक एफएमए (फ्यूज्ड मल्टिप्लाई–एड) संक्रिया का समर्थन fma मानक गणितीय पुस्तकालय फ़ंक्शन के माध्यम से करती है और एक गुणन एवं एक जोड़ के पश्चात आपूर्ति की स्वचालित परिवर्तन (फ्लोटिंग–पॉइंट अभिव्यक्तियों का संकुचन), जो मानक प्रग्माओं (#pragma STDC FP_CONTRACT) के माध्यम से स्पष्ट रूप से सक्षम या अक्षम किया जा सकता है। जीसीसी और क्लांग C कंपाइलर ऐसे रूपांतरण को उन प्रोसेसर शास्त्रविद्याओं के लिए डिफ़ॉल्ट रूप से करते हैं जो एफएमए निर्देशिकाएं समर्थन करती हैं। जीसीसी, जिसमें उक्त प्रग्मा का समर्थन नहीं है, इसे  कमांड लाइन विकल्प से वैश्विक रूप से नियंत्रित किया जा सकता है।

फ्यूज्ड मल्टिप्लाई–एड संक्रिया को "मल्टिप्लाई–एड फ्यूज्ड" के रूप में आईबीएम पावर1 (1990) प्रोसेसर में प्रस्तुत किया गया था, लेकिन तब से यह बहुत से अन्य प्रोसेसरों में जोड़ा गया है:


 * एचपी पीए–8000 (1996) और ऊपर
 * हिटाची सुपरएच एसएच–4 (1998)
 * एससीई–तोशीबा इमोशन इंजन (1999)
 * इंटेल इटेनियम (2001)
 * एसटीआई सेल (2006)
 * फुजित्सु एसपीएआरसी64 VI (2007) और ऊपर
 * (एमआईपीएस–संगत) लूंगसन–2एफ (2008)
 * एल्ब्रस–8एसवी (2018)
 * एफएमए3 और/या एफएमए4 निर्देश सेट के साथ x86 प्रोसेसर
 * एएमडी बुलडोजर (2011, एफएमए4 केवल)
 * एएमडी पाइलड्राइवर (2012, एफएमए3 और एफएमए4)
 * एएमडी स्टीमरोलर (2014)
 * एएमडी उत्खननकर्ता (2015)
 * एएमडी ज़ेन (2017, एफएमए3 केवल)
 * इंटेल हैसवेल (2013, एफएमए3 केवल)
 * इंटेल स्काईलेक (2015, एफएमए3 केवल)
 * VFPv4 और/या NEONv2 के साथ ARM प्रोसेसर:
 * एआरएम कॉर्टेक्स–एम4एफ (2010)
 * एआरएम कॉर्टेक्स–ए5 (2012)
 * एआरएम कॉर्टेक्स–ए7(2013)
 * एआरएम कॉर्टेक्स–ए15(2012)
 * क्रेट (सीपीयू) (2012)
 * एप्पल ए6 (2012)
 * सभी एआरएमवी8 प्रोसेसर
 * फुजित्सु ए64एफएक्स में "प्रीफिक्स इंस्ट्रक्शन के साथ चार–ऑपरेंड एफएमए" है।
 * आईबीएम जेड/आर्किटेक्चर (1998 से)
 * जीपीयू और जीपीजीपीयू बोर्ड:
 * एएमडी जीपीयू (2009) और नए
 * टेरास्केल 2 "एवरग्रीन"–श्रृंखला आधारित
 * ग्राफ़िक्स कोर नेक्स्ट–आधारित
 * एनवीडिया जीपीयू(2010) और नए
 * फर्मी–आधारित (2010)
 * केप्लर–आधारित (2012)
 * मैक्सवेल–आधारित (2014)
 * पास्कल–आधारित (2016)
 * वोल्टा–आधारित (2017)
 * सैंडी ब्रिज के बाद से इंटेल जीपीयू
 * इंटेल एमआईसी (2012)
 * एआरएम माली टी600 सीरीज (2012) और उससे ऊपर
 * वेक्टर प्रोसेसर:
 * एनईसी एसएक्स–अरोड़ा त्सुबासा
 * आरआईएससी–वी निर्देश सेट (2010)