CPU (ตัวควบคุมหน่วยความจำโดยเฉพาะ) สามารถใช้ประโยชน์จากความจริงที่ว่าหน่วยความจำไม่ได้กลายพันธุ์
ข้อได้เปรียบคือข้อเท็จจริงนี้ช่วยประหยัดคอมไพเลอร์จากการใช้คำแนะนำmembarเมื่อมีการเข้าถึงข้อมูล
หน่วยความจำกีดขวางหรือที่เรียกว่า membar รั้วหน่วยความจำหรือคำสั่งรั้วเป็นประเภทของการเรียนการสอนอุปสรรคซึ่งทำให้หน่วยประมวลผลกลาง (CPU) หรือคอมไพเลอร์เพื่อบังคับใช้ข้อ จำกัด การสั่งซื้อในการดำเนินงานหน่วยความจำก่อนและหลัง ซึ่งโดยทั่วไปหมายความว่าการดำเนินการบางอย่างได้รับการรับรองว่าจะต้องดำเนินการก่อนที่จะมีสิ่งกีดขวางและอื่น ๆ หลังจากนั้น
ปัญหาและอุปสรรคหน่วยความจำมีความจำเป็นเนื่องจาก CPU ที่ทันสมัยส่วนใหญ่ใช้การปรับปรุงประสิทธิภาพที่สามารถส่งผลให้เกิดการดำเนินการตามคำสั่ง การเรียงลำดับใหม่ของการดำเนินการของหน่วยความจำ (โหลดและเก็บ) โดยปกติแล้วจะไม่มีใครสังเกตเห็นภายในการดำเนินการของเธรดเดียว แต่อาจทำให้เกิดพฤติกรรมที่ไม่สามารถคาดเดาได้ในโปรแกรมและไดรเวอร์อุปกรณ์ที่เกิดขึ้นพร้อมกัน
คุณจะเห็นเมื่อข้อมูลถูกเข้าถึงจากเธรดที่แตกต่างกันที่ CPU แบบมัลติคอร์มันจะเป็นดังนี้: เธรดที่แตกต่างกันทำงานที่แกนที่ต่างกันแต่ละตัวใช้แคชของตัวเอง (ภายในกับแกนหลัก) - สำเนาของแคชทั่วโลก
หากข้อมูลไม่แน่นอนและโปรแกรมเมอร์ต้องการให้สอดคล้องกันระหว่างเธรดที่แตกต่างกันจำเป็นต้องใช้มาตรการเพื่อรับประกันความสอดคล้อง สำหรับโปรแกรมเมอร์หมายถึงการใช้การซิงโครไนซ์โครงสร้างเมื่อเข้าถึง (เช่นอ่าน) ข้อมูลในเธรดเฉพาะ
สำหรับคอมไพเลอร์โครงสร้างการซิงโครไนซ์ในรหัสหมายความว่าจำเป็นต้องแทรกคำสั่ง membarเพื่อให้แน่ใจว่าการเปลี่ยนแปลงที่ทำกับสำเนาของข้อมูลที่แกนใดแกนหนึ่งถูกเผยแพร่อย่างถูกต้อง ("เผยแพร่") เพื่อรับประกันว่าแคชที่แกนอื่น ๆ มีสำเนาเดียวกัน (ล่าสุด)
ค่อนข้างง่ายดูหมายเหตุด้านล่างนี่คือสิ่งที่เกิดขึ้นที่ตัวประมวลผลแบบมัลติคอร์สำหรับ membar:
- แกนทั้งหมดหยุดการประมวลผล - เพื่อหลีกเลี่ยงการเขียนแคช
- การอัปเดตทั้งหมดที่ทำกับแคชในเครื่องนั้นจะถูกเขียนกลับไปเป็นโกลบอลแคช - เพื่อให้แน่ใจว่าแคชสากลมีข้อมูลล่าสุด ใช้เวลาพอสมควร
- ข้อมูลที่อัปเดตจะถูกเขียนจากแคชสากลไปยังโลคัลแคช - เพื่อให้แน่ใจว่าแคชโลคัลมีข้อมูลล่าสุด ใช้เวลาพอสมควร
- แกนประมวลผลทั้งหมดดำเนินการต่อ
คุณจะเห็นแกนทั้งหมดที่มีการทำอะไรในขณะที่ข้อมูลจะถูกคัดลอกไปมาระหว่างแคชโลกและท้องถิ่น นี่เป็นสิ่งจำเป็นเพื่อให้แน่ใจว่าข้อมูลที่ไม่แน่นอนถูกซิงโครไนซ์อย่างเหมาะสม (ปลอดภัยของเธรด) หากมี 4 คอร์ทั้ง 4 หยุดและรอในขณะที่แคชถูกซิงค์ หากมี 8 ทั้งหมด 8 หยุด หากมี 16 ... ทีนี้คุณมี 15 คอร์ที่ไม่ได้ทำอะไรเลยในขณะที่รอสิ่งที่ต้องทำที่หนึ่งในนั้น
ทีนี้มาดูกันว่าเกิดอะไรขึ้นเมื่อข้อมูลไม่เปลี่ยนรูป? ไม่ว่าเธรดจะเข้าถึงสิ่งใดก็ตามจะรับประกันว่าเหมือนกัน สำหรับโปรแกรมเมอร์นี่หมายถึงไม่จำเป็นต้องแทรกโครงสร้างการซิงโครไนซ์เมื่อเข้าถึงข้อมูล (อ่าน) ในเธรดเฉพาะ
สำหรับคอมไพเลอร์สิ่งนี้ก็ไม่จำเป็นต้องใช้ที่จะแทรกคำแนะนำ membar
ดังนั้นการเข้าถึงข้อมูลจึงไม่จำเป็นต้องหยุดแกนกลางและรอในขณะที่ข้อมูลกำลังถูกเขียนไปมาระหว่างแคชระดับโลกและระดับท้องถิ่น นั่นคือประโยชน์จากความจริงที่ว่าหน่วยความจำจะไม่กลายพันธุ์
หมายเหตุค่อนข้างลดความซับซ้อนของสาเหตุดังกล่าวลดลงผลกระทบเชิงลบบางอย่างที่มีความซับซ้อนมากขึ้นของข้อมูลที่ถูกไม่แน่นอนเช่นในpipelining เพื่อรับประกันการสั่งซื้อที่ต้องการ CPU จะต้องยกเลิกการใช้งาน pilelines ที่ได้รับผลกระทบจากการเปลี่ยนแปลงข้อมูล หากสิ่งนี้ถูกนำมาใช้โดยตรงไปตรงมา (และเชื่อถือได้ :) การทำให้เป็นโมฆะของท่อทั้งหมดแล้วผลกระทบเชิงลบจะถูกขยายเพิ่มเติม