Sebuah pustaka optimasi ARM NEON baru yang disebut NEON Bytepack telah menunjukkan peningkatan performa yang mengesankan dalam tugas kompresi data, mencapai kecepatan throughput hingga 86 GB/s pada data yang berada di L1. Pratinjau penelitian ini, yang dibuat oleh pengembang Ashton Six, berfokus pada pengemasan dan pembongkaran bit dari array byte secara efisien menggunakan set instruksi ARM NEON SIMD.
Validasi Komunitas Melalui Pengujian Independen
Proyek ini mendapat kredibilitas ketika anggota komunitas berhasil mereproduksi hasil benchmark di berbagai platform ARM. Seorang pengguna awalnya mempertanyakan keaslian hasil tersebut, mencatat masalah kompilasi dengan kode perbandingan baseline. Namun, setelah menemukan bahwa implementasi baseline x86 menggunakan header SIMDe (SIMD Everywhere) untuk menerjemahkan intrinsik x86 ke ekuivalen ARM, mereka mengonfirmasi legitimasi benchmark tersebut.
Pengujian pada instance C4A Axion Google Cloud menunjukkan performa yang bahkan lebih baik daripada hasil Graviton4 asli, dengan beberapa konfigurasi mencapai lebih dari 123 GB/s untuk operasi bit-width tertentu. Validasi ini di berbagai platform server ARM menunjukkan nilai praktis dari teknik optimasi tersebut.
SIMD (Single Instruction, Multiple Data) memungkinkan prosesor untuk melakukan operasi yang sama pada beberapa titik data secara bersamaan, secara signifikan mempercepat tugas komputasi tertentu.
Hasil Uji Platform
- Graviton4 (Neoverse V2): Benchmark asli menunjukkan rata-rata geometris 86 GB/s
- Google Cloud C4A Axion: Hingga 123,63 GB/s untuk operasi packing 2-bit
- Apple M1 Pro: Performa terbatas karena dukungan operasi small-shift yang buruk
- Apple M3/M4: Performa small-shift yang lebih baik dibandingkan M1
Semua platform menggunakan arsitektur core Neoverse V2 yang sama kecuali prosesor Apple
Inovasi Teknis di Balik Peningkatan Performa
Pustaka ini mencapai peningkatan kecepatan melalui beberapa optimasi kunci. Ia beroperasi pada level byte daripada bekerja dengan tipe data yang lebih besar, memungkinkan lebih banyak elemen logis untuk diproses per instruksi. Implementasi menggunakan interleaving yang selaras di mana kontributor data selaras dengan batas kata, memungkinkan sebagian besar perpindahan data untuk runtuh menjadi operasi tunggal tanpa spillage lintas kata.
Kode ini juga menggunakan teknik pembentukan instruksi, menggunakan fungsi pembantu kecil untuk operasi load, store, dan manipulasi bit yang mendorong prosesor untuk menggunakan operasi load/store berpasangan dan instruksi shift-insert yang digabung. Selain itu, pustaka ini mencakup spesialisasi per-bit-width yang menginline loop panas, menghilangkan overhead dari panggilan fungsi, switch, atau pembangunan mask selama operasi kritis.
Bit-width mengacu pada berapa banyak bit yang diperlukan untuk merepresentasikan setiap nilai data - misalnya, nilai 0-7 hanya memerlukan 3 bit masing-masing.
Optimisasi Teknis Utama
- Paralelisme tingkat byte: Lebih banyak elemen logis diproses per instruksi
- Interleaving yang selaras: Kontributor selaras dengan batas kata, sebagian besar perpindahan menyatu menjadi operasi tunggal
- Pembentukan instruksi: Fungsi pembantu mendorong operasi load/store berpasangan dan operasi shift-insert yang tergabung
- Penjadwalan mikroarsitektur: Memisahkan rantai, memangkas rentang hidup, menyeimbangkan port, membuka gulungan loop panas
- Overhead kontrol minimal: Spesialisasi per-lebar-bit menyisipkan loop panas tanpa panggilan fungsi atau switch
Tantangan dan Solusi Spesifik Platform
Pengujian komunitas mengungkap perbedaan platform yang menarik, terutama dengan prosesor M1 Apple. Seorang penguji menemukan bahwa chip M1 memiliki performa yang sangat buruk dengan operasi small-shift, yang mempengaruhi jenis kode manipulasi bit ini. Pengembang mencatat bahwa prosesor M3 sebagian mengatasi masalah ini, sementara chip M4 menyelesaikannya sepenuhnya.
Pustaka ini menargetkan perangkat keras kelas server daripada perangkat konsumen, berfokus pada beban kerja gudang data dan analitik di mana bandwidth memori sering menjadi faktor pembatas. Untuk aplikasi dunia nyata, pengembang merekomendasikan untuk menggabungkan operasi bytepack dengan tahap pemrosesan lain untuk menjaga hasil antara dalam register prosesor, memaksimalkan manfaat performa.
Perbandingan Performa (throughput GB/s)
| Lebar Bit | 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 |
Diuji pada Neoverse V2 ( Graviton4 ) dengan working set 16 KiB di cache L1
Dampak Lebih Luas pada Pemrosesan Data
Karya ini mengatasi bottleneck umum dalam analitik data di mana array angka dengan batas atas yang diketahui - seperti kode kategori atau nilai enum - memerlukan pemrosesan yang efisien. Dengan mengemas nilai-nilai ini lebih rapat dalam memori, optimasi dapat lebih dari menggandakan performa untuk operasi yang terikat memori yang umum dalam sistem database dan analitik.
Proyek ini telah memicu diskusi tentang kemampuan ARM NEON dibandingkan dengan set instruksi SIMD x86, dengan anggota komunitas berbagi wawasan tentang fitur yang hilang dan solusi alternatif. Beberapa mencatat bahwa meskipun NEON tidak memiliki instruksi tertentu yang nyaman yang ditemukan dalam prosesor x86, arsitektur set instruksi ARM menawarkan dukungan yang lebih baik untuk operasi elemen 8-bit dan karakteristik performa yang lebih dapat diprediksi.
Referensi: NEON Bytepack
