อ่าน 11 นาที
การดำเนินการที่ไม่เป็นไปตามลำดับ
ใน วิศวกรรมคอมพิวเตอร์ การ ประมวลผลแบบไม่เรียงลำดับ (หรือเรียกอย่างเป็นทางการว่า การประมวลผลแบบไดนามิก ) เป็น รูปแบบ การจัดตารางคำสั่ง ที่ใช้ใน หน่วยประมวลผลกลาง (CPU)...
การดำเนินการที่ไม่เป็นไปตามลำดับ
ในวิศวกรรมคอมพิวเตอร์การประมวลผลแบบไม่เรียงลำดับ (หรือเรียกอย่างเป็นทางการว่าการประมวลผลแบบไดนามิก ) เป็น รูปแบบ การจัดตารางคำสั่ง ที่ใช้ใน หน่วยประมวลผลกลาง (CPU) ประสิทธิภาพสูงเพื่อใช้ประโยชน์จากรอบคำสั่งที่ปกติแล้วจะถูกทิ้งไปโดยเปล่าประโยชน์ ในรูปแบบนี้ โปรเซสเซอร์จะประมวลผลคำสั่งตามลำดับที่กำหนดโดยความพร้อมใช้งานของข้อมูลอินพุตและหน่วยประมวลผล[ 1 ]แทนที่จะเป็นลำดับเดิมในโปรแกรม[ 2 ] [ 3 ]ด้วยวิธีนี้ โปรเซสเซอร์สามารถหลีกเลี่ยงการอยู่เฉยๆ ในขณะที่รอให้คำสั่งก่อนหน้าเสร็จสมบูรณ์ และในระหว่างนั้นก็สามารถประมวลผลคำสั่งถัดไปที่สามารถทำงานได้ทันทีและเป็นอิสระ[ 4 ]
ประวัติศาสตร์
การประมวลผลแบบไม่เรียงลำดับ (Out-of-order execution) เป็นรูปแบบที่จำกัดของสถาปัตยกรรมดาต้าโฟลว์ซึ่งเป็นหัวข้อวิจัยสำคัญในสถาปัตยกรรมคอมพิวเตอร์ในช่วงทศวรรษ 1970 และต้นทศวรรษ 1980
เริ่มแรกใช้ในซูเปอร์คอมพิวเตอร์
อาจกล่าวได้ว่าเครื่องแรกที่ใช้การประมวลผลแบบไม่เรียงลำดับคือCDC 6600 (1964) ซึ่งใช้สกอร์บอร์ดเพื่อแก้ไขข้อขัดแย้ง อย่างไรก็ตาม 6600 ขาด การจัดการ ข้อขัดแย้ง WAWจึงเลือกที่จะหยุดการทำงานแทน สถานการณ์นี้ถูกเรียกว่า "ข้อขัดแย้งลำดับที่หนึ่ง" โดย Thornton [ 5 ] แม้ว่าจะมี การแก้ไข ข้อขัดแย้ง RAW (เรียกว่า "ข้อขัดแย้งลำดับที่สอง" [ 6 ] ) และ การแก้ไข ข้อขัดแย้ง WAR (เรียกว่า "ข้อขัดแย้งลำดับที่สาม" [ 7 ] ) ซึ่งเพียงพอที่จะประกาศว่าสามารถประมวลผลแบบไม่เรียงลำดับได้อย่างสมบูรณ์ แต่ 6600 ก็ไม่มีการจัดการข้อยกเว้นที่แม่นยำ รูปแบบการคาดการณ์สาขาในยุคแรกและจำกัดนั้นเป็นไปได้ตราบใดที่สาขานั้นไปยังตำแหน่งบนสิ่งที่เรียกว่า "สแต็กคำสั่ง" ซึ่งจำกัดอยู่ที่ความลึกเจ็ดคำจากตัวนับโปรแกรม[ 8 ]
ประมาณสองปีต่อมาIBM System/360 Model 91 (1966) ได้แนะนำการเปลี่ยนชื่อรีจิสเตอร์ด้วย อัลกอริทึม ของTomasulo [ 9 ]ซึ่งขจัดความสัมพันธ์ที่ผิดพลาด (WAW และ WAR) ทำให้สามารถดำเนินการนอกลำดับได้อย่างสมบูรณ์ คำสั่งที่อ้างถึงการเขียนลงในรีจิสเตอร์r nสามารถดำเนินการได้ก่อนคำสั่งก่อนหน้าที่ใช้รีจิสเตอร์r nโดยการเขียนลงในรีจิสเตอร์ทางเลือก (ที่เปลี่ยนชื่อ) alt-r nซึ่งจะเปลี่ยนเป็นรีจิสเตอร์r n ปกติ ก็ต่อเมื่อคำสั่งก่อนหน้าทั้งหมดที่อ้างถึงr nได้รับการดำเนินการแล้ว แต่จนกว่าจะถึงตอนนั้นr nจะถูกใช้สำหรับคำสั่งก่อนหน้าและalt-r n สำหรับคำ สั่ง ที่อ้างถึง r nในภายหลัง
ใน Model 91 การเปลี่ยนชื่อรีจิสเตอร์จะถูกนำไปใช้โดยบายพาสที่เรียกว่าCommon Data Bus (CDB) และบัฟเฟอร์ตัวดำเนินการแหล่งที่มาของหน่วยความจำ ทำให้รีจิสเตอร์ทางสถาปัตยกรรมทางกายภาพไม่ได้ถูกใช้งานเป็นเวลาหลายรอบ เนื่องจากสถานะที่เก่าที่สุดของรีจิสเตอร์ที่ถูกเรียกใช้โดยคำสั่งที่ยังไม่ได้ดำเนินการใดๆ จะพบได้ใน CDB ข้อได้เปรียบอีกประการหนึ่งของ Model 91 เหนือกว่า 6600 คือความสามารถในการดำเนินการคำสั่งแบบไม่เรียงลำดับในหน่วยประมวลผล เดียวกัน ไม่ใช่แค่ระหว่างหน่วยต่างๆ เหมือนกับ 6600 ซึ่งทำได้โดยสถานีสำรองซึ่งคำสั่งจะถูกส่งไปยังหน่วยประมวลผลเมื่อพร้อม ต่างจากคิว FIFO ของแต่ละหน่วยประมวลผลของ 6600 Model 91 ยังสามารถจัดลำดับการโหลดและการจัดเก็บใหม่ให้ดำเนินการก่อนการโหลดและการจัดเก็บก่อนหน้าได้[ 10 ]ซึ่งแตกต่างจาก 6600 ที่มีความสามารถจำกัดในการย้ายการโหลดผ่านการโหลด และการจัดเก็บผ่านการจัดเก็บ แต่ไม่สามารถย้ายการโหลดผ่านการจัดเก็บ และการจัดเก็บผ่านการโหลดได้[ 11 ]เฉพาะรีจิสเตอร์จุดลอยตัวของ Model 91 เท่านั้นที่ได้รับการเปลี่ยนชื่อ ทำให้ต้องอยู่ภายใต้ข้อจำกัด WAW และ WAR เดียวกันกับ CDC 6600 เมื่อทำการคำนวณจุดคงที่ ทั้ง 91 และ 6600 ต่างก็ประสบปัญหาข้อยกเว้นที่ไม่แม่นยำซึ่งจำเป็นต้องได้รับการแก้ไขก่อนที่จะสามารถนำการประมวลผลนอกลำดับมาใช้โดยทั่วไปและทำให้ใช้งานได้จริงนอกซูเปอร์คอมพิวเตอร์
ข้อยกเว้นที่แม่นยำ
เพื่อให้เกิดข้อยกเว้นที่แม่นยำสถานะการดำเนินการตามลำดับที่ถูกต้องของโปรแกรมจะต้องพร้อมใช้งานเมื่อเกิดข้อยกเว้น ในปี 1985 ได้มีการพัฒนาแนวทางต่างๆ ดังที่James E. Smithและ Andrew R. Pleszkun ได้อธิบายไว้ [ 12 ] CDC Cyber 205เป็นต้นแบบ เนื่องจากเมื่อเกิดการขัดจังหวะหน่วยความจำเสมือน สถานะทั้งหมดของโปรเซสเซอร์ (รวมถึงข้อมูลเกี่ยวกับคำสั่งที่ดำเนินการบางส่วน) จะถูกบันทึกไว้ในแพ็คเกจการแลกเปลี่ยนที่มองไม่เห็นเพื่อให้สามารถกลับมาดำเนินการต่อได้ในสถานะการดำเนินการเดียวกัน[ 13 ]อย่างไรก็ตาม เพื่อให้ข้อยกเว้นทั้งหมดมีความแม่นยำ จะต้องมีวิธีในการยกเลิกผลกระทบของคำสั่ง CDC Cyber 990 (1984) ใช้การขัดจังหวะที่แม่นยำโดยใช้บัฟเฟอร์ประวัติ ซึ่งเก็บค่าเก่า (ที่ถูกเขียนทับ) ของรีจิสเตอร์ที่จะถูกกู้คืนเมื่อข้อยกเว้นจำเป็นต้องย้อนกลับคำสั่ง[ 12 ]จากการจำลอง Smith พบว่าการเพิ่มบัฟเฟอร์จัดลำดับใหม่ (หรือบัฟเฟอร์ประวัติหรือเทียบเท่า) ลงในCray-1Sจะลดประสิทธิภาพการทำงานของลูป Livermore 14 ลูป แรก (แบบไม่ใช้เวกเตอร์) ลงเพียง 3% [ 12 ]งานวิจัยทางวิชาการที่สำคัญในหัวข้อนี้ นำโดยYale Pattด้วยโปรแกรมจำลองHPSm ของเขา [ 14 ]
ในช่วงทศวรรษ 1980 ไมโครโปรเซสเซอร์ RISC รุ่นแรกๆ จำนวนมาก มีการเขียนข้อมูลกลับไปยังรีจิสเตอร์แบบไม่เรียงลำดับ ซึ่งส่งผลให้เกิดข้อยกเว้นที่ไม่แม่นยำเสมอMotorola 88100เป็นหนึ่งในไมโครโปรเซสเซอร์รุ่นแรกๆ เพียงไม่กี่ตัวที่ไม่ประสบปัญหาข้อยกเว้นที่ไม่แม่นยำ แม้ว่าจะมีการเขียนข้อมูลแบบไม่เรียงลำดับก็ตาม ถึงแม้ว่าจะอนุญาตให้มีข้อยกเว้นจุดลอยตัวทั้งแบบแม่นยำและไม่แม่นยำก็ตาม[ 15 ] คำสั่งต่างๆ เริ่มดำเนินการตามลำดับ แต่บางคำสั่ง (เช่น จุดลอยตัว) ต้องใช้รอบการทำงานมากกว่าในการดำเนินการให้เสร็จสมบูรณ์ อย่างไรก็ตาม การดำเนินการในรอบเดียวของคำสั่งพื้นฐานที่สุดช่วยลดขอบเขตของปัญหาลงอย่างมากเมื่อเทียบกับ CDC 6600
การแยกส่วน
สมิธยังได้วิจัยวิธีการทำให้หน่วยประมวลผลต่างๆ ทำงานได้อย่างอิสระมากขึ้นจากกันและกัน รวมถึงจากหน่วยความจำ ส่วนหน้า และการแตกแขนง[ 16 ]เขาได้นำแนวคิดเหล่านั้นไปใช้ในAstronautics ZS-1 (1988) ซึ่งมีการแยกไปป์ไลน์ จำนวนเต็ม/โหลด/จัดเก็บ ออก จากไปป์ไลน์จุดลอยตัว ทำให้สามารถจัดลำดับใหม่ระหว่างไปป์ไลน์ได้ ZS-1 ยังสามารถดำเนินการโหลดก่อนการจัดเก็บก่อนหน้าได้อีกด้วย ในบทความปี 1984 ของเขา เขาแสดงความคิดเห็นว่าการบังคับใช้ข้อยกเว้นที่แม่นยำเฉพาะในไปป์ไลน์จำนวนเต็ม/หน่วยความจำน่าจะเพียงพอสำหรับกรณีการใช้งานหลายๆ กรณี เนื่องจากยังอนุญาตให้ใช้หน่วยความจำเสมือน ได้อีก ด้วย ไปป์ไลน์แต่ละอันมีบัฟเฟอร์คำสั่งเพื่อแยกออกจากตัวถอดรหัสคำสั่ง เพื่อป้องกันการหยุดชะงักของส่วนหน้า เพื่อแยกการเข้าถึงหน่วยความจำออกจากการดำเนินการเพิ่มเติม ไปป์ไลน์ทั้งสองอันแต่ละอันจะเชื่อมโยงกับคิว ที่สามารถระบุที่อยู่ได้สองคิว ซึ่งทำการเปลี่ยนชื่อรีจิสเตอร์อย่างจำกัดได้อย่างมีประสิทธิภาพ[ 10 ]สถาปัตยกรรมแยกส่วนที่คล้ายกันนี้เคยถูกนำมาใช้ก่อนหน้านี้ใน Culler 7 [ 17 ] ISA ของ ZS-1 เช่นเดียวกับ POWER รุ่นต่อมาของ IBM ช่วยในการดำเนินการสาขาในช่วงแรก
ผลงานวิจัยประสบผลสำเร็จ
ด้วยPOWER1 (1990) IBM กลับมาใช้การประมวลผลแบบไม่เรียงลำดับอีกครั้ง นับเป็นโปรเซสเซอร์ตัวแรกที่รวมการเปลี่ยนชื่อรีจิสเตอร์ (แม้ว่าจะใช้ได้เฉพาะรีจิสเตอร์จุดลอยตัวเท่านั้น) เข้ากับข้อยกเว้นที่แม่นยำ โดยใช้ไฟล์รีจิสเตอร์ทางกายภาพ (เช่น ไฟล์ที่แมปใหม่แบบไดนามิกที่มีทั้งค่าที่ยังไม่ได้ยืนยันและค่าที่ยืนยันแล้ว) แทนบัฟเฟอร์การจัดลำดับใหม่ แต่ความสามารถในการยกเลิกคำสั่งนั้นจำเป็นเฉพาะในหน่วยสาขา ซึ่งใช้บัฟเฟอร์ประวัติ (ตั้งชื่อว่าสแต็กตัวนับโปรแกรมโดย IBM) เพื่อยกเลิกการเปลี่ยนแปลงในรีจิสเตอร์นับ ลิงก์ และเงื่อนไข ความสามารถในการจัดลำดับใหม่ของคำสั่งจุดลอยตัวยังคงมีจำกัดมาก เนื่องจาก POWER1 ไม่สามารถจัดลำดับคำสั่งคำนวณเลขจุดลอยตัวใหม่ได้ (ผลลัพธ์จะพร้อมใช้งานตามลำดับ) รีจิสเตอร์ปลายทางจึงไม่ถูกเปลี่ยนชื่อ POWER1 ยังไม่มีสถานีสำรองที่จำเป็นสำหรับการใช้งานแบบไม่เรียงลำดับของหน่วยประมวลผลเดียวกัน[ 18 ] [ 19 ]ในปีถัดมา IBM รุ่น ES/9000รุ่น 900 ได้เพิ่มการเปลี่ยนชื่อรีจิสเตอร์สำหรับรีจิสเตอร์อเนกประสงค์ นอกจากนี้ยังมีสถานีสำรองที่มีรายการหกรายการสำหรับหน่วยประมวลผลจำนวนเต็มคู่ (ในแต่ละรอบ สามารถเลือกคำสั่งได้สูงสุดสองคำสั่งจากหกคำสั่งแล้วจึงดำเนินการ) และรายการหกรายการสำหรับ FPU หน่วยอื่นๆ มีคิว FIFO แบบง่าย ระยะการเรียงลำดับใหม่สูงสุด 32 คำสั่ง[ 20 ] เมนเฟรม A19 ของUnisys ในซีรีส์ Aก็เปิดตัวในปี 1991 เช่นกัน และมีการอ้างว่ามีการประมวลผลแบบไม่เรียงลำดับ และนักวิเคราะห์คนหนึ่งกล่าวว่าเทคโนโลยีของ A19 นั้นล้ำหน้ากว่าคู่แข่งถึงสามถึงห้าปี[ 21 ] [ 22 ]
การนำไปใช้อย่างกว้างขวาง
โปรเซสเซอร์แบบชิปเดี่ยวซูเปอร์สเกลาร์ รุ่นแรก( Intel i960CAในปี 1989) ใช้การจัดตารางเวลาแบบ scoreboarding อย่างง่ายเช่นเดียวกับ CDC 6600 เมื่อ 25 ปีก่อน ในช่วงปี 1992–1996 ความก้าวหน้าอย่างรวดเร็วของเทคนิคต่างๆ ซึ่งเป็นไปได้ด้วยจำนวนทรานซิสเตอร์ที่เพิ่มขึ้นทำให้เกิดการแพร่หลายไปจนถึงคอมพิวเตอร์ส่วนบุคคล Motorola 88110 (1992) ใช้บัฟเฟอร์ประวัติเพื่อย้อนกลับคำสั่ง[ 23 ]การโหลดสามารถดำเนินการก่อนการจัดเก็บก่อนหน้า ในขณะที่การจัดเก็บและการแตกสาขากำลังรอการเริ่มต้นการดำเนินการ คำสั่งประเภทอื่นๆ ที่ตามมาสามารถไหลผ่านขั้นตอนไปป์ไลน์ทั้งหมดได้ รวมถึงการเขียนกลับ ความจุ 12 รายการของบัฟเฟอร์ประวัติจำกัดระยะการเรียงลำดับใหม่[ 24 ] [ 25 ] [ 26 ] PowerPC 601 (1993) เป็นวิวัฒนาการของRISC Single Chipซึ่งเป็นการลดความซับซ้อนของ POWER1 โปรเซสเซอร์ 601 อนุญาตให้คำสั่ง branch และ floating-point แซงหน้าคำสั่งจำนวนเต็มที่อยู่ในคิวคำสั่งที่ดึงมาแล้ว โดยจะสแกนรายการสี่รายการล่างสุดเพื่อตรวจสอบความสามารถในการส่งคำสั่ง ในกรณีที่แคชพลาด คำสั่ง load และ store สามารถจัดลำดับใหม่ได้ เฉพาะรีจิสเตอร์ลิงก์และรีจิสเตอร์นับเท่านั้นที่สามารถเปลี่ยนชื่อได้[ 27 ] [ 28 ] [ 29 ] [ 30 ] [ 31 ]ในช่วงฤดูใบไม้ร่วงปี 1994 NexGenและIBM ร่วมกับ Motorolaได้นำการเปลี่ยนชื่อรีจิสเตอร์อเนกประสงค์มาใช้กับ CPU แบบชิปเดี่ยว Nx586 ของ NexGen เป็น โปรเซสเซอร์ x86 ตัวแรก ที่สามารถประมวลผลแบบไม่เรียงลำดับและมีระยะการจัดลำดับใหม่ได้สูงสุดถึง 14 ไมโครโอเปอเรชัน [ 32 ] PowerPC 603 ได้เปลี่ยนชื่อทั้งรีจิสเตอร์อเนกประสงค์และรีจิสเตอร์ FP แต่ละหน่วยประมวลผลที่ไม่ใช่ branch ทั้งสี่หน่วยสามารถมีคำสั่งรออยู่ข้างหน้าได้หนึ่งคำสั่งโดยไม่ปิดกั้นการไหลของคำสั่งไปยังหน่วยอื่นๆบัฟเฟอร์จัดลำดับใหม่ห้ารายการอนุญาตให้คำสั่งไม่เกินสี่คำสั่งแซงหน้าคำสั่งที่ยังไม่ได้ดำเนินการ เนื่องจากมีบัฟเฟอร์จัดเก็บ การโหลดสามารถเข้าถึงแคชก่อนการจัดเก็บก่อนหน้าได้[ 33 ] [ 34 ]
PowerPC 604 (1995) เป็นโปรเซสเซอร์ชิปเดี่ยวตัวแรกที่มี การจัดลำดับใหม่ในระดับ หน่วยประมวลผลโดยแต่ละหน่วยประมวลผล 3 ใน 6 หน่วยจะมีสถานีสำรอง 2 รายการ ทำให้สามารถประมวลผลรายการที่ใหม่กว่าก่อนรายการที่เก่ากว่าได้ ความจุของบัฟเฟอร์การจัดลำดับใหม่คือ 16 คำสั่ง คิวโหลด 4 รายการและคิวจัดเก็บ 6 รายการจะติดตามลำดับการโหลดและการจัดเก็บใหม่เมื่อเกิดแคชพลาด[ 35 ] HAL SPARC64 (1995) มีความสามารถในการจัดลำดับใหม่มากกว่า รุ่น ES/9000รุ่น 900 โดยมีสถานีสำรอง 8 รายการ 3 สถานีสำหรับหน่วยจำนวนเต็ม หน่วยจุดลอยตัว และหน่วยสร้างที่อยู่และสถานีสำรอง 12 รายการสำหรับโหลด/จัดเก็บ ซึ่งช่วยให้สามารถจัดลำดับการเข้าถึงแคช/หน่วยความจำใหม่ได้มากกว่าโปรเซสเซอร์รุ่นก่อนหน้า สามารถมีคำสั่งอยู่ในสถานะจัดลำดับใหม่ได้มากถึง 64 คำสั่งในเวลาเดียวกัน[ 36 ] [ 37 ] Pentium Pro (1995) ได้แนะนำสถานีสำรองแบบรวมศูนย์ซึ่งมีความจุ 20 ไมโคร-OP ทำให้สามารถจัดลำดับใหม่ได้อย่างยืดหยุ่นมาก โดยได้รับการสนับสนุนจากบัฟเฟอร์การจัดลำดับใหม่ 40 รายการ สามารถจัดลำดับการโหลดใหม่ก่อนการโหลดและการจัดเก็บได้[ 38 ]
อัตราการประมวลผลต่อรอบที่สามารถทำได้จริงเพิ่มสูงขึ้นอีก เนื่องจากการประมวลผลแบบไม่เรียงลำดับเต็มรูปแบบได้รับการนำมาใช้โดยSGI / MIPS ( R10000 ) และHP PA-RISC ( PA-8000 ) ในปี 1996 ในปีเดียวกันนั้นCyrix 6x86และAMD K5ได้นำเทคนิคการจัดลำดับขั้นสูงมาใช้ในคอมพิวเตอร์ส่วนบุคคลทั่วไป นับตั้งแต่DEC Alphaได้รับการประมวลผลแบบไม่เรียงลำดับในปี 1998 ( Alpha 21264 ) คอร์ประมวลผลแบบไม่เรียงลำดับที่มีประสิทธิภาพสูงสุดก็ไม่มีคอร์แบบเรียงลำดับใดเทียบได้ ยกเว้นHP / Intel Itanium 2และIBM POWER6แม้ว่าตัวหลังจะมีหน่วยประมวลผลจุดลอยตัว แบบไม่เรียงลำดับ ก็ตาม[ 39 ]โปรเซสเซอร์แบบเรียงลำดับระดับสูงอื่นๆ ล้าหลังไปมาก ได้แก่UltraSPARC III / IVของSunและเมนเฟรม ของ IBM ซึ่งสูญเสียความสามารถในการประมวลผลแบบไม่เรียงลำดับเป็นครั้งที่สอง และยังคงใช้การประมวลผลแบบเรียงลำดับในรุ่นz10ต่อมาโปรเซสเซอร์แบบเรียงลำดับขนาดใหญ่ได้มุ่งเน้นไปที่ประสิทธิภาพการทำงานแบบมัลติเธรด แต่ในที่สุดซีรี่ส์ SPARC TและXeon Phiก็เปลี่ยนมาใช้การประมวลผลแบบไม่เรียงลำดับในปี 2011 และ 2016 ตามลำดับ
โปรเซสเซอร์เกือบทั้งหมดสำหรับโทรศัพท์และแอปพลิเคชันระดับล่างอื่นๆ ยังคงทำงานแบบเรียงลำดับจนถึงประมาณปี 2010โดยเริ่มจากScorpionของQualcomm (ระยะการเรียงลำดับใหม่ 32) ที่ถูกนำมาใช้ในSnapdragon [40 ]และต่อมา A9 ของ Arm ก็เข้ามาแทนที่A8 สำหรับ คอมพิวเตอร์ส่วนบุคคลx86ระดับล่างสถาปัตยกรรมไมโคร Bonnell แบบเรียงลำดับใน โปรเซสเซอร์ Intel Atom รุ่นแรกๆ ถูกท้าทายโดยสถาปัตยกรรมไมโคร BobcatของAMDและในปี 2013 ก็ถูกแทนที่ด้วยสถาปัตยกรรมไมโคร Silvermont แบบ ไม่ เรียงลำดับ [ 41 ]เนื่องจากความซับซ้อนของการประมวลผลแบบไม่เรียงลำดับทำให้ไม่สามารถบรรลุการใช้พลังงาน ต้นทุน และขนาดที่ต่ำที่สุดได้ การประมวลผลแบบเรียงลำดับจึงยังคงแพร่หลายในไมโครคอนโทรลเลอร์และระบบฝังตัวรวมถึงคอร์ระดับโทรศัพท์ เช่นA55และA510 ของ Arm ในการกำหนดค่า big.LITTLE
แนวคิดพื้นฐาน
พื้นหลัง
การประมวลผลแบบไม่เรียงลำดับนั้นมีความซับซ้อนกว่าการประมวลผลแบบเรียงลำดับ ในโปรเซสเซอร์แบบเรียงลำดับแบบไปป์ไลน์ การประมวลผลคำสั่งจะซ้อนทับกันในลักษณะไปป์ไลน์ โดยแต่ละคำสั่งต้องใช้รอบสัญญาณนาฬิกา หลายรอบ จึงจะเสร็จสมบูรณ์ ผลที่ตามมาคือ ผลลัพธ์จากคำสั่งก่อนหน้าจะล่าช้ากว่าที่อาจจำเป็นต้องใช้ในคำสั่งถัดไป การประมวลผลแบบเรียงลำดับยังคงต้องติดตามความสัมพันธ์เหล่านี้อยู่ แต่แนวทางของมันค่อนข้างไม่ซับซ้อน: หยุดชะงักทุกครั้ง การประมวลผลแบบไม่เรียงลำดับใช้เทคนิคการติดตามข้อมูลที่ซับซ้อนกว่ามาก ดังที่อธิบายไว้ด้านล่าง
ตัวประมวลผลตามลำดับ
ในโปรเซสเซอร์รุ่นก่อนๆ การประมวลผลคำสั่งจะดำเนินการในรอบคำสั่งซึ่งโดยปกติประกอบด้วยขั้นตอนต่อไปนี้:
- การ ดึงคำสั่ง
- หาก ตัวถูก ดำเนินการอินพุต พร้อม ใช้งาน (เช่น ในรีจิสเตอร์ของโปรเซสเซอร์) คำสั่งจะถูกส่งไปยังหน่วยการทำงาน ที่เหมาะสม หากตัวถูกดำเนินการอย่างน้อยหนึ่งตัวไม่พร้อมใช้งานในระหว่างรอบสัญญาณนาฬิกาปัจจุบัน (โดยทั่วไปเนื่องจากต้องดึงมาจากหน่วยความจำ ) โปรเซสเซอร์จะหยุดทำงานจนกว่าตัวถูกดำเนินการเหล่านั้นจะพร้อมใช้งาน
- คำสั่งดังกล่าวจะถูกดำเนินการโดยหน่วยงานที่เกี่ยวข้อง
- หน่วยการทำงานจะเขียนผลลัพธ์กลับไปยังไฟล์รีจิสเตอร์
โดยทั่วไป โปรเซสเซอร์แบบเรียงลำดับจะมีเวกเตอร์บิตสำหรับบันทึกรีจิสเตอร์ซึ่งจะถูกเขียนโดยไปป์ไลน์[ 42 ]หากตัวถูกดำเนินการอินพุตใด ๆ มีบิตที่สอดคล้องกันถูกตั้งค่าในเวกเตอร์นี้ คำสั่งจะหยุดทำงาน โดยพื้นฐานแล้ว เวกเตอร์ทำหน้าที่ที่เรียบง่ายกว่ามากในการป้องกันอันตรายจากรีจิสเตอร์ ดังนั้น การประมวลผลแบบไม่เรียงลำดับจะใช้เมทริกซ์ 2 มิติ ในขณะที่การประมวลผลแบบเรียงลำดับจะใช้เวกเตอร์ 1 มิติเพื่อหลีกเลี่ยงอันตราย
โปรเซสเซอร์ที่ชำรุด
รูปแบบใหม่นี้แบ่งการประมวลผลคำสั่งออกเป็นขั้นตอนเหล่านี้: [ 43 ]
- การดึงคำสั่ง
- การถอดรหัสคำสั่ง
- การเปลี่ยนชื่อคำสั่ง
- การส่งคำสั่งไปยังคิวคำสั่ง (หรือเรียกว่าบัฟเฟอร์คำสั่งหรือสถานีสำรอง )
- คำสั่งนี้จะรออยู่ในคิวจนกว่าตัวถูกดำเนินการอินพุตจะพร้อมใช้งาน คำสั่งนี้สามารถออกจากคิวได้ก่อนคำสั่งก่อนหน้า
- คำสั่งดังกล่าวจะถูกส่งไปยังหน่วยงานที่เกี่ยวข้อง และหน่วยงานนั้นจะดำเนินการตามคำสั่ง
- ผลลัพธ์ถูกจัดคิวไว้แล้ว
- ผลลัพธ์นี้จะถูกเขียนกลับไปยังไฟล์รีจิสเตอร์ก็ต่อเมื่อคำสั่งเก่าทั้งหมดได้รับการเขียนผลลัพธ์กลับไปยังไฟล์รีจิสเตอร์แล้ว ขั้นตอนนี้เรียกว่าขั้นตอนการสำเร็จการศึกษาหรือขั้นตอนการเกษียณ
แนวคิดหลักของการประมวลผลแบบไม่เรียงลำดับคือการอนุญาตให้โปรเซสเซอร์หลีกเลี่ยงการหยุดชะงักประเภทหนึ่งที่เกิดขึ้นเมื่อข้อมูลที่จำเป็นในการดำเนินการไม่พร้อมใช้งาน ในโครงร่างข้างต้น โปรเซสเซอร์หลีกเลี่ยงการหยุดชะงักที่เกิดขึ้นในขั้นตอนที่ 2 ของโปรเซสเซอร์แบบเรียงลำดับเมื่อคำสั่งไม่พร้อมที่จะประมวลผลอย่างสมบูรณ์เนื่องจากข้อมูลขาดหายไป
โปรเซสเซอร์แบบประมวลผลไม่เรียงลำดับจะเติมช่องว่าง เหล่านี้ ตามเวลาด้วยคำสั่งอื่นๆ ที่พร้อม จากนั้นจึงเรียงลำดับผลลัพธ์ใหม่ในตอนท้ายเพื่อให้ดูเหมือนว่าคำสั่งได้รับการประมวลผลตามปกติ บันทึกและนำลำดับโปรแกรม เดิมไปใช้ หรือดำเนินการเป็นชุดที่ไม่สามารถขัดจังหวะได้ ซึ่งลำดับจะไม่ทำให้ข้อมูลเสียหาย วิธีการเรียงลำดับคำสั่งในรหัสคอมพิวเตอร์ดั้งเดิมเรียกว่าลำดับโปรแกรมในโปรเซสเซอร์จะจัดการคำสั่งตามลำดับข้อมูลซึ่งเป็นลำดับที่ข้อมูลพร้อมใช้งานในรีจิสเตอร์ของโปรเซสเซอร์ วงจรที่ค่อนข้างซับซ้อนจำเป็นสำหรับการแปลงจากลำดับหนึ่งไปยังอีกลำดับหนึ่งและรักษาลำดับตรรกะของเอาต์พุต
ข้อดีของการประมวลผลแบบไม่เรียงลำดับจะยิ่งเพิ่มมากขึ้นเมื่อไปป์ไลน์คำสั่งลึกขึ้นและความแตกต่างของความเร็วระหว่างหน่วยความจำหลัก (หรือหน่วยความจำแคช ) กับโปรเซสเซอร์กว้างขึ้น ในเครื่องคอมพิวเตอร์สมัยใหม่ โปรเซสเซอร์ทำงานเร็วกว่าหน่วยความจำหลายเท่า ดังนั้นในช่วงเวลาที่โปรเซสเซอร์แบบเรียงลำดับรอข้อมูลเข้ามา ในทางทฤษฎีแล้วมันอาจประมวลผลคำสั่งได้เป็นจำนวนมาก
การแยกส่วนการจัดส่งและการออกช่วยให้สามารถออกสินค้าได้นอกลำดับ
หนึ่งในความแตกต่างที่เกิดจากกระบวนทัศน์ใหม่นี้คือการสร้างคิวที่ช่วยให้ขั้นตอนการจัดส่งแยกออกจากขั้นตอนการออกคำสั่ง และขั้นตอนการสำเร็จการศึกษาแยกออกจากขั้นตอนการประมวลผล ชื่อเรียกแรกเริ่มของกระบวนทัศน์นี้คือสถาปัตยกรรมแบบแยกส่วน (decoupled architecture ) ในโปรเซสเซอร์ แบบเรียงลำดับรุ่นก่อนๆขั้นตอนเหล่านี้ทำงานในลักษณะ ที่ค่อนข้าง ประสานกันและเป็นลำดับขั้น
ขั้นตอน การดึงและถอดรหัสจะถูกแยกออกจากขั้นตอนการประมวลผลใน โปรเซสเซอร์ แบบไปป์ไลน์โดยใช้บัฟเฟอร์จุดประสงค์ของบัฟเฟอร์คือการแบ่งส่วนการเข้าถึงหน่วยความจำ และฟังก์ชันการประมวลผลในโปรแกรมคอมพิวเตอร์และบรรลุประสิทธิภาพสูงโดยการใช้ประโยชน์จาก ความขนานแบบละเอียดระหว่างทั้งสอง[ 44 ] ในการทำเช่นนั้น บัฟเฟอร์จะซ่อน ความหน่วงของหน่วยความจำทั้งหมดจากมุมมองของโปรเซสเซอร์ ได้อย่างมีประสิทธิภาพ
ในทางทฤษฎีแล้ว บัฟเฟอร์ขนาดใหญ่สามารถเพิ่มประสิทธิภาพการประมวลผลได้ อย่างไรก็ตาม หากโปรเซสเซอร์มีการคาดการณ์การทำงานผิดพลาดบัฟเฟอร์ทั้งหมดอาจต้องถูกล้าง ทำให้สิ้นเปลืองรอบการทำงานของนาฬิกาและลดประสิทธิภาพลง นอกจากนี้ บัฟเฟอร์ขนาดใหญ่ยังสร้างความร้อนมากขึ้นและใช้ พื้นที่ บนชิป มากขึ้น ด้วยเหตุนี้ นักออกแบบโปรเซสเซอร์ในปัจจุบันจึงนิยมใช้แนวทางการออกแบบแบบ มัลติเธรด
โดยทั่วไปแล้ว สถาปัตยกรรมแบบแยกส่วนถือว่าไม่มีประโยชน์สำหรับการคำนวณทั่วไป เนื่องจากไม่สามารถจัดการกับโค้ดที่เน้นการควบคุมได้ดี[ 45 ]โค้ดที่เน้นการควบคุมนั้นรวมถึงสิ่งต่างๆ เช่น สาขาซ้อนกันที่เกิดขึ้นบ่อยครั้งในเคอร์เนลของระบบปฏิบัติการสถาปัตยกรรมแบบแยกส่วนมีบทบาทสำคัญในการจัดกำหนดการในสถาปัตยกรรมคำสั่งยาวมาก (VLIW) [ 46 ]
การแยกการทำงานและการเขียนกลับช่วยให้สามารถเริ่มต้นโปรแกรมใหม่ได้
คิวสำหรับผลลัพธ์มีความจำเป็นในการแก้ไขปัญหาต่างๆ เช่น การคาดการณ์ผิดพลาดของคำสั่งกระโดด และข้อยกเว้น คิวผลลัพธ์ช่วยให้โปรแกรมสามารถเริ่มต้นใหม่ได้หลังจากเกิดข้อยกเว้น และช่วยให้คำสั่งต่างๆ เสร็จสมบูรณ์ตามลำดับของโปรแกรม คิวยังอนุญาตให้ทิ้งผลลัพธ์เนื่องจากการคาดการณ์ผิดพลาดในคำสั่งกระโดดเก่าๆ และข้อยกเว้นที่เกิดขึ้นกับคำสั่งเก่าๆ ความสามารถในการออกคำสั่งผ่านคำสั่งกระโดดที่ยังไม่ได้รับการแก้ไขเรียกว่า การประมวลผลแบบคาดการณ์ล่วงหน้า (speculative execution )
ทางเลือกด้านสถาปัตยกรรมระดับจุลภาค
คำสั่งต่างๆ ถูกส่งไปยังคิวส่วนกลางหรือไปยังคิวแบบกระจายหลายแห่ง?
- โปรเซสเซอร์ IBM PowerPCใช้คิวที่กระจายอยู่ระหว่างหน่วยการทำงานต่างๆ ในขณะที่โปรเซสเซอร์ประมวลผลแบบไม่เรียงลำดับอื่นๆ ใช้คิวแบบรวมศูนย์ IBM ใช้คำว่า " สถานีสำรอง"สำหรับคิวแบบกระจายของตน
มีคิวสำหรับแสดงผลลัพธ์จริง ๆ หรือว่าผลลัพธ์ถูกเขียนลงในไฟล์รีจิสเตอร์โดยตรง? สำหรับกรณีหลัง ฟังก์ชันการจัดคิวจะถูกจัดการโดยแผนที่รีจิสเตอร์ซึ่งเก็บข้อมูลการเปลี่ยนชื่อรีจิสเตอร์สำหรับแต่ละคำสั่งที่กำลังดำเนินการอยู่
- โปรเซสเซอร์ Intel รุ่นแรกๆ ที่ประมวล ผลไม่เรียงลำดับจะใช้คิวผลลัพธ์ที่เรียกว่าบัฟเฟอร์เรียงลำดับใหม่ [ a ]ในขณะที่โปรเซสเซอร์ที่ประมวลผลไม่เรียงลำดับรุ่นหลังๆ ส่วนใหญ่จะใช้แผนที่รีจิสเตอร์[ b ]
ดูเพิ่มเติม
หมายเหตุ
- ไมโคร โปรเซสเซอร์ตระกูล Intel P6มีทั้งบัฟเฟอร์จัดลำดับใหม่ (ROB) และตารางนามแฝงรีจิสเตอร์ (RAT) ROB ถูกสร้างขึ้นมาเพื่อแก้ไขปัญหาการคาดการณ์สาขาผิดพลาดเป็นหลัก ตระกูล Intel P6เป็นหนึ่งในไมโครโปรเซสเซอร์แบบ out-of-order รุ่นแรกๆ แต่ถูกแทนที่ด้วย สถาปัตยกรรม NetBurstหลายปีต่อมา NetBurst พิสูจน์แล้วว่าเป็นทางตันเนื่องจากไปป์ไลน์ที่ยาวซึ่งคาดการณ์ถึงความถี่ในการทำงานที่สูงกว่ามาก วัสดุที่ใช้ไม่สามารถรองรับเป้าหมายความถี่สัญญาณนาฬิกาที่ตั้งเป้าไว้สูงได้เนื่องจากปัญหาด้านความร้อน และการออกแบบรุ่นต่อมาที่ใช้ NetBurst เป็นพื้นฐาน เช่น Tejas และ Jayhawk จึงถูกยกเลิก Intel จึงกลับมาใช้การออกแบบ P6 เป็นพื้นฐานของสถาปัตยกรรมไมโคร Coreและ Nehalem
- ^ สถาปัตยกรรมไมโคร Sandy Bridge , Ivy Bridgeและ Haswellที่ตามมานั้นแตกต่างจากเทคนิคการเรียงลำดับใหม่ที่ใช้ใน P6 และใช้เทคนิคการเรียงลำดับใหม่จาก EV6และ P4แต่มีไปป์ไลน์ที่สั้นกว่าเล็กน้อย [ 47 ] [ 48 ]
อ่านเพิ่มเติม
- Smith, James E. ; Pleszkun, AR (มิถุนายน 1985). "การนำการขัดจังหวะที่แม่นยำมาใช้ในโปรเซสเซอร์แบบไปป์ไลน์". ACM SIGARCH Computer Architecture News . 13 (3): 36– 44. doi : 10.1145/327070.327125 .
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การดำเนินการที่ไม่เป็นไปตามลำดับ
ใน วิศวกรรมคอมพิวเตอร์ การ ประมวลผลแบบไม่เรียงลำดับ (หรือเรียกอย่างเป็นทางการว่า การประมวลผลแบบไดนามิก ) เป็น รูปแบบ การจัดตารางคำสั่ง ที่ใช้ใน หน่วยประมวลผลกลาง (CPU)...
ประวัติศาสตร์
การประมวลผลแบบไม่เรียงลำดับ (Out-of-order execution) เป็นรูปแบบที่จำกัดของ สถาปัตยกรรมดาต้าโฟลว์ ซึ่งเป็นหัวข้อวิจัยสำคัญใน สถาปัตยกรรมคอมพิวเตอร์ ในช่วงทศวรรษ 1970 และต้นทศวรรษ 1980
เริ่มแรกใช้ในซูเปอร์คอมพิวเตอร์
อาจกล่าวได้ว่าเครื่องแรกที่ใช้การประมวลผลแบบไม่เรียงลำดับคือ CDC 6600 (1964) ซึ่งใช้ สกอร์บอร์ด เพื่อแก้ไขข้อขัดแย้ง อย่างไรก็ตาม 6600 ขาด การจัดการ ข้อขัดแย้ง WAW จึงเลือกที่จะหยุดการทำงานแทน สถานการณ์นี้ถูกเรียกว่า "ข้อขัดแย้งลำดับที่หนึ่ง" โดย Thornton [ 5...
ข้อยกเว้นที่แม่นยำ
เพื่อให้เกิด ข้อยกเว้นที่แม่นยำ สถานะการดำเนินการตามลำดับที่ถูกต้องของโปรแกรมจะต้องพร้อมใช้งานเมื่อเกิดข้อยกเว้น ในปี 1985 ได้มีการพัฒนาแนวทางต่างๆ ดังที่ James E. Smith และ Andrew R.