สมมติว่าคำขอ l1 และ l2 แคชส่งผลให้พลาดตัวประมวลผลจะหยุดทำงานจนกว่าหน่วยความจำหลักจะถูกเข้าถึงหรือไม่?
ฉันได้ยินเกี่ยวกับแนวคิดของการเปลี่ยนไปใช้เธรดอื่นถ้าเช่นนั้นจะใช้อะไรในการปลุกเธรดที่ค้างอยู่
สมมติว่าคำขอ l1 และ l2 แคชส่งผลให้พลาดตัวประมวลผลจะหยุดทำงานจนกว่าหน่วยความจำหลักจะถูกเข้าถึงหรือไม่?
ฉันได้ยินเกี่ยวกับแนวคิดของการเปลี่ยนไปใช้เธรดอื่นถ้าเช่นนั้นจะใช้อะไรในการปลุกเธรดที่ค้างอยู่
คำตอบ:
หน่วยความจำแฝงเป็นหนึ่งในปัญหาพื้นฐานที่ศึกษาในการวิจัยสถาปัตยกรรมคอมพิวเตอร์
การดำเนินการเก็งกำไรกับปัญหาคำสั่งที่ไม่ได้รับคำสั่งมักจะสามารถหางานที่มีประโยชน์ที่ต้องทำเพื่อเติมเวลาแฝงในช่วงเวลาที่การโจมตีแคช L1 แต่โดยปกติแล้วจะทำงานที่มีประโยชน์หลังจาก 10 หรือ 20 รอบ มีความพยายามหลายครั้งในการเพิ่มปริมาณงานที่สามารถทำได้ในช่วงเวลาที่พลาด แนวคิดหนึ่งคือพยายามทำการทำนายค่า (Lipasti, Wilkerson และ Shen, (ASPLOS-VII): 138-147, 1996) ความคิดนี้เป็นที่นิยมมากในแวดวงการวิจัยสถาปัตยกรรมวิชาการในขณะที่ดูเหมือนว่าจะไม่ทำงานในทางปฏิบัติ ความพยายามครั้งสุดท้ายในการบันทึกการทำนายค่าจากถังขยะของประวัติศาสตร์คือการดำเนินการแบบเรียกใช้ล่วงหน้า(Mutlu, สิ้นเชิง, Wilkerson และ Patt (HPCA-9): 129, 2003) ในการดำเนินการ runahead คุณรู้จักว่าการคาดการณ์ค่าของคุณจะไปจะผิด แต่การพิจารณาดำเนินการอยู่แล้วแล้วโยนงานทั้งหมดที่อยู่บนพื้นฐานของการคาดคะเนเกี่ยวกับทฤษฎีที่ว่าอย่างน้อยคุณจะเริ่มต้น prefetches บางอย่างสำหรับสิ่งที่มิฉะนั้นจะแคช L2 พลาดท่า ปรากฎว่า runahead เปลืองพลังงานมากจนไม่คุ้มค่า
วิธีสุดท้ายในหลอดเลือดดำซึ่งอาจได้รับแรงฉุดบางอย่างในอุตสาหกรรมนี้เกี่ยวข้องกับการสร้างบัฟเฟอร์เรียงลำดับยาวมาก คำสั่งถูกดำเนินการแบบเก็งกำไรบนพื้นฐานของการทำนายสาขา แต่ไม่มีการทำนายค่าใด ๆ แทนที่จะทำตามคำแนะนำทั้งหมดที่ขึ้นอยู่กับความล่าช้าในการโหลดเป็นเวลานานและรอในการจัดลำดับบัฟเฟอร์ใหม่ แต่เนื่องจากบัฟเฟอร์การเรียงลำดับใหม่มีขนาดใหญ่มากคุณสามารถใช้คำสั่งดึงข้อมูลได้หากตัวทำนายสาขาทำงานได้ดีคุณอาจจะสามารถหางานที่มีประโยชน์ได้ในภายหลังในสตรีมคำสั่ง งานวิจัยที่มีอิทธิพลในบริเวณนี้คือท่อส่งต่อเนื่อง(Srinivasan, Rajwar, Akkary, Gandhi และ Upton (ASPLOS-XI): 107-119, 2004) (แม้ว่าข้อเท็จจริงที่ว่าผู้เขียนมาจาก Intel แต่ฉันเชื่อว่าความคิดนั้นมีแรงฉุดมากขึ้นที่ AMD)
การใช้หลายเธรดสำหรับความทนทานต่อความล่าช้ามีประวัติยาวนานกว่ามากและประสบความสำเร็จในอุตสาหกรรมมากขึ้น เวอร์ชันที่ประสบความสำเร็จทั้งหมดใช้การสนับสนุนฮาร์ดแวร์สำหรับมัลติเธรด ที่ง่าย (และประสบความสำเร็จมากที่สุด) รุ่นนี้คือสิ่งที่มักจะเรียกว่า FGMT ( ปรับเม็ดเล็กแบบมัลติเธรด ) หรือบรรณนิทัศน์แบบมัลติเธรด แต่ละแกนของฮาร์ดแวร์รองรับบริบทของเธรดที่หลากหลาย ( บริบทคือสถานะของรีจิสเตอร์รวมถึงรีจิสเตอร์เช่นตัวชี้คำสั่งและการลงทะเบียนแฟล็กโดยนัย) ในการประมวลผลแบบมัลติเธรดเม็ดเล็กแต่ละหัวข้อจะถูกประมวลผลใน-ใบสั่ง. ตัวประมวลผลติดตามว่าเธรดใดถูกถ่วงเวลาในการโหลด latency long และซึ่งพร้อมสำหรับคำสั่งถัดไปและใช้กลยุทธ์การกำหนดตารางเวลาแบบ FIFO ง่าย ๆ ในแต่ละรอบเพื่อเลือกเธรดที่พร้อมใช้เพื่อประมวลผลรอบนั้น ตัวอย่างแรกของเรื่องนี้ในวงกว้างคือโปรเซสเซอร์ HEP ของ Burton Smith (Burton Smith ไปที่ Tera supercomputer สถาปนิกซึ่งเป็นหน่วยประมวลผลแบบมัลติเธรดที่ละเอียดยิ่งยวด) แต่ความคิดกลับไปไกลกว่านั้นในทศวรรษ 1960 ฉันคิดว่า
FGMT มีประสิทธิภาพโดยเฉพาะในการสตรีมเวิร์กโหลด GPU ที่ทันสมัยทั้งหมด (หน่วยประมวลผลกราฟิก) เป็นมัลติคอร์ที่แต่ละคอร์คือ FGMT และแนวคิดนี้ยังใช้กันอย่างแพร่หลายในโดเมนคอมพิวเตอร์อื่น ๆ T1 ของ Sun ยังเป็น FMGT ที่มีหลายหน่วยความจำและดังนั้น Xeon Phi ของ Intel (โปรเซสเซอร์ที่มักจะเรียกว่า "MIC" และเคยถูกเรียกว่า "Larabee")
แนวคิดของSim พร้อมกันมัลติเธรด (Tullsen, Eggers และ Levy, (ISCA-22): 392-403, 1995) รวมฮาร์ดแวร์หลายเธรดกับการดำเนินการเก็งกำไร โปรเซสเซอร์มีหลายเธรดบริบท แต่แต่ละเธรดจะถูกดำเนินการอย่างพิเศษและไม่เรียบร้อย ตัวกำหนดตารางเวลาที่ซับซ้อนยิ่งขึ้นสามารถใช้ฮิวริสติกแบบต่าง ๆ เพื่อดึงข้อมูลจากเธรดที่มีแนวโน้มว่าจะมีประโยชน์มากที่สุด ( มาลิก, Agarwal, Dhar และ Frank, (HPCA-14: 50-61), 2008 ) บริษัท เซมิคอนดักเตอร์ขนาดใหญ่แห่งหนึ่งเริ่มใช้คำว่าไฮเปอร์เธรดเพื่อการมัลติเธรดพร้อมกันและดูเหมือนว่าชื่อนี้จะเป็นชื่อที่ใช้กันอย่างแพร่หลายในทุกวันนี้
ฉันรู้ว่าหลังจากอ่านความคิดเห็นของคุณแล้วคุณยังสนใจในการส่งสัญญาณที่เกิดขึ้นระหว่างโปรเซสเซอร์และหน่วยความจำ แคชที่ทันสมัยมักจะอนุญาตให้คิดถึงหลายครั้งที่จะโดดเด่นพร้อมกัน สิ่งนี้เรียกว่าแคชปลอดการล็อก (Kroft, (ISCA-8): 81-87, 1981) (แต่บทความหายากทางออนไลน์และค่อนข้างอ่านยากคำตอบสั้น ๆ : มีหนังสือมากมาย แต่คุณต้องจัดการกับมันโครงสร้างการเก็บหนังสือฮาร์ดแวร์เรียกว่า MSHR (ข้อมูล / สถานะการลงทะเบียนถือเป็นข้อผิดพลาด) ) ซึ่งเป็นชื่อ Kroft ที่ให้ไว้ในกระดาษ 1981 ของเขา)
คำตอบสั้น ๆ คือ: ไม่มีอะไรโปรเซสเซอร์จะหยุดทำงาน
มีความเป็นไปได้ไม่มากนัก การสลับไปใช้งานที่แตกต่างนั้นไม่ใช่ตัวเลือกด้วยเหตุผลสองประการ นั่นเป็นการดำเนินการที่มีราคาแพงและเนื่องจากงานปัจจุบันและงานอื่นกำลังแย่งพื้นที่ในแคชการเปลี่ยนไปใช้งานอื่นอาจต้องการการเข้าถึงหน่วยความจำหลักและอาจสลับกลับไปใช้งานดั้งเดิม นอกจากนี้สิ่งนี้จะต้องเกี่ยวข้องกับระบบปฏิบัติการดังนั้นโปรเซสเซอร์จะต้องทริกเกอร์รูปแบบของการขัดจังหวะหรือกับดัก - ในความเป็นจริงหน่วยประมวลผลจะสลับไปใช้เคอร์เนลโค้ดบางตัว
ในขณะที่ตัวประมวลผลหยุดทำงานตัวจับเวลายังคงทำงานต่อดังนั้นอาจมีการขัดจังหวะตัวจับเวลาหรืออาจมีการขัดจังหวะจากอุปกรณ์ต่อพ่วงอื่น ๆ ดังนั้นการสลับบริบทมีแนวโน้มที่จะเกิดขึ้นระหว่างการเข้าถึงหน่วยความจำหลักมากกว่าในระหว่างการเข้าถึงแคช แต่เพียงเพราะใช้เวลานานกว่า
อย่างไรก็ตามคอมพิวเตอร์สมัยใหม่นั้นมีเทคนิคที่หลากหลายเพื่อพยายามลดเวลาที่เสียไปในโปรเซสเซอร์เพื่อรอหน่วยความจำหลัก การตบจะเกิดขึ้น แต่ก็ต่อเมื่อไม่สามารถหลีกเลี่ยงได้
เทคนิคหนึ่งคือการดึงข้อมูลการเก็งกำไร : ตัวประมวลผลพยายามเดาตำแหน่งหน่วยความจำที่จะเข้าถึงและดึงข้อมูลไปยังแคชล่วงหน้า ตัวอย่างเช่นการวนซ้ำผ่านบล็อกหน่วยความจำเป็นเรื่องธรรมดาดังนั้นหากมีการโหลดรายการแคชสำหรับที่อยู่หน่วยความจำ 0x12340000, 0x12340010 และ 0x12340020 อาจเป็นการดีที่จะโหลดบรรทัดสำหรับ 0x12340030 คอมไพเลอร์สามารถช่วยด้วยการสร้างคำแนะนำ prefetchซึ่งเป็นเหมือนโหลดยกเว้นว่าพวกเขาจะถ่ายโอนข้อมูลจากหน่วยความจำหลักไปยังแคชเท่านั้นไม่ใช่ลงในโปรเซสเซอร์ลงทะเบียน
เทคนิคก็คือการดำเนินการเก็งกำไร โปรเซสเซอร์เริ่มประมวลผลคำสั่งถัดไปก่อนที่จะทำการโหลด นี้เกิดขึ้นตามธรรมชาติอยู่แล้วเพราะpipeliningของคำแนะนำ คำสั่งที่ไม่ขึ้นอยู่กับค่าที่โหลดสามารถดำเนินการได้ด้วยวิธีนี้: โปรเซสเซอร์ต้องทำการวิเคราะห์การพึ่งพา สำหรับคำแนะนำแบบมีเงื่อนไข (เช่น load r1; branch ถ้า r1 ≠ 0) ตัวประมวลผลจะใช้ฮิวริสติกการทำนายสาขาเพื่อคาดเดาค่าที่จะได้ การดำเนินการเก็งกำไรหลังจากโหลดจะต้องมีการกรอในกรณีที่โหลดก่อให้เกิดการยกเลิก
สถาปัตยกรรมบางอย่างเช่นItaniumช่วยอำนวยความสะดวกในการดำเนินการคำสั่งในลำดับที่สะดวกโดยอนุญาตให้มีการจัดเรียงคำสั่งใหม่ตามค่าเริ่มต้น: แทนที่จะประกอบด้วยลำดับของคำสั่งเบื้องต้นที่ถูกดำเนินการทางความหมายหลังจากนั้นอีกหนึ่งโปรแกรมประกอบด้วยคำสอนนานมาก : เป็นคำสั่งที่เดียวรวมถึง การดำเนินการหลายอย่างที่ต้องดำเนินการแบบขนานโดยส่วนประกอบที่แตกต่างกันของโปรเซสเซอร์
การสลับไปยังเธรดอื่นเกิดขึ้นในไฮเปอร์เธรดที่พบในโปรเซสเซอร์ x86 ระดับไฮเอนด์ นี่คือเทคนิคการออกแบบฮาร์ดแวร์: โปรเซสเซอร์แต่ละคอร์มีสองธนาคารแยกต่างหาก (แต่ละที่สอดคล้องกับบริบทของงาน) แต่เป็นอินสแตนซ์เดียวขององค์ประกอบอื่น ๆ เพื่อให้สามารถสนับสนุนเธรดการดำเนินการสองตัวได้อย่างอิสระ เวลา. ในขณะที่เธรดหนึ่งถูกหยุดทำงานเธรดอื่นจะดำเนินต่อ จากมุมมองของซอฟต์แวร์มีโปรเซสเซอร์อิสระสองตัว มันเกิดขึ้นที่โปรเซสเซอร์เหล่านั้นใช้องค์ประกอบร่วมกันหลายอย่างภายใต้ประทุน
สลับเป็นอีกระดับหนึ่งในลำดับชั้นของแคชหน่วยความจำ: หน่วยความจำหลักสามารถมองเห็นเป็นแคชสำหรับพื้นที่สว็อป ด้วยการสลับกลไกและอัตราส่วนประสิทธิภาพจะแตกต่างกัน หากภารกิจต้องการข้อมูลที่จะโหลดจาก swap คำสั่งโหลดจะทริกเกอร์กับดักซึ่งประมวลผลรหัสเคอร์เนลเพื่อจัดสรรหน้าใน RAM และโหลดเนื้อหาจากดิสก์ ในขณะที่สิ่งนี้เกิดขึ้นเคอร์เนลอาจตัดสินใจเปลี่ยนไปใช้งานอื่น
คำตอบสำหรับคำถามนี้จะแตกต่างกันไปตามสถาปัตยกรรมที่มีปัญหา ในขณะที่ซีพียูจำนวนมากจะหยุดทำงาน (ARM, x86 โดยไม่ต้องไฮเปอร์เธรด ฯลฯ ) เนื่องจากใช้เวลาในการสลับเธรดนานเกินไปนั่นไม่ใช่วิธีการที่ใช้ในทุกสถาปัตยกรรม ในบางสถาปัตยกรรมแต่ละเธรดที่กำหนดเวลาไว้บน CPU มีไฟล์รีจิสเตอร์อิสระของตัวเองดังนั้นโปรเซสเซอร์อาจดำเนินการงานจากเธรดที่ไม่รอการเข้าถึงหน่วยความจำ ฉันเข้าใจว่านี่คือขอบเขตที่ จำกัด สิ่งที่ไฮเปอร์เธรด x86 ทำ (ใช้เพียง 2 เธรด) แต่มันก็ธรรมดากว่ามาก GPGPUสถาปัตยกรรม ในกรณีเฉพาะของ CUDA อย่างน้อยหลายสิบถ้าไม่ใช่หลายร้อยแห่งเกลียวของเธรดมักจะโหลดบนมัลติโปรเซสเซอร์ที่กำหนดในเวลาใดก็ตามโดยแต่ละเธรด (หลายร้อยหรือหลายพัน) มีรีจิสเตอร์ของตนเอง สิ่งนี้อนุญาตให้สถาปัตยกรรมดำเนินการคำสั่งจากเธรดอื่นในรอบถัดไปเมื่อเธรดที่กำหนดมีปัญหาการเข้าถึงหน่วยความจำ ดังนั้นตราบเท่าที่โหลดเธรดจำนวนมากเพียงพอแกนประมวลผลจะไม่ว่างสำหรับการเข้าถึงหน่วยความจำ ดูแนวทางการปฏิบัติงานและลำดับชั้นของหน่วยความจำสำหรับข้อมูลเพิ่มเติม