กลับไปหน้าบทความ

อ่าน 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 2y 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 ]แต่ได้ถูกเพิ่มเข้าไปในโปรเซสเซอร์จำนวนมาก

การ์ด GPU และ GPGPU:

รูปแบบที่มีการปัดเศษสองครั้งขึ้นไป

การตัดทอน 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 ด้วย

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Multiply–accumulate_operation&oldid=1343258892 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การดำเนินการคูณสะสม

ในด้าน การคำนวณ โดยเฉพาะอย่างยิ่ง การประมวลผลสัญญาณดิจิทัล การดำเนินการคูณ-สะสม (MAC) หรือคูณ-บวก (MAD) เป็นขั้นตอนทั่วไปที่คำนวณผลคูณของตัวเลขสองตัวและบวกผลคูณนั้นเข้ากับตัว สะสม...

ในการคำนวณเลขทศนิยม

เมื่อดำเนินการกับ จำนวนเต็ม การดำเนินการมักจะแม่นยำ (คำนวณ โมดูลัส กำลัง ของ สอง ) อย่างไรก็ตาม จำนวน จุดลอยตัว มี ความแม่นยำ ทางคณิตศาสตร์เพียงระดับหนึ่งเท่านั้นกล่าวคือ การคำนวณเลขจุดลอยตัวแบบดิจิทัลโดยทั่วไปจะไม่เป็นไป ตามกฎการสลับที่ หรือ การกระจาย (ดู...

การคูณแบบหลอมรวม-บวก

การ คูณและบวกแบบรวม ( FMA หรือ fmadd ) [ 7 ] คือการดำเนินการคูณและบวกแบบจุดลอยตัวที่ดำเนินการในขั้นตอนเดียว ( การดำเนินการแบบรวม ) โดยมีการปัดเศษเพียงครั้งเดียว กล่าวคือ ในขณะที่การคูณและบวกแบบไม่รวมจะคำนวณผลคูณ b × c ปัดเศษให้เหลือ N บิตสำคัญ บวกผลลัพธ์กับ a...

คำแนะนำเกี่ยวกับผลคูณดอท

เครื่องบางเครื่องจะรวมการดำเนินการคูณและบวกแบบหลอมรวมหลายรายการเข้าไว้ในขั้นตอนเดียว เช่น การดำเนินการผลคูณดอทสี่องค์ประกอบบนรีจิสเตอร์ SIMD a0×b0 + a1×b1 + a2×b2 + a3×b3 128 บิตสองตัว ด้วยอัตราการประมวลผลรอบเดียว