อ่าน 6 นาที
การดำเนินการคูณสะสม
ในด้าน การคำนวณ โดยเฉพาะอย่างยิ่ง การประมวลผลสัญญาณดิจิทัล การดำเนินการคูณ-สะสม (MAC) หรือคูณ-บวก (MAD) เป็นขั้นตอนทั่วไปที่คำนวณผลคูณของตัวเลขสองตัวและบวกผลคูณนั้นเข้ากับตัว สะสม...
การดำเนินการคูณสะสม
ในด้านการคำนวณโดยเฉพาะอย่างยิ่งการประมวลผลสัญญาณดิจิทัลการดำเนินการคูณ-สะสม (MAC) หรือคูณ-บวก (MAD) เป็นขั้นตอนทั่วไปที่คำนวณผลคูณของตัวเลขสองตัวและบวกผลคูณนั้นเข้ากับตัวสะสมหน่วยฮาร์ดแวร์ที่ทำการดำเนินการนี้เรียกว่าตัวคูณ-สะสม ( หน่วย MAC ) การดำเนินการนั้นเองก็มักเรียกว่าการดำเนินการ MAC หรือ MAD การดำเนินการ MAC จะแก้ไขตัวสะสมดังนี้ :
เมื่อประมวลผลด้วย ตัวเลข ทศนิยมอาจทำได้โดยการปัดเศษ สองครั้ง (ซึ่งเป็นเรื่องปกติในDSP หลายตัว ) หรือโดยการปัดเศษเพียงครั้งเดียว เมื่อทำโดยการปัดเศษเพียงครั้งเดียว จะเรียกว่า การคูณและบวกแบบรวม (Fused Multiply-AddหรือFMA ) หรือ การคูณและสะสมแบบรวม ( Fused Multiply-AccumulateหรือFMAC )
คอมพิวเตอร์สมัยใหม่อาจมี MAC เฉพาะ ซึ่งประกอบด้วยตัวคูณที่ใช้ตรรกะเชิงผสมตามด้วยตัวบวกและรีจิสเตอร์สะสมที่เก็บผลลัพธ์ เอาต์พุตของรีจิสเตอร์จะถูกป้อนกลับไปยังอินพุตหนึ่งของตัวบวก ดังนั้นในแต่ละรอบสัญญาณนาฬิกา เอาต์พุตของตัวคูณจะถูกบวกเข้ากับรีจิสเตอร์ ตัวคูณเชิงผสมต้องการตรรกะจำนวนมาก แต่สามารถคำนวณผลคูณได้เร็วกว่าวิธีการเลื่อนและบวกแบบทั่วไปของคอมพิวเตอร์รุ่นก่อนๆเพอร์ซี ลัดเกตเป็นคนแรกที่คิดค้น MAC ในเครื่องวิเคราะห์ของเขาในปี 1909 [ 1 ]และเป็นคนแรกที่ใช้ MAC สำหรับการหาร (โดยใช้การคูณที่เริ่มต้นด้วยส่วนกลับ ผ่านอนุกรมลู่เข้า(1+ x ) −1 ) โปรเซสเซอร์สมัยใหม่เครื่องแรกที่ติดตั้งหน่วย MAC คือโปรเซสเซอร์สัญญาณดิจิทัลแต่ปัจจุบันเทคนิคนี้ก็เป็นที่นิยมในโปรเซสเซอร์อเนกประสงค์เช่นกัน[ 2 ] [ 3 ] [ 4 ] [ 5 ]
ในการคำนวณเลขทศนิยม
เมื่อดำเนินการกับจำนวนเต็มการดำเนินการมักจะแม่นยำ (คำนวณโมดูลัส กำลัง ของสอง ) อย่างไรก็ตาม จำนวน จุดลอยตัว มี ความแม่นยำทางคณิตศาสตร์เพียงระดับหนึ่งเท่านั้นกล่าวคือ การคำนวณเลขจุดลอยตัวแบบดิจิทัลโดยทั่วไปจะไม่เป็นไปตามกฎการสลับที่หรือการกระจาย (ดูการคำนวณเลขจุดลอยตัว § ปัญหาความแม่นยำ ) ดังนั้น ผลลัพธ์จึงแตกต่างกันไม่ว่าการคูณ-บวกจะดำเนินการด้วยการปัดเศษสองครั้ง หรือในการดำเนินการเดียวด้วยการปัดเศษเพียงครั้งเดียว (การคูณ-บวกแบบรวม) IEEE 754-2008ระบุว่าต้องดำเนินการด้วยการปัดเศษเพียงครั้งเดียว ซึ่งจะให้ผลลัพธ์ที่แม่นยำกว่า[ 6 ]
การคูณแบบหลอมรวม-บวก
การคูณและบวกแบบรวม ( FMAหรือfmadd ) [ 7 ] คือการดำเนินการคูณและบวกแบบจุดลอยตัวที่ดำเนินการในขั้นตอนเดียว ( การดำเนินการแบบรวม ) โดยมีการปัดเศษเพียงครั้งเดียว กล่าวคือ ในขณะที่การคูณและบวกแบบไม่รวมจะคำนวณผลคูณb × cปัดเศษให้เหลือNบิตสำคัญ บวกผลลัพธ์กับaแล้วปัดเศษกลับเป็นNบิตสำคัญ การคูณและบวกแบบรวมจะคำนวณนิพจน์ทั้งหมดa + ( b × c )ให้มีความแม่นยำเต็มที่ก่อนที่จะปัดเศษผลลัพธ์สุดท้ายลงเหลือNบิตสำคัญ
FMA ที่รวดเร็วสามารถเร่งความเร็วและปรับปรุงความแม่นยำของการคำนวณหลายอย่างที่เกี่ยวข้องกับการสะสมผลคูณได้:
- ผลคูณดอท
- การคูณเมทริกซ์
- การประเมินค่าพหุนาม (เช่น โดยใช้กฎของฮอร์เนอร์ )
- วิธีการของนิวตันในการประเมินค่าฟังก์ชัน (จากฟังก์ชันผกผัน)
- การคอนโวลูชัน
- เครือข่ายประสาทเทียม
- การคูณในเลขคณิตแบบดับเบิลดับเบิล
โดยทั่วไปแล้ว การคูณและบวกแบบรวมมักให้ผลลัพธ์ที่แม่นยำกว่า อย่างไรก็ตามวิลเลียม คาฮานได้ชี้ให้เห็นว่าอาจก่อให้เกิดปัญหาได้หากใช้โดยไม่คิดให้รอบคอบ[ 8 ]หากx 2 − y 2ถูกประเมินเป็น(( x × x ) − y × y ) (ตามสัญกรณ์ที่คาฮานแนะนำซึ่งวงเล็บที่ซ้ำซ้อนจะสั่งให้คอมไพ เลอร์ปัดเศษเทอม ( x × x )ก่อน) โดยใช้การคูณและบวกแบบรวม ผลลัพธ์อาจเป็นลบแม้ว่าx = yเนื่องจากการคูณครั้งแรกจะทิ้งบิตที่มีนัยสำคัญต่ำ ซึ่งอาจนำไปสู่ข้อผิดพลาดได้หากมีการประเมินรากที่สองของผลลัพธ์ในภายหลัง
เมื่อนำไปใช้ภายในไมโครโปรเซสเซอร์ FMA จะเร็วกว่าการคูณตามด้วยการบวก อย่างไรก็ตาม การใช้งานมาตรฐานทางอุตสาหกรรมตามการออกแบบ IBM RS/6000 ดั้งเดิมนั้นต้องการ ตัวบวก 2Nบิตเพื่อคำนวณผลรวมอย่างถูกต้อง[ 9 ]
ประโยชน์อีกประการหนึ่งของการรวมคำสั่งนี้คือ ช่วยให้สามารถใช้งานซอฟต์แวร์ได้อย่างมีประสิทธิภาพใน การดำเนินการ หาร (ดูอัลกอริทึมการหาร ) และรากที่สอง (ดูวิธีการคำนวณรากที่สอง ) ซึ่งช่วยลดความจำเป็นในการใช้ฮาร์ดแวร์เฉพาะสำหรับการดำเนินการเหล่านั้น[ 10 ]
คำแนะนำเกี่ยวกับผลคูณดอท
เครื่องบางเครื่องจะรวมการดำเนินการคูณและบวกแบบหลอมรวมหลายรายการเข้าไว้ในขั้นตอนเดียว เช่น การดำเนินการผลคูณดอทสี่องค์ประกอบบนรีจิสเตอร์SIMDa0×b0 + a1×b1 + a2×b2 + a3×b3 128 บิตสองตัว ด้วยอัตราการประมวลผลรอบเดียว
สนับสนุน
การดำเนินการ FMA รวมอยู่ในมาตรฐาน IEEE 754-2008แล้ว
มาตรฐาน ภาษาการเขียน โปรแกรมC ปี 1999รองรับการดำเนินการ FMA ผ่านฟังก์ชันไลบรารีคณิตศาสตร์มาตรฐานและการแปลงอัตโนมัติของการคูณตามด้วยการบวก (การหดตัวของนิพจน์จุดลอยตัว) ซึ่งสามารถเปิดใช้งานหรือปิดใช้งานได้อย่างชัดเจนด้วย pragma มาตรฐาน ( ) คอมไพเลอร์ C ของGCCและClangทำการแปลงดังกล่าวโดยค่าเริ่มต้นสำหรับสถาปัตยกรรมโปรเซสเซอร์ที่รองรับคำสั่ง FMA สำหรับ GCC ซึ่งไม่รองรับ pragma ดังกล่าว[ 11 ]สามารถควบคุมได้ทั่วโลกโดยตัวเลือกบรรทัดคำสั่ง[ 12 ]fma()#pragma STDC FP_CONTRACT-ffp-contract
การดำเนินการคูณ-บวกแบบรวมได้รับการแนะนำในชื่อ "คูณ-บวกแบบรวม" ในโปรเซสเซอร์ IBM POWER1 (1990) [ 13 ]แต่ได้ถูกเพิ่มเข้าไปในโปรเซสเซอร์จำนวนมาก
- IBM POWER1 (1990)
- HP PA-8000 (ปี 1996 ขึ้นไป)
- ฮิตาชิซูเปอร์เอช เอสเอช4 (1998)
- สถาปัตยกรรม IBM z/ (ตั้งแต่ปี 1998)
- SCE - Toshiba Emotion Engine (1999)
- อินเทล อิทาเนียม (2001)
- เซลล์ STI (2006)
- Fujitsu SPARC64 VI (2007) และรุ่นที่สูงกว่า
- ( เข้ากันได้ กับ MIPS ) Loongson -2F (2008) [ 14 ]
- ชุดคำสั่งRISC-V (2010)
- โปรเซสเซอร์ ARM ที่รองรับ VFPv4 และ/หรือ NEONv2:
- ARM Cortex-M4F (2010)
- STM32 Cortex-M33 (การทำงาน VFMA) [ 15 ]
- ARM Cortex-A5 (2012)
- ARM Cortex-A7 (2013)
- ARM Cortex-A15 (2012)
- Qualcomm Krait (2012)
- Apple A6 (2012)
- โปรเซสเซอร์ ARMv8ทั้งหมด
- Fujitsu A64FXมี "FMA สี่ตัวดำเนินการพร้อมคำสั่งคำนำหน้า"
- โปรเซสเซอร์ x86 ที่มีชุดคำสั่ง FMA3 และ/หรือ FMA4
- AMD Bulldozer (ปี 2011, เฉพาะ FMA4)
- AMD Piledriver (2012, FMA3 และ FMA4) [ 16 ]
- Intel Haswell (2013, FMA3 เท่านั้น) [ 17 ]
- AMD Steamroller (2014, FMA3 และ FMA4)
- AMD Excavator (2015, FMA3 และ FMA4)
- Intel Skylake (ปี 2015, เฉพาะรุ่น FMA3)
- AMD Zen (2017, เฉพาะ FMA3)
- เอลบรัส-8SV (2018)
การ์ด GPU และ GPGPU:
- การ์ดจอ AMD (รุ่นปี 2009 และใหม่กว่า)
- TeraScale 2ซีรีส์ "Evergreen"
- อิงตามGraphics Core Next
- การ์ดจอ Nvidia (รุ่นปี 2010 และใหม่กว่า)
- เฟอร์มิ -อิน (2010)
- อ้างอิงจาก เคปเลอร์ (2012)
- อ้างอิงจาก แม็กซ์เวลล์ (2014)
- อ้างอิงจาก ปาสคาล (2016)
- ที่ตั้งตามระบบ โวลต้า (2017)
- การ์ดจอ Intel:
- หน่วยประมวลผลกราฟิกแบบรวม (Integrated GPU) ตั้งแต่Sandy Bridge เป็นต้นมา :
- อินเทล MIC (2012)
- ARM Mali T600 Series (2012) และรุ่นที่สูงกว่า
- ตัวประมวลผลเวกเตอร์:
รูปแบบที่มีการปัดเศษสองครั้งขึ้นไป
การตัดทอน MAD
การใช้งาน MADD ที่ง่ายกว่านั้นเกี่ยวข้องกับการตัดทอนผลลัพธ์ของการคูณก่อนที่จะบวก ซึ่งไม่ได้ให้ประโยชน์ด้านความแม่นยำ (และในความเป็นจริงมีความแม่นยำน้อยกว่า) แต่ก่อนปี 2010 วิธีนี้ได้รับการสนับสนุนบน GPU บ่อยกว่า FMA ที่แม่นยำ ตัวอย่างหนึ่งคือคำสั่ง "FMAD" ของ Nvidia PTX [ 18 ]
ตัวเลือกการเพิ่มประสิทธิภาพ OpenCL -cl-mad-enableช่วยให้สามารถแทนที่a * b + cด้วยmad(a, b, c)ฟังก์ชันที่คำนวณนิพจน์ที่เทียบเท่า "ด้วยความแม่นยำที่ลดลง" ใน OpenCL 1.0 [ 19 ]ความแม่นยำของตัวเลือกนี้รวมถึงmad()มีความละเอียดอ่อนมากขึ้นใน OpenCL เวอร์ชันใหม่กว่า โดยอนุญาตให้มีความแม่นยำที่ลดลงใน "โปรไฟล์ฝังตัว" ตั้งแต่เวอร์ชัน 3.0 เป็นต้นไป[ 20 ]
การปัดเศษด้วยความแม่นยำขั้นกลางเพิ่มเติม
คำสั่ง ของDigital Equipment Corporation (DEC) VAXPOLYใช้สำหรับประเมินพหุนามด้วยกฎของ Hornerโดยใช้ขั้นตอนการคูณและการบวกต่อเนื่องกัน คำอธิบายคำสั่งไม่ได้ระบุว่าการคูณและการบวกดำเนินการโดยใช้ขั้นตอน FMA เดียวหรือไม่ คำสั่งนี้เป็นส่วนหนึ่งของชุดคำสั่ง VAX มาตั้งแต่การใช้งาน 11/780 ครั้งแรกในปี 1977 [ 21 ]ตามที่ Bob Supnik กล่าว เครื่องจะทำการคูณและการบวกภายในด้วยความแม่นยำที่ขยายออกไป จากนั้นแปลงเป็นรูปแบบเป้าหมาย[ 22 ]ดังนั้นจึงมีขั้นตอนการปัดเศษหลังจากการคูณ ผลก็คือ แม้ว่าการดำเนินการนี้จะมีความแม่นยำมากกว่าแบบง่ายa * b + cในรูปแบบเป้าหมาย แต่ก็ไม่ตรงตามคำจำกัดความของ FMA ของ IEEE
พฤติกรรมนี้ยังเทียบเคียงได้กับการใช้งานFLT_EVAL_METHOD == 2บนสถาปัตยกรรมx87 ด้วย
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การดำเนินการคูณสะสม
ในด้าน การคำนวณ โดยเฉพาะอย่างยิ่ง การประมวลผลสัญญาณดิจิทัล การดำเนินการคูณ-สะสม (MAC) หรือคูณ-บวก (MAD) เป็นขั้นตอนทั่วไปที่คำนวณผลคูณของตัวเลขสองตัวและบวกผลคูณนั้นเข้ากับตัว สะสม...
ในการคำนวณเลขทศนิยม
เมื่อดำเนินการกับ จำนวนเต็ม การดำเนินการมักจะแม่นยำ (คำนวณ โมดูลัส กำลัง ของ สอง ) อย่างไรก็ตาม จำนวน จุดลอยตัว มี ความแม่นยำ ทางคณิตศาสตร์เพียงระดับหนึ่งเท่านั้นกล่าวคือ การคำนวณเลขจุดลอยตัวแบบดิจิทัลโดยทั่วไปจะไม่เป็นไป ตามกฎการสลับที่ หรือ การกระจาย (ดู...
การคูณแบบหลอมรวม-บวก
การ คูณและบวกแบบรวม ( FMA หรือ fmadd ) [ 7 ] คือการดำเนินการคูณและบวกแบบจุดลอยตัวที่ดำเนินการในขั้นตอนเดียว ( การดำเนินการแบบรวม ) โดยมีการปัดเศษเพียงครั้งเดียว กล่าวคือ ในขณะที่การคูณและบวกแบบไม่รวมจะคำนวณผลคูณ b × c ปัดเศษให้เหลือ N บิตสำคัญ บวกผลลัพธ์กับ a...
คำแนะนำเกี่ยวกับผลคูณดอท
เครื่องบางเครื่องจะรวมการดำเนินการคูณและบวกแบบหลอมรวมหลายรายการเข้าไว้ในขั้นตอนเดียว เช่น การดำเนินการผลคูณดอทสี่องค์ประกอบบนรีจิสเตอร์ SIMD a0×b0 + a1×b1 + a2×b2 + a3×b3 128 บิตสองตัว ด้วยอัตราการประมวลผลรอบเดียว