Özet
Giriş
- Matris çarpımı, modern sinir ağlarında vazgeçilmez bir unsurdur
- NumPy, yüksek performansa ulaşmak için harici BLAS kütüphaneleri kullanır
- Bu yazı, basit, taşınabilir ve ölçeklenebilir yüksek performanslı matris çarpımının nasıl uygulanacağını açıklar
NumPy performansı
- NumPy, AMD CPU üzerinde OpenBLAS kullanır
- Performans ölçümü FLOP/s cinsinden hesaplanır
- Ryzen 7 7700 CPU üzerinde NumPy'nin tek iş parçacıklı ve çok iş parçacıklı performansı ölçülür
Teorik sınırlar
- CPU'nun bellek hiyerarşisi ve SIMD uzantıları açıklanır
- Teorik olarak tek iş parçacığında 163 GFLOPS, çok iş parçacığında 1203 GFLOPS elde edilebilir
Basit uygulama
- Temel matris çarpımı algoritması açıklanır ve basit uygulamanın performansı ölçülür
- Basit uygulama 2.7 GFLOPS elde eder
Kernel
- Matris çarpımını küçük alt problemlere bölerek çözme yöntemi açıklanır
- Kernel, SIMD komutları kullanılarak optimize edilir
- 16x6 kernel ile 147 GFLOPS elde edilir
Maskeleme ve paketleme
- Rastgele matris boyutlarını işlemek için sınır durumlarının nasıl ele alınacağı açıklanır
- Performansı optimize etmek için maskeleme ve paketleme kullanılır
- Yeni uygulama 56 GFLOPS elde eder
Önbellekleme
- CPU önbelleğinin bellek sistemi açıklanır
- Verinin yeniden kullanımı ve önbellek yönetimini optimize etmek için önbellekten yararlanılır
GN⁺ görüşü
- Bu yazı, yüksek performanslı matris çarpımının nasıl uygulanacağını adım adım anlattığı için oldukça öğreticidir
- SIMD komutları ve CPU önbelleğini kullanan optimizasyon yöntemleri öğrenilebilir
- NumPy gibi kütüphanelerin iç işleyişini anlamaya yardımcı olur
- Benzer işlevlere sahip diğer projeler arasında Intel MKL ve OpenBLAS bulunur
- Yeni bir teknoloji ya da açık kaynak benimsenirken performans ve taşınabilirlik dikkate alınmalıdır
1 yorum
Hacker News yorumları
Çoğu yazılım optimize edilmemiştir; bu yüzden performansı artırmak için geniş bir alan vardır
BLIS deposunda referans verilen makaleler, bu konuyu anlamak için otoriter kaynaklardır
SIMD komutları, mikro çekirdek vektörleştirmesi için gerekli değildir
Çoğu kodlama kalıbı donanıma tamamen özgü değildir, bu yüzden çok fazla performans kaçırılmaktadır
Benchmark'ın kolayca tekrarlanabilir hâle getirilmiş olması övgüyü hak ediyor
matmul.c,gcc -O3ile derlendiğinde 1,41 saniye,clang -O2ile derlendiğinde 1,47 saniye sürüyor; NumPy ise 1,07 saniye sürüyoravx512çekirdeğinin daha hızlı olacağına inanılıyorompyerinepthreadskullanarak thread pool'u açıkça yönetmek, ek yükü azaltabilirNumPy'nin uygulamasının gerçekten multithreading kullanıp kullanmadığı sorgulanıyor
OpenBLAS'tan daha iyi performans göstermesinin nedeni merak ediliyor
Bir tarafı Python, diğer tarafı C olarak karşılaştırmak adil değil
Maske üretimindeki verimsizlik rahatsız edici bulunuyor
Matris çarpımının kendisini multithreading yapmanın ne kadar pratik olduğu sorgulanıyor
jart'ın tinyBLAS'ına değiniliyor