การใช้รั้วหน่วยความจำที่ชัดเจนหมายถึงอะไร?
การใช้รั้วหน่วยความจำที่ชัดเจนหมายถึงอะไร?
คำตอบ:
สำหรับประสิทธิภาพที่เพิ่มขึ้นซีพียูสมัยใหม่มักจะดำเนินการตามคำสั่งเพื่อใช้ประโยชน์สูงสุดจากซิลิกอนที่มีอยู่ (รวมถึงการอ่าน / เขียนหน่วยความจำ) เนื่องจากฮาร์ดแวร์บังคับใช้ความสมบูรณ์ของคำแนะนำคุณจึงไม่เคยสังเกตเห็นสิ่งนี้ในเธรดการดำเนินการเดียว อย่างไรก็ตามสำหรับหลายเธรดหรือสภาพแวดล้อมที่มีหน่วยความจำระเหย (เช่นหน่วยความจำที่แมป I / O) สิ่งนี้อาจนำไปสู่พฤติกรรมที่ไม่สามารถคาดเดาได้
รั้ว / อุปสรรคหน่วยความจำคือชั้นของคำสั่งที่หมายความว่าหน่วยความจำอ่าน / เขียนเกิดขึ้นตามลำดับที่คุณคาดหวัง ตัวอย่างเช่น "เต็มรั้ว" หมายถึงอ่าน / เขียนทั้งหมดก่อนที่รั้วจะมาถึงก่อนรั้วหลังรั้ว
หมายเหตุรั้วหน่วยความจำเป็นแนวคิดของฮาร์ดแวร์ ในภาษาระดับสูงเราใช้ในการจัดการกับ mutexes และ semaphores ซึ่งอาจนำไปใช้งานได้ดีโดยใช้ memory fences ในระดับต่ำและไม่จำเป็นต้องใช้อุปสรรคด้านความจำอย่างชัดเจน การใช้อุปสรรคด้านหน่วยความจำจำเป็นต้องมีการศึกษาสถาปัตยกรรมฮาร์ดแวร์อย่างรอบคอบและมักพบในไดรเวอร์อุปกรณ์มากกว่ารหัสแอปพลิเคชัน
การจัดลำดับใหม่ของ CPU นั้นแตกต่างจากการเพิ่มประสิทธิภาพคอมไพเลอร์ - แม้ว่าสิ่งประดิษฐ์จะคล้ายกันก็ตาม คุณจำเป็นต้องใช้มาตรการแยกต่างหากเพื่อหยุดคอมไพลเลอร์ที่จัดลำดับคำสั่งของคุณใหม่หากสิ่งนั้นอาจทำให้เกิดพฤติกรรมที่ไม่พึงปรารถนา (เช่นการใช้คีย์เวิร์ดระเหยใน C)
การคัดลอกคำตอบของฉันไปยังคำถามอื่นมีเทคนิคอะไรบ้างที่โปรเซสเซอร์ใช้ในการปรับโค้ดให้เหมาะสม :
สิ่งที่สำคัญที่สุดคือการจัดลำดับการเข้าถึงหน่วยความจำใหม่
ไม่มีกรอบหน่วยความจำหรือคำแนะนำในการทำให้เป็นอนุกรมโปรเซสเซอร์มีอิสระในการจัดลำดับการเข้าถึงหน่วยความจำใหม่ สถาปัตยกรรมโปรเซสเซอร์บางตัวมีข้อ จำกัด ในการเรียงลำดับใหม่ได้ อัลฟ่าเป็นที่รู้จักกันดีว่าอ่อนแอที่สุด (กล่าวคือคนที่สามารถเรียงลำดับใหม่ได้มากที่สุด)
การรักษาที่ดีมากของเรื่องที่สามารถพบได้ในเอกสารที่มาลินุกซ์เคอร์เนลที่เอกสาร / หน่วยความจำ barriers.txt
โดยส่วนใหญ่แล้วควรใช้การล็อกแบบดั้งเดิมจากคอมไพเลอร์หรือไลบรารีมาตรฐานของคุณ สิ่งเหล่านี้ได้รับการทดสอบอย่างดีควรมีอุปสรรคด้านหน่วยความจำที่จำเป็นทั้งหมดและอาจได้รับการปรับให้เหมาะสมที่สุด (การเพิ่มประสิทธิภาพการล็อคแบบดั้งเดิมเป็นเรื่องยุ่งยากแม้แต่ผู้เชี่ยวชาญก็สามารถเข้าใจผิดได้ในบางครั้ง)
Alpha is known for being the weakest
ทำไมweakest
? ไม่ดีกว่าเหรอที่จะเรียงลำดับใหม่มากขึ้นดังนั้นมันจะทำให้การดำเนินการเร็วขึ้นมาก? (ฉันไม่ใช่ผู้ใช้อัลฟ่า แต่ถามเกี่ยวกับผลของvery reordering
vs restricted reordering
) ดังนั้นข้อเสียของการเรียงลำดับล็อตใหม่คืออะไร (ยกเว้นความเสี่ยงของพฤติกรรมที่ไม่ได้กำหนด แต่ฉันเดาว่าซีพียูที่ทันสมัยส่วนใหญ่ควรแก้ไขการเรียงลำดับใหม่ที่ดีและได้ใช้การจัดลำดับใหม่ที่กำหนดไว้เท่านั้นมิฉะนั้นจะไม่สมเหตุสมผลกับการตัดสินใจที่ทำ)
จากประสบการณ์ของฉันมันอ้างถึงอุปสรรคหน่วยความจำซึ่งเป็นคำสั่ง (โดยชัดแจ้งหรือโดยนัย) เพื่อซิงโครไนซ์การเข้าถึงหน่วยความจำระหว่างเธรดหลายชุด
ปัญหาเกิดขึ้นจากการรวมกันของคอมไพเลอร์ agressive สมัยใหม่ (พวกเขามีอิสระอย่างน่าอัศจรรย์ในการเรียงลำดับคำสั่งใหม่ แต่โดยปกติแล้วจะไม่รู้อะไรเลยในเธรดของคุณ) และซีพียูมัลติคอร์ที่ทันสมัย
คำแนะนำที่ดีสำหรับปัญหาคือ "การประกาศ" การตรวจสอบการล็อกสองครั้งเสีย "" สำหรับหลาย ๆ คนมันคือการปลุกว่ามีมังกร
อุปสรรคของหน่วยความจำเต็มโดยปริยายมักจะรวมอยู่ในรูทีนการซิงโครไนซ์เธรดแพลตฟอร์มซึ่งครอบคลุมแกนหลักของมัน อย่างไรก็ตามสำหรับการเขียนโปรแกรมโดยไม่ต้องล็อกและใช้รูปแบบการซิงโครไนซ์แบบกำหนดเองที่มีน้ำหนักเบาคุณมักจะต้องใช้เพียงแค่สิ่งกีดขวางหรือแม้แต่สิ่งกีดขวางทางเดียวเท่านั้น
Memory barrier หรือที่เรียกว่า membar หรือ memory fence เป็นคลาสของคำสั่งที่ทำให้หน่วยประมวลผลกลาง (CPU) บังคับใช้ข้อ จำกัด ในการสั่งซื้อสำหรับการดำเนินการของหน่วยความจำที่ออกก่อนและหลังคำสั่งกั้น
ซีพียูใช้การเพิ่มประสิทธิภาพการทำงานที่อาจส่งผลให้เกิดการดำเนินการนอกคำสั่งรวมถึงการโหลดหน่วยความจำและการดำเนินการจัดเก็บ การเรียงลำดับการทำงานของหน่วยความจำโดยปกติจะไม่มีใครสังเกตเห็นภายในเธรดการดำเนินการเดียว แต่ทำให้เกิดพฤติกรรมที่ไม่สามารถคาดเดาได้ในโปรแกรมและไดรเวอร์อุปกรณ์ที่ทำงานพร้อมกันเว้นแต่จะได้รับการควบคุมอย่างรอบคอบ ลักษณะที่แน่นอนของข้อ จำกัด ในการสั่งซื้อขึ้นอยู่กับฮาร์ดแวร์และกำหนดโดยโมเดลหน่วยความจำของสถาปัตยกรรม สถาปัตยกรรมบางอย่างมีอุปสรรคหลายประการสำหรับการบังคับใช้ข้อ จำกัด ในการสั่งซื้อที่แตกต่างกัน
โดยทั่วไปอุปสรรคของหน่วยความจำจะใช้เมื่อใช้รหัสเครื่องระดับต่ำที่ทำงานบนหน่วยความจำที่ใช้ร่วมกันโดยอุปกรณ์หลายเครื่อง รหัสดังกล่าวรวมถึงไพรมารีซิงโครไนซ์และโครงสร้างข้อมูลที่ไม่ต้องล็อกบนระบบมัลติโปรเซสเซอร์และไดรเวอร์อุปกรณ์ที่สื่อสารกับฮาร์ดแวร์คอมพิวเตอร์