Ringkasan
Pengantar
- Perkalian matriks merupakan elemen penting dalam jaringan saraf modern
- NumPy mencapai kinerja tinggi dengan menggunakan pustaka BLAS eksternal
- Artikel ini menjelaskan cara mengimplementasikan perkalian matriks berperforma tinggi yang sederhana, portabel, dan dapat diskalakan
Kinerja NumPy
- NumPy menggunakan OpenBLAS pada CPU AMD
- Pengukuran kinerja dihitung dalam FLOP/s
- Kinerja NumPy single-thread dan multi-thread diukur pada CPU Ryzen 7 7700
Batas teoretis
- Menjelaskan hierarki memori CPU dan ekstensi SIMD
- Secara teoretis, dapat mencapai 163 GFLOPS pada single-thread dan 1203 GFLOPS pada multi-thread
Implementasi sederhana
- Menjelaskan algoritme dasar perkalian matriks dan mengukur kinerja implementasi sederhana
- Implementasi sederhana mencapai 2.7 GFLOPS
Kernel
- Menjelaskan cara menyelesaikan perkalian matriks dengan membaginya menjadi submasalah kecil
- Mengoptimalkan kernel menggunakan instruksi SIMD
- Mencapai 147 GFLOPS dengan kernel 16x6
Masking dan packing
- Menjelaskan cara menangani kasus batas untuk memproses ukuran matriks sembarang
- Mengoptimalkan kinerja dengan masking dan packing
- Implementasi baru mencapai 56 GFLOPS
Caching
- Menjelaskan sistem memori cache CPU
- Mengoptimalkan penggunaan ulang data dan pengelolaan cache dengan memanfaatkan cache CPU
Opini GN⁺
- Artikel ini sangat edukatif karena menjelaskan langkah demi langkah cara mengimplementasikan perkalian matriks berperforma tinggi
- Anda dapat mempelajari metode optimasi yang memanfaatkan instruksi SIMD dan cache CPU
- Membantu memahami cara kerja internal pustaka seperti NumPy
- Proyek lain dengan fungsi serupa antara lain Intel MKL, OpenBLAS, dan lainnya
- Saat mengadopsi teknologi baru atau open source, perlu mempertimbangkan kinerja dan portabilitas
1 komentar
Komentar Hacker News
Sebagian besar software tidak dioptimalkan, jadi masih banyak ruang untuk peningkatan performa
Makalah yang dirujuk di repositori BLIS adalah referensi otoritatif untuk memahami topik ini
Instruksi SIMD tidak diperlukan untuk vektorisasi micro-kernel
Sebagian besar pola coding tidak sepenuhnya spesifik terhadap hardware, sehingga banyak performa yang terlewat
Patut diapresiasi karena benchmark dibuat mudah untuk diulang
matmul.cmembutuhkan 1,41 detik saat dikompilasi dengangcc -O3, 1,47 detik saat dikompilasi denganclang -O2, dan NumPy membutuhkan 1,07 detikDiragukan apakah implementasi numpy benar-benar menggunakan multithreading
Ingin tahu mengapa performanya lebih baik daripada OpenBLAS
Membandingkan Python di satu sisi dan C di sisi lain tidak adil
Inefisiensi dalam pembuatan mask terasa mengganggu
Meragukan kepraktisan melakukan multithreading pada perkalian matriks itu sendiri
Menyebut tinyBLAS milik jart