เหตุใดสถาปัตยกรรม CPU ใช้การตั้งค่าสถานะ (ข้อดี)


15

CPU บางตัวมีค่าสถานะการลงทะเบียน (ARM, x86, ... ), ตัวอื่น ๆ ไม่ (MIPS, ... ) อะไรคือข้อดีของการมีคำสั่ง CMP เพื่ออัปเดตค่าสถานะการลงทะเบียนตามด้วยคำสั่งสาขาแทนที่จะใช้การลงทะเบียนเป็นศูนย์และสาขาที่มีเงื่อนไขเพื่อตรวจสอบเครื่องหมายล้น ฯลฯ

คำตอบ:


11

ในสถาปัตยกรรมแบบจุลภาคสมัยใหม่ที่มีการลงทะเบียนการเปลี่ยนชื่อค่าใช้จ่ายในการดำเนินการสำหรับแฟล็กหรือไม่แฟล็กนั้นคล้ายคลึงกัน ความแตกต่างหลักที่ฉันคิดได้ก็คือบางแฟล็กบ่งบอกถึงลักษณะของค่า (ค่าเป็นลบหรือไม่ค่าเป็นศูนย์หรือไม่ค่ามีความเท่าเทียมหรือคี่หรือไม่) ในขณะที่บางคนแสดงถึงเหตุการณ์ที่เกิดขึ้นระหว่างการดำเนินการก่อนหน้านี้ (คำสั่งการเพิ่มมีการดำเนินการหรือโอเวอร์โฟลว์หรือไม่) สิ่งนี้นำไปสู่สถานการณ์ที่ไม่เหมาะกับ MIPS เมื่อคุณต้องการจำลองการเพิ่ม 64- บิตบนสถาปัตยกรรม 32- บิต (หรือการเพิ่ม 128- บิตบน สถาปัตยกรรม 64 บิต) สำหรับสถาปัตยกรรมส่วนใหญ่ที่มีธงพกพาจะมีความพิเศษadd-with-carryการเรียนการสอนที่มีธงดำเนินการจากการเพิ่มคำสั่งก่อนหน้า สิ่งนี้ทำให้การคำนวณทางคณิตศาสตร์ที่มีความแม่นยำสูงมีราคาไม่แพงในสถาปัตยกรรมจำนวนมากที่มีการลงทะเบียนสถานะ

ในทางกลับกันการทดสอบการลงทะเบียน N-bit สำหรับศูนย์หรือไม่เป็นศูนย์จะมีราคาแพงอย่างน่าประหลาดใจ ในการทดสอบการลงทะเบียน N-bit สำหรับศูนย์คุณต้องดำเนินการ N-bit NOR ซึ่งต้องใช้ตรรกะระดับในการคำนวณ ในสถาปัตยกรรมที่มีธงลงทะเบียนตรรกะพิเศษสำหรับการคำนวณศูนย์ / ไม่เป็นศูนย์ที่ส่วนท้ายของขั้นตอน ALU อาจทำให้นาฬิกาทำงานช้าลง (หรือบังคับให้ ALU มีการทำงานสองรอบ) ด้วยเหตุผลนี้ฉันคิดว่าบางคน สถาปัตยกรรมเช่น SPARC มีสองรุ่นของการดำเนินการทางคณิตศาสตร์แต่ละอันหนึ่งอันที่ตั้งค่าสถานะและอีกอันที่ไม่ได้ทำO(เข้าสู่ระบบยังไม่มีข้อความ)

แต่ MIPS ไม่ได้บันทึกอะไรเลยที่นี่ พวกเขาย้ายปัญหาไปที่อื่น ใน MIPS มีbranch-on-equalคำแนะนำ ซึ่งหมายความว่าคำสั่งสาขาต้องมีสเตจ ALU (รวมถึงการxorดำเนินการบิตบิตตามด้วย a norเพื่อลดลงไปที่บิตที่เท่ากัน / ไม่เท่ากัน) ก่อนที่จะกำหนดวิธีที่สาขาจะไป

สถาปัตยกรรม DEC Alpha พยายามแยกความแตกต่างโดยใช้เล่ห์เหลี่ยม DEC อัลฟ่าไม่มีธงลงทะเบียน แต่ยังไม่มีbranch-on-equalคำแนะนำ แต่คำสั่งสาขาจะดูสถานะของการลงทะเบียนวัตถุประสงค์ทั่วไปเพียงครั้งเดียว มีbranch-on-zero, branch-on-not-zero, branch-on-less-than-zeroฯลฯ เคล็ดลับคือการที่คุณสามารถให้ทุกอเนกประสงค์ลงทะเบียนบิต 65 พิเศษที่จะบอกคุณว่าอีก 64 บิตเป็นศูนย์ทั้งหมดหรือไม่ สิ่งนี้ทำให้คล้ายกับการลงทะเบียนค่าสถานะ: คำสั่งสาขาทั้งหมดดูบิตเดียว (ที่คำนวณแล้ว) เพื่อทำการตัดสินใจ แต่ตอนนี้คุณกลับมาหาวิธีคำนวณบิตตัวบ่งชี้ที่เป็นศูนย์พิเศษในระหว่าง ALU ปกติ วงจร (และคุณยังคงไม่สามารถทำการคำนวณทางคณิตศาสตร์ที่มีความแม่นยำได้หลายรูปแบบเพียงแค่ดูที่แฟลกพกพาจากการทำงานก่อนหน้านี้)


2
การดำเนินการตั้งค่าที่ไม่ใช่ CC คือ (จากสิ่งที่ฉันเข้าใจ) การปรับให้เหมาะสมของคอมไพเลอร์ทำให้คอมไพเลอร์สามารถกำหนดเวลาคำแนะนำการตั้งค่า CC ได้ แต่เนิ่นๆโดยไม่มีค่าที่ถูกบดบังโดยคำแนะนำหลัง PowerPC750 วางเงื่อนไขการลงทะเบียน (ลงทะเบียน 4-bit 8 บิต) 8 ใกล้กับส่วนหน้าเช่นที่สาขาที่นำไปสู่แคชคำสั่งเป้าหมายสาขาและมีสภาพพร้อมใช้งานเร็วพอที่จะแก้ไขสาขาที่นำมาโดยไม่มีการลงโทษ (CRISP ของ AT&T ยังใช้ประโยชน์จากความละเอียดของสาขาก่อน) จำนวนน้อยและความเชี่ยวชาญของ CCs ทำให้การปฏิบัตินี้เป็นจริงมากขึ้น
Paul A. Clayton

รายละเอียด: การคำนวณค่าสถานะทั้งหมดไม่เท่ากัน ลองนึกภาพ CPU ของคุณมีค่าสถานะ NZVC แบบดั้งเดิม หากคำแนะนำ ALU ทั้งหมดได้รับอนุญาตให้อัปเดตแฟล็กคุณต้องวางการสร้างแฟล็กหลังจากตัวบวก / ลบและ mux สองสามตัว ค่าลบเป็นเรื่องง่ายมันเป็นเพียง MSB ในขณะที่ค่าสถานะ Zero มีราคาแพงและขึ้นอยู่กับทุกบิต ตอนนี้ถ้าคุณ จำกัด แฟล็กเป็นคำสั่งเปรียบเทียบ (และทดสอบบิต) แฟล็ก Zero สามารถคำนวณได้ด้วย XOR แบบขนานบนตัวถูกดำเนินการต้นทางโดยไม่ต้องรอผลลัพธ์การลบ การคำนวณค่าสถานะ Z หลังจากการบวกนั้นแทบจะไร้ประโยชน์
TEMLIB

7

1 จากมุมมองของ ISA

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

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

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

2 จากมุมมองของผู้ดำเนินการ

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

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


2

บนเครื่อง 32 บิตคำสั่ง "add-with-carry" ที่ใช้เป็นส่วนหนึ่งของลำดับการเพิ่มความแม่นยำแบบมัลติต้องรับตัวถูกดำเนินการ 65 บิตและคำนวณผลรวม 33 บิต ข้อมูลจำเพาะการลงทะเบียนแหล่งที่มาจะระบุว่าตัวถูกดำเนินการ 64 บิตมาจากที่ใดและข้อกำหนดการลงทะเบียนปลายทางจะบอกว่าผลการค้นหา 32 บิตที่ต่ำกว่าควรไปที่ใด แต่จะทำอย่างไรกับตัวถูกดำเนินการ ของผลลัพธ์หรือไม่ การได้รับอนุญาตให้ระบุว่าเป็นส่วนหนึ่งของคำสั่งที่ตัวถูกดำเนินการพิเศษควรมาจากที่ใดและบิตผลลัพธ์พิเศษควรเป็นประโยชน์ในระดับปานกลาง แต่โดยทั่วไปแล้วจะไม่เป็นประโยชน์มากพอที่จะพิสูจน์ฟิลด์พิเศษใน opcode การมี "ตำแหน่ง" ที่คงที่เพื่อจัดการกับธงพกพาอาจจะอึดอัดเล็กน้อยจากมุมมองการตั้งเวลาการเรียนการสอน แต่มัน '

หากมีใครพยายามออกแบบชุดคำสั่งเพื่อให้สามารถคำนวณทางคณิตศาสตร์ได้หลายแบบ แต่แต่ละคำสั่งนั้นถูก จำกัด ไว้ที่ตัวถูกดำเนินการ 32 บิตสองตัวและปลายทางหนึ่งตัวถูกดำเนินการ 32 บิตตัวหนึ่งสามารถใช้ "เพิ่ม" 64 บิตในสี่คำสั่ง: r5 ถึง 1 ถ้า r0 + r2 จะมีค่าเป็นศูนย์หรืออย่างอื่นคำนวณ r4 = r1 + r3 คำนวณ r5 = r4 + r5 คำนวณ r4 = r0 + r2 "แต่ไปไกลเกินกว่านั้นจะต้องใช้สามคำแนะนำสำหรับแต่ละคำเพิ่มเติม การมีธงพกพาเป็นแหล่งเสริมและปลายทางช่วยลดค่าใช้จ่ายในการเรียนการสอนหนึ่งคำต่อคำ

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

ldr  r0,[r1]
add  r0,r0,r2
eors r4,r5,r6

หน่วยปฏิบัติการสามารถจดจำได้ง่ายพอสมควรว่าคำสั่งที่สามสามารถดำเนินการได้โดยไม่ต้องรอข้อมูลที่จะอ่าน[r1]แต่ถ้าคำสั่งที่สองadds r0,r0,r2นั้นเป็นไปได้ก็ต่อเมื่อหน่วยปฏิบัติงานสามารถมั่นใจได้ว่าในเวลาใดก็ตามที่พยายามใช้ แฟล็ก zero flag จะเก็บค่าที่กำหนดในคำสั่งที่สาม แต่แฟล็ก carry จะเก็บค่าในวินาที


1
"คำสั่งควบคุมบิตไม่ว่าคำสั่งจะอัพเดตการตั้งค่าสถานะ": ตัวอย่างเช่นใน PowerPC, SPARC
TEMLIB

MIPS ใช้ "r5 = r1 + r2; ตั้งค่า r6 หาก r6 น้อยกว่า r1; r7 = r3 + r4; r5 = R5 + R6;" นามสกุล SIMD บางตัวสามารถใช้การเปรียบเทียบที่ตั้งค่าบิตทั้งหมดเป็นศูนย์หรือหนึ่ง (เช่นศูนย์หรือ -1 เติมเต็มจำนวนเต็ม) เพื่อค้นหาการดำเนินการและการลบเพื่อนำไปใช้
Paul A. Clayton

@ PaulA.Clayton: ฉันคิดว่าคุณหมายถึง "ถ้า r5 น้อยกว่า r1" MIPS จะจัดการกับคณิตศาสตร์ได้นานขึ้นอย่างไร มันจะต้องมีสามคำสั่งมากกว่าสามคำหรือน้อยกว่าสามคำต่อคำ?
supercat

@supercat ใช่นั่นน่าจะเป็น "set r6 ถ้า r5 น้อยกว่า r1"!
Paul A. Clayton

@ PaulA.Clayton: เราจะเพิ่มหมายเลขเช่น 64- บิต (2048 บิต) สองหมายเลขบน MIPS แบบ 32 บิตได้อย่างไร มีวิธีใดที่มีประสิทธิภาพในการจัดการกับการบรรทุกเข้าและออกจากเวทีกลางหรือไม่?
supercat

0

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


1
คำตอบนี้ค่อนข้างเบาในรายละเอียด คำตอบยาว ๆ ไม่จำเป็นต้องมี แต่สิ่งที่มากกว่าเนื้อออกจะเป็นการปรับปรุงที่แตกต่างกัน
David Richerby

การตั้งค่าสถานะหรือเปรียบเทียบค่าสถานะเป็นคำสั่งเดียวโดยไม่มีข้อมูลอื่นใดในรูปแบบของอาร์กิวเมนต์ที่จะรวมอยู่ในรหัสแอสเซมบลี แฟล็กยังเป็นผลลัพธ์ของการดำเนินการ uprocessor หรือการทดสอบและสามารถใช้ในการแยกสาขาได้อย่างมีประสิทธิภาพ เป็นบิตจริงที่สลับหรือตั้งค่าเมื่อเปรียบเทียบสองค่าในการลงทะเบียน
SkipBerne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.