NEON Bytepack ทำสถิติประสิทธิภาพ 86 GB/s ด้วยการปรับแต่ง ARM SIMD ชุมชนยืนยันผลการทดสอบ

ทีมชุมชน BigGo
NEON Bytepack ทำสถิติประสิทธิภาพ 86 GB/s ด้วยการปรับแต่ง ARM SIMD ชุมชนยืนยันผลการทดสอบ

ไลบรารีการปรับแต่ง 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