คำตอบของ @ jalf ครอบคลุมสาเหตุส่วนใหญ่ แต่มีรายละเอียดที่น่าสนใจอย่างหนึ่งที่ไม่ได้กล่าวถึง: แกนที่คล้าย RISC ภายในไม่ได้ออกแบบมาเพื่อเรียกใช้ชุดคำสั่งเช่น ARM / PPC / MIPS ภาษี x86 ไม่ได้จ่ายเฉพาะในตัวถอดรหัสที่ใช้พลังงานเท่านั้น แต่ในระดับหนึ่งตลอดทั้งแกน กล่าวคือไม่ใช่แค่การเข้ารหัสคำสั่ง x86 เท่านั้น ทุกคำสั่งที่มีความหมายแปลก ๆ
ลองแกล้งทำเป็นว่า Intel สร้างโหมดการทำงานโดยที่สตรีมคำสั่งเป็นอย่างอื่นที่ไม่ใช่ x86 พร้อมคำแนะนำที่แมปโดยตรงกับ uops ลองแกล้งทำเป็นว่า CPU แต่ละรุ่นมี ISA ของตัวเองสำหรับโหมดนี้ดังนั้นจึงยังคงมีอิสระที่จะเปลี่ยนภายในเมื่อต้องการและแสดงให้เห็นด้วยทรานซิสเตอร์จำนวนน้อยที่สุดสำหรับการถอดรหัสคำสั่งของรูปแบบทางเลือกนี้
สันนิษฐานว่าคุณยังคงมีรีจิสเตอร์จำนวนเท่าเดิมซึ่งแมปกับสถานะสถาปัตยกรรม x86 ดังนั้นระบบปฏิบัติการ x86 จึงสามารถบันทึก / กู้คืนได้บนสวิตช์บริบทโดยไม่ต้องใช้ชุดคำสั่งเฉพาะของ CPU แต่ถ้าเราโยนให้เห็นว่าข้อ จำกัด ในทางปฏิบัติใช่เราอาจมีการลงทะเบียนอีกไม่กี่เพราะเราสามารถใช้ซ่อนลงทะเบียนชั่วคราวลิขสิทธิ์ตามปกติสำหรับเฟิร์มแว1
หากเรามีตัวถอดรหัสทางเลือกโดยไม่มีการเปลี่ยนแปลงขั้นตอนไปป์ไลน์ในภายหลัง (หน่วยการดำเนินการ) ISA นี้จะยังคงมีความผิดปกติของ x86 จำนวนมาก มันคงไม่ใช่สถาปัตยกรรม RISC ที่ดีมาก ไม่มีคำสั่งเดียวจะซับซ้อนมาก แต่ความบ้าคลั่งอื่น ๆ ของ x86 ก็ยังคงอยู่ที่นั่น
ตัวอย่างเช่น: การเลื่อนไปทางซ้าย / ขวาปล่อยให้แฟล็ก Overflow ไม่ได้กำหนดไว้เว้นแต่จำนวนกะจะเป็นหนึ่งในกรณีของ = การตรวจจับการลงชื่อล้นตามปกติ ความบ้าคลั่งที่คล้ายกันสำหรับการหมุน อย่างไรก็ตามคำแนะนำ RISC ที่เปิดเผยสามารถให้การเปลี่ยนแปลงแบบไม่ใช้แฟล็กและอื่น ๆ (อนุญาตให้ใช้ uops เพียงหนึ่งหรือสองตัวที่มักจะเข้าสู่คำสั่ง x86 ที่ซับซ้อน) ดังนั้นนี่จึงไม่ถือเป็นข้อโต้แย้งหลัก
หากคุณกำลังจะสร้างตัวถอดรหัสใหม่ทั้งหมดสำหรับ RISC ISA คุณสามารถให้มันเลือกและเลือกส่วนของคำสั่ง x86 เพื่อแสดงเป็นคำแนะนำ RISC สิ่งนี้ช่วยลดความเชี่ยวชาญ x86 ของคอร์ได้บ้าง
การเข้ารหัสคำสั่งอาจไม่เป็นขนาดคงที่เนื่องจาก uops เดียวสามารถเก็บข้อมูลได้มาก ข้อมูลมากกว่าที่สมเหตุสมผลหากอินส์ทั้งหมดมีขนาดเท่ากัน uop แบบไมโครฟิวชั่นเดียวสามารถเพิ่ม 32 บิตได้ทันทีและตัวถูกดำเนินการหน่วยความจำที่ใช้โหมดการกำหนดแอดเดรสที่มีการลงทะเบียน 2 ตัวและการกระจัด 32 บิต (ใน SnB และใหม่กว่ามีเพียงโหมดการลงทะเบียนครั้งเดียวเท่านั้นที่สามารถไมโครฟิวส์กับตัวเลือก ALU)
uops มีขนาดใหญ่มากและไม่คล้ายกับคำสั่ง ARM ที่มีความกว้างคงที่มากนัก ชุดคำสั่ง 32 บิตที่มีความกว้างคงที่สามารถโหลดได้ครั้งละ 16 บิตในทันทีดังนั้นการโหลดแอดเดรส 32 บิตจึงต้องใช้คู่โหลดทันทีครึ่งต่ำ / โหลดสูงทันที x86 ไม่จำเป็นต้องทำเช่นนั้นซึ่งช่วยให้ไม่น่ากลัวด้วยการลงทะเบียน GP เพียง 15 เครื่องที่จำกัดความสามารถในการรักษาค่าคงที่ในการลงทะเบียน (15 เป็นความช่วยเหลือที่ยิ่งใหญ่ในการลงทะเบียน 7 รายการ แต่การเพิ่มขึ้นเป็นสองเท่าอีกครั้งเป็น 31 ช่วยให้น้อยลงฉันคิดว่าการจำลองบางอย่างที่พบ RSP มักไม่ใช่จุดประสงค์ทั่วไปดังนั้นจึงเหมือนกับการลงทะเบียน 15 GP และสแต็กมากกว่า)
TL; DR สรุป:
อย่างไรก็ตามคำตอบนี้ลงไปที่ "ชุดคำสั่ง x86 น่าจะเป็นวิธีที่ดีที่สุดในการตั้งโปรแกรม CPU ที่ต้องสามารถเรียกใช้คำสั่ง x86 ได้อย่างรวดเร็ว" แต่หวังว่าจะช่วยให้เข้าใจเหตุผลได้บ้าง
รูปแบบ uop ภายในใน front-end เทียบกับ back-end
ดูเพิ่มเติมไมโครฟิวชั่นและโหมดการกำหนดแอดเดรสสำหรับกรณีหนึ่งที่มีความแตกต่างกันในสิ่งที่รูปแบบ front-end กับ back-end uop สามารถแสดงบน CPU ของ Intel
เชิงอรรถ 1 : มีการลงทะเบียน "ซ่อน" บางรายการเพื่อใช้เป็นจังหวะโดยไมโครโค้ด รีจิสเตอร์เหล่านี้ถูกเปลี่ยนชื่อเช่นเดียวกับรีจิสเตอร์สถาปัตยกรรม x86 ดังนั้นคำสั่ง multi-uop จึงสามารถดำเนินการนอกลำดับได้
เช่นxchg eax, ecx
ใน CPU ของ Intel ถอดรหัส 3 UOPs ( ทำไม? ) และเดาที่ดีที่สุดของเราคือว่าเหล่านี้เป็น MOV เหมือน UOPs tmp = eax; ecx=eax ; eax=tmp;
ที่ทำ ตามลำดับนั้นเนื่องจากฉันวัดเวลาแฝงของทิศทาง dst-> src ที่ ~ 1 รอบเทียบกับ 2 สำหรับวิธีอื่น และการย้ายเหล่านี้ไม่เหมือนกับmov
คำแนะนำทั่วไป ดูเหมือนว่าพวกเขาจะไม่ได้เป็นผู้สมัครสำหรับการกำจัดการเคลื่อนที่แบบศูนย์เวลาแฝง
ดูเพิ่มเติมhttp://blog.stuffedcow.net/2013/05/measuring-rob-capacity/สำหรับการกล่าวถึงการพยายามที่จะทดลองวัดขนาด PRF และมีการบัญชีสำหรับการลงทะเบียนทางกายภาพใช้ในการเก็บรัฐสถาปัตยกรรมรวมทั้งการลงทะเบียนที่ซ่อนอยู่
ในส่วนหน้าหลังตัวถอดรหัส แต่ก่อนที่จะเกิดปัญหา / เปลี่ยนชื่อขั้นตอนที่เปลี่ยนชื่อรีจิสเตอร์ลงในไฟล์รีจิสเตอร์ฟิสิคัลรูปแบบ uop ภายในจะใช้หมายเลขรีจิสเตอร์ที่คล้ายกับ x86 reg แต่มีพื้นที่สำหรับจัดการรีจิสเตอร์ที่ซ่อนอยู่เหล่านี้
รูปแบบ uop มีความแตกต่างกันบ้างภายในแกนที่ไม่ได้รับคำสั่ง (ROB และ RS) หรือที่เรียกว่า back-end (หลังจากขั้นตอนปัญหา / เปลี่ยนชื่อ) ไฟล์ลงทะเบียนฟิสิคัล int / FP แต่ละไฟล์มี 168 รายการใน Haswellดังนั้นแต่ละฟิลด์ register ใน uop จะต้องกว้างพอที่จะจัดการกับจำนวนมากได้
เนื่องจากการเปลี่ยนชื่อมีอยู่ใน HW เราจึงน่าจะดีกว่าที่จะใช้แทนการป้อนคำแนะนำที่กำหนดเวลาไว้แบบคงที่โดยตรงไปยังส่วนหลัง ดังนั้นเราจะต้องทำงานกับชุดรีจิสเตอร์ที่มีขนาดใหญ่เท่ากับการลงทะเบียนสถาปัตยกรรม x86 + ไมโครโค้ดจังหวะไม่เกินนั้น
ส่วนหลังได้รับการออกแบบมาเพื่อทำงานร่วมกับการเปลี่ยนชื่อส่วนหน้าเพื่อหลีกเลี่ยงอันตรายจาก WAW / WAR ดังนั้นเราจึงไม่สามารถใช้งานได้เหมือนกับ CPU ตามลำดับแม้ว่าเราจะต้องการก็ตาม ไม่มีลูกโซ่เพื่อตรวจจับการอ้างอิงเหล่านั้น ที่จัดการโดยปัญหา / เปลี่ยนชื่อ
อาจจะเรียบร้อยถ้าเราสามารถป้อน uops เข้าไปในส่วนหลังโดยไม่มีปัญหาคอขวด / เปลี่ยนชื่อขั้นตอน (จุดที่แคบที่สุดในท่อส่งของ Intel สมัยใหม่เช่น 4-wide บน Skylake เทียบกับ 4 ALU + 2 load + 1 เก็บพอร์ตใน ส่วนหลัง) แต่ถ้าคุณทำเช่นนั้นฉันไม่คิดว่าคุณสามารถตั้งเวลาโค้ดแบบคงที่เพื่อหลีกเลี่ยงการลงทะเบียนซ้ำและดำเนินการตามผลลัพธ์ที่ยังคงต้องการหากการพลาดแคชหยุดการโหลดเป็นเวลานาน
ดังนั้นเราจึงจำเป็นต้องป้อน uops ให้กับปัญหา / เปลี่ยนชื่อสเตจอาจจะข้ามการถอดรหัสเท่านั้นไม่ใช่ uop cache หรือ IDQ จากนั้นเราจะได้รับ OoO exec ตามปกติด้วยการตรวจจับอันตราย ตารางการจัดสรรการลงทะเบียนได้รับการออกแบบมาเพื่อเปลี่ยนชื่อ 16 + จำนวนเต็มสองสามรายการลงทะเบียนเป็น PRF จำนวนเต็ม 168 รายการ เราไม่สามารถคาดหวังให้ HW เปลี่ยนชื่อชุดของการลงทะเบียนแบบลอจิคัลที่มีขนาดใหญ่ขึ้นเป็นจำนวนเดียวกัน ซึ่งจะใช้ RAT ที่ใหญ่กว่า