จะปิดแคช L1 และ L2 ของโปรเซสเซอร์ได้อย่างไร


10

เป็นไปได้ไหมที่จะปิดการใช้งานแคช L1 และ / หรือ L2 บน Ubuntu 14.04 (ควรเป็นภาษาระดับสูงกว่าเช่น Python)? ถ้าเป็นเช่นนั้นได้อย่างไร

นอกจากนี้การปิดใช้งานแคชจะแตกต่างกันอย่างมีนัยสำคัญระหว่างสถาปัตยกรรมที่แตกต่างกันหรือไม่ ถ้าเป็นเช่นนั้นฉันสนใจ ARM Cortex-A15 มากกว่า

แก้ไข

ในขณะที่ค้นคว้าวิธีปิดการใช้งานแคชฉันพบเกี่ยวกับไฟล์ "drop_caches" ใน / proc / sys / vm / จากเอกสาร kernel.org

"การเขียนสิ่งนี้จะทำให้เคอร์เนลวางแคชที่สะอาดรวมถึงวัตถุพื้นที่สามารถเรียกคืนได้เช่นเดนทิสและ inodes เมื่อถูกทิ้งหน่วยความจำจะว่าง

...

"ไฟล์นี้ไม่ได้หมายถึงการควบคุมการเจริญเติบโตของแคชเคอร์เนลต่างๆ (inodes, dentries, pagecache, ฯลฯ ... ) วัตถุเหล่านี้จะถูกเรียกคืนโดยเคอร์เนลโดยอัตโนมัติเมื่อจำเป็นต้องใช้หน่วยความจำที่อื่นในระบบ"

ดูเหมือนจะไม่เหมือนกับสิ่งที่ฉันกำลังมองหาเพราะไม่เพียง แต่ดูเหมือนว่ามันจะปิดการใช้งานแคชฉันคิดว่าหน่วยความจำเสมือนอยู่ในระบบปฏิบัติการไม่ใช่ในฮาร์ดแวร์ เป้าหมายของฉันคือปิดการใช้งานแคชดังนั้นจึงต้องค้นหาหน่วยความจำที่ต้องการที่อื่นเช่นภายใน RAM

แก้ไข

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

การลดความล้มเหลวที่เกิดจากการแผ่รังสีของซอฟต์แวร์ผ่านทางหน่วยความจำแคช

แนวทางสำหรับการทดสอบการฉายรังสีภาคพื้นดินของไมโครโปรเซสเซอร์ในสภาพแวดล้อมการฉายรังสีในอวกาศ

มีหนังสืออยู่ในหัวข้อ:

ผลกระทบของการแผ่รังสีที่ทำให้เกิดไอออนในอุปกรณ์อิเล็กทรอนิกส์: จากความทรงจำไปจนถึงภาพ


หากคุณกำลังพยายามทำสิ่งต่าง ๆ เช่นการปิดใช้งานแคชคุณกำลังทำการเขียนโปรแกรมแบบฝังตัวหากคุณกำลังทำการเขียนโปรแกรมแบบฝังตัวคุณควรใช้ภาษาแบบฝังตัว (C) และฉันจะไม่ใช้ระบบปฏิบัติการ เนื่องจากการปิดใช้งานแคชจะทำให้ระบบของคุณช้าลงอย่างมาก
Sam

ฉันมีวิธีอื่น ๆ ในการเพิ่มความเร็วของระบบโดยไม่ใช้แคช แต่ฉันไม่สามารถบอกได้ว่าวิธีการเหล่านี้มีประสิทธิภาพเพียงใดจนกว่าฉันจะปิดใช้งานแคชและเรียกใช้การวัดประสิทธิภาพ ฉันรู้ว่า C หรือแอสเซมบลีเป็นตัวเลือกที่ต้องการสำหรับแอปพลิเคชันแบบฝัง อย่างไรก็ตามมีหลายสิ่งที่เกิดขึ้นในระดับสูงซึ่งทำให้เข้าใจได้ง่ายขึ้นใน Python มันจะสะดวกกว่านี้ถ้า Python สนับสนุนการทำบางอย่างเช่นปิดใช้งานแคชสำหรับแอปพลิเคชันเฉพาะของฉัน สำหรับการลอก OS, โลหะเปลือยนั้นไม่ใช่ตัวเลือกสำหรับฉันอย่างน่าเสียดาย
AustinTronics

คำตอบ:


2

คุณไม่สามารถทำได้โดยตรงใน Python เนื่องจากคุณต้องการให้เคอร์เนลโมดูลทำเช่นนั้น (และสิทธิ์การใช้งานรูทเพื่อโหลดโมดูลนั้น)

ดูที่http://lxr.free-electrons.com/source/arch/arm/mm/cache-v7.S#L21สำหรับสิ่งที่ใช้ในการทำให้แคช L1 ใช้ไม่ได้ (ทำให้ใช้งานไม่ได้)

สถาปัตยกรรมซีพียูที่แตกต่างกัน (เช่น x86 vs ARM) ต้องการรหัสแอสเซมบลีที่แตกต่างกัน (คำแนะนำของ CPU) เพื่อปิดใช้งานแคช ฉันไม่แน่ใจว่าเคอร์เนล Linux มีความเป็นไปได้ที่จะปิดการใช้งานแคช L1 / L2 / L3 / L4 หรือไม่และถ้าเป็นเช่นนั้นฉันเชื่อว่ามันจะถูกใช้ภายในเป็นระยะเวลาสั้นเนื่องจาก CPU ช้า ไม่มีแคชเหล่านี้

ดูมีวิธีปิดการใช้งาน CPU แคช (L1 / L2) บนระบบ Linux หรือไม่? สำหรับลิงค์เกี่ยวกับวิธีปิดการใช้งานแคชในระบบ x86 / x64 (คุณต้องเปลี่ยนการลงทะเบียนcr0) สำหรับ ARM ตรวจสอบพฤติกรรมของคนพิการแคช

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


แอปพลิเคชั่นนี้เป็นคอมพิวเตอร์สมองกลฝังตัวประสิทธิภาพสูงสำหรับการบินและอวกาศ เวลาทำงานมีความสำคัญต่อแอปพลิเคชันของฉันมากกว่าประสิทธิภาพ ฉันรู้ว่ามันฟังดูแปลก ๆ แต่มีการบันทึกปรากฏการณ์ไว้อย่างดี
AustinTronics

คุณจะมีแอพพลิเคชั่น "ประสิทธิภาพสูง" โดยไม่มีแคชของ CPU ได้อย่างไร? แคชต้องทำอะไรกับเวลาทำงาน?
tehnicaorg

2
ฉันเป็นนักพัฒนาซอฟต์แวร์ในการวิจัยและพัฒนาเราทำเรื่องบ้าๆมากมาย ขออภัยถ้าดูเหมือนว่าฉันกำลังออกจากข้อมูลหรือคลุมเครือในการตอบกลับของฉัน แต่ฉันไม่สามารถพูดได้มากเท่าที่ฉันต้องการเนื่องจากเป็นข้อมูลที่ถูกต้อง หากสิ่งที่แคชสนใจของคุณจะทำอย่างไรกับเวลาในการใช้งานการบินและอวกาศที่นี่เป็นที่เปิดเผยต่อสาธารณชนกระดาษ JPL นี่คือกระดาษบันทึกประจำวันของมันเช่นกัน
AustinTronics

1
กระแทกแดกดันการปิดการใช้งานแคช L1 ทำให้รู้สึกวันนี้!
แหวนØ

4

คุณสามารถทำสิ่งนี้ให้สำเร็จด้วยรหัส ASM เล็กน้อยดูที่บทที่ 11 ของคู่มือการเขียนโปรแกรมระบบของ Intel

11.5.3 การป้องกันการแคช

หากต้องการปิดใช้งานแคช L1, L2 และ L3 หลังจากเปิดใช้งานและได้รับการเติมแคชแล้วให้ทำตามขั้นตอนต่อไปนี้: 1. เข้าสู่โหมดแคชที่ไม่มีการเติม (ตั้งค่าแฟล็ก CD ในการควบคุมรีจิสเตอร์ CR0 เป็น 1 และแฟล็ก NW เป็น 0 2. ล้างแคชทั้งหมดโดยใช้คำสั่ง WBINVD 3. ปิดใช้งาน MTRRs และตั้งค่าประเภทหน่วยความจำเริ่มต้นเป็น uncached หรือตั้งค่า MTRR ทั้งหมดสำหรับประเภทหน่วยความจำ (ดูการอภิปรายการอภิปรายของฟิลด์ TYPE และการตั้งค่าสถานะ E ในหัวข้อ 11.11.2.1,“ IA32_MTRR_DEF_TYPE MSR”)

ฉันไม่ทราบเกี่ยวกับโมดูล Python ที่ใช้สิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.