สรุป
บทนำ
- matrix multiplication เป็นองค์ประกอบสำคัญของโครงข่ายประสาทสมัยใหม่
- NumPy ทำประสิทธิภาพสูงได้ด้วยการใช้ไลบรารี BLAS ภายนอก
- บทความนี้อธิบายวิธีสร้าง matrix multiplication ประสิทธิภาพสูงที่เรียบง่าย พกพาได้ และขยายต่อได้
ประสิทธิภาพของ NumPy
- NumPy ใช้ OpenBLAS บน CPU ของ AMD
- วัดประสิทธิภาพเป็น FLOP/s
- วัดประสิทธิภาพของ NumPy แบบ single-thread และ multi-thread บน Ryzen 7 7700 CPU
ขีดจำกัดเชิงทฤษฎี
- อธิบายลำดับชั้นหน่วยความจำของ CPU และส่วนขยาย SIMD
- ในทางทฤษฎี ทำได้ 163 GFLOPS แบบ single-thread และ 1203 GFLOPS แบบ multi-thread
การติดตั้งใช้งานแบบง่าย
- อธิบายอัลกอริทึม matrix multiplication พื้นฐานและวัดประสิทธิภาพของการติดตั้งใช้งานแบบง่าย
- การติดตั้งใช้งานแบบง่ายทำได้ 2.7 GFLOPS
เคอร์เนล
- อธิบายวิธีแก้ปัญหาโดยแบ่ง matrix multiplication ออกเป็นโจทย์ย่อยขนาดเล็ก
- ปรับแต่งเคอร์เนลด้วยคำสั่ง SIMD
- ใช้เคอร์เนล 16x6 เพื่อทำได้ 147 GFLOPS
การมาสก์และการแพ็ก
- อธิบายวิธีจัดการกรณีขอบเขตเพื่อรองรับขนาดเมทริกซ์ตามต้องการ
- ปรับประสิทธิภาพด้วยการมาสก์และการแพ็ก
- การติดตั้งใช้งานใหม่ทำได้ 56 GFLOPS
การแคช
- อธิบายระบบหน่วยความจำของ CPU cache
- ใช้แคชเพื่อเพิ่มประสิทธิภาพการนำข้อมูลกลับมาใช้ซ้ำและการจัดการแคช
ความเห็นของ GN⁺
- บทความนี้อธิบายวิธีสร้าง matrix multiplication ประสิทธิภาพสูงแบบเป็นขั้นตอน จึงให้ความรู้มาก
- สามารถเรียนรู้วิธีปรับแต่งด้วยคำสั่ง SIMD และ CPU cache ได้
- ช่วยให้เข้าใจการทำงานภายในของไลบรารีอย่าง NumPy มากขึ้น
- โปรเจ็กต์อื่นที่มีความสามารถคล้ายกัน ได้แก่ Intel MKL, OpenBLAS เป็นต้น
- เมื่อนำเทคโนโลยีใหม่หรือโอเพนซอร์สมาใช้ ควรพิจารณาทั้งประสิทธิภาพและความสามารถในการพกพา
1 ความคิดเห็น
ความเห็นจาก Hacker News
ซอฟต์แวร์ส่วนใหญ่ยังไม่ได้รับการปรับแต่งอย่างเหมาะสม จึงยังมีช่องว่างให้เพิ่มประสิทธิภาพได้มาก
งานวิจัยที่อ้างอิงอยู่ในรีโพ BLIS เป็นแหล่งข้อมูลที่น่าเชื่อถือสำหรับการทำความเข้าใจหัวข้อนี้
คำสั่ง SIMD ไม่จำเป็นสำหรับการทำ vectorization ของ micro-kernel
แพตเทิร์นการเขียนโค้ดส่วนใหญ่ไม่ได้ปรับให้เข้ากับฮาร์ดแวร์อย่างเต็มที่ จึงพลาดประสิทธิภาพไปมาก
การทำให้สามารถรัน benchmark ซ้ำได้ง่ายเป็นจุดที่น่าชื่นชม
สงสัยว่า implementation ของ numpy ใช้ multithreading จริงหรือไม่
อยากรู้ว่าทำไมจึงมีประสิทธิภาพดีกว่า OpenBLAS
การเปรียบเทียบโดยฝั่งหนึ่งเป็น Python และอีกฝั่งเป็น C นั้นไม่ยุติธรรม
รู้สึกติดใจกับความไม่มีประสิทธิภาพของการสร้าง mask
ตั้งคำถามถึงความคุ้มค่าในทางปฏิบัติของการทำ multithreading กับการคูณเมทริกซ์โดยตรง
มีการกล่าวถึง tinyBLAS ของ jart