- Versi terbaru Sep 0.10.0 mencapai kecepatan parsing CSV yang luar biasa, 21 GB/s, di AMD 9950X
- Performa meningkat besar berkat dukungan AVX-512 dan keberhasilan mengatasi isu register mask
- Parser AVX-512-to-256 yang baru menunjukkan hasil melampaui AVX2 dan parser AVX-512 sebelumnya
- Dalam lingkungan multithread, 1 juta baris diproses dalam 72ms dengan bandwidth 8 GB/s
- Optimisasi perangkat lunak dan perangkat keras yang berkelanjutan menghasilkan peningkatan performa sekitar 3x dalam 2 tahun
Rilisan Sep 0.10.0 dan ringkasan peningkatan performa
- Pada rilisan 0.10.0 terbaru, Sep melakukan optimisasi untuk CPU dengan dukungan AVX-512 (misalnya AMD 9950X, Zen 5), dan hasil benchmark telah diperbarui
- Pada versi terbaru, Sep mencatat capaian luar biasa sebesar 21 GB/s pada parsing CSV tingkat rendah
- Dibandingkan versi sebelumnya, ini merupakan peningkatan performa yang signifikan dari 18 GB/s
- Rincian peningkatan dapat dilihat di rilisan GitHub dan README Sep
- Artikel ini menjelaskan proses peningkatan performa melalui kode C# berbasis SIMD dan assembly SIMD x64 yang mengatasi inefisiensi machine code AVX-512 di .NET 9.0
Proses perkembangan performa Sep
- Perkembangan Sep dari 0.1.0 awal hingga 0.10.0, dari .NET 7.0 ke 9.0, serta dari AMD 5950X (Zen 3) ke 9950X (Zen 5) ditampilkan secara visual
- Benchmark didasarkan pada single-thread, dan tiap rilisan dapat memiliki sedikit variasi
- Pesan utamanya adalah bahwa refaktorisasi besar (penulisan ulang struktur internal di 0.2.0) maupun optimisasi kecil yang terakumulasi sama-sama mendorong peningkatan performa secara konsisten
- Berkat perkembangan bersama perangkat keras dan perangkat lunak, kecepatan parsing 21 GB/s yang sekitar 3x lebih tinggi berhasil dicapai dalam rata-rata 2 tahun
- Perubahan antargenerasi perangkat keras saja (5950X→9950X, 4.9→5.7GHz) sudah menjadi dasar peningkatan lebih dari 1.2x
Pembuatan kode AVX-512 dan masalah register mask
- Sep telah mendukung AVX-512 sejak 0.2.3, tetapi ada keterbatasan dalam pemanfaatan register mask AVX-512 (k1-k8)
- Di .NET 8, belum ada dukungan langsung untuk register mask, sehingga penyalinan dan konversi berulang antar register normal menjadi faktor penurun performa
- Pada masa awal ketika belum ada CPU terpisah yang mendukung AVX-512, pengujian terbatas dilakukan di Xeon Silver 4316 dan memastikan bahwa itu yang paling cepat
Upgrade ke 9950X dan perbandingan AVX-512 vs AVX2
- Setelah baru-baru ini meng-upgrade CPU dari Zen 3 (5950X) ke Zen 5 (9950X), benchmark Sep menunjukkan hasil mencapai 18 GB/s
- Dalam eksperimen perbandingan langsung antara parser AVX-512 dan AVX2, agak mengejutkan, AVX2 menunjukkan performa sekitar 20 GB/s, kira-kira 10% lebih cepat daripada AVX-512
- Ini mengindikasikan bahwa inefisiensi penanganan register mask pada .NET JIT masih menjadi masalah
Kode parser, analisis assembly, dan parser AVX-512-to-256 baru
- Semua parser Sep memproses char span dalam unit 16K dan memanfaatkan operasi perbandingan berbasis register SIMD (
Vector256 dan lainnya)
- SIMD digunakan untuk mendeteksi karakter khusus (baris baru, tanda kutip, delimiter, dll.) dengan cepat lalu mengubahnya menjadi bitmask demi optimisasi operasi himpunan
- Parser berbasis AVX-512 memiliki banyak operasi berlebih akibat perpindahan berulang antara register mask (
k1 dan sejenisnya) dan register umum (zmm dan sejenisnya)
- Di 0.10.0, pemanggilan
MoveMask dimajukan untuk meminimalkan konversi mask yang tidak perlu, sehingga jumlah instruksi assembly berkurang
- Parser AVX2 tidak memiliki register mask sehingga strukturnya jauh lebih sederhana dan dalam praktiknya lebih cepat daripada AVX-512
- Parser AVX-512-to-256 yang baru membaca data dengan AVX-512 lalu memakai instruksi konversi 256-bit untuk melewati masalah pemrosesan mask itu sendiri; implementasinya menjadi lebih ringkas dan mencapai performa lebih dari 21 GB/s
Ringkasan berbagai benchmark parser
- Hasil perbandingan benchmark semua tipe parser melalui environment variable menunjukkan bahwa parser AVX-512-to-256 adalah yang tercepat dengan 21.5 GB/s
- Parser berbasis AVX2 dan
Vector256 juga menunjukkan performa yang sangat dekat, dengan selisih hanya dalam 5%
- Parser berbasis
Vector128 dan Vector512 5~10% lebih lambat dibanding AVX2, dan khususnya parser Vector512 bahkan lebih lambat daripada Vector128
- Parser
IndexOfAny jauh lebih lambat dibanding parser SIMD lain. Vector64 tidak diakselerasi pada 9950X sehingga performanya sangat rendah
- Parser SIMD berbasis AVX-512 dan AVX2 membuktikan performa yang sangat unggul dibanding parser CSV sejenis
Benchmark tingkat atas: perbandingan 5950X dan 9950X
- Berdasarkan 1 juta baris aset paket, Sep_MT mencatat 72ms (8GB/s) di 9950X dan 119ms (4.9GB/s) di 5950X
- Pada data beban nyata (seperti
float), bandwidth ~8GB/s juga dicapai secara multithread di 9950X
- Perubahan generasi (5950X→9950X) menghasilkan peningkatan sekitar 1.5~1.6x pada parsing aplikasi nyata
- Dibanding pustaka CSV pesaing (Sylvan, ReadLine, CsvHelper, dll.), Sep membuktikan throughput yang jauh lebih tinggi dan alokasi sumber daya minimal
Kesimpulan dan ringkasan
- Sep 0.10.0 menembus batas performa parsing CSV melalui kombinasi optimisasi perangkat lunak dan fitur perangkat keras terbaru (AVX-512, clock tinggi)
- Perancangan algoritme SIMD terbaru, perbaikan kode JIT .NET, dan struktur assembly adalah inti inovasinya
- Efek dari peningkatan performa kumulatif dan perubahan generasi arsitektur dalam waktu singkat sangat mengesankan
- Sep secara efektif menghadirkan performa tinggi, multiplatform, dan skalabilitas kelas atas di ranah parsing CSV
1 komentar
Komentar Hacker News
vpternlogddanvpor