การทดสอบประสิทธิภาพการเข้าถึงแบบสุ่มเผยให้เห็นข้อจำกัดของ CPU Prefetching และสถาปัตยกรรมหน่วยความจำ

ทีมชุมชน BigGo
การทดสอบประสิทธิภาพการเข้าถึงแบบสุ่มเผยให้เห็นข้อจำกัดของ CPU Prefetching และสถาปัตยกรรมหน่วยความจำ

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

ผลการเปรียบเทียบประสิทธิภาพ

การกำหนดค่าระบบ การเข้าถึงแบบต่อเนื่อง การเข้าถึงแบบสุ่ม อัตราส่วนประสิทธิภาพ
MacBook M1 (16GB RAM) ~1 ns ต่อองค์ประกอบ ~4 ns ต่อองค์ประกอบ ช้ากว่า 4 เท่า
Linux AMD Ryzen 5 3600X (24GB RAM) ~0.5 ns ต่อองค์ประกอบ ~8-16 ns ต่อองค์ประกอบ ช้ากว่า 8-16 เท่า

เกณฑ์ขนาด Cache

  • MacBook M1 : ประสิทธิภาพเริ่มลดลงที่ 8MB (ขีดจำกัด SLC)
  • Linux Desktop : ประสิทธิภาพเริ่มลดลงที่ 4MB (แม้จะมี L3 cache 32MB)
  • ทั้งสองระบบ: ประสิทธิภาพตกลงอย่างมากเมื่อข้อมูลเกินขนาด RAM ที่มีอยู่

CPU Prefetching ปิดบังต้นทุนที่แท้จริงของการเข้าถึงแบบสุ่ม

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

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

นี่หมายความว่าความแตกต่างด้านประสิทธิภาพ 4 ถึง 16 เท่าที่สังเกตได้ระหว่างการเข้าถึงแบบต่อเนื่องและแบบสุ่มอาจประเมินต้นทุนที่แท้จริงของรูปแบบหน่วยความจำแบบสุ่มในแอปพลิเคชันในโลกจริงต่ำไป การทดสอบที่สมจริงมากกว่าจะเกี่ยวข้องกับ dependency chains ที่แต่ละตำแหน่งหน่วยความจำมีที่อยู่ถัดไปที่จะเข้าถึง ป้องกันไม่ให้ CPU ทำนายคำขอหน่วยความจำในอนาคต

หมายเหตุทางเทคนิค : Speculative execution ช่วยให้ CPU สามารถทำนายและดำเนินการคำสั่งก่อนที่จะต้องการจริง ในขณะที่ prefetching โหลดข้อมูลเข้าสู่แคชก่อนที่จะมีการร้องขอ

สถาปัตยกรรม Memory Controller ส่งผลต่อผลลัพธ์

รายละเอียดการกำหนดค่าฮาร์ดแวร์ได้เกิดขึ้นเป็นแหล่งที่มาที่อาจเกิดขึ้นของความผิดปกติในการวัด ระบบทดสอบ Linux ใช้การกำหนดค่า RAM 24GB ที่ผิดปกติด้วยโมดูล 8GB สามตัว สร้างการตั้งค่า dual-channel ที่ไม่สมดุล การกำหนดค่าหน่วยความจำที่ไม่สมมาตรนี้อาจทำให้เกิดสิ่งประดิษฐ์ด้านประสิทธิภาพที่ไม่คาดคิด โดยเฉพาะเมื่อข้อมูลครอบคลุมทั้งสองช่องหน่วยความจำ

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

ข้อมูลจำเพาะของระบบทดสอบ

MacBook Pro 2020

  • โปรเซสเซอร์: ชิป Apple M1
  • RAM: 16GB
  • หน่วยเก็บข้อมูล: SSD 1TB
  • แคช: 8MB System Level Cache (SLC)

Linux Desktop

  • โปรเซสเซอร์: AMD Ryzen 5 3600X
  • RAM: 24GB Corsair Vengeance LPX DDR4 3000MHz (การกำหนดค่า 3x8GB)
  • หน่วยเก็บข้อมูล: Western Digital 1TB 3D NAND SATA SSD
  • แคش: 32MB L3 cache

พฤติกรรมลำดับชั้นแคชแตกต่างจากความคาดหวัง

ผลลัพธ์แสดงให้เห็นความไม่สอดคล้องที่น่าสนใจระหว่างขีดจำกัดแคชเชิงทฤษฎีและการเปลี่ยนแปลงประสิทธิภาพจริง ในระบบ Linux ที่มีแคช L3 32MB ประสิทธิภาพการเข้าถึงแบบสุ่มเริ่มเสื่อมลงเมื่ออาร์เรย์เกิน 4MB แทนที่จะเป็นเกณฑ์ 32MB ที่คาดไว้ นี่บ่งชี้ว่าพฤติกรรมของแคชในลำดับชั้นหลายระดับมีความซับซ้อนมากกว่าการคำนวณขนาดง่ายๆ ที่จะทำนายได้

เส้นโค้งประสิทธิภาพยังเผยให้เห็นว่าการจัดการไฟล์ memory-mapped แตกต่างกันอย่างมีนัยสำคัญระหว่างระบบปฏิบัติการ macOS ดูเหมือนจะจัดการไฟล์ memory-mapped ขนาดใหญ่ได้อย่างมีประสิทธิภาพน้อยกว่า Linux แม้ว่าความแตกต่างนี้จะหายไปเมื่อใช้วิธีการอ่านไฟล์โดยตรง

ผลกระทบต่อประสิทธิภาพในโลกจริง

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

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

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

อ้างอิง: How much slower is random access, really?