มี CPU ที่ดำเนินการเพิ่มประสิทธิภาพการเขียนแคช L1 ที่เป็นไปได้หรือไม่


9

เมื่อ CPU ที่มีแคช L1 ทำการเขียนสิ่งที่เกิดขึ้นตามปกติคือ (สมมติว่าบรรทัดแคชที่กำลังเขียนอยู่ในแคช L1 อยู่แล้ว) แคช (นอกเหนือจากการอัปเดตข้อมูล) ทำเครื่องหมายว่าบรรทัดแคชนั้นสกปรก และจะเขียนบรรทัดที่มีข้อมูลที่ปรับปรุงในภายหลัง

การปรับให้เหมาะสมอย่างหนึ่งที่เป็นไปได้คือให้แคชเปรียบเทียบเนื้อหาของการเขียนและเนื้อหาก่อนหน้าของแคชและถ้ามันเหมือนกันอย่าทำเครื่องหมายบรรทัดว่าสกปรก เนื่องจากสิ่งนี้อาจทำให้แคชสามารถหลีกเลี่ยงการเขียนกลับในบางโอกาสฉันสามารถดูว่าผู้ผลิต CPU อาจเห็นสิ่งนี้ว่าคุ้มค่ากับประตูที่ต้องใช้ในการทำตรรกะนี้

คำถามของฉัน: มีซีพียูที่ทำงานเพิ่มประสิทธิภาพนี้หรือไม่?

ข้อมูลพื้นฐานเกี่ยวกับสาเหตุที่ฉันถาม: ฉันกำลังเขียนโค้ดบางอย่างที่จำเป็นต้องมีการเข้าถึงหน่วยความจำคงที่ นั่นคือคนที่สามารถฟังพฤติกรรมของแคชไม่ควรอนุมานสิ่งที่ฉันทำ การเข้าถึงของฉันบางอย่างเป็นการเขียนและวิธีที่ชัดเจนในการใช้รหัสนี้การเขียนจำนวนมากจะเขียนข้อมูลเดียวกันกับที่มีอยู่แล้ว ฉันต้องทำการเขียนเพราะขึ้นอยู่กับข้อมูลข้อมูลที่ฉันเขียนอาจจะเหมือนกันหรือไม่เหมือนกันและเป็นสิ่งสำคัญที่จะต้องดำเนินการเดียวกันโดยไม่คำนึงถึง หาก CPU ปรับให้เหมาะสมโดยการไม่เขียน 'no-change-write' นั่นหมายความว่าพฤติกรรมของแคชจะแตกต่างกันไปขึ้นอยู่กับสิ่งที่ฉันทำซึ่งจะทำลายเป้าหมายของฉัน

ดังนั้นมี CPU ที่พยายามเพิ่มประสิทธิภาพการเขียนด้วยวิธีนี้หรือไม่


11
มันบอกว่ามีปัญหาที่ยากอย่างแท้จริงสองในวิทยาการคอมพิวเตอร์: การทำให้ใช้ไม่ได้แคช, การตั้งชื่อสิ่งที่ดีและข้อผิดพลาดออกจากหนึ่ง นี่เป็นตัวอย่างว่าทำไมการแรก ๆ เหล่านี้จึงยุ่งยาก
Mason Wheeler

@ poncho คุณพูดว่า"คนที่สามารถฟังพฤติกรรมของแคชไม่ควรอนุมานสิ่งที่ฉันทำ" ตอนนี้หากซีพียูบางตัวใช้คุณสมบัติ "สมาร์ทเขียนกลับ" ซึ่งไม่ทำให้แคชใช้งานไม่ได้จนกว่าข้อมูลจะได้รับการอัปเดตจริงๆจากนั้นไปอีกหนึ่งระดับถัดจาก CPU ในลำดับชั้นของหน่วยความจำ ความแตกต่างระหว่างการเขียนจริงและการเขียนแบบจำลอง นี่คือสิ่งที่คุณกังวลหรือไม่
TheCodeArtist

@poncho คำถามจริงของคุณน่าจะเกี่ยวกับการใช้โหมดสิทธิพิเศษ / ความปลอดภัยที่ดีกว่าซึ่งไม่รั่วไหลข้อมูลการใช้งาน บางทีคุณควรถามว่า ...
TheCodeArtist

1
@TheCodeArtist: มีการเผยแพร่การโจมตีไซด์แชนแนลแบบเข้ารหัสลับซึ่งอาจมีการโจมตีรูทีนการเข้ารหัสโดยโปรแกรมอื่นที่ทำงานบนแกนหลักที่แตกต่างกันของ CPU เดียวกันโดยให้โปรแกรมการโจมตีตรวจสอบแคชที่ใช้ร่วมกัน ฉันเชื่อว่าโปรแกรมดังกล่าวสามารถตรวจจับได้ว่าแคชของ L1 นั้นถูกลบทิ้งหรือไม่และด้วยเหตุนี้จึงสามารถสรุปข้อมูลเกี่ยวกับโปรแกรมที่ฉันสนใจได้หาก CPU ทำการปรับให้เหมาะสมภายใต้การสนทนา ฉันไม่ได้พูดถึง 'โหมดปลอดภัย' เนื่องจากฉันไม่คิดว่าจะสามารถปรับเปลี่ยนซีพียูหรือระบบปฏิบัติการได้
เสื้อปอนโช

4
แม้ว่านี่จะเป็นจริงในวันนี้ก็ไม่รับประกันว่าจะเป็นจริงในวันพรุ่งนี้
pjc50

คำตอบ:


4

จากการค้นหาหลายชั่วโมงฉันไม่สามารถค้นหา CPU ที่ใช้การเพิ่มประสิทธิภาพเฉพาะนี้ได้ การปรับให้เหมาะสมส่วนใหญ่ที่กล่าวถึงมักเกี่ยวข้องกับ hit / miss ด้วยการอ่าน / เขียนและการเข้าถึงข้อมูล:

(หน้า 7 และ) https://cseweb.ucsd.edu/classes/fa14/cse240A-a/pdf/08/CSE240A-MBT-L15-Cache.ppt.pdf

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

การรับค่าปัจจุบันในแคชของรีจิสเตอร์

นอกจากนี้โซลูชันทางทฤษฎีทั้งหมดต้องการรูปแบบการใช้งานซอฟต์แวร์ (แอสเซมเบลอร์) สิ่งที่ฉันพบที่ใกล้เคียงที่สุดนั้นเกี่ยวข้องกับสถาปัตยกรรม ARM ซึ่งดูเหมือนว่าจะอนุญาตให้ปรับแต่งแคชได้ นอกจากนี้คุณต้องทราบขนาดของแคชไลน์สำหรับ CPU ที่คุณต้องการ คุณสามารถอ่านเนื้อหาแคชไปยังตำแหน่งที่สองอย่างระมัดระวังในหน่วยความจำเพิ่มขนาดบรรทัดและเปรียบเทียบกับข้อมูลที่กำลังจะถูกเขียนไปยังรีจิสเตอร์ (หรือบรรทัดแคช L1 ในกรณีนี้)

อ่านเนื้อหาแคช CPU

จากตรงนั้นคุณสามารถสร้างระบบที่ใช้ซอฟต์แวร์ซึ่งป้องกันการเขียนซ้ำเหมือนกัน ในขณะที่สิ่งนี้ง่ายขึ้นเล็กน้อยเนื่องจากเป็นวิธีแก้ปัญหาที่จำเป็นสำหรับ CPU ใด ๆ ที่มีอยู่

ความเป็นไปได้อีกอย่างที่ฉันพบว่าเกี่ยวข้องกับการเชื่อมโยงกันของแคช:

บทความที่เกี่ยวข้องจากบทความ Wikipedia เกี่ยวกับ acche coherence

ประเด็นหลักที่ดึงดูดความสนใจของฉันเกี่ยวกับปัญหานี้คือคำอธิบาย Snarfing:

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

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


นอกจากนี้ยังสามารถเข้าถึงค่าปัจจุบันในการลงทะเบียนแคช - แต่ค่อนข้างอันตรายที่จะทำเช่นนั้น อืมมันไม่สมเหตุสมผลเลย คุณหมายถึง CPU register หรือไม่ คอมไพเลอร์ที่สร้างขึ้นหรือโค้ด asm ที่เขียนด้วยมือใช้รีจิสเตอร์เพื่อเก็บค่าที่ทำงานบน ...
Peter Cordes

ถ้าคุณกำลังพยายามที่จะดำเนินการในซอฟต์แวร์ที่คุณต้องการเพียงแค่มีคอมไพเลอร์สร้างรหัสที่ไม่แทนif (mem != x) { mem = x; } mem = x;นี่เป็นเพียงบางครั้งการเพิ่มประสิทธิภาพสำหรับบรรทัดแคชที่ใช้ร่วมกันในโปรแกรมแบบมัลติเธรดเนื่องจากการเขียนรบกวนการอ่านเธรดอื่น ๆ
Peter Cordes

1
"snarfing" ไม่มีส่วนเกี่ยวข้องกับสิ่งนี้ มันเป็นเพียงการสอดแนมเรื่อย ๆ แคชของ CPU ใช้ MESIเพื่อให้สามารถมีแคชการเขียนหลังที่สอดคล้องกัน
Peter Cordes

@PeterCordes หากคุณพบว่าคำตอบของฉันน่ารังเกียจฉันขอโทษ อย่างไรก็ตามปรากฏว่าคุณมีความเข้าใจมากกว่าฉันในเรื่องนี้ ดังนั้นทำไมไม่ตอบคำถามตัวเอง? การตอบสนองของฉันนั้นไม่เพียงพอตามมาตรฐานของคุณ ...

ฉันไม่เกี่ยวกับที่อยู่ใกล้ที่ซ้ำกันของคำถามนี้ในดังนั้น
Peter Cordes

3

การเขียนไปยังแคช L1 เป็นการดำเนินการที่สำคัญและมีเวลามาก

การเขียนข้อมูลเดิมกลับคืนนั้นค่อนข้างหายาก การเพิ่มประสิทธิภาพที่เพิ่มความเร็วในกรณีนี้จะไม่ได้รับการเร่งความเร็วโดยรวม

ในทางกลับกันการปรับให้เหมาะสมนี้ต้องการการเปรียบเทียบข้อมูลเก่าและข้อมูลใหม่ในการเขียนหน่วยความจำแคช สิ่งที่ทำให้สิ่งนี้แย่ลงคือต้องมีข้อมูลที่จะเขียนจริงในขณะที่เขียน!

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

ตัวอย่างเช่นถ้าคุณมีรหัส C a [i] = x / y; การแบ่ง x / y ใช้เวลานานเป็นพิเศษในการแสดงบนซีพียูส่วนใหญ่ อย่างไรก็ตามงานส่วนใหญ่ที่จำเป็นในการจัดการกับการจัดเก็บผลการ [i] ได้เกิดขึ้นนานก่อนที่การแบ่งจะเสร็จสิ้น; สิ่งเดียวที่ขาดหายไปคือการย้ายผลลัพธ์จำนวนแปดไบต์ไปยังบรรทัดแคช การล้างข้อมูลบรรทัดแคชจะรอโดยอัตโนมัติจนกว่าการแบ่งจะเสร็จสิ้น การดำเนินการอ่าน [i] อาจถูกเปลี่ยนเส้นทางเพื่อให้ได้ผลลัพธ์โดยตรงจากตัวหาร


แคชที่ใช้ MESI สำหรับการเชื่อมโยงกันยังคงสามารถทำ RFO ได้ แต่หากข้อมูลเปรียบเทียบกันเมื่อมันพร้อมให้ออกจากบรรทัดในสถานะพิเศษแทน Modified เหตุผลที่แท้จริงที่ไม่ได้ทำในฮาร์ดแวร์คือค่าใช้จ่ายในการอ่านแคชเพิ่มเติมเนื่องจากข้อมูลมุ่งมั่นที่จะแคชและจะต้องมีประเภทของอะตอมอ่าน / เปรียบเทียบ / เขียนรอบ (ด้วยการตั้งค่าตัวเลือกของบิตสกปรก) ที่ทำให้ดูด การดำเนินการไปป์ไลน์
Peter Cordes

1

การปรับให้เหมาะสมอย่างหนึ่งที่เป็นไปได้คือให้แคชเปรียบเทียบเนื้อหาของการเขียนและเนื้อหาก่อนหน้าของแคชและถ้ามันเหมือนกันอย่าทำเครื่องหมายบรรทัดว่าสกปรก

การเพิ่มประสิทธิภาพดังกล่าวจะไม่เพิ่มขึ้นเป็นสองเท่าของเวลาที่ CPU ต้องการเขียนอะไรลงแคช เพราะตอนนี้แต่ละแคชเขียนบรรทัดจะมาพร้อมกับการดำเนินการเปรียบเทียบซึ่งไม่ได้ฟรี

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


การเปรียบเทียบนี้จะดำเนินการภายในตรรกะของ CPU มันจะไม่ต้องการการดำเนินการ CPU เพิ่มเติม แต่เวลาสัญญาณอาจเพิ่มขึ้นซึ่งอาจเป็นปัญหาหรือไม่
ziggystar

@ziggystar ดีฉันไม่ใช่ผู้เชี่ยวชาญด้านฮาร์ดแวร์ แต่ฉันชินกับความคิดที่ว่าทุกอย่างมาพร้อมกับราคา เพื่อเปรียบเทียบการดำเนินการกับสายแคช มันอาจจะเร็ว แต่นี่ยังคงมีค่าใช้จ่าย และฉันคิดว่าผู้ดำเนินการตัดสินใจที่จะไม่จ่ายเงิน อาจเป็นไปได้แม้หลังจากคิดและวัด
Vladislav Rastrusny

1
แต่คุณกำลังพูดถึงเวลาที่ค่าใช้จ่ายอาจเพิ่มจำนวนประตูเท่านั้น
ziggystar

1
@ziggystar: นี่ไม่ใช่แค่ประตูอีกต่อไป เมื่อข้อมูลถูกส่งไปยังแคชโดยปกติกระบวนการส่งข้อมูลสามารถทำเครื่องหมายบรรทัดแคชว่าถูกแก้ไข ด้วย "การเพิ่มประสิทธิภาพ" นี้ข้อมูลเก่าและข้อมูลใหม่จะต้องผ่านประตูเหล่านี้ซึ่งจะทำให้เกิดความล่าช้าและจากนั้นแคชเท่านั้นจึงจะสามารถใช้งานได้ คุณต้องบีบสิ่งเหล่านี้ทั้งหมดลงในหนึ่งรอบตัวประมวลผลมิฉะนั้นการเขียนลงในบรรทัดแคชก็จะใช้เวลาสองรอบ และตอนนี้เพื่อทำให้สิ่งต่าง ๆ มีความซับซ้อนมากขึ้นลองพิจารณาสิ่งที่เกิดขึ้นเมื่อฉันเขียนคำติดต่อกันแปดคำไปยังแคช
gnasher729

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