ไลบรารีการปรับแต่ง ARM NEON ใหม่ที่เรียกว่า NEON Bytepack ได้แสดงให้เห็นการเพิ่มประสิทธิภาพที่น่าประทับใจในงานการบีบอัดข้อมูล โดยสามารถทำความเร็วในการประมวลผลได้สูงถึง 86 GB/s บนข้อมูลที่อยู่ใน L1 งานวิจัยตัวอย่างนี้สร้างโดยนักพัฒนา Ashton Six มุ่งเน้นไปที่การบรรจุและแกะบิตจากอาร์เรย์ไบต์อย่างมีประสิทธิภาพโดยใช้ชุดคำสั่ง NEON SIMD ของ ARM
การยืนยันจากชุมชนผ่านการทดสอบอิสระ
โครงการนี้ได้รับความน่าเชื่อถือเมื่อสมาชิกชุมชนสามารถทำซ้ำผลการทดสอบได้สำเร็จบนแพลตฟอร์ม ARM ที่แตกต่างกัน ผู้ใช้คนหนึ่งเริ่มแรกตั้งคำถามเกี่ยวกับความถูกต้องของผลลัพธ์ โดยสังเกตเห็นปัญหาการคอมไพล์ในโค้ดเปรียบเทียบพื้นฐาน อย่างไรก็ตาม หลังจากค้นพบว่าการใช้งานพื้นฐาน x86 ใช้ header SIMDe (SIMD Everywhere) เพื่อแปลง intrinsics ของ x86 ให้เป็นส่วนเทียบเท่าของ ARM พวกเขาก็ยืนยันความถูกต้องของการทดสอบ
การทดสอบบน Google Cloud's C4A Axion instances แสดงประสิทธิภาพที่ดีกว่าผลลัพธ์ Graviton4 เดิม โดยบางการกำหนดค่าสามารถทำได้มากกว่า 123 GB/s สำหรับการดำเนินการ bit-width เฉพาะ การยืนยันนี้บนแพลตฟอร์มเซิร์ฟเวอร์ ARM หลายแห่งแสดงให้เห็นถึงคุณค่าในทางปฏิบัติของเทคนิคการปรับแต่ง
SIMD (Single Instruction, Multiple Data) ช่วยให้โปรเซสเซอร์สามารถดำเนินการเดียวกันกับจุดข้อมูลหลายจุดพร้อมกัน ทำให้งานคำนวณบางอย่างเร็วขึ้นอย่างมีนัยสำคัญ
ผลการทดสอบแพลตฟอร์ม
- Graviton4 (Neoverse V2): เบนช์มาร์กต้นฉบับแสดงค่าเฉลี่ยเรขาคณิต 86 GB/s
- Google Cloud C4A Axion: สูงสุดถึง 123.63 GB/s สำหรับการดำเนินการ 2-bit packing
- Apple M1 Pro: ประสิทธิภาพจำกัดเนื่องจากการรองรับการดำเนินการ small-shift ที่ไม่ดี
- Apple M3/M4: ประสิทธิภาพ small-shift ที่ดีขึ้นเมื่อเปรียบเทียบกับ M1
แพลตฟอร์มทั้งหมดใช้สถาปัตยกรรมคอร์ Neoverse V2 เดียวกัน ยกเว้นโปรเซสเซอร์ Apple
นวัตกรรมทางเทคนิคเบื้องหลังการเพิ่มประสิทธิภาพ
ไลบรารีนี้ทำให้ความเร็วดีขึ้นผ่านการปรับแต่งหลักหลายประการ มันทำงานในระดับไบต์แทนที่จะทำงานกับประเภทข้อมูลที่ใหญ่กว่า ทำให้สามารถประมวลผลองค์ประกอบเชิงตรรกะได้มากขึ้นต่อคำสั่ง การใช้งานใช้การสลับแบบจัดแนวที่ผู้สนับสนุนข้อมูลจัดแนวกับขอบเขตคำ ทำให้การเคลื่อนย้ายข้อมูลส่วนใหญ่ยุบเป็นการดำเนินการเดียวโดยไม่มีการหกล้นข้ามคำ
โค้ดยังใช้เทคนิคการสร้างรูปแบบคำสั่ง โดยใช้ฟังก์ชันช่วยเล็กๆ สำหรับการโหลด เก็บ และการจัดการบิตที่กระตุ้นให้โปรเซสเซอร์ใช้การดำเนินการโหลด/เก็บแบบคู่และคำสั่ง shift-insert แบบรวม นอกจากนี้ ไลบรารียังรวมการเชี่ยวชาญเฉพาะ bit-width ที่ inline ลูปร้อน ขจัดค่าใช้จ่ายของการเรียกฟังก์ชัน สวิตช์ หรือการสร้างมาสก์ระหว่างการดำเนินการที่สำคัญ
Bit-width หมายถึงจำนวนบิตที่จำเป็นในการแสดงค่าข้อมูลแต่ละค่า - ตัวอย่างเช่น ค่า 0-7 ต้องการเพียง 3 บิตต่อค่า
การปรับปรุงทางเทคนิคที่สำคัญ
- การประมวลผลแบบขนานระดับไบต์: องค์ประกอบเชิงตรรกะมากขึ้นถูกประมวลผลต่อคำสั่งเดียว
- การสลับแบบจัดตำแหน่ง: ผู้มีส่วนร่วมจัดตำแหน่งตามขอบเขตของ word ทำให้การเคลื่อนย้ายส่วนใหญ่ย่อลงเหลือการดำเนินการเดียว
- การกำหนดรูปแบบคำสั่ง: ฟังก์ชันช่วยเหลือส่งเสริมการโหลด/เก็บแบบคู่และการดำเนินการแทรก-เลื่อนแบบรวม
- การจัดตารางเวลาไมโครอาร์คิเทกเจอร์: แยกโซ่ ตัดช่วงการใช้งาน สมดุลพอร์ต คลี่ลูปที่ใช้บ่อย
- ค่าใช้จ่ายในการควบคุมขั้นต่ำ: การเฉพาะเจาะจงตามความกว้างบิตแทรกลูปที่ใช้บ่อยโดยไม่ต้องเรียกฟังก์ชันหรือสวิตช์
ความท้าทายและการแก้ไขเฉพาะแพลตฟอร์ม
การทดสอบชุมชนเผยให้เห็นความแตกต่างของแพลตฟอร์มที่น่าสนใจ โดยเฉพาะกับโปรเซสเซอร์ M1 ของ Apple ผู้ทดสอบคนหนึ่งพบว่าชิป M1 มีประสิทธิภาพที่แย่มากกับการดำเนินการ small-shift ซึ่งส่งผลต่อโค้ดการจัดการบิตประเภทนี้ นักพัฒนาสังเกตว่าโปรเซสเซอร์ M3 แก้ไขปัญหานี้บางส่วน ในขณะที่ชิป M4 แก้ไขได้อย่างสมบูรณ์
ไลบรารีมุ่งเป้าไปที่ฮาร์ดแวร์ระดับเซิร์ฟเวอร์แทนที่จะเป็นอุปกรณ์ผู้บริโภค โดยเน้นไปที่ workload คลังข้อมูลและการวิเคราะห์ที่แบนด์วิดท์หน่วยความจำมักจะกลายเป็นปัจจัยจำกัด สำหรับแอปพลิเคชันในโลกแห่งความเป็นจริง นักพัฒนาแนะนำให้รวมการดำเนินการ bytepack เข้ากับขั้นตอนการประมวลผลอื่นๆ เพื่อเก็บผลลัพธ์ระหว่างกลางไว้ในรีจิสเตอร์ของโปรเซสเซอร์ เพื่อเพิ่มประโยชน์ด้านประสิทธิภาพให้สูงสุด
การเปรียบเทียบประสิทธิภาพ (อัตราความเร็วในการส่งผ่านข้อมูล GB/s)
ความกว้างของบิต | NEON Pack | NEON Unpack | Baseline Pack | Baseline Unpack |
---|---|---|---|---|
1-bit | 90.50 | 66.80 | 38.83 | 58.94 |
2-bit | 104.93 | 72.88 | 48.14 | 56.17 |
3-bit | 84.55 | 73.11 | 40.92 | 59.56 |
4-bit | 95.22 | 70.09 | 52.83 | 68.66 |
5-bit | 80.43 | 69.70 | 39.64 | 56.96 |
6-bit | 79.58 | 68.11 | 44.66 | 57.56 |
7-bit | 66.66 | 66.20 | 38.24 | 53.96 |
8-bit | 79.73 | 80.17 | 58.37 | 73.35 |
ทดสอบบน Neoverse V2 ( Graviton4 ) ด้วยชุดข้อมูลการทำงานขนาด 16 KiB ใน L1 cache
ผลกระทบที่กว้างขึ้นต่อการประมวลผลข้อมูล
งานนี้แก้ไขคอขวดที่พบบ่อยในการวิเคราะห์ข้อมูลที่อาร์เรย์ของตัวเลขที่มีขอบเขตบนที่ทราบ - เช่น รหัสหมวดหมู่หรือค่า enum - ต้องการการประมวลผลที่มีประสิทธิภาพ โดยการบรรจุค่าเหล่านี้ให้แน่นขึ้นในหน่วยความจำ การปรับแต่งสามารถเพิ่มประสิทธิภาพได้มากกว่าสองเท่าสำหรับการดำเนินการที่ถูกจำกัดด้วยหน่วยความจำที่พบบ่อยในระบบฐานข้อมูลและการวิเคราะห์
โครงการนี้ได้จุดประกายการอภิปรายเกี่ยวกับความสามารถของ ARM NEON เมื่อเปรียบเทียบกับชุดคำสั่ง x86 SIMD โดยสมาชิกชุมชนแบ่งปันข้อมูลเชิงลึกเกี่ยวกับคุณสมบัติที่ขาดหายไปและวิธีแก้ไข บางคนสังเกตว่าแม้ว่า NEON จะขาดคำสั่งที่สะดวกบางอย่างที่พบในโปรเซสเซอร์ x86 แต่สถาปัตยกรรมชุดคำสั่งของ ARM ให้การสนับสนุนที่ดีกว่าสำหรับการดำเนินการองค์ประกอบ 8 บิตและลักษณะประสิทธิภาพที่คาดเดาได้มากกว่า
อ้างอิง: NEON Bytepack