ทำไมการหารจึงซับซ้อนกว่าการคำนวณทางคณิตศาสตร์อื่น ๆ


39

ฉันเพิ่งพบกรณีที่ฉันต้องการการดำเนินการหารจำนวนเต็มบนชิปที่ขาดหนึ่ง (ARM Cortex-A8) ในขณะที่พยายามค้นคว้าสาเหตุที่ต้องทำฉันพบว่าในแผนกทั่วไปใช้เวลานานกว่าการบวกลบหรือคูณในสถาปัตยกรรมจำนวนเต็มใด ๆ (หรือจุดคงที่) ค่อนข้างมาก เหตุใดจึงเป็นเช่นนี้ มันไม่สามารถใช้แทนด้วยตรรกะ AND-OR สองชั้นเหมือนทุกสิ่งทุกอย่าง

คำตอบ:


34

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


2
มันเคยเป็นทั้งการคูณและการหารเป็นการดำเนินการที่ช้า ทุกวันนี้การคูณนั้นเร็วกว่าเล็กน้อย (แต่ช้ากว่าการบวก / การลบเล็กน้อย) แต่การหารยังช้ากว่าการหารอื่น ๆ ฉันเชื่อว่า Newton-Raphson ยังคงใช้ภายในเป็นส่วนใหญ่ในการตอบสนองต่อตัวเลข
JM

12
(นอกหัวข้อ: "การปฏิบัติการกลับกันมักจะยากเพียงแค่ดูที่การรวมกับความแตกต่าง" - ขึ้นอยู่กับว่าคุณกำลังทำอะไรเป็นสัญลักษณ์หรือตัวเลขการสร้างความแตกต่างนั้นง่าย แต่เป็นตัวเลขยาก ง่าย.)
JM

1
โอเคฉันจะจัดการกับการพูดว่าลูกบาศก์เป็นหนอนที่แตกต่างกัน แต่อย่างน้อยในกรณีที่มีมิติเดียวการสร้างพื้นที่สี่เหลี่ยมจัตุรัสนั้นง่ายกว่าการแยกความแตกต่าง
JM

1
ไม่ว่าในกรณีใดผู้รุกรานจะมาเป็นคู่เสมอ ทำไมคุณถึงเรียก "การดำเนินการ" และอีกอันหนึ่งว่า "การผกผัน"?
David Ketcheson

2
การทำซ้ำหรือการผกผันไม่ทำให้ยากขึ้น ความแข็งของการหารนั้นมาจากความจริงที่ว่าคุณต้องเปลี่ยนผลลัพธ์จากความฉลาดทางไปยังส่วนที่เหลือโดยใช้การวัดแบบยุคลิด ดูทฤษฎีบทส่วนขั้นตอนวิธีการ

20

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

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

ทำไมถึงเป็นไปไม่ได้?

ในการออกแบบ CPU นั้นมีข้อเสียมากมายที่ต้องทำ ฟังก์ชั่นความซับซ้อน (จำนวนทรานซิสเตอร์) ความเร็วและการใช้พลังงานล้วน แต่มีความสัมพันธ์กันและการตัดสินใจในระหว่างการออกแบบสามารถส่งผลกระทบอย่างมากต่อประสิทธิภาพการทำงาน

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

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

ก่อนที่มันจะกลายเป็นการใช้งบประมาณของทรานซิสเตอร์อย่างมีประสิทธิภาพทวีคูณเช่นเดียวกับการหารมักจะทำโดยวิธีการวนซ้ำ กลับมาแล้วประมวลผล DSP ทุ่มเทอาจอุทิศส่วนใหญ่ของซิลิกอนของพวกเขาให้เป็นหนึ่งเดียวได้อย่างรวดเร็วสะสมคูณ (MAC)หน่วย ซีพียู Core2duo มีความหน่วงแฝงทวีคูณเท่ากับ 3 (ค่าออกมาจากไพพ์ไลน์ 3 รอบหลังจากเข้าไป), แต่สามารถมี 3 ทวีคูณในการบินพร้อมกัน, ทำให้เกิดปริมาณงานที่รอบเดียว, ในขณะที่หน่วย SSE2 สามารถ เพิ่ม FP หลายตัวในรอบเดียว

แทนที่จะทุ่มเทพื้นที่ขนาดใหญ่ของซิลิกอนเป็นหน่วยแบ่งวงจรเดี่ยวซีพียูสมัยใหม่มีหลายหน่วยซึ่งแต่ละหน่วยสามารถทำงานแบบขนาน แต่เหมาะสำหรับสถานการณ์เฉพาะของตนเอง ในความเป็นจริงเมื่อคุณคำนึงถึงคำแนะนำSIMDเช่นSSEหรือกราฟิกรวม CPU ของSandy Bridgeหรือ CPU ในภายหลังอาจมีหน่วยแบ่งทศนิยมจำนวนมากบน CPU ของคุณ

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


ตามความรู้ของฉันไม่มีชิปใดมี latencies หารรอบเดียวสำหรับจุดลอย ตัวอย่างเช่นตารางคำสั่งของ Agner Fog สำหรับซีพียู Intel, AMD และ VIA แสดงรายการ DIVPS (แบ่ง SSE ที่บรรจุทศนิยม) เป็น 10-14 รอบ ฉันไม่พบฮาร์ดแวร์ใด ๆ ที่มีคำสั่งแบ่งรอบเดียว แต่ฉันยินดีที่จะพิสูจน์ว่าผิด มันไม่ธรรมดาเท่าที่ฉันจะบอกได้
Bill Barth

@Bill - ขอบคุณคุณพูดถูก ฉันแน่ใจว่าฉันเคยเห็นการทำงานแบบแบ่งรอบเดียวในชิป DSP มาก่อนดังนั้นจึงคิดว่ามันน่าจะเป็นทางไปสู่เดสก์ท็อปเช่นเดียวกับการเพิ่มรอบเดียวแบบทวีคูณ แต่ฉันไม่สามารถหาข้อมูลอ้างอิงได้เลย ฉันได้อัปเดตคำตอบของฉันและเพิ่มข้อมูลที่เกี่ยวข้องเกี่ยวกับวิธีการทำซ้ำที่อาจอนุญาตในอนาคต มันวิเศษมากที่คิดว่าการแบ่งไม่ได้มีประสิทธิภาพมากขึ้นต่อรอบในตอนนี้เมื่อเทียบกับตอนที่ฉันใช้ transputers
Mark Booth

1
ฉันคิดว่า DSP ทำเช่นนั้นด้วยการ จำกัด ช่วงที่พวกมันแม่นยำ นี่เป็นกลยุทธ์เดียวกับที่ใช้สำหรับการค้นหา + การแก้ไขสำหรับสแควร์รูท
Matt Knepley

1
ฉันไม่แน่ใจว่าเวลาแฝงของแผนกดังกล่าวจะเป็นอย่างไร ด้วยความเร็ว 4 GHz ทำให้การค้นหาแบบไปกลับในตารางการค้นหาภายใน N รอบจะ จำกัด ขนาดที่อาจเกิดขึ้นของตารางดังกล่าวอย่างรุนแรง (ตัวอย่างเช่นแคช L1 หยุดนิ่งที่ 32K ต่อวินาที) การใช้ 3D จะช่วยเพิ่มสิ่งนี้ได้ คุณมีความคิดใด ๆ ที่สามารถเข้าถึงเวลาแฝงสำหรับ CPU 4GHz / 5GHz ที่ทันสมัยได้หรือไม่?
Matthieu M.

1
สำหรับ divps / divpd กับ mulps / mulpd พุตที่ตัวเลขดูตลาดน้ำส่วนจุด VS ลอยคูณจุด ฉันนำข้อมูลจากตารางคำสั่งของ Agner Fog และจัดรูปแบบเป็นบทสรุปสำหรับ uarches ของ div และ mul throughput และ latency สำหรับ single กับ double และสำหรับความกว้างเวกเตอร์ SIMD ที่แตกต่างกัน (ชิป Intel มักจะมีการแบ่ง SIMD ที่เพียงครึ่งหนึ่งของความกว้างของ ALUs เวกเตอร์อื่น ๆ .)
ปีเตอร์ Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.