ในโลกของการคำนวณประสิทธิภาพสูง คำสั่ง SIMD (Single Instruction, Multiple Data) ได้สัญญาถึงการปรับปรุงความเร็วอย่างมากมายมานาน แต่การตระหนักถึงผลกำไรเหล่านี้มักต้องใช้ความรู้เฉพาะทางและการปรับให้เหมาะสมด้วยมือ การอภิปรายล่าสุดในหมู่ผู้พัฒนาระบุว่าด้วยการพัฒนาจนถึงจุดสมบูรณ์ของ AVX512 สัญญาเหล่านี้กำลังถูกเติมเต็มในแอปพลิเคชันเชิงปฏิบัติในที่สุด โดยส่งมอบการปรับปรุงประสิทธิภาพที่ครั้งหนึ่งเคยเป็นเพียงแค่ทฤษฎี
ความก้าวหน้าทางประสิทธิภาพในโลกจริง
ผู้พัฒนากำลังรายงานถึงความเร็วที่เพิ่มขึ้นอย่างไม่น่าเชื่อเมื่อนำ AVX512 ไปใช้กับปัญหาการเขียนโปรแกรมทั่วไป ตัวอย่างหนึ่งที่น่าสนใจเป็นพิเศษเกี่ยวข้องกับการดำเนินการตารางค้นหาไบต์ ซึ่งผู้พัฒนาบรรลุผลการปรับปรุงประสิทธิภาพได้ 32 เท่าเมื่อเทียบกับรหัสสเกลาร์ การเปลี่ยนแปลงจากการประมวลผล 2 องค์ประกอบต่อรอบ เป็น 64 องค์ประกอบต่อรอบ แสดงถึงประสิทธิภาพการคำนวณประเภทเดียวกับที่ผู้บุกเบิก SIMD ได้จินตนาการไว้เมื่อหลายทศวรรษก่อน นี่ไม่ใช่แค่ผลลัพธ์ในห้องแล็บ—มันกำลังเกิดขึ้นในโค้ดสำหรับการผลิตในปัจจุบัน โดยมีผู้พัฒนารายหนึ่งระบุว่าการเพิ่มประสิทธิภาพเพียงอย่างเดียวนี้สร้างความเร็วเพิ่มขึ้น 4 เท่าโดยรวมให้กับเคอร์เนล
สำหรับทุกๆ 64 ไบต์ เวอร์ชัน AVX512 มีการโหลดและจัดเก็บหนึ่งครั้ง และทำการสับเปลี่ยนสองครั้ง ซึ่ง Zen5 สามารถทำได้ที่ 2 ครั้งต่อรอบ ดังนั้นจึงได้ 64 องค์ประกอบต่อรอบ! ความเร็วที่เพิ่มขึ้นในทางทฤษฎีของเราที่นี่คือประมาณ 32 เท่าเมื่อเทียบกับรหัสสเกลาร์!
กุญแจสู่การปรับปรุงอย่างมากเหล่านี้อยู่ที่รีจิสเตอร์ขนาด 512 บิตของ AVX512 และชุดคำสั่งที่ซับซ้อน ซึ่งรวมถึงการดำเนินการอันทรงพลังเช่น การสับเปลี่ยนไบต์แบบ double-width ที่สามารถประมวลผลข้อมูลตารางค้นหา 128 ไบต์ได้ในเวลาเดียวกัน สิ่งนี้แสดงถึงวิวัฒนาการที่สำคัญจากการใช้งาน SIMD รุ่นก่อนหน้าเช่น SSE ที่มีรีจิสเตอร์ 128 บิต
การปรับปรุงประสิทธิภาพที่รายงาน
- การดำเนินการตารางค้นหาไบต์: เร็วขึ้น 32 เท่าด้วย AVX512
- การประมวลผลบัฟเฟอร์ WebAssembly: ปรับปรุงขึ้น 20 เท่าด้วย SIMD 128 บิต
- พื้นฐานโค้ดแบบสเกลาร์: 2 องค์ประกอบต่อรอบบน Zen5
- ปรับให้เหมาะสมด้วย AVX512: 64 องค์ประกอบต่อรอบบน Zen5
ความท้าทายในการเขียนโปรแกรมยังคงมีอยู่
แม้จะได้รับผลกำไรที่น่าประทับใจนี้ การยอมรับการเพิ่มประสิทธิภาพ SIMD อย่างกว้างขวางยังคงเผชิญกับอุปสรรคสำคัญ ตามที่ผู้แสดงความคิดเห็นหนึ่งคนสังเกตว่า โค้ดปกติไม่ได้ใช้พวกมัน เกือบทุกครั้งที่มีคนจำเป็นต้องเขียนโค้ด SIMD ด้วยตนเองเพื่อให้ได้ประสิทธิภาพที่ดี แม้คอมไพเลอร์สมัยใหม่จะสามารถทำให้โค้ดเป็นเวกเตอร์โดยอัตโนมัติได้ในบางครั้ง แต่ความสามารถนี้ยังคงมีจำกัดและไม่น่าเชื่อถือสำหรับการดำเนินการที่ซับซ้อน ผู้พัฒนายังคงต้องใช้คำสั่ง SIMD ด้วยตนเองเป็นส่วนใหญ่ โดยมักจะมุ่งเน้นเฉพาะลูปภายในที่สำคัญเท่านั้น ซึ่งความพยายามนั้นคุ้มค่ากับผลตอบแทนด้านประสิทธิภาพ
อย่างไรก็ดี ภูมิทัศน์ของการเขียนโปรแกรมกำลังค่อยๆ ดีขึ้น ภาษาเช่น C# นำเสนอคลาส Vector ที่ทำให้การใช้งาน SIMD ง่ายขึ้น และ Go กำลังพิจารณาที่จะเพิ่ม intrinsic ของ SIMD สำหรับ WebAssembly SIMD แม้ในปัจจุบันจะถูกจำกัดอยู่ที่การดำเนินการ 128 บิต แต่ก็แสดงให้เห็นการปรับปรุงความเร็ว 20 เท่าในงานประมวลผลบัฟเฟอร์แล้ว การพัฒนาต่างๆ เหล่านี้ชี้ให้เห็นถึงอนาคตที่การเพิ่มประสิทธิภาพ SIMD จะเข้าถึงได้ง่ายขึ้นสำหรับนักพัฒนาทั่วไป แทนที่จะยังคงเป็นโดเมนของผู้เชี่ยวชาญเฉพาะทาง
วิวัฒนาการของความกว้างของ SIMD Register
- MMX: 64 บิต
- SSE: 128 บิต
- AVX: 256 บิต
- AVX512: 512 บิต
วิวัฒนาการของฮาร์ดแวร์และทิศทางในอนาคต
การอภิปรายเกี่ยวกับความกว้างของรีจิสเตอร์ SIMD ที่เหมาะสมเผยให้เห็นถึงการถกเถียงที่ยังคงมีอยู่เกี่ยวกับสถาปัตยกรรมฮาร์ดแวร์ ในขณะที่ผู้พัฒนาบางส่วนแย้งว่ารีจิสเตอร์ 128 บิตนั้นล้าสมัยและไม่เพียงพอสำหรับ workload สมัยใหม่ คนอื่นๆ ชี้ให้เห็นว่า 512 บิตนั้นเป็นจุดที่เหมาะสมที่สุด โดยพิจารณาจากข้อจำกัดแบนด์วิธหน่วยความจำในปัจจุบัน เมื่อมองไปข้างหน้า ผู้พัฒนาบางส่วนกำลังเรียกร้องให้มีการดำเนินการที่กว้างขึ้นอีกคือ 1024 หรือ 2048 บิต แม้ว่าสิ่งนี้จะต้องการการเปลี่ยนแปลงพื้นฐานต่อขนาดแคชไลน์และสถาปัตยกรรมหน่วยความจำ
ความสัมพันธ์ระหว่าง CPU SIMD และการคำนวณด้วย GPU ก็มีบทบาทสำคัญในการอภิปรายเช่นกัน ดังที่ผู้พัฒนารายหนึ่งอธิบาย GPU เป็นอุปกรณ์ SIMD ตามตัวอักษร แต่ใช้โมเดลการเขียนโปรแกรมที่แตกต่างกันเรียกว่า SIMT (Single Instruction, Multiple Threads) ซึ่งทำให้การทำงานแบบขนานโปร่งใสต่อโปรแกรมเมอร์มากขึ้น ความแตกต่างนี้เน้นย้ำถึงความท้าทายที่กำลังดำเนินอยู่ในการทำให้การคำนวณแบบขนานสามารถเข้าถึงได้ ในขณะที่เพิ่มขีดความสามารถของฮาร์ดแวร์ให้สูงสุด
ประสบการณ์ของชุมชนชี้ให้เห็นว่าการประยุกต์ใช้ SIMD ที่ประสบความสำเร็จมากที่สุดเกิดขึ้นในสถานที่ที่มีไปป์ไลน์การปรับใช้งานที่ชัดเจนสำหรับการปรับปรุงประสิทธิภาพ เช่น ในด้านการเข้ารหัสลับ การประมวลผลวิดีโอ และที่เพิ่มมากขึ้นในด้านการดำเนินการสตริงและการประมวลผลข้อมูล ในขณะที่การสนับสนุน AVX512 กำลังแพร่หลายมากขึ้น—ปัจจุบันอยู่ที่ประมาณ 20% ในการสำรวจฮาร์ดแวร์ของ Steam ตามที่ผู้แสดงความคิดเห็นหนึ่งคนระบุ—การเพิ่มประสิทธิภาพเหล่านี้จะให้ประโยชน์แก่ผู้ใช้มากขึ้นอย่างโปร่งใส ในที่สุดก็ส่งมอบการปรับปรุงประสิทธิภาพที่ราบรื่นซึ่ง Intel จินตนาการไว้เมื่อหลายทศวรรษก่อน เมื่อแรกเริ่มแนะนำ MMX
การเดินทางของ SIMD จากชุดคำสั่งเฉพาะทางไปสู่เครื่องมือประสิทธิภาพเชิงปฏิบัติ สาธิตให้เห็นว่าขีดความสามารถของฮาร์ดแวร์แปลเป็นประโยชน์ในโลกจริงได้อย่างไรในที่สุด แม้ว่าเส้นทางจะยาวนานกว่าที่คาดไว้ ด้วย AVX512 ในขณะนี้ที่แสดงให้เห็นถึงความเร็วที่เพิ่มขึ้นอย่างมากในโค้ดสำหรับการผลิตและกำลังมีให้ใช้อย่างกว้างขวางมากขึ้น เราอาจกำลังเข้าสู่ยุคที่การเพิ่มประสิทธิภาพ SIMD ย้ายจากเทคนิคเฉพาะทางไปสู่การปฏิบัติทั่วไป
อ้างอิง: Why We Need SIMD (The Real Reason)