1 puan yazan GN⁺ 2024-07-05 | 1 yorum | WhatsApp'ta paylaş

Ö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

 
GN⁺ 2024-07-05
Hacker News yorumları
  • Çoğu yazılım optimize edilmemiştir; bu yüzden performansı artırmak için geniş bir alan vardır

    • En önemli şey algoritma seçimidir
    • Çekirdek çağrıları gibi ağır işlemlerin azaltılıp azaltılamayacağı kontrol edilmelidir
    • Vektörleştirme yoluyla performans artırılabilir
    • Önbellek verimliliğinin optimize edilip edilemeyeceği kontrol edilmelidir
    • Donanıma özel optimizasyon olasılığı incelenmelidir
  • BLIS deposunda referans verilen makaleler, bu konuyu anlamak için otoriter kaynaklardır

    • Optimize edilmiş BLAS'ın neden düşük performans verdiğinin düşünüldüğünü anlamıyorum
    • NumPy yerine AMD'nin BLAS'ı kullanılmalıdır
    • BLIS, OpenBLAS'a göre paralelleştirmede daha iyidir
  • SIMD komutları, mikro çekirdek vektörleştirmesi için gerekli değildir

    • Uygun blok boyutu kullanılırsa BLIS'in saf C mikro çekirdeği, elle optimize edilmiş uygulamanın %80'inden fazla performans sunar
  • Çoğu kodlama kalıbı donanıma tamamen özgü değildir, bu yüzden çok fazla performans kaçırılmaktadır

    • "There's plenty of room at the top" adlı klasik CS makalesine bakmaya değer
  • Benchmark'ın kolayca tekrarlanabilir hâle getirilmiş olması övgüyü hak ediyor

    • 16 çekirdekli Xeon CPU'da matmul.c, gcc -O3 ile derlendiğinde 1,41 saniye, clang -O2 ile derlendiğinde 1,47 saniye sürüyor; NumPy ise 1,07 saniye sürüyor
    • avx512 çekirdeğinin daha hızlı olacağına inanılıyor
    • omp yerine pthreads kullanarak thread pool'u açıkça yönetmek, ek yükü azaltabilir
  • NumPy'nin uygulamasının gerçekten multithreading kullanıp kullanmadığı sorgulanıyor

  • OpenBLAS'tan daha iyi performans göstermesinin nedeni merak ediliyor

    • Önbellekleme gibi ayrıntılar ele alınıyor
    • Belirli bir işlemci için daha fazla optimize edilip edilmediği merak ediliyor
  • Bir tarafı Python, diğer tarafı C olarak karşılaştırmak adil değil

    • Her ikisini de C ile yazıp karşılaştırmak daha iyi olur
  • Maske üretimindeki verimsizlik rahatsız edici bulunuyor

    • Global sabit dizi üretmek veya sabit vektörle karşılaştırmak gibi daha verimli yöntemler var
    • Ancak bu küçük bir mesele ve pratikte büyük bir fark yaratmayacaktır
  • Matris çarpımının kendisini multithreading yapmanın ne kadar pratik olduğu sorgulanıyor

    • Multithreading, matris çarpımını kullanan algoritmalarda daha faydalı olacaktır
  • jart'ın tinyBLAS'ına değiniliyor

    • İlgili bağlantı veriliyor