หากคุณเพิ่งเริ่มเรียนรู้ว่าซีพียูแบบมัลติคอร์การแคชการทำงานร่วมกันของแคชและหน่วยความจำทำงานอย่างไรในตอนแรกอาจดูสับสนเล็กน้อย ด้วยเหตุนี้โพสต์ SuperUser Q&A ของวันนี้จึงมีคำตอบสำหรับคำถามของผู้อ่านที่อยากรู้อยากเห็น
เซสชันคำถามและคำตอบของวันนี้มาถึงเราโดยได้รับความอนุเคราะห์จาก SuperUser ซึ่งเป็นแผนกย่อยของ Stack Exchange ซึ่งเป็นการรวมกลุ่มเว็บไซต์ถาม & ตอบโดยชุมชน
คำถาม
ผู้อ่าน SuperUser CarmeloS ต้องการทราบว่าเมื่อแคชของ CPU ถูกล้างกลับไปที่หน่วยความจำหลัก:
ถ้าฉันมีซีพียูที่มีสองคอร์และแต่ละคอร์มีแคช L1 ของตัวเองเป็นไปได้ไหมที่ทั้ง Core1 และ Core2 จะแคชส่วนเดียวกันของหน่วยความจำในเวลาเดียวกัน หากเป็นไปได้ค่าของหน่วยความจำหลักจะเป็นเท่าใดหากทั้ง Core1 และ Core2 แก้ไขค่าในแคช
แคชของ CPU จะล้างกลับไปที่หน่วยความจำหลักเมื่อใด
คำตอบ
ผู้สนับสนุน SuperUser David Schwartz, sleske และ Kimberly W มีคำตอบให้เรา ก่อนอื่น David Schwartz:
ถ้าฉันมีซีพียูที่มีสองคอร์และแต่ละคอร์มีแคช L1 ของตัวเองเป็นไปได้ไหมที่ทั้ง Core1 และ Core2 จะแคชส่วนเดียวกันของหน่วยความจำในเวลาเดียวกัน
ใช่ประสิทธิภาพจะแย่มากถ้าไม่ใช่กรณีนี้ พิจารณาสองเธรดที่ใช้รหัสเดียวกัน คุณต้องการรหัสนั้นในแคช L1 ทั้งสอง
หากเป็นไปได้ค่าของหน่วยความจำหลักจะเป็นเท่าใดหากทั้ง Core1 และ Core2 แก้ไขค่าในแคช
ค่าเก่าจะอยู่ในหน่วยความจำหลักซึ่งจะไม่สำคัญเนื่องจากทั้งสองคอร์จะไม่อ่านมัน ก่อนที่จะลบค่าที่แก้ไขออกจากแคชจะต้องเขียนลงในหน่วยความจำ โดยทั่วไปแล้วตัวแปรบางอย่างของไฟล์ โปรโตคอล MESI ถูกนำมาใช้. ในการใช้งาน MESI แบบดั้งเดิมหากมีการแก้ไขค่าในแคชหนึ่งจะไม่สามารถแสดงในแคชอื่น ๆ ที่ระดับเดียวกัน
ตามด้วยคำตอบจาก sleske:
ใช่การมีแคชสองแคชในพื้นที่หน่วยความจำเดียวกันอาจเกิดขึ้นได้และเป็นปัญหาที่เกิดขึ้นมากมายในทางปฏิบัติ มีวิธีแก้ปัญหามากมายเช่น:
- แคชทั้งสองสามารถสื่อสารเพื่อให้แน่ใจว่าพวกเขาไม่เห็นด้วย
- คุณสามารถมีหัวหน้างานบางประเภทที่คอยตรวจสอบแคชทั้งหมดและอัปเดตตามนั้น
- โปรเซสเซอร์แต่ละตัวจะตรวจสอบพื้นที่หน่วยความจำที่แคชไว้และเมื่อตรวจพบการเขียนมันจะพ่นแคช (ตอนนี้ไม่ถูกต้อง) ออกไป
ปัญหานี้เรียกว่าการเชื่อมโยงกันของแคชและไฟล์ บทความ Wikipedia ในหัวข้อนี้มีภาพรวมที่ดีของปัญหาและแนวทางแก้ไขที่เป็นไปได้
และคำตอบสุดท้ายของเราจาก Kimberly W:
ในการตอบคำถามในชื่อโพสต์ของคุณขึ้นอยู่กับว่าโปรโตคอลการแคชคืออะไร หากเป็นการเขียนกลับแคชจะถูกล้างกลับไปที่หน่วยความจำหลักก็ต่อเมื่อตัวควบคุมแคชไม่มีทางเลือกอื่นนอกจากใส่บล็อกแคชใหม่ในพื้นที่ว่างที่มีอยู่แล้ว บล็อกที่ครอบครองพื้นที่ก่อนหน้านี้จะถูกลบออกและค่าของมันจะถูกเขียนกลับไปยังหน่วยความจำหลัก
โปรโตคอลอื่นคือการเขียนผ่าน ในกรณีนี้เมื่อใดก็ตามที่บล็อกแคชถูกเขียนในระดับ n บล็อกที่สอดคล้องกันในระดับ n + 1 ได้รับการอัปเดต มันคล้ายกับแนวคิดในการกรอกแบบฟอร์มด้วยกระดาษคาร์บอนด้านล่าง สิ่งที่คุณเขียนไว้ด้านบนจะถูกคัดลอกไว้ในแผ่นงานด้านล่าง สิ่งนี้ช้ากว่าเนื่องจากเห็นได้ชัดว่าเกี่ยวข้องกับการดำเนินการเขียนมากกว่า แต่ค่าระหว่างแคชจะสอดคล้องกันมากกว่า ในรูปแบบการเขียนกลับมีเพียงแคชระดับสูงสุดเท่านั้นที่จะมีค่าล่าสุดสำหรับบล็อกหน่วยความจำเฉพาะ
มีสิ่งที่จะเพิ่มคำอธิบาย? ปิดเสียงในความคิดเห็น ต้องการอ่านคำตอบเพิ่มเติมจากผู้ใช้ Stack Exchange ที่เชี่ยวชาญด้านเทคโนโลยีคนอื่น ๆ หรือไม่? ดูกระทู้สนทนาฉบับเต็มได้ที่นี่ .
เครดิตรูปภาพ: Lemsipmatt (Flickr)