ทำไมการเพิ่มความเร็วอย่างรวดเร็วเท่ากับการทำงานที่ชาญฉลาดในโปรเซสเซอร์รุ่นใหม่?


72

ฉันรู้ว่าการทำงานของ bit-wise นั้นรวดเร็วสำหรับตัวประมวลผลที่ทันสมัยเนื่องจากสามารถทำงานกับ 32 หรือ 64 บิตในแบบขนานดังนั้นการดำเนินงาน bit-wise จึงใช้เวลาเพียงหนึ่งรอบนาฬิกา อย่างไรก็ตามการเพิ่มเป็นการดำเนินการที่ซับซ้อนซึ่งประกอบด้วยการดำเนินการอย่างน้อยหนึ่งอย่างและอาจเป็นถึงการดำเนินการที่ชาญฉลาดจำนวนโหลดังนั้นฉันจึงคิดว่ามันจะช้าลง 3-4 เท่า ฉันรู้สึกประหลาดใจที่ได้เห็นมาตรฐานที่เรียบง่ายว่าการเพิ่มนั้นเร็วพอ ๆ กับการดำเนินการที่ชาญฉลาด (XOR, OR และอื่น ๆ ) ทุกคนสามารถหลั่งน้ำตาแสงนี้




1
ใช่การคูณก็ค่อนข้างเร็วในการทดสอบของฉันเช่นกัน มันช้ากว่าการเพิ่มประมาณ 2 เท่าขณะที่การหารช้ากว่าประมาณ 30 เท่า (!)
SoloNasus

ภาพรวมคร่าวๆของผู้เติมคำนำหน้าต้นไม้คู่ขนานที่ทันสมัย: อนุกรมวิธานของเครือข่ายคำนำหน้าแบบขนานโดย David Harris: pages.hmc.edu/harris/research/taxonomy.pdf
Franki

รายละเอียดเพิ่มเติม: ปริญญาเอกมิถุนายนเฉินเอกวิทยานิพนธ์ "โครงสร้างขนานคำนำหน้าสำหรับไบนารีและโมดูโล {2n-1 2n, 2n + 1} งู" digital.library.okstate.edu/etd/Chen_okstate_0664D_10070.pdf
Franki

คำตอบ:


104

นอกจากนี้ยังรวดเร็วเนื่องจากนักออกแบบ CPU ได้ใส่วงจรที่จำเป็นเพื่อให้รวดเร็ว ใช้ประตูมากกว่าการดำเนินการระดับบิตอย่างมีนัยสำคัญ แต่บ่อยครั้งมากพอที่ผู้ออกแบบ CPU จะตัดสินว่ามันคุ้มค่า ดูhttps://en.wikipedia.org/wiki/Adder_(electronics)

ทั้งสองอย่างนี้สามารถทำได้เร็วพอที่จะใช้งานในรอบการทำงานของซีพียูเดียว พวกมันไม่เร็วเท่ากัน - การเพิ่มต้องใช้ประตูมากขึ้นและเวลาแฝงมากกว่าการใช้บิตบิต - แต่มันเร็วพอที่ตัวประมวลผลสามารถทำได้ในหนึ่งรอบนาฬิกา มีค่าใช้จ่ายแอบแฝงต่อคำสั่งสำหรับการถอดรหัสคำสั่งและตรรกะการควบคุมและเวลาแฝงสำหรับการที่มีขนาดใหญ่กว่าเวลาแฝงอย่างมีนัยสำคัญในการดำเนินการระดับบิตดังนั้นความแตกต่างระหว่างทั้งสองจึงล้นด้วยค่าใช้จ่ายนั้น คำตอบของ AProgrammerและคำตอบของPaul92อธิบายผลกระทบเหล่านั้นได้ดี


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
DW

38

มีหลายด้าน

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

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

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


6
+1 ใช่โปรเซสเซอร์ส่วนใหญ่มีการโอเวอร์คล็อก แต่มีซีพียูที่ไม่ทำงานกี่ตัวที่มีวางจำหน่ายทั่วไป
David Cary

2
ความเป็นไปได้อีกอย่างหนึ่งคือหน่วยประมวลผลอาจเก็บข้อมูลการลงทะเบียน 64- บิตเป็นหนึ่งชิ้น 16- บิตและ 17- บิตสามชิ้นที่บิตเพิ่มเติมของแต่ละชิ้นที่ถือดำเนินการรอการตัดจากด้านล่าง การเพิ่มที่ตามมาด้วยการดำเนินการระดับบิตหรือร้านค้าอาจต้องใช้ 1-2 รอบพิเศษในการเผยแพร่การพกพา แต่การเพิ่มซึ่งตามมาด้วยการเพิ่มอื่นจะไม่ นอกจากนี้ในกรณี "store" เวลาการแพร่กระจายเพิ่มเติมอาจทำให้ประสิทธิภาพการทำงานของร้านค้าล่าช้า แต่ไม่จำเป็นต้องใช้รหัสในการ "รอ"
supercat

3
@supercat Pentium 4 ทำอะไรเช่นนี้ด้วยความเร็วสองเท่า (เทียบกับส่วนที่เหลือของโปรเซสเซอร์) ALU ที่จะมีบิตต่ำ 16 หรือ 32 บิตพร้อมสำหรับการดำเนินการต่อมาครึ่งรอบก่อนบิตครึ่งบน
Jeffrey Bosboom

2
คุณแน่ใจหรือว่าคุณวัดสิ่งที่คุณต้องการ ในกรณีนี้ข้อสรุปของ OP จากการวัดที่เกิดขึ้นนั้นถูกต้องสำหรับซีพียูส่วนใหญ่ การเพิ่มนั้นเป็นเรื่องธรรมดามากที่ซีพียูระดับซูเปอร์คาลมีการเพิ่มหน่วยในพอร์ตการดำเนินการทั้งหมดและบูลีนก็มีราคาถูกมากที่จะใช้งาน (ในจำนวนทรานซิสเตอร์) ที่พวกมันยังปรากฏอยู่ในพอร์ตทั้งหมด ดังนั้นการเพิ่มและบูลีนมักจะมีอัตราความเร็วเท่ากัน (เช่น 4 ต่อนาฬิกาใน Intel Haswell)
Peter Cordes

2
การเพิ่มจำนวนเต็ม SIMD มักจะให้ปริมาณงานที่ต่ำกว่าบูลีน SIMD แม้ว่าจะมีเวลาแฝงเท่ากันก็ตาม ซีพียูของ Intel จาก PentiumII ถึง Broadwell สามารถเรียกใช้การเพิ่ม vector-int เท่านั้น (เช่นpaddw) ที่ 2 ต่อนาฬิกา แต่ booleans (เช่นpand) ที่ 3 ต่อนาฬิกา (Skylake วางส่วนเสริมเวกเตอร์บนพอร์ตการดำเนินการเวกเตอร์ทั้งสามพอร์ต)
Peter Cordes

24

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

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

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

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

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


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

12

โปรเซสเซอร์มีโอเวอร์คล็อกดังนั้นแม้ว่าคำสั่งบางอย่างสามารถทำได้เร็วกว่าคำสั่งอื่น ๆ อย่างชัดเจน แต่ก็อาจใช้จำนวนรอบเท่ากัน

คุณอาจพบว่าวงจรที่ต้องใช้ในการขนส่งข้อมูลระหว่างหน่วยรีจิสเตอร์และหน่วยปฏิบัติการมีความซับซ้อนมากกว่าตัวแอดเดอร์

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


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Gilles

1
บทสรุปของการสนทนา: ซีพียูที่ล้าสมัยบางตัวจัดการ MOV เป็นพิเศษด้วยการเปลี่ยนชื่อรีจิสเตอร์โดยไม่มีเวลาแฝงอย่างมีประสิทธิภาพ ดูMOV ของ x86 สามารถ“ ฟรี” ได้หรือไม่? เหตุใดฉันจึงทำซ้ำไม่ได้เลย สำหรับรายละเอียดทั้งหมดเกี่ยวกับค่า MOV ที่แท้จริง
Peter Cordes

12

การเติมมีความสำคัญมากพอที่จะไม่รอให้บิตการกระเพื่อมผ่านการสะสม 64 บิต: คำว่านั่นคือแอดเดอร์ lookaheadและพวกมันเป็นส่วนหนึ่งของซีพียู 8 บิต (และ ALUs) ขึ้นไป แท้จริงแล้วโปรเซสเซอร์สมัยใหม่มักไม่ต้องการเวลาในการประมวลผลอีกมากสำหรับการคูณเต็มรูปแบบเช่นกัน: carry-lookahead เป็นเครื่องมือที่เก่ามาก ๆ


การคูณจำนวนเต็มคือเวลาแฝงที่สูงขึ้นและปริมาณงานที่ลดลงกว่า ADD ใน x86 แต่มันเป็นเรื่องที่รวดเร็วอย่างน่าอัศจรรย์เมื่อพิจารณาว่ามีตัวเพิ่มจำนวนเท่าใดที่ต้องใช้ในการสร้างตัวทวีคูณอย่างรวดเร็ว: เช่นใน Intel ตั้งแต่ Nehalem และ AMD ตั้งแต่ Ryzen, 8/16/32/64 บิตจำนวนเต็มสเกลาร์คูณเป็น 3 รอบแฝง (หนึ่งหน่วยดำเนินการไปป์ไลน์เต็มที่) สิ่งนี้ดูดได้เมื่อเทียบกับการเพิ่ม ADD ของ 3 หรือ 4 ต่อนาฬิกา แต่เป็นที่น่าอัศจรรย์เมื่อเทียบกับ IMUL latency 9 รอบใน Intel Pentium P5 สิ่งที่คล้ายกันสำหรับ SIMD: vector-int ทวีคูณคือเวลาแฝงที่สูงขึ้นและปริมาณงานต่ำกว่าการเพิ่ม แต่ก็ยังเร็ว
Peter Cordes

ใช่แล้วคูณเคยเป็นแพงกว่าคำแนะนำอื่น ๆ กว่าตอนนี้ หลีกเลี่ยงได้ที่ค่าใช้จ่ายของกว่า 2 คำแนะนำมักจะไม่คุ้มค่าและบางครั้งไม่ได้ 2 คำแนะนำแทนเป็นมูลค่ามัน (เช่นกับการเปลี่ยนแปลง + เพิ่มleaคำแนะนำ)
Peter Cordes

9

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

(วงจรการเรียนการสอนไม่ใช่วงจรนาฬิกา - เช่น 6502 ใช้เวลาอย่างน้อยสองรอบนาฬิกาต่อการเรียนการสอนเนื่องจากไม่ได้ถูกวางท่อและไม่มีแคชคำสั่ง)

แนวคิดที่แท้จริงที่คุณอาจขาดหายไปคือเส้นทางที่สำคัญ : ภายในชิปการดำเนินการที่ยาวนานที่สุดที่อาจดำเนินการภายในหนึ่งรอบสั่งการในระดับฮาร์ดแวร์ระดับความเร็วของชิปอาจถูกตอกบัตร

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


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

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

6502 ถูก pipelined - อ่านไบต์แรกของคำสั่งถัดไปในระหว่างรอบสุดท้ายของอันก่อนหน้า มิฉะนั้นการดึงข้อมูล / ถอดรหัส / ดำเนินการจะต้องมีอย่างน้อยสามรอบ
gnasher729

8

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

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

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

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


7

ตัวประมวลผลที่ทันสมัยถูกโอเวอร์คล็อก: ทุกการดำเนินการใช้จำนวนรอบสัญญาณนาฬิกาบางส่วน นักออกแบบของโปรเซสเซอร์กำหนดความยาวของรอบสัญญาณนาฬิกา มีข้อควรพิจารณาสองประการ ได้แก่ หนึ่งความเร็วของฮาร์ดแวร์ตัวอย่างเช่นวัดจากความล่าช้าของเกต NAND เดียว ขึ้นอยู่กับเทคโนโลยีที่ใช้และการแลกเปลี่ยนเช่นความเร็วกับการใช้พลังงาน มันเป็นอิสระจากการออกแบบโปรเซสเซอร์ สองนักออกแบบตัดสินใจว่าความยาวของวงจรนาฬิกาเท่ากับ n ความล่าช้าของประตู NAND เดียวโดยที่ n อาจเป็น 10 หรือ 30 หรือค่าอื่น ๆ

ตัวเลือกนี้ n จำกัด การทำงานที่ซับซ้อนซึ่งสามารถประมวลผลได้ในรอบเดียว จะมีการดำเนินการที่สามารถทำได้ใน 16 แต่ไม่ใช่ในความล่าช้า 15 NAND ดังนั้นการเลือก n = 16 หมายถึงการดำเนินการดังกล่าวสามารถทำได้ในรอบการเลือก n = 15 หมายความว่าไม่สามารถทำได้

นักออกแบบจะเลือก n เพื่อให้การดำเนินการที่สำคัญหลายอย่างสามารถทำได้ในครั้งเดียวหรืออาจจะสองหรือสามรอบ n จะถูกเลือกในระดับท้องถิ่น: หากคุณแทนที่ n ด้วย n-1 การดำเนินการส่วนใหญ่จะเร็วขึ้นเล็กน้อย แต่บางอย่าง (บางอย่างที่จำเป็นต้องใช้การหน่วงเวลา NAND แบบเต็มจริง ๆ ) จะช้าลง หากการดำเนินการบางอย่างจะช้าลงดังนั้นการดำเนินการโดยรวมของโปรแกรมจะเร็วขึ้นโดยเฉลี่ยคุณจะต้องเลือก n-1 คุณสามารถเลือก n + 1 ได้ ซึ่งทำให้การดำเนินการส่วนใหญ่ช้าลงเล็กน้อย แต่ถ้าคุณมีการดำเนินการหลายอย่างที่ไม่สามารถทำได้ภายใน n ความล่าช้า แต่สามารถทำได้ภายใน n + 1 ล่าช้าดังนั้นมันจะทำให้โปรเซสเซอร์โดยรวมเร็วขึ้น

ตอนนี้คำถามของคุณ: เพิ่มและลบเป็นการดำเนินการทั่วไปที่คุณต้องการให้สามารถดำเนินการได้ในรอบเดียว ดังนั้นมันไม่สำคัญว่า AND, OR ฯลฯ จะทำงานได้เร็วขึ้น: พวกเขายังต้องการวงจรนั้น แน่นอนหน่วย "การคำนวณ" AND หรือหรืออื่น ๆ มีเวลามากในการเลื่อนนิ้วโป้ง แต่ไม่สามารถช่วยได้

โปรดทราบว่าไม่ใช่เพียงแค่การดำเนินการที่สามารถทำได้ภายใน n NAND- ล่าช้าหรือไม่: ตัวอย่างเพิ่มเติมสามารถทำได้เร็วขึ้นด้วยการเป็นคนฉลาดขึ้นเล็กน้อยยังเร็วขึ้นโดยฉลาดมากขึ้นและเร็วขึ้นเล็กน้อยด้วยการลงทุนฮาร์ดแวร์จำนวนมากพิเศษ และในที่สุดโปรเซสเซอร์อาจมีวงจรที่มีราคาแพงมากและช้าลงเล็กน้อยและมีวงจรที่ถูกกว่าดังนั้นจึงมีความเป็นไปได้ที่จะดำเนินการอย่างใดอย่างหนึ่งโดยเร็วพอโดยใช้เงินไปกับมัน

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


6

ให้ฉันแก้ไขบางสิ่งที่ไม่ได้กล่าวถึงอย่างชัดเจนในคำตอบที่คุณมีอยู่:

ฉันรู้ว่าการทำงานระดับบิตเร็วมากในโปรเซสเซอร์รุ่นใหม่เพราะสามารถทำงานกับ 32 หรือ 64 บิตแบบขนานได้

นี่เป็นเรื่องจริง การติดฉลาก CPU เป็นบิต "XX" โดยปกติ (ไม่เสมอไป) หมายความว่าโครงสร้างทั่วไปส่วนใหญ่ (ความกว้างรีจิสเตอร์ RAM ที่กำหนดแอดเดรสได้เป็นต้น) เป็นขนาด XX บิต (มักจะ "+/- 1" หรือบางส่วน) แต่สำหรับคำถามของคุณคุณสามารถสันนิษฐานได้ว่า CPU ที่มีขนาด 32 บิตหรือ 64 บิตจะทำการบิตพื้นฐานใน 32 หรือ 64 บิตในเวลาที่แน่นอน

ดังนั้นการทำงานในระดับบิตจะใช้เวลาหนึ่งรอบนาฬิกาเท่านั้น

ข้อสรุปนี้ไม่จำเป็นต้องเป็นกรณี โดยเฉพาะอย่างยิ่งซีพียูที่มีชุดคำสั่งมากมาย (google CISC กับ RISC) สามารถใช้มากกว่าหนึ่งรอบสำหรับคำสั่งง่ายๆ ด้วย interleaving แม้คำสั่ง simples อาจแบ่งออกเป็น fetch-exec-store ด้วย 3 นาฬิกา (เป็นตัวอย่าง)

อย่างไรก็ตามการติดตั้งเป็นการดำเนินการที่ซับซ้อน

ไม่การเพิ่มจำนวนเต็มเป็นการดำเนินการอย่างง่าย การลบเช่นกัน มันง่ายมากที่จะติดตั้ง Adders ในฮาร์ดแวร์เต็มรูปแบบและพวกมันก็ทำสิ่งต่าง ๆ เช่นเดียวกับการทำงานของบิตพื้นฐาน

ที่ประกอบด้วยอย่างน้อยหนึ่งรายการและอาจสูงถึงหนึ่งโหลการทำงานระดับบิตดังนั้นฉันคิดว่ามันช้ากว่า 3-4 เท่า

มันจะใช้เวลามากขึ้น 3-4 เท่าของทรานซิสเตอร์ แต่เมื่อเปรียบเทียบกับภาพรวมที่ละเลยได้

ฉันรู้สึกประหลาดใจที่ได้เห็นมาตรฐานที่เรียบง่ายว่าการเพิ่มนั้นเร็วพอ ๆ กับการดำเนินการระดับบิต (XOR, OR และอื่น ๆ ) ทุกคนสามารถหลั่งน้ำตาแสงนี้

ใช่: นอกจากจำนวนเต็มคือการดำเนินการระดับบิต (กับบิตอีกไม่กี่กว่าคนอื่น ๆ แต่ยังคง) ไม่จำเป็นต้องทำอะไรเป็นระยะ ๆ ไม่จำเป็นต้องใช้อัลกอริธึมที่ซับซ้อนนาฬิกาหรือสิ่งอื่นใด

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


เป็นที่น่าสนใจที่จะทราบว่าการลดเวลาในการเพิ่มจาก O (N) เป็น O (sqrt (N)) ไม่ได้เพิ่มจำนวนที่ต้องการของทรานซิสเตอร์หรือความซับซ้อนในการกำหนดเส้นทางอย่างมีนัยสำคัญ (ในแต่ละขั้นตอนจำเป็นต้องให้ลวดหนึ่ง และจะต้องมีขั้นตอนการรวมกันเป็นพิเศษ sqrt (N) ค่าเวลาสามารถลดลงเป็น O (lgN) ได้ด้วยค่าใช้จ่ายของทรานซิสเตอร์ O (lgN) แต่ในหลาย ๆ กรณีอาจมีประโยชน์ในการประมวลผลบางอย่างเช่น 64- บิตนอกจากนี้ยังเป็นเช่นแปด 8 บิตเพิ่ม (ใช้ sqrtN ส่งต่อ) ร่วมกับสามชั้นของการรวมตรรกะมากกว่าที่จะเป็น 64 1 บิตเพิ่มหกชั้นของการรวม.
SuperCat

ใช่ส่วนเสริมนั้นค่อนข้างง่าย มีอะไรที่น่าประทับใจจริงๆคือซีพียู x86 ทันสมัยพร้อมไปป์ไลน์อย่างเต็มที่ 3 วงจรแฝง 64 บิตจำนวนเต็มคูณ (เช่นimul rax, rcxมี 3c latency และหนึ่งต่อ 1c throughput สำหรับตระกูล Intel Sandybridge และ AMD Ryzen) แม้แต่การเพิ่มทวีคูณ 64- บิต (สร้างผลลัพธ์ 128 บิตเป็น rdx: rax) มีเวลาแฝงและปริมาณงานเท่ากัน แต่ถูกนำมาใช้เป็น 2 uops (ซึ่งทำงานแบบขนานบนพอร์ตต่าง ๆ ) (ดูagner.org/optimizeสำหรับตารางคำแนะนำและคำแนะนำไมโครออริจินอลที่ยอดเยี่ยม)
Peter Cordes

[add-with-carry] อยู่ในอีกระดับของความซับซ้อน (ระดับภาษาการเขียนโปรแกรมไม่ใช่ระดับแอสเซมบลี / รหัสเครื่องขึ้นอยู่กับภาษาคอมไพเลอร์ AC ที่กำหนดเป้าหมาย CPU 16 บิตจะต้องปล่อยเพิ่ม / adc สำหรับคุณเมื่อคอมไพล์ การเพิ่มuint32_tค่าสองค่านี้ยังคงมีความเกี่ยวข้องกันในวันนี้สำหรับ int64_t บนเป้าหมาย 32 บิต AVR เป็นไมโครคอนโทรลเลอร์ RISC 8 บิตดังนั้นจำนวนเต็ม 32 บิตต้องการ 4 คำแนะนำ: godbolt.org/g/wre0fM
Peter Cordes

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