ทำไมชิป Haswell ของ Intel อนุญาตให้การคูณ FP เป็นสองเท่าเร็วกว่าการเติม


35

ฉันกำลังอ่านคำถามที่น่าสนใจเกี่ยวกับ Stack Overflow:

การคูณจำนวนเต็มทำได้ด้วยความเร็วเท่ากันกับการเพิ่มใน CPU ที่ทันสมัยหรือไม่?

หนึ่งในความคิดเห็นที่กล่าวว่า:

"มันไม่มีค่าอะไรที่ Haswell ปริมาณงานคูณ FP เป็นสองเท่าของ FP เพิ่มนั่นเป็นเพราะทั้งพอร์ต 0 และ 1 สามารถใช้ในการคูณ แต่พอร์ต 1 เท่านั้นที่สามารถใช้เพิ่มได้นั่นหมายความว่าคุณสามารถโกงด้วยการหลอมรวม เพิ่มหลายอย่างเนื่องจากทั้งสองพอร์ตสามารถทำได้ "

ทำไมพวกเขาถึงอนุญาตให้มีการคูณหลายตัวพร้อมกันเป็นสองเท่าเมื่อเทียบกับการเพิ่ม


3
ขอบคุณ @DKNguyen! แต่การคูณนั้นเกี่ยวข้องกับวิธีการทางอิเล็กทรอนิกส์มากกว่าการเติม (อันที่จริงการเพิ่มเป็นขั้นตอนสุดท้ายของการคูณดังนั้นวงจรใดก็ตามที่จำเป็นสำหรับการคูณจะรวมสิ่งที่จำเป็นสำหรับการบวกด้วย) ดังนั้นฉันจึงไม่เห็นว่า
user1271772

5
การคูณ FP นั้นเพิ่มเข้ามา ดูลอการิทึม
Janka

9
@Janka ในขณะที่การทวีคูณ FP ต้องใช้การเพิ่มเลขชี้กำลัง แต่ก็ยังจำเป็นต้องคูณตั๊กแตนตำข้าวจริง ๆ mantissa ที่เก็บไว้ไม่ใช่ลอการิทึม
Elliot Alderson

6
FWIW ใน Skylake ทรูพุต "การเพิ่มที่บริสุทธิ์" เพิ่มขึ้นเป็นสองเท่าดังนั้นนี่คือความอยากรู้อยากเห็นจากยุคแฮสเวลล์ / บรอดเวลและไม่ใช่สิ่งที่สืบทอดกันมา
แฮโรลด์

4
@ user1271772 ใช่พวกเขาเป็นพอร์ตเดียวกันแม้ว่า: การเพิ่มในพอร์ต 0 และ 1 และการคูณด้วยพอร์ต 0 และ 1 ก่อนที่ Skylake จะมีเพียงพอร์ต 1 เท่านั้นที่สามารถจัดการการเติมที่บริสุทธิ์ได้ นอกจากนี้ยังขยายไปถึงการดำเนินการบางอย่างนอกเหนือเหมือนคือต่ำสุด / สูงสุด / เปรียบเทียบμopของการแปลงที่ไม่เกิดขึ้นจริงแปลง (ที่มักจะมีการสับเปลี่ยนหรือโหลดμopมีมากเกินไป)
แฮโรลด์

คำตอบ:


37

นี่อาจเป็นคำตอบของชื่อคำถามหากไม่ใช่ร่างกาย:

การเพิ่มจุดลอยตัวนั้นต้องการการจัดตำแหน่งของ mantissa สองตัวก่อนที่จะเพิ่ม (ขึ้นอยู่กับความแตกต่างระหว่างเลขชี้กำลังสองตัว) ซึ่งอาจต้องใช้การเปลี่ยนแปลงจำนวนมากก่อนที่ adder จากนั้นจึงจำเป็นต้องปรับผลลัพธ์ของการเติมแมนทิสซาใหม่อีกครั้งซึ่งอาจต้องใช้การเปลี่ยนแปลงจำนวนมากอีกครั้งเพื่อจัดรูปแบบผลการคำนวณให้ถูกต้อง สองกระบอก mantissa shifters จึงอาจต้องใช้ความล่าช้าของประตูมากขึ้นความล่าช้าของสายไฟที่มากขึ้นหรือรอบพิเศษที่เกินความล่าช้าของการกระชับอัดดีพกพาบันทึกต้นไม้บวก

เพิ่มสำหรับ OP: โปรดทราบว่าการเพิ่มความยาว 2 มิลลิเมตรและ 2 กิโลเมตรไม่ใช่ 4 ของทั้งสองหน่วย นั่นเป็นเพราะความจำเป็นในการแปลงการวัดหนึ่งหรือการวัดอื่น ๆ ให้เป็นสเกลหรือการแสดงหน่วยเดียวกันก่อนเพิ่ม การแปลงนั้นต้องใช้การคูณด้วยกำลังบางส่วน 10 สิ่งเดียวกันโดยทั่วไปจะต้องเกิดขึ้นในระหว่างการเพิ่มจุดลอยตัวเนื่องจากตัวเลขจุดลอยตัวเป็นรูปแบบของจำนวนเต็มที่ปรับขนาดแปรผัน (เช่นมีหน่วยหรือสเกลปัจจัย, เลขชี้กำลัง, เกี่ยวข้องกับ แต่ละหมายเลข) ดังนั้นคุณอาจต้องปรับขนาดหนึ่งในตัวเลขด้วยกำลัง 2 ก่อนที่จะเพิ่มบิต mantissa ดิบเพื่อให้ทั้งสองเป็นตัวแทนของหน่วยหรือสเกลเดียวกัน การขยายนี้เป็นรูปแบบการคูณง่าย ๆ ด้วยกำลัง 2 ดังนั้นการเพิ่มจุดลอยตัวต้องใช้การคูณ(ซึ่งเป็นพลังของ 2 สามารถทำได้ด้วยการเปลี่ยนบิตตัวแปรหรือจำแลงบาร์เรลซึ่งสามารถต้องใช้สายไฟค่อนข้างยาวในความสัมพันธ์กับขนาดของทรานซิสเตอร์ซึ่งสามารถค่อนข้างช้าในวงจรย่อย - ไมครอน - พิมพ์หินย่อยลึก) หากตัวเลขทั้งสองส่วนใหญ่ยกเลิก (เพราะมีค่าเกือบเป็นลบค่าอื่น) ดังนั้นอาจจำเป็นต้องลดผลลัพธ์ของการเพิ่มเช่นกันเพื่อจัดรูปแบบผลลัพธ์ให้เหมาะสม ดังนั้นการเพิ่มอาจช้าหากต้องการ 2 ขั้นตอน (ก่อนและหลัง) ขั้นตอนโดยรอบการเพิ่มไบนารีของจำนวน mantissa บิตคงที่ (จำกัด ) ดิบแทนจำนวนหน่วยเทียบเท่าหรือมาตราส่วนเนื่องจากลักษณะของรูปแบบตัวเลข (IEEE floating point) )

เพิ่ม # 2: นอกจากนี้ยังมีเกณฑ์มาตรฐานน้ำหนัก FMACS (ทวีคูณสะสม) มากกว่าการเพิ่มเปล่า ใน MAC ที่หลอมรวมการจัดตำแหน่ง (shift) ของภาคผนวกมักจะทำควบคู่ไปกับการทวีคูณและการเติม mantissa มักจะรวมอยู่ในทรี CSA ก่อนที่จะทำการแพร่กระจายครั้งสุดท้าย


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท ข้อสรุปใด ๆ ที่มาถึงควรได้รับการแก้ไขกลับเข้าไปในคำถามและ / หรือคำตอบใด ๆ
Dave Tweed

3
ฉันกำลังเรียก BS แน่นอนว่าการคูณที่เกิดขึ้นจริงในการดำเนินการคูณ FP นั้นไม่สามารถทำได้ยากกว่าการกะ 2 บาร์เรล
user253751

5
"ยากขึ้น" อาจเร็วขึ้นและคุ้มค่าในการเพิ่มประสิทธิภาพเนื่องจากข้อ จำกัด และเป้าหมายของโครงการคือ 4 สิ่งที่แตกต่างกัน
hotpaw2

3
@immibis: ก่อน Haswell ซีพียู Intel มีหน่วยเพิ่ม 1 SIMD FP (เวลาแฝง 3 รอบ) และ 1 SIMD FP mul unit (5 รอบเวลาแฝง) ดังนั้นการเพิ่มเร็วกว่าทวีคูณ (ซึ่งเป็นสาเหตุที่ Haswell เก็บหน่วยเพิ่ม FP แยกต่างหากเมื่อเพิ่มหน่วย FMA 2x สำหรับ fma และ mul แทนที่จะเรียกใช้บนหน่วย FMA เหมือน SKL) นอกจากนี้การเปลี่ยน SIMD-int ทำงานด้วย 1c latency และ SIMD-int mul ที่ 5c latency (piggybacking บนซิกนิฟิแคนด์และตัวคูณในหน่วย FMA) ดังนั้นการเปลี่ยนแปลงจะถูกกว่าการคูณมาก ทั้ง add และ mul มี pipelined อย่างสมบูรณ์ดังนั้นพวกเขาทั้งสองต้องการ shifter แยกบาร์เรลเพื่อเอาท์พุทปกติ
Peter Cordes

22

ในการทวีคูณ FP การประมวลผลเลขชี้กำลังเป็นการเพิ่มที่ง่าย คุณได้เจอลอการิทึมฉันหวังว่า

ทีนี้ลองพิจารณาว่ามันยากแค่ไหนที่จะเพิ่มตัวเลขสองตัวในรูปแบบลอการิทึม ...

จุดลอยตัวใช้พื้นที่สีเทาระหว่างโดเมนเชิงเส้นและโดเมนล็อกโดยมีลักษณะของทั้งคู่ หมายเลข FP แต่ละหมายเลขประกอบด้วยแมนทิสซา (ซึ่งเป็นเส้นตรง) และเลขชี้กำลัง (ลอการิทึม) ในการกำหนดความหมายของแต่ละบิตในแมนทิสซาคุณต้องดูเลขชี้กำลัง (ซึ่งเป็นเพียงตัวประกอบสเกล) ก่อน

ใน FP นอกจากนี้การประมวลผลเลขชี้กำลังในกรณีทั่วไปต้องใช้การขยับบาร์เรล mantissa สองครั้งโดยที่การเปลี่ยนบาร์เรลแต่ละครั้งเป็นกรณีพิเศษของการคูณแบบง่าย ๆ เล็กน้อย

(การเลื่อนครั้งแรกจัดตำแหน่งอินพุตทั้งสองให้อยู่ในระดับกำลังเท่ากันของ 2 ดังนั้นบิต mantissa มีน้ำหนักไบนารีเท่ากันในแต่ละตัวถูกดำเนินการ

ตัวอย่างทศนิยมจะพอเพียง (แม้ว่าจะใช้ไบนารีอย่างชัดเจน) ...

(3103)+(1101)=(3103)+(0.0001103)

ครั้งที่สองปรับขนาดเอาต์พุต ...

1100+(0.999100)=0.001100=1103

ดังนั้นความขัดแย้งการเพิ่ม FP เกี่ยวข้องกับสิ่งที่คล้ายกับการคูณสองอย่างซึ่งต้องดำเนินการตามลำดับโดยการเพิ่ม mantissa ระหว่างพวกเขา ในแง่ที่ว่าประสิทธิภาพการรายงานไม่น่าแปลกใจ


8
"พิจารณาว่ามันยากแค่ไหนที่จะเพิ่มตัวเลขสองตัวในรูปแบบลอการิทึม" ได้รับความกระจ่าง
Peter - Reinstate Monica

1
แม้ว่าโชคดีที่เลขชี้กำลังจุดลอยตัวเป็นจำนวนเต็มดังนั้นคุณไม่จำเป็นต้องเพิ่มอะไรอย่างเช่น 1.3 + 2.3 = 2.34 มันเป็นเพียงการเปลี่ยนของตั๊กแตนตำข้าว
ilkkachu

1
เหตุผลที่คุณสามารถทำการคูณสองครั้งต่อรอบเนื่องจากมีสองหน่วยคูณไม่ใช่เพราะหน่วยคูณเร็วกว่าหน่วยเพิ่มเติม (ดูแผนภาพในคำตอบของ pjc50) คุณไม่สามารถตอบคำถามนี้ได้โดยอธิบายว่าทำไมคุณคิดว่าหน่วยเพิ่มเติมช้ากว่าหน่วยคูณ นอกจากนั้นคำตอบอื่น ๆ ที่บอกว่าหน่วยเพิ่มนั้นมีเวลาแฝงต่ำกว่าแสดงว่าการเพิ่มนั้นเป็นการทำงานที่ง่ายขึ้น
user253751

2
@immibis: การสังเกตของคุณถูกต้อง แต่คำถามนั้นเป็นไปตามเส้นของ "เหตุใดจึงเป็นเช่นนี้ทำไมไม่มีหน่วยเพิ่มสองหน่วยเนื่องจากการเพิ่มนั้นง่ายกว่า / ถูกกว่า mpy มาก" ส่วนหนึ่งของคำตอบก็คือ "ใน FP มันไม่ใช่เรื่องง่าย" ส่วนที่เหลือมาจากเศรษฐศาสตร์: จากค่าใช้จ่ายจริงและการศึกษาปริมาณงานที่คาดหวังมาก ซิลิคอน. ฉันจะปล่อยให้คำตอบอื่น ๆ เพื่อขยายในส่วนนั้น
Brian Drummond

นักวิทยาศาสตร์คอมพิวเตอร์บางคน (เช่น Kahan (สถาปนิกของ IEEE754 FP) และ Knuth) ยืนยันว่า "mantissa" เป็นคำที่ผิดเพราะมันเป็นเส้นตรง (ไม่ใช่ลอการิทึม) คำศัพท์สมัยใหม่ที่ต้องการคือซิกนิแคนด์ en.wikipedia.org/wiki/Significand#Use_of_%22mantissa%22 "mantissa" เป็นคำที่ดูเย็นกว่าโดยมีพยางค์ที่น้อยกว่า
Peter Cordes

16

TL: DR : เนื่องจาก Intel คิดว่า SSE / AVX FP การเพิ่มความหน่วงแฝงมีความสำคัญมากกว่าปริมาณงานจึงเลือกที่จะไม่รันบนหน่วย FMA ใน Haswell / Broadwell


Haswell run (SIMD) FP ทวีคูณบนหน่วยการดำเนินการเดียวกันกับ FMA ( Fused Multiply-Add ) ซึ่งมีสองเพราะรหัส FP-Intense บางตัวสามารถใช้ FMA ส่วนใหญ่ทำ 2 FLOP ต่อการเรียนการสอน 5 latency cycle เหมือนกับ FMA และเหมือนกับmulpsCPU ก่อนหน้า (Sandybridge / IvyBridge) Haswell ต้องการหน่วย 2 FMA และไม่มีข้อเสียในการอนุญาตให้เพิ่มจำนวนการรันต่อเนื่องเพราะมันมีความหน่วงเช่นเดียวกับหน่วยคูณที่อุทิศในซีพียูรุ่นก่อนหน้า

แต่มันทำให้ SIMD FP เฉพาะหน่วยเพิ่มจากซีพียูก่อนหน้านี้ยังคงทำงานaddps/ addpdด้วยเวลาแฝง 3 รอบ ฉันได้อ่านว่าเหตุผลที่เป็นไปได้อาจเป็นรหัสที่เพิ่ม FP จำนวนมากมีแนวโน้มที่จะเกิดปัญหาคอขวดในเวลาแฝงไม่ใช่ปริมาณงาน นั่นเป็นความจริงอย่างแน่นอนสำหรับผลรวมอันไร้เดียงสาของอาเรย์ที่มีตัวสะสม (เวกเตอร์) เพียงตัวเดียวเช่นที่คุณมักจะได้รับจากการปรับเวกเตอร์อัตโนมัติ GCC แต่ฉันไม่รู้ว่า Intel ยืนยันอย่างเปิดเผยว่าเป็นเหตุผล

Broadwell เหมือนกัน ( แต่เร่งmulps/mulpdแฝง 3c ขณะ FMA อยู่ที่ 5c) บางทีพวกเขาสามารถลัดหน่วย FMA และรับผลคูณก่อนที่จะทำการเพิ่มจำลอง0.0หรืออาจเป็นสิ่งที่แตกต่างอย่างสิ้นเชิงและนั่นก็เป็นวิธีที่ง่ายเกินไป BDW ส่วนใหญ่เป็นการตายของ HSW กับการเปลี่ยนแปลงส่วนใหญ่เป็นรอง

ใน Skylake ทุกอย่าง FP (รวมถึงการเพิ่ม) ทำงานบนหน่วย FMA ที่มีความหน่วง 4 รอบและปริมาณงาน 0.5c ยกเว้นหลักสูตร div / sqrt และ booleans บิต (เช่นค่าสัมบูรณ์หรือการปฏิเสธ) เห็นได้ชัดว่า Intel ตัดสินใจว่ามันไม่คุ้มกับซิลิกอนพิเศษสำหรับการเพิ่ม FP ในเวลาแฝงที่ต่ำกว่าหรือaddpsปริมาณงานที่ไม่สมดุลนั้นเป็นปัญหา และการกำหนดเวลามาตรฐานทำให้หลีกเลี่ยงความขัดแย้งในการเขียนกลับ (เมื่อผลลัพธ์ 2 รายการพร้อมในรอบเดียวกัน) ง่ายขึ้นเพื่อหลีกเลี่ยงในการจัดตารางเวลาแบบ uop ie ช่วยลดความซับซ้อนของการตั้งเวลาและ / หรือพอร์ตที่เสร็จสมบูรณ์

ใช่แล้ว Intel เปลี่ยนมันในการแก้ไขครั้งสำคัญครั้งต่อไป (Skylake) การลดเวลาแฝงของ FMA ลง 1 รอบทำให้ได้ประโยชน์จาก SIMD FP เฉพาะหน่วยที่เล็กลงมากสำหรับกรณีที่มีความล่าช้าในการตอบสนอง

Skylake ยังแสดงให้เห็นว่า Intel กำลังเตรียมพร้อมสำหรับ AVX512 ซึ่งการขยายตัวขยาย SIMD-FP adder แยกเป็น 512 บิตที่กว้างจะทำให้พื้นที่ตายยิ่งกว่าเดิม Skylake-X (พร้อม AVX512) มีรายงานว่ามีแกนหลักเกือบเหมือนกันกับ Skylake-client ปกติยกเว้นแคช L2 ที่มีขนาดใหญ่กว่าและ (ในบางรุ่น) หน่วย FMA 512 บิตพิเศษ "ปิด" ที่พอร์ต 5

SKX ปิดพอร์ต 1 SIMD ALUs เมื่อ uops 512 บิตกำลังบิน แต่มันต้องการวิธีที่จะดำเนินการvaddps xmm/ymm/zmmทุกจุด สิ่งนี้ทำให้การมีหน่วย FP ADD เฉพาะบนพอร์ต 1 เป็นปัญหาและเป็นแรงจูงใจที่แยกต่างหากสำหรับการเปลี่ยนแปลงจากประสิทธิภาพของรหัสที่มีอยู่

ความจริงแล้วสนุก: ทุกอย่างจาก Skylake, KabyLake, Coffee Lake และแม้กระทั่ง Cascade Lake นั้นมีลักษณะทางจุลภาคเหมือนกับ Skylake ยกเว้น Cascade Lake เพิ่มคำแนะนำ AVX512 ใหม่ IPC ไม่ได้เปลี่ยนเป็นอย่างอื่น แม้ว่า CPU ที่ใหม่กว่าจะมี iGPU ที่ดีกว่า Ice Lake (microarchitecture ของซันนี่โคฟ) เป็นครั้งแรกในรอบหลายปีที่เราได้เห็นไมโครอาร์คิเทคเจอร์ใหม่ที่แท้จริง


ข้อโต้แย้งที่อิงตามความซับซ้อนของหน่วย FMUL เทียบกับหน่วย FADD นั้นน่าสนใจ แต่ไม่เกี่ยวข้องในกรณีนี้ FMA หน่วยรวมทั้งหมดฮาร์ดแวร์ขยับจำเป็นต้องทำนอกจาก FP เป็นส่วนหนึ่งของ FMA 1

หมายเหตุ: ผมไม่ได้หมายถึง x87 fmulคำแนะนำผมหมายถึง SSE / AVX SIMD / FP เกลาคูณ ALU ที่สนับสนุน 32 บิตแม่นยำเดียว / floatและ64 บิตdoubleความแม่นยำ (53 บิตซิก aka mantissa) คำแนะนำเช่นชอบหรือmulps mulsd80-bit ที่แท้จริง x87 fmulยังคงเป็นเพียง 1 / throughput บน Haswell บนพอร์ต 0

ซีพียูสมัยใหม่มีทรานซิสเตอร์มากกว่าพอที่จะทำให้เกิดปัญหาเมื่อมันคุ้มค่าและเมื่อมันไม่ทำให้เกิดปัญหาการหน่วงเวลาการแพร่กระจายทางกายภาพ โดยเฉพาะอย่างยิ่งสำหรับหน่วยดำเนินการที่ใช้งานได้บางครั้ง ดูhttps://en.wikipedia.org/wiki/Dark_siliconและเอกสารการประชุมปี 2554: Dark Silicon และ End of Multicore Scaling. นี่คือสิ่งที่ทำให้เป็นไปได้สำหรับซีพียูที่จะมีปริมาณงาน FPU จำนวนมากและปริมาณงานจำนวนเต็มจำนวนมาก แต่ไม่ใช่ทั้งสองอย่างในเวลาเดียวกัน (เพราะหน่วยดำเนินการที่แตกต่างกันอยู่ในพอร์ตส่งเดียวกันดังนั้นจึงแข่งขันกัน) ในโค้ดที่ได้รับการปรับอย่างระมัดระวังจำนวนมากซึ่งไม่ได้มีปัญหาคอขวดบนแบนด์วิดท์ mem มันไม่ใช่หน่วยประมวลผลแบ็คเอนด์ที่เป็นปัจจัย จำกัด แต่แทนที่จะเป็นปริมาณงานคำสั่งส่วนหน้า ( แกนกว้างมีราคาแพงมาก ) ดูเพิ่มเติมhttp://www.lighterra.com/papers/modernmicroprocessors/


ก่อนแฮส

ก่อน HSW , CPU ของ Intel เช่น Nehalem และ Sandybridge มี SIMD FP คูณบนพอร์ต 0 และ SIMD FP เพิ่มที่พอร์ต 1 ดังนั้นจึงมีหน่วยการดำเนินการแยกต่างหากและปริมาณงานมีความสมดุล ( https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle

แฮสได้แนะนำการสนับสนุน FMA ให้กับซีพียู Intel (สองปีหลังจากที่เอเอ็มดีได้แนะนำ FMA4 ใน Bulldozer หลังจากที่Intel แกล้งพวกเขาออกมาโดยรอสายเท่าที่จะทำได้เพื่อเผยแพร่ต่อสาธารณชนว่าพวกเขากำลังจะใช้ FMA 3 ตัว - ทำลายปลายทาง FMA4) ความจริงแล้วสนุก: AMD Piledriverยังคงเป็นซีพียู x86 ตัวแรกที่มี FMA3 ประมาณหนึ่งปีก่อน Haswell ในเดือนมิถุนายน 2013

สิ่งนี้ต้องการการแฮ็กหลักของ internals เพื่อสนับสนุน uop เดี่ยวด้วยอินพุต 3 ตัว แต่อย่างไรก็ตาม Intel ก็เข้ากันได้ดีและใช้ประโยชน์จากทรานซิสเตอร์ที่ลดขนาดลงเพื่อใส่ SIMD FMA สองหน่วย 256 บิตทำให้ Haswell (และผู้สืบทอด) เป็นสัตว์สำหรับคณิตศาสตร์ FP

เป้าหมายด้านประสิทธิภาพที่ Intel อาจคำนึงถึงคือผลิตภัณฑ์ BLAS ที่มีความหนาแน่นสูงและเวกเตอร์ดอท ทั้งสองอย่างนั้นส่วนใหญ่สามารถใช้ FMA และไม่ต้องการเพียงแค่เพิ่ม

ดังที่ฉันได้กล่าวไปแล้วก่อนหน้านี้เวิร์กโหลดบางอย่างที่ทำส่วนใหญ่หรือเพียงแค่การเพิ่ม FP นั้นมีปัญหาเรื่องการเพิ่มความหน่วง (ส่วนใหญ่) ไม่ใช่ปริมาณงาน


เชิงอรรถ 1 : และด้วยการเพิ่มทวีคูณ1.0FMA นั้นสามารถนำมาใช้เพิ่มเติมได้ แต่มีความล่าช้าน้อยกว่าaddpsคำแนะนำ สิ่งนี้อาจเป็นประโยชน์สำหรับเวิร์กโหลดเช่นการสรุปอาร์เรย์ที่ร้อนในแคช L1d ที่ FP เพิ่มปริมาณงานมีความสำคัญมากกว่าเวลาแฝง สิ่งนี้จะช่วยได้ถ้าคุณใช้ตัวสะสมแบบเวคเตอร์หลายตัวเพื่อซ่อนเวลาแฝงของหลักสูตรและทำให้การดำเนินงาน FMA 10 ครั้งต่อเนื่องในหน่วยการปฏิบัติการ FP (การประมวลผล 5c latency / 0.5c ทรูพุท = 10 คุณต้องทำเช่นนั้นเมื่อใช้ FMA สำหรับผลิตภัณฑ์เวคเตอร์ดอทเช่นกัน

ดูDavid Kanter เขียนบทความเกี่ยวกับสถาปัตยกรรมแบบ Sandybridgeซึ่งมีบล็อกไดอะแกรมซึ่งสหภาพยุโรปอยู่บนพอร์ตใดสำหรับ NHM, SnB และ AMD Bulldozer ตระกูล (ดูตารางการสอนของ Agner Fogและคู่มือการใช้ไมโครอาร์เอ็มออปชั่น asm และhttps://uops.info/ซึ่งมีการทดสอบ uops, พอร์ตและเวลาแฝง / ปริมาณงานของการเรียนการสอนเกือบทุกรุ่นสำหรับไมโครสถาปัตยกรรมของ Intel)

ยังเกี่ยวข้องกับ: https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle


1
ในกรณีที่คุณสงสัยเกี่ยวกับว่าจะใช้คำของฉันนี้: บนกองมากเกินผมมีป้ายทองรวมทั้ง[cpu-architecture], [performance], [x86-64], และ[assembly] [sse]ฉันเขียนคำตอบเกี่ยวกับรหัส C ++ สำหรับทดสอบการคาดคะเนของ Collatz เร็วกว่าชุดประกอบที่เขียนด้วยมือ - ทำไม ที่หลายคนคิดว่าดี นอกจากนี้ยังเกี่ยวกับการดำเนินการไพพ์ไลน์ OoO
Peter Cordes

"BDW ส่วนใหญ่เป็นการตายของ HSW กับการเปลี่ยนแปลงส่วนใหญ่เป็นรอง" ทำให้ดูเหมือนว่าพวกเขาตั้งใจปล่อยให้การเพิ่มประสิทธิภาพบางอย่างถูกยกเลิกไปในรอบแรกอาจเป็นเพราะเหตุผลทางการเงิน
jpaugh

2
@jpaugh: ดูen.wikipedia.org/wiki/Tick%E2%80%93tock_model - แผนของ Intel ตั้งแต่ปีพ. ศ. 2549 (จนกว่าพวกเขาจะตีสิ่งกีดขวางบนถนน 10nm) นั้นตายตัวในกระบวนการใหม่ด้วยการเปลี่ยนแปลงอื่น ๆ เล็กน้อยจากนั้นสถาปัตยกรรมใหม่ ในกระบวนการที่ผ่านการทดสอบแล้ว โปรดจำไว้ว่าการพัฒนานั้นกำลังอยู่ในช่วงหลายปีที่มีการออกแบบในอนาคตหลายแบบบนเครื่องบิน: มันไม่ได้เสร็จสิ้นก่อนที่จะเริ่มต้นในวันถัดไป Broadwell ตั้งใจที่จะเป็นเพียง "เห็บ" ก่อน Skylake "tock" ที่ใช้ประโยชน์เต็มที่จากกระบวนการผลิต 14nm ของพวกเขาและไม่ต้องกังวลกับการดีบักกระบวนการเพียงแค่ออกแบบ
Peter Cordes

ฉันขอขอบคุณการเชื่อมโยง คุณสะท้อนความรู้สึกของฉันเป็นหลัก แต่ก็มีความแม่นยำมากกว่าที่ฉันสามารถรวบรวมได้
jpaugh

8

ฉันจะดูที่ส่วนนี้:
"ทำไมถึงอนุญาตให้ " ...
TL; DR - เพราะพวกเขาออกแบบมันในแบบนั้น มันคือการตัดสินใจของฝ่ายบริหาร แน่นอนว่ามีคำตอบของ mantissa และ bit shifters แต่สิ่งเหล่านี้เป็นสิ่งที่นำไปสู่การตัดสินใจด้านการจัดการ

ทำไมพวกเขาถึงออกแบบมันอย่างนั้น? คำตอบคือสเป็คทำเพื่อให้บรรลุเป้าหมายบางอย่าง เป้าหมายเหล่านั้นรวมถึงประสิทธิภาพและต้นทุน ประสิทธิภาพนั้นไม่ได้มุ่งเน้นไปที่การดำเนินงาน แต่เป็นมาตรฐานเช่น FLOPS หรือ FPS ใน Crysis
มาตรฐานเหล่านี้จะมีฟังก์ชั่นการผสมผสานซึ่งบางส่วนสามารถประมวลผลได้ในเวลาเดียวกัน
หากนักออกแบบคิดว่าการที่มีสองฟังก์ชั่นของวิดเจ็ต A ทำให้มันเร็วขึ้นมากกว่าที่จะเป็นสองฟังก์ชั่นของวิดเจ็ต B พวกเขาจะไปกับวิดเจ็ต A การใช้งานสองของ A และสองของ B

มองย้อนกลับไปเมื่อซูเปอร์คาร์และซูเปอร์ไพน์ไลน์ (ก่อนมัลติคอร์) กลายเป็นเรื่องธรรมดาในชิปเชิงพาณิชย์เป็นครั้งแรกสิ่งเหล่านี้อยู่ที่นั่นเพื่อเพิ่มประสิทธิภาพ Pentium มีสองท่อและไม่มีเวกเตอร์รวมกัน แฮสมีท่อเพิ่มเติมหน่วยเวกเตอร์ท่อลึกฟังก์ชั่นเฉพาะและอื่น ๆ อีกมากมาย ทำไมจึงไม่มีสองสิ่งทุกอย่าง เพราะพวกเขาออกแบบมันอย่างนั้น


เป้าหมายประสิทธิภาพที่เกี่ยวข้องมากขึ้นอาจเป็นผลิตภัณฑ์หนาแน่น BLAS และเวกเตอร์ดอท ทั้งสองอย่างนั้นส่วนใหญ่สามารถใช้ FMA และไม่ต้องการเพียงแค่เพิ่ม
Peter Cordes

ฉันไม่เคยเห็น BLAS matmul หนาแน่นและเวกเตอร์ดอทโปรดักส์บนกล่องผลิตภัณฑ์ ไม่เห็นโฆษณาเหล่านี้ใน ไม่เห็นสิ่งเหล่านี้ในการตรวจสอบผลิตภัณฑ์ (แน่นอนว่าพวกเขามีความสำคัญ แต่วิศวกรรมติดตามการจัดการการจัดการตามการตลาดการตลาดตามการขายยอดขายซื้อโดยคนทั่วไป
MikeP

1
ฉันเคยเห็นรีวิวซีพียูที่มีเกณฑ์มาตรฐานเช่น Linpack แต่อย่างไรก็ตามตามที่คุณพูด (สูงสุดตามทฤษฎี) FLOPS จะได้รับการโฆษณาและนั่นเป็นพร็อกซีสำหรับประสิทธิภาพการทำงานของ matmul หากแคชสามารถติดตามได้ ฉันไม่แน่ใจว่าเบนช์มาร์กของ SPECfp ใกล้เคียงกับการอิ่มตัวของหน่วย FMA ทั้งบน HSW หรือ SKL แต่เบนช์มาร์ก SPEC นั้นมีความสำคัญมาก การขายทั้งหมดไม่ใช่การขายแบบครั้งต่อครั้ง บางคนเป็นผู้ซื้อที่มีความซับซ้อนเช่นผู้ซื้อคลัสเตอร์ซูเปอร์คอมพิวเตอร์ตัดสินใจว่าจะอัพเกรดเมื่อใดหรือฟาร์มเซิร์ฟเวอร์ขององค์กร ส่วนต่างกำไรก็สูงขึ้นด้วยเช่นกันฉันคิดว่า
Peter Cordes

6

แผนภาพนี้จาก Intel อาจช่วย:

ภาพรวมหน่วยปฏิบัติการแฮสเวล

ดูเหมือนว่าพวกเขาได้ให้ FMA (fused ทวีคูณเพิ่ม) แต่ละหน่วยเช่นเดียวกับคูณและบวกหนึ่ง พวกเขาอาจหรือไม่อาจแชร์ฮาร์ดแวร์ภายใต้

คำถามที่ว่าทำไมการตอบคำถามจึงยากกว่านี้หากไม่มีเหตุผลในการออกแบบ แต่ข้อความในกล่องสีม่วงให้คำใบ้กับเรา "doubles peak FLOPs": โปรเซสเซอร์จะกำหนดเป้าหมายชุดมาตรฐานซึ่งได้มาจากกรณีการใช้งานจริง FMA ได้รับความนิยมอย่างมากเนื่องจากเป็นหน่วยพื้นฐานของการคูณเมทริกซ์ นอกจากนี้การเปลือยก็เป็นที่นิยมน้อยกว่า

คุณสามารถใช้พอร์ตทั้งสองเพื่อเพิ่มโดยใช้คำสั่ง FMA โดยที่พารามิเตอร์การคูณคือ 1 การคำนวณ (A x 1) + B ซึ่งจะช้ากว่าการเพิ่มเปล่าเล็กน้อยเล็กน้อย


FP Multiply ทำงานบนหน่วย FMA FP เพิ่มรันด้วยเวลาแฝงที่ต่ำกว่าในหน่วยเพิ่ม SIMD FP เฉพาะบนพอร์ต 1 เท่านั้น เป็นไปได้ที่มันจะแบ่งปันทรานซิสเตอร์บางตัวกับหน่วย FMA บนพอร์ตนั้น แต่จากสิ่งที่ฉันได้อ่านฉันได้รับความประทับใจที่ต้องใช้พื้นที่เพิ่มเติมที่สำคัญในการให้สิ่งนี้
Peter Cordes

โพสต์คำตอบ พร้อมรายละเอียดเพิ่มเติม
Peter Cordes

4

ลองมาดูขั้นตอนที่ใช้เวลานาน:

เพิ่มเติม: จัดตำแหน่งเลขชี้กำลัง (อาจเป็นการดำเนินการกะมาก) หนึ่งบวก 53 บิต การทำให้เป็นมาตรฐาน (สูงสุด 53 บิต)

การคูณ: เครือข่าย adder ขนาดใหญ่เพื่อลดขนาดผลิตภัณฑ์ 53 x 53 หนึ่งบิตให้เท่ากับจำนวน 106 บิตสองตัว บวกหนึ่ง 106 บิต normalization ฉันจะบอกว่าการลดบิตของผลิตภัณฑ์ให้เหลือเพียงสองตัวเลขนั้นสามารถทำได้เร็วเท่ากับ adder สุดท้าย

หากคุณสามารถสร้างตัวแปรการคูณเวลาได้คุณจะได้รับประโยชน์จากการทำให้มาตรฐานกลับคืนสู่สภาพเดิมโดยใช้เวลาเพียงหนึ่งบิตเท่านั้นและคุณสามารถตรวจจับกรณีอื่น ๆ ได้อย่างรวดเร็ว (อินพุตที่ผิดปกติ

สำหรับขั้นตอนการปรับสภาพให้เป็นมาตรฐานนั้นเป็นเรื่องธรรมดามาก (การเพิ่มตัวเลขที่ไม่ได้มีขนาดเท่ากันลบตัวเลขที่อยู่ใกล้) ดังนั้นสำหรับการคูณคุณสามารถที่จะมีเส้นทางที่รวดเร็วและได้รับความนิยมอย่างมากสำหรับเส้นทางที่ช้า นอกจากนี้คุณไม่สามารถ

PS การอ่านความคิดเห็น: มันสมเหตุสมผลแล้วที่การเพิ่มจำนวน denormalised ไม่ทำให้เกิดการลงโทษ: มันหมายความว่าในบรรดาบิตที่ถูกเลื่อนเพื่อจัดตำแหน่งเลขชี้กำลังหลาย ๆ คนเป็นศูนย์ และผลลัพธ์ที่ผิดปกติหมายความว่าคุณหยุดขยับเพื่อลบเลขศูนย์นำหน้าถ้านั่นจะทำให้เลขชี้กำลังมีขนาดเล็กเกินไป


ในความเป็นจริงแล้วซีพียูของ Intel ทำหน้าที่จัดการคูณย่อยปกติ (อินพุตหรือเอาต์พุต) ผ่านตัวช่วยไมโครโค้ด นั่นคือ FPU ปกติส่งสัญญาณให้เกิดข้อยกเว้นแทนที่จะมีขั้นตอนขั้นตอนพิเศษสำหรับกรณีนี้ Agner Fog กล่าวว่าอีกครั้ง: Sandybridge ในการทดสอบของฉันกรณีของอันเดอร์โฟล์และตัวเลขผิดเพี้ยนได้รับการจัดการอย่างรวดเร็วเท่ากับเลขทศนิยมปกติสำหรับการเติม แต่ไม่ใช่สำหรับการคูณ นี่คือเหตุผลที่รวบรวม-ffast-mathชุด FTZ / DAZ (ล้าง denormals เป็นศูนย์) เพื่อทำแทนการใช้ FP assist
Peter Cordes

ในคู่มือไมโครอาร์เนอร์ของ Agner เขากล่าวว่ามีบทลงโทษเสมอเมื่อดำเนินการกับอินพุตปกติจะสร้างเอาต์พุตย่อย แต่การเพิ่ม + ปกติปกติไม่มีการลงโทษ ดังนั้นการตรวจสอบสรุปอาจไม่ถูกต้องหรือคำแนะนำ uarch ไม่ถูกต้อง Agner กล่าวว่า Knight's Landing (Xeon Phi) ไม่มีบทลงโทษสำหรับ subnormals ใด ๆ ใน mul / add แบ่งเฉพาะ แต่ KNL มีการเพิ่ม / mul / FMA (6c) ในเวลาแฝงที่สูงกว่า Haswell (5c) / SKL (4c) กระแสหลัก ที่น่าสนใจคือ AMD Ryzen มีบทลงโทษเพียงไม่กี่รอบเท่านั้นและโทษครั้งใหญ่ในตระกูล Bulldozer
Peter Cordes

ตามข้อ จำกัด ของ GPU นั้นเป็นเรื่องของปริมาณงานไม่ใช่ความหน่วงดังนั้นจึงมักจะมีความหน่วงแฝงคงที่สำหรับทุกกรณีแม้กระทั่งกับ subnormals การติดกับไมโครโค้ดอาจไม่ใช่แม้แต่ตัวเลือกสำหรับท่อกระดูกเปล่าเช่นนั้น
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.