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

कम्प्यूटिंग में, खासकर डिजिटल सिग्नल प्रोसेसिंग में, मल्टिप्लाई-एक्यूम्युलेट (MAC) या मल्टिप्लाई-एड (MAD) ऑपरेशन एक सामान्य कदम है जो दो नंबरों का गुणन-योग (प्रोडक्ट) करता है और उस प्रोडक्ट को एक एक्यूम्युलेटर में जोड़ता है। ऑपरेशन को करने वाली हार्डवेयर यूनिट को मल्टीप्लाई-एक्यूम्युलेटर (MAC यूनिट) के रूप में जाना जाता है; स्वयं ऑपरेशन को अक्सर एक MAC या MAD ऑपरेशन भी कहा जाता है। MAC ऑपरेशन एक एक्यूम्युलेटर एक a को संशोधित करता है:


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

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

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

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

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

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


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

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

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

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

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

समर्थन
एफएमए ऑपरेशन IEEE 754-2008 में शामिल है।

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

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

फ्यूज्ड मल्टिप्लाई-एड ऑपरेशन को "मल्टिप्लाई-एड फ्यूज्ड" के रूप में IBM POWER1 (1990) प्रोसेसर में प्रस्तुत किया गया था, लेकिन तब से यह बहुत से अन्य प्रोसेसरों में जोड़ा गया है:


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