กลับไปหน้าบทความ

อ่าน 7 นาที

การดึงข้อมูลแคชล่วงหน้า

การดึงข้อมูลแคชล่วงหน้า เป็นเทคนิคที่ หน่วยประมวลผลกลาง (CPU) ใช้เพื่อเพิ่มประสิทธิภาพการทำงานโดยการดึงคำสั่งหรือข้อมูลจากหน่วยความจำหลักหรือหน่วยความจำที่ทำงานช้ากว่าไปยังหน่วยควา...

การดึงข้อมูลแคชล่วงหน้า

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

การดึงข้อมูลล่วงหน้าจากแคชข้อมูลเทียบกับแคชคำสั่ง

การดึงข้อมูลล่วงหน้าจากแคชสามารถดึงข้อมูลหรือคำสั่งเข้าไปในแคชได้

  • การดึงข้อมูลล่วงหน้า (Data prefetching)คือการดึงข้อมูลก่อนที่จะมีความจำเป็นต้องใช้ เนื่องจากรูปแบบการเข้าถึงข้อมูลมีความสม่ำเสมอน้อยกว่ารูปแบบคำสั่ง การดึงข้อมูลล่วงหน้าอย่างแม่นยำจึงมักมีความท้าทายมากกว่าการดึงคำสั่งล่วงหน้า
  • การดึงคำสั่ง ล่วงหน้า (Instruction prefetching)คือการดึงคำสั่งมาก่อนที่จะต้องนำไปประมวลผล ไมโครโปรเซสเซอร์หลักรุ่นแรกๆ ที่ใช้เทคนิคการดึงคำสั่งล่วงหน้า ได้แก่Intel 8086 (หกไบต์) และMotorola 68000 (สี่ไบต์) ในช่วงไม่กี่ปีมานี้ โปรเซสเซอร์ประสิทธิภาพสูงทั้งหมดใช้เทคนิคการดึงคำสั่งล่วงหน้าแล้ว

การดึงข้อมูลแคชล่วงหน้าแบบฮาร์ดแวร์เทียบกับแบบซอฟต์แวร์

การดึงแคชล่วงหน้าสามารถทำได้โดยฮาร์ดแวร์หรือซอฟต์แวร์[ 3 ]

  • โดยทั่วไปแล้ว การดึงข้อมูลล่วงหน้าโดยใช้ฮาร์ดแวร์จะทำได้โดยใช้กลไกฮาร์ดแวร์เฉพาะในโปรเซสเซอร์ที่คอยตรวจสอบกระแสคำสั่งหรือข้อมูลที่โปรแกรมที่กำลังทำงานร้องขอ จดจำองค์ประกอบถัดไปสองสามรายการที่โปรแกรมอาจต้องการโดยอิงจากกระแสนี้ และดึงข้อมูลล่วงหน้าลงในแคชของโปรเซสเซอร์[ 4 ]
  • โดยทั่วไปแล้ว การดึงข้อมูลล่วงหน้าโดยใช้ซอฟต์แวร์จะทำได้โดยให้คอมไพเลอร์วิเคราะห์โค้ดและแทรกคำสั่ง "ดึงข้อมูลล่วงหน้า" เพิ่มเติมลงในโปรแกรมระหว่างการคอมไพล์[ 5 ]

วิธีการดึงข้อมูลฮาร์ดแวร์ล่วงหน้า

บัฟเฟอร์สตรีม

  • บัฟเฟอร์สตรีมได้รับการพัฒนาขึ้นโดยอิงตามแนวคิดของ "รูปแบบการมองล่วงหน้าหนึ่งบล็อก (OBL)" ที่เสนอโดยAlan Jay Smith [ 1 ]
  • บัฟเฟอร์สตรีมเป็นหนึ่งในเทคนิคการดึงข้อมูลล่วงหน้าแบบฮาร์ดแวร์ที่ใช้กันทั่วไป เทคนิคนี้ได้รับการเสนอครั้งแรกโดยNorman Jouppiในปี 1990 [ 6 ]และมีการพัฒนาวิธีการนี้ในรูปแบบต่างๆ มากมายตั้งแต่นั้นมา[ 7 ] [ 8 ] [ 9 ]แนวคิดพื้นฐานคือ ที่ อยู่ แคชพลาด (และ ที่อยู่ถัดไป kที่อยู่) จะถูกดึงไปยังบัฟเฟอร์แยกต่างหากที่มีความลึกkบัฟเฟอร์นี้เรียกว่าบัฟเฟอร์สตรีมและแยกจากแคช จากนั้นโปรเซสเซอร์จะใช้ข้อมูล/คำสั่งจากบัฟเฟอร์สตรีมหากที่อยู่ที่เกี่ยวข้องกับบล็อกที่ดึงมาล่วงหน้าตรงกับที่อยู่ร้องขอที่สร้างโดยโปรแกรมที่กำลังทำงานบนโปรเซสเซอร์ รูปด้านล่างแสดงการตั้งค่านี้:
การตั้งค่าบัฟเฟอร์สตรีมแบบทั่วไปตามที่เสนอไว้แต่เดิม
การตั้งค่าบัฟเฟอร์สตรีมทั่วไปตามที่ Norman Jouppi เสนอไว้ครั้งแรกในปี 1990 [ 6 ]
  • เมื่อใดก็ตามที่กลไกการดึงข้อมูลล่วงหน้าตรวจพบการพลาดในบล็อกหน่วยความจำ เช่น บล็อกAมันจะจัดสรรสตรีมเพื่อเริ่มต้นการดึงข้อมูลล่วงหน้าบล็อกถัดไปจากบล็อกที่พลาดไป หากบัฟเฟอร์สตรีมสามารถเก็บได้ 4 บล็อก โปรเซสเซอร์จะดึงข้อมูลล่วงหน้าA +1, A +2, A +3, A +4 และเก็บไว้ในบัฟเฟอร์สตรีมที่จัดสรรไว้ หากโปรเซสเซอร์ใช้A +1 ในครั้งต่อไป มันจะถูกย้าย "ขึ้น" จากบัฟเฟอร์สตรีมไปยังแคชของโปรเซสเซอร์ รายการแรกของบัฟเฟอร์สตรีมจะเป็นA +2 และต่อไปเรื่อยๆ รูปแบบการดึงข้อมูลล่วงหน้าบล็อกถัดไปนี้เรียกว่าการดึงข้อมูลล่วงหน้าแบบลำดับ (Sequential Prefetching ) ส่วนใหญ่จะใช้เมื่อต้องการดึงข้อมูลล่วงหน้าในตำแหน่งที่อยู่ติดกัน ตัวอย่างเช่น ใช้ในการดึงข้อมูลล่วงหน้าคำสั่ง
  • กลไกนี้สามารถขยายขนาดได้โดยการเพิ่มบัฟเฟอร์สตรีมดังกล่าวหลายตัว ซึ่งแต่ละตัวจะรักษาสตรีมพรีเฟตช์แยกต่างหาก[ 10 ]สำหรับการพลาดแต่ละครั้ง จะมีการจัดสรรบัฟเฟอร์สตรีมใหม่ และจะทำงานในลักษณะที่คล้ายคลึงกันดังที่ได้อธิบายไว้ข้างต้น
  • ความลึกที่เหมาะสมของบัฟเฟอร์สตรีมขึ้นอยู่กับการทดลองกับเกณฑ์มาตรฐานต่างๆ[ 6 ] และขึ้นอยู่กับ สถาปัตยกรรมไมโครส่วนที่เหลือที่เกี่ยวข้อง[ 11 ]

การดึงข้อมูลล่วงหน้าแบบก้าวเดิน

การดึงข้อมูลล่วงหน้าประเภทนี้จะตรวจสอบความแตกต่างระหว่างที่อยู่ของหน่วยความจำที่เข้าถึง และมองหารูปแบบภายในความแตกต่างนั้น

ก้าวเดินปกติ

ในรูปแบบนี้ การเข้าถึงหน่วยความจำที่ต่อเนื่องกันจะเกิดขึ้นกับบล็อกที่อยู่ ห่างกัน sแอดเดรส[ 3 ] [ 12 ]ในกรณีนี้ ตัวดึงข้อมูลล่วงหน้าจะคำนวณค่าsและใช้เพื่อคำนวณแอดเดรสหน่วยความจำสำหรับการดึงข้อมูลล่วงหน้า ตัวอย่างเช่น ถ้าs = 4แอดเดรสที่จะดึงข้อมูลล่วงหน้าจะเป็นA +4

ก้าวเดินที่ไม่สม่ำเสมอในเชิงพื้นที่

ในกรณีนี้ เดลต้าระหว่างที่อยู่ของการเข้าถึงหน่วยความจำที่ต่อเนื่องกันนั้นแปรผันได้ แต่ยังคงเป็นไปตามรูปแบบ การออกแบบพรีเฟตเชอร์บางส่วน[ 9 ] [ 13 ] [ 14 ]ใช้ประโยชน์จากคุณสมบัตินี้เพื่อทำนายและดึงข้อมูลล่วงหน้าสำหรับการเข้าถึงในอนาคต

การดึงข้อมูลล่วงหน้าตามเวลาที่ไม่ปกติ

คลาสของพรีเฟตเชอร์นี้จะมองหาสตรีมการเข้าถึงหน่วยความจำที่ซ้ำกันเมื่อเวลาผ่านไป[ 15 ] [ 16 ]ตัวอย่างเช่น ในสตรีมการเข้าถึงหน่วยความจำ N, A, B, C, E, G, H, A, B, C, I, J, K, A, B, C, L, M, N, O, A, B, C, ...; สตรีม A, B, C จะซ้ำกันเมื่อเวลาผ่านไป รูปแบบการออกแบบอื่นๆ ได้พยายามนำเสนอการใช้งานที่มีประสิทธิภาพมากขึ้น[ 17 ] [ 18 ]

การดึงข้อมูลล่วงหน้าแบบร่วมมือกัน

แอปพลิเคชันคอมพิวเตอร์สร้างรูปแบบการเข้าถึงที่หลากหลาย สถาปัตยกรรมของโปรเซสเซอร์และระบบย่อยหน่วยความจำที่ใช้ในการเรียกใช้แอปพลิเคชันเหล่านี้ทำให้รูปแบบการเข้าถึงหน่วยความจำที่สร้างขึ้นมีความชัดเจนยิ่งขึ้น ดังนั้น ประสิทธิภาพและประสิทธิผลของแผนการดึงข้อมูลล่วงหน้าจึงมักขึ้นอยู่กับแอปพลิเคชันและสถาปัตยกรรมที่ใช้ในการเรียกใช้[ 19 ]งานวิจัยล่าสุด[ 20 ] [ 21 ]ได้มุ่งเน้นไปที่การสร้างกลไกการทำงานร่วมกันเพื่อใช้แผนการดึงข้อมูลล่วงหน้าหลายแบบร่วมกันเพื่อให้ครอบคลุมและแม่นยำยิ่งขึ้นในการดึงข้อมูลล่วงหน้า

วิธีการดึงข้อมูลซอฟต์แวร์ล่วงหน้า

การดึงข้อมูลล่วงหน้าตามคำสั่งของคอมไพเลอร์

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

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

ข้อดีหลักประการหนึ่งของการดึงข้อมูลล่วงหน้าด้วยซอฟต์แวร์คือช่วยลดจำนวนแคชพลาดที่จำเป็น[ 3 ]

ตัวอย่างต่อไปนี้แสดงการเพิ่มคำสั่งดึงข้อมูลล่วงหน้า (prefetch) เข้าไปในโค้ดเพื่อปรับปรุงประสิทธิภาพของแคช

ในการทำซ้ำครั้งต่อไป

สำหรับ( size_t i = 0 ; i < 1024 ; ++ i ) { array1 [ i ] *= 2 ; }

มีการเข้าถึง องค์ประกอบiที่ iของอาร์เรย์array1ระบบสามารถดึงข้อมูลล่วงหน้าขององค์ประกอบที่คาดว่าจะถูกเข้าถึงในรอบการทำงานถัดไปได้โดยการแทรกคำสั่งดึงข้อมูลล่วงหน้าดังแสดงด้านล่าง:

สำหรับ( size_t i = 0 ; i < 1024 ; ++ i ) { prefetch ( array1 [ i + k ]); array1 [ i ] *= 2 ; }

ในที่นี้ ระยะการดึงข้อมูลล่วงหน้า (prefetch stride) kขึ้นอยู่กับสองปัจจัย คือ ค่าปรับจากการพลาดแคช (cache miss penalty) และเวลาที่ใช้ในการวนซ้ำหนึ่งรอบของลูป for ตัวอย่างเช่น หากการวนซ้ำหนึ่งรอบใช้เวลา 7 รอบ และค่าปรับจากการพลาดแคชคือ 49 รอบ ดังนั้น k ควรมีค่าเท่ากับ 49/7 = 7 ซึ่งหมายความว่าระบบควรดึงข้อมูลล่วงหน้า 7 องค์ประกอบ ในการวนซ้ำครั้งแรก ค่าของ k iจะเป็น 0 ดังนั้นระบบจึงดึงข้อมูลล่วงหน้าองค์ประกอบที่ 7 ด้วยการจัดเรียงนี้ การเข้าถึง 7 ครั้งแรก ( i= 0 → 6) จะยังคงเป็นการเข้าถึงพลาดแคช (ภายใต้สมมติฐานแบบง่ายๆ ว่าแต่ละองค์ประกอบของ k array1อยู่ในบรรทัดแคชที่แยกจากกัน)

การเปรียบเทียบการดึงข้อมูลล่วงหน้าด้วยฮาร์ดแวร์และซอฟต์แวร์

  • ในขณะที่การดึงข้อมูลล่วงหน้าด้วยซอฟต์แวร์ต้องอาศัยการแทรกแซงจากโปรแกรมเมอร์หรือคอมไพเลอร์การดึงข้อมูลล่วงหน้าด้วยฮาร์ดแวร์ต้องอาศัยกลไกฮาร์ดแวร์พิเศษ[ 3 ]
  • การดึงข้อมูลล่วงหน้าด้วยซอฟต์แวร์จะทำงานได้ดีเฉพาะกับลูปที่มีการเข้าถึงอาร์เรย์เป็นประจำเท่านั้น เนื่องจากโปรแกรมเมอร์ต้องเขียนโค้ดคำสั่งดึงข้อมูลล่วงหน้าด้วยตนเอง ในขณะที่ตัวดึงข้อมูลล่วงหน้าด้วยฮาร์ดแวร์จะทำงานแบบไดนามิกตามพฤติกรรมของโปรแกรมในระหว่างการทำงาน[ 3 ]
  • การดึงข้อมูลล่วงหน้าด้วยฮาร์ดแวร์ยังใช้ทรัพยากร CPU น้อยกว่าเมื่อเทียบกับการดึงข้อมูลล่วงหน้าด้วยซอฟต์แวร์[ 22 ]อย่างไรก็ตาม การดึงข้อมูลล่วงหน้าด้วยซอฟต์แวร์สามารถลดข้อจำกัดบางประการของการดึงข้อมูลล่วงหน้าด้วยฮาร์ดแวร์ ซึ่งนำไปสู่การปรับปรุงประสิทธิภาพ[ 23 ]

ตัวชี้วัดการดึงข้อมูลแคชล่วงหน้า

การดึงข้อมูลแคชล่วงหน้าสามารถประเมินได้จากตัวชี้วัดหลักสามประการ[ 3 ]

ความคุ้มครอง

อัตราการครอบคลุม คือ สัดส่วนของจำนวนการพลาดทั้งหมดที่ถูกกำจัดออกไปเนื่องจากการดึงข้อมูลล่วงหน้า กล่าวคือ

ความคุ้มครอง = การพลาดแคชถูกกำจัดด้วยการดึงข้อมูลล่วงหน้า/จำนวนแคชพลาดทั้งหมด ,

ที่ไหน

จำนวนแคชพลาดทั้งหมด = (แคชพลาดที่ถูกกำจัดโดยการดึงข้อมูลล่วงหน้า) + (แคชพลาดที่ไม่ได้ถูกกำจัดโดยการดึงข้อมูลล่วงหน้า)

ความแม่นยำ

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

ความแม่นยำในการดึงข้อมูลล่วงหน้า = การพลาดแคชถูกกำจัดด้วยการดึงข้อมูลล่วงหน้า/(การดึงข้อมูลแคชล่วงหน้าที่ไร้ประโยชน์) + (การลดการพลาดแคชด้วยการดึงข้อมูลล่วงหน้า)

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

ความตรงต่อเวลา

นิยามเชิงคุณภาพของความทันเวลาคือ ระยะเวลาที่ผ่านไปนับตั้งแต่การดึงข้อมูลล่วงหน้าจนถึงการอ้างอิงจริง ตัวอย่างเช่น เพื่อให้การดึงข้อมูลล่วงหน้ามีประโยชน์ในลูป forที่แต่ละรอบใช้เวลาสามรอบการทำงาน และการดึงข้อมูลล่วงหน้าใช้เวลาสิบสองรอบการทำงาน ระบบจะต้องเริ่มการดึงข้อมูลล่วงหน้า 12/3 = 4 รอบการทำงานก่อนที่จะใช้งานจริง เพื่อรักษาความทันเวลา

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Cache_prefetching&oldid=1349307638 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การดึงข้อมูลแคชล่วงหน้า

การดึงข้อมูลแคชล่วงหน้า เป็นเทคนิคที่ หน่วยประมวลผลกลาง (CPU) ใช้เพื่อเพิ่มประสิทธิภาพการทำงานโดยการดึงคำสั่งหรือข้อมูลจากหน่วยความจำหลักหรือหน่วยความจำที่ทำงานช้ากว่าไปยังหน่วยควา...

การดึงข้อมูลล่วงหน้าจากแคชข้อมูลเทียบกับแคชคำสั่ง

การดึงข้อมูลล่วงหน้าจากแคชสามารถดึงข้อมูลหรือคำสั่งเข้าไปในแคชได้

การดึงข้อมูลแคชล่วงหน้าแบบฮาร์ดแวร์เทียบกับแบบซอฟต์แวร์

การดึงแคชล่วงหน้าสามารถทำได้โดยฮาร์ดแวร์หรือซอฟต์แวร์ [ 3 ]

บัฟเฟอร์สตรีม

บัฟเฟอร์สตรีมได้รับการพัฒนาขึ้นโดยอิงตามแนวคิดของ "รูปแบบการมองล่วงหน้าหนึ่งบล็อก (OBL)" ที่เสนอโดย Alan Jay Smith [ 1 ] บัฟเฟอร์ สตรีมเป็นหนึ่งในเทคนิคการดึงข้อมูลล่วงหน้าแบบฮาร์ดแวร์ที่ใช้กันทั่วไป เทคนิคนี้ได้รับการเสนอครั้งแรกโดย Norman Jouppi ในปี 1990 [...