Robert A. van de Geijn ve Enrique S. Quintana-Ortí'nin yazdığı The Science of Programming Matrix Computations adlı harika kitap iyi bir başlangıç noktasıdır . Ücretsiz bir indirme sürümü sağlarlar.
BLAS üç seviyeye ayrılmıştır:
Seviye 1, yalnızca vektörler üzerinde çalışan bir dizi doğrusal cebir fonksiyonunu tanımlar. Bu işlevler vektörleştirmeden yararlanır (örneğin SSE kullanımından).
Seviye 2 fonksiyonları matris vektör işlemleridir, örneğin bazı matris vektör çarpımı. Bu işlevler Seviye1 işlevleri açısından uygulanabilir. Bununla birlikte, paylaşılan belleğe sahip bazı çok işlemcili mimariden yararlanan özel bir uygulama sağlayabilirseniz, bu işlevlerin performansını artırabilirsiniz.
Seviye 3 fonksiyonları, matris-matris çarpımı gibi işlemlerdir. Yine bunları Seviye2 işlevleri açısından uygulayabilirsiniz. Ancak Seviye3 işlevleri, O (N ^ 2) verileri üzerinde O (N ^ 3) işlemleri gerçekleştirir. Dolayısıyla, platformunuzun bir önbellek hiyerarşisi varsa, önbellek için optimize edilmiş / önbellek dostu özel bir uygulama sağlarsanız performansı artırabilirsiniz . Bu kitapta güzelce anlatılıyor. Seviye3 işlevlerinin ana desteği önbellek optimizasyonundan gelir. Bu artış, paralellik ve diğer donanım optimizasyonlarından gelen ikinci artışı önemli ölçüde aşıyor.
Bu arada, yüksek performanslı BLAS uygulamalarının çoğu (veya hatta tümü) Fortran'da GERÇEKLEŞTİRİLMEMEKTEDİR. ATLAS, C'de uygulanmaktadır. GotoBLAS / OpenBLAS, C'de ve onun performans açısından kritik kısımları Assembler'da uygulanmaktadır. Sadece BLAS'ın referans uygulaması Fortran'da uygulanmaktadır. Bununla birlikte, tüm bu BLAS uygulamaları, LAPACK'e bağlanabilecek şekilde bir Fortran arayüzü sağlar (LAPACK tüm performansını BLAS'tan alır).
Optimize edilmiş derleyiciler bu bakımdan küçük bir rol oynar (ve GotoBLAS / OpenBLAS için derleyici hiç önemli değildir).
IMHO hiçbir BLAS uygulaması, Coppersmith – Winograd algoritması veya Strassen algoritması gibi algoritmaları kullanmaz. Sebebinden tam olarak emin değilim, ama bu benim tahminim:
- Belki de bu algoritmaların önbellek için optimize edilmiş bir uygulamasını sağlamak mümkün değildir (yani kazanacağınızdan daha fazlasını kaybedersiniz)
- Bu algoritmalar sayısal olarak kararlı değildir. BLAS, LAPACK'in hesaplamalı çekirdeği olduğundan, bu bir hayırdır.
Düzenle / Güncelle:
Bu konuyla ilgili yeni ve çığır açan kağıt, BLIS kağıtlarıdır . Son derece iyi yazılmışlar. "Yüksek Performanslı Hesaplama için Yazılım Temelleri" dersim için matris-matris ürününü kağıtlarını takip ederek uyguladım. Aslında matris-matris çarpımının birkaç çeşidini uyguladım. En basit varyantlar tamamen düz C ile yazılmıştır ve 450 satırdan az koda sahiptir. Diğer tüm varyantlar yalnızca döngüleri optimize eder
for (l=0; l<MR*NR; ++l) {
AB[l] = 0;
}
for (l=0; l<kc; ++l) {
for (j=0; j<NR; ++j) {
for (i=0; i<MR; ++i) {
AB[i+j*MR] += A[i]*B[j];
}
}
A += MR;
B += NR;
}
Matris-matris ürününün genel performansı yalnızca bu döngülere bağlıdır. Zamanın yaklaşık% 99,9'u burada geçiriliyor. Diğer varyantlarda performansı artırmak için içsel ve derleyici kodu kullandım. Öğreticinin tüm varyantların üzerinden geçtiğini burada görebilirsiniz:
ulmBLAS: GEMM üzerine Öğretici (Matrix-Matrix Product)
BLIS belgeleri ile birlikte, Intel MKL gibi kitaplıkların böyle bir performansı nasıl elde edebileceğini anlamak oldukça kolay hale geliyor. Ve neden satır veya sütun büyük depolama kullanmanız önemli değil!
Nihai kriterler burada (projemize ulmBLAS adını verdik):
UlmBLAS, BLIS, MKL, openBLAS ve Eigen için kıyaslamalar
Başka Bir Düzenleme / Güncelleme:
Ayrıca, BLAS'ın bir doğrusal denklem sistemini çözmek gibi sayısal doğrusal cebir problemlerinde nasıl kullanıldığına dair bazı eğitimler yazdım:
Yüksek Performanslı LU Ayrıştırması
(Bu LU çarpanlarına ayırma, örneğin Matlab tarafından bir doğrusal denklem sistemini çözmek için kullanılır.)
Ben zaman bulmak için umut tanımlamak ve benzeri LU çarpanlarına bir derece ölçeklenebilir paralel uygulanmasını gerçekleştirmek için nasıl göstermek için öğretici uzatmak PLAZMA .
Tamam, işte burada: Önbellek İçin Optimize Edilmiş Paralel LU Ayrıştırmasını Kodlama
Not: Ayrıca uBLAS'ın performansını iyileştirmek için bazı deneyler yaptım. UBLAS'ın performansını artırmak (evet, kelimelerle oynayın :)) aslında oldukça basit:
UBLAS üzerinde deneyler .
İşte BLAZE ile benzer bir proje :
BLAZE üzerinde deneyler .