การลงทะเบียนแบบศูนย์ช่วยปรับปรุงประสิทธิภาพได้อย่างไร

ใน MIPS ISA จะมีการลงทะเบียนเป็นศูนย์ ($r0) ซึ่งจะให้ค่าเป็นศูนย์เสมอ สิ่งนี้ทำให้โปรเซสเซอร์สามารถ:

  1. คำสั่งใด ๆ ที่สร้างผลลัพธ์ที่จะทิ้งไปสามารถนำเป้าหมายไปที่รีจิสเตอร์นี้ได้
  2. เพื่อเป็นแหล่งของ0

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

$r0 ไม่ใช่วัตถุประสงค์ทั่วไป โดยเดินสายไปที่ 0 ไม่ว่าคุณจะทำอะไรกับรีจิสเตอร์นี้ มันก็จะมีค่าเป็น 0 เสมอ คุณอาจสงสัยว่าทำไม MIPS จึงจำเป็นต้องมีรีจิสเตอร์ดังกล่าว

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


person dayuloli    schedule 09.07.2014    source แหล่งที่มา
comment
บางทีการลงทะเบียนเป็นศูนย์อาจทำให้ CPU เร็วขึ้นในแง่ที่ว่าช่วยให้โปรแกรมจำนวนมากสามารถเขียนคำสั่งน้อยลงได้   -  person Konrad Lindenbach    schedule 09.07.2014


คำตอบ (4)


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

  1. หลีกเลี่ยงแผงลอยท่อปลอม หากไม่มีการลงทะเบียนศูนย์อย่างชัดเจน จำเป็นต้องทำการลงทะเบียน ลบศูนย์ และใช้ค่าของมัน ซึ่งหมายความว่าการดำเนินการที่ใช้เป็นศูนย์จะขึ้นอยู่กับการดำเนินการการทำให้เป็นศูนย์ และ (ขึ้นอยู่กับประสิทธิภาพของระบบการส่งต่อไปป์ไลน์) อาจขึ้นอยู่กับค่าก่อนหน้าของการลงทะเบียนที่เป็นศูนย์ สถาปัตยกรรมเช่น x86 ซึ่งมีไฟล์รีจิสเตอร์ค่อนข้างเล็กและโดยพื้นฐานแล้วทำรีจิสเตอร์เสมือนเพื่อป้องกันไม่ให้เกิดปัญหา มีเครื่องมือวิเคราะห์อันตรายที่ทรงพลังอย่างยิ่ง โดยทั่วไปแล้วสิ่งเดียวกันนี้ไม่เป็นความจริงกับโปรเซสเซอร์ RISC
  2. การดำเนินการบางอย่างอาจไปป์ไลน์ได้มากกว่าหากสามารถหลีกเลี่ยงการอ่านรีจิสเตอร์ได้ หากใช้รีจิสเตอร์ศูนย์อย่างชัดเจน ข้อเท็จจริงที่ว่าตัวถูกดำเนินการจะเป็นศูนย์จะทราบในขั้นตอนการถอดรหัสคำสั่ง แทนที่จะทราบในภายหลังในขั้นตอนการดึงข้อมูลรีจิสเตอร์ ดังนั้นจึงสามารถข้ามขั้นตอนการอ่านรีจิสเตอร์ได้
  3. ในทำนองเดียวกัน ความสามารถในการละทิ้งผลลัพธ์อย่างชัดเจนช่วยหลีกเลี่ยงความจำเป็นในขั้นตอนการเขียนรีจิสเตอร์
  4. การดำเนินการบางอย่างอาจสร้างไมโครโค้ดที่ง่ายกว่าเมื่อทราบว่าตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นศูนย์ หรือเมื่อทราบว่าผลลัพธ์ถูกละทิ้ง
  5. การลงทะเบียนแบบศูนย์ที่ชัดเจนจะช่วยลดแรงกดดันต่อเครื่องมือเพิ่มประสิทธิภาพของคอมไพเลอร์ เนื่องจากไม่จำเป็นต้องระมัดระวังในการกำหนดการลงทะเบียน (ไม่จำเป็นต้องระบุการลงทะเบียนซึ่งจะไม่ทำให้การอ่านหรือเขียนหยุดชะงัก)
person Sneftel    schedule 11.07.2014
comment
บน CPU ที่เรียบง่ายกว่า การถอดรหัสมีประโยชน์หาก ISA ต้องการ opcode น้อยลง การมีการลงทะเบียนเป็นศูนย์หมายความว่า mov-ทันทีในการลงทะเบียนสามารถเป็นนามแฝงสำหรับ ori dst, $zero, 1234 แทนที่จะต้องใช้ opcode ของตัวเอง บน ISA ที่มี FLAGS (ต่างจาก MIPS) cmp สามารถเป็น sub โดยมี $zero เป็นปลายทางได้ - person Peter Cordes; 14.05.2019

สำหรับแต่ละรายการของคุณ นี่คือคำตอบ

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

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

person Sanchises    schedule 11.07.2014
comment
การละทิ้งเอาต์พุตของคำสั่งจะมีประโยชน์บน x86 โดยที่คำสั่งมีผลข้างเคียง เช่น การตั้งรหัสเงื่อนไข คำสั่ง MIPS มีเอาต์พุตเดียวเท่านั้น เนื่องจากนี่คือสถาปัตยกรรม RISC และแทบไม่จำเป็นต้องละทิ้งเอาต์พุตของคำสั่ง - person markgz; 15.07.2014

แนวคิดของการลงทะเบียนเป็นศูนย์ไม่ใช่เรื่องใหม่ ฉันพบมันครั้งแรกบนเมนเฟรม CDC 6600 ซึ่งมีอายุย้อนกลับไปในช่วงกลางถึงปลายทศวรรษ 1960 ในบางแง่ นี่เป็นหนึ่งในโปรเซสเซอร์ RISC รุ่นแรกๆ และเป็นคอมพิวเตอร์ที่เร็วที่สุดในโลกในรอบ 5 ปี ในสถาปัตยกรรมนั้น รีจิสเตอร์ "B0" ได้รับการเดินสายให้เป็นศูนย์เสมอ http://en.wikipedia.org/wiki/CDC_6600

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

person Burt_Harris    schedule 16.07.2014

การลงทะเบียนแบบศูนย์ช่วยให้สามารถบันทึก opcodes บางส่วนได้เมื่อออกแบบสถาปัตยกรรมชุดคำสั่งใหม่ (ISA)

ตัวอย่างเช่น ข้อมูลจำเพาะ RISC-V หลัก มีคำสั่งหลอก 32 คำสั่งที่ขึ้นอยู่กับการลงทะเบียนศูนย์ (เปรียบเทียบตาราง 26.2 และ 26.3) คำสั่งหลอกคือคำสั่งที่ถูกแมปโดยแอสเซมเบลอร์กับคำสั่งจริงอื่น (เช่น สาขาถ้าเท่ากับศูนย์ ถูกแมปกับสาขาถ้าเท่ากับ) สำหรับการเปรียบเทียบ: ข้อมูลจำเพาะหลักของ RISV-V แสดงรายการ opcodes คำสั่งจริง 164 รายการ (เช่น การนับฐาน/ส่วนขยาย RV(32|64)[IMAFD] หรือที่เรียกว่า RV64G) นั่นหมายความว่าหากไม่มีการลงทะเบียน RISC-V RV64G จะใช้ opcode เพิ่มอีก 32 รหัสสำหรับคำสั่งเหล่านั้น (นั่นคือ มากกว่า 20 %) สำหรับการใช้งาน CPU RISC-V อย่างเป็นรูปธรรม อัตราคำสั่งจริงต่อหลอกนี้อาจเปลี่ยนไปในทิศทางใดทิศทางหนึ่ง ขึ้นอยู่กับส่วนขยายที่เลือก

การมี opcode น้อยจะทำให้ตัวถอดรหัสคำสั่งง่ายขึ้น

ตัวถอดรหัสที่ซับซ้อนมากขึ้นต้องใช้เวลามากขึ้นในการถอดรหัสคำสั่งหรือใช้เกตมากขึ้น (ซึ่งไม่สามารถใช้กับหน่วย CPU ที่มีประโยชน์มากกว่าได้) หรือทั้งสองอย่าง

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

นอกจาก RISC-V ISA ที่ทันสมัย ​​(พัฒนาตั้งแต่ปี 2010 และให้สัตยาบันครั้งแรกในปี 2019) แล้ว ARMv8 AArch64 (ISA 64 บิตที่เปิดตัวในปี 2011) ตรงกันข้ามกับ ARM 32 บิต ISA ก่อนหน้านี้ ยังมีคุณสมบัติการลงทะเบียนเป็นศูนย์อีกด้วย ด้วยเหตุนี้และการเปลี่ยนแปลงอื่นๆ AArch64 ISA จึงมีความเหมือนกันน้อยกว่า ISA ARM 32 บิตรุ่นก่อนๆ มากเท่ากับ x86 และ x86-64 ISA

ตรงกันข้ามกับ AArch64 x86-64 ไม่มีการลงทะเบียนเป็นศูนย์ แม้ว่า x86-64 จะทันสมัยกว่า ISA x86 32 บิตก่อนหน้า แต่ ISA ของมันเปลี่ยนไปทีละน้อยเท่านั้น ดังนั้นจึงมีออปโค้ด x86 ที่มีอยู่ทั้งหมดบวกกับตัวแปร 64 บิต ดังนั้นตัวถอดรหัสจึงมีความซับซ้อนมากอยู่แล้ว

person maxschlepzig    schedule 28.12.2019