คำถามติดแท็ก memory-management

4
แนวทางปฏิบัติที่ดีที่สุดในการจัดสรรหน่วยความจำแบบมัลติคอร์ / NUMA แบบพกพา / การกำหนดค่าเริ่มต้น
เมื่อทำการคำนวณแบนด์วิดท์หน่วยความจำที่ จำกัด จะดำเนินการในสภาพแวดล้อมหน่วยความจำที่ใช้ร่วมกัน (เช่นเธรดผ่าน OpenMP, Pthreads หรือ TBB) จะมีภาวะที่กลืนไม่เข้าคายไม่ออกของวิธีการตรวจสอบให้แน่ใจว่าหน่วยความจำกระจายอย่างถูกต้องผ่านหน่วยความจำกายภาพบัสหน่วยความจำ "ท้องถิ่น" แม้ว่าอินเทอร์เฟซนั้นไม่สามารถพกพาได้ระบบปฏิบัติการส่วนใหญ่มีวิธีตั้งค่าความสัมพันธ์ของเธรด (เช่นpthread_setaffinity_np()ในระบบ POSIX จำนวนมากsched_setaffinity()บน Linux SetThreadAffinityMask()บน Windows) นอกจากนี้ยังมีไลบรารีเช่นhwlocสำหรับกำหนดลำดับชั้นของหน่วยความจำ แต่น่าเสียดายที่ระบบปฏิบัติการส่วนใหญ่ยังไม่ได้เตรียมวิธีในการตั้งค่านโยบายหน่วยความจำ NUMA Linux เป็นข้อยกเว้นที่น่าทึ่งด้วยlibnumaการอนุญาตให้แอปพลิเคชันจัดการนโยบายหน่วยความจำและการโยกย้ายหน้าเว็บที่หน้าย่อย (ตั้งแต่เดือนพ. ศ. 2547 เป็นต้นมาซึ่งมีอยู่ทั่วไป) ระบบปฏิบัติการอื่นคาดว่าผู้ใช้จะปฏิบัติตามนโยบาย "สัมผัสแรก" โดยนัย การทำงานกับนโยบาย "สัมผัสแรก" หมายความว่าผู้โทรควรสร้างและแจกจ่ายเธรดด้วยความสัมพันธ์ที่พวกเขาวางแผนที่จะใช้ในภายหลังเมื่อเขียนไปยังหน่วยความจำที่จัดสรรใหม่ครั้งแรก (ระบบน้อยมากที่มีการกำหนดค่าเช่นที่malloc()พบหน้าจริง ๆ มันแค่สัญญาว่าจะพบพวกเขาเมื่อพวกเขาจะผิดจริงอาจจะโดยกระทู้ต่าง ๆ ) นี่ก็หมายความว่าการจัดสรรการใช้calloc()หรือการเริ่มต้นทันทีหลังจากการจัดสรรหน่วยความจำใช้memset()เป็นอันตราย หน่วยความจำทั้งหมดบนบัสหน่วยความจำของคอร์ที่รันเธรดที่จัดสรรซึ่งนำไปสู่แบนด์วิดท์หน่วยความจำกรณีที่แย่ที่สุดเมื่อเข้าถึงหน่วยความจำจากหลายเธรด เช่นเดียวกับตัวดำเนินการ C ++ newซึ่งยืนยันในการเริ่มต้นการจัดสรรใหม่จำนวนมาก (เช่นstd::complex) ข้อสังเกตบางประการเกี่ยวกับสภาพแวดล้อมนี้: การจัดสรรสามารถทำ "กลุ่มรวม" แต่ตอนนี้การจัดสรรกลายเป็นผสมในรูปแบบเกลียวซึ่งเป็นที่ไม่พึงประสงค์สำหรับห้องสมุดซึ่งอาจต้องโต้ตอบกับลูกค้าโดยใช้รูปแบบเกลียวที่แตกต่างกัน (อาจแต่ละคนมีเธรดพูลของตัวเอง) RAII …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.