Uzun yazı için özür dilerim ama ilk adımda alakalı olduğunu düşündüğüm her şeyi dahil etmek istedim.
İstediğim
Yoğun Matrisler için Krylov Altuzay Yöntemlerinin paralel bir versiyonunu kullanıyorum .Temelde GMRES, QMR ve CG. (Profillemeden sonra) DGEMV rutinimin acıklı olduğunu fark ettim. Bu yüzden izole ederek buna konsantre olmaya karar verdim. 12 çekirdekli bir makinede çalıştırmayı denedim, ancak aşağıdaki sonuçlar 4 çekirdekli Intel i3 Dizüstü Bilgisayar için. Trendde çok fazla fark yok.
Çıktıma buradanKMP_AFFINITY=VERBOSE
ulaşılabilir .
Küçük bir kod yazdım:
size_N = 15000
A = randomly_generated_dense_matrix(size_N,size_N); %Condition Number is not bad
b = randomly_generated_dense_vector(size_N);
for it=1:n_times %n_times I kept at 50
x = Matrix_Vector_Multi(A,b);
end
Bunun 50 yineleme için CG'nin davranışını simüle ettiğine inanıyorum.
Ne denedim:
Tercüme
Başlangıçta kodu Fortran'da yazmıştım. C, MATLAB ve Python'a (Numpy) çevirdim. Söylemeye gerek yok, MATLAB ve Python korkunçtu. Şaşırtıcı bir şekilde, C, yukarıdaki değerler için bir veya iki saniye FORTRAN'dan daha iyiydi. Sürekli.
profil oluşturma
Kodumu çalıştırmak için profilli ve 46.075
saniyeler içinde koştu . Bu, MKL_DYNAMIC olarak ayarlandığındaFALSE
ve tüm çekirdekler kullanıldığında oldu. MKL_DYNAMIC'i doğru olarak kullansaydım, çekirdek sayısının sadece (yaklaşık) yarısı herhangi bir zamanda kullanılırdı. İşte birkaç ayrıntı:
Address Line Assembly CPU Time
0x5cb51c mulpd %xmm9, %xmm14 36.591s
En çok zaman alan süreç şu şekildedir:
Call Stack LAX16_N4_Loop_M16gas_1
CPU Time by Utilization 157.926s
CPU Time:Total by Utilization 94.1%
Overhead Time 0us
Overhead Time:Total 0.0%
Module libmkl_mc3.so
İşte birkaç resim:
Sonuç:
Profil oluşturmaya gerçek bir başlangıç yapıyorum, ancak hızlanmanın hala iyi olmadığını anlıyorum. Sıralı (1 Çekirdek) kod 53 saniye içinde biter . Bu, 1.1'den daha düşük bir hız!
Gerçek Soru: Hızımı artırmak için ne yapmalıyım?
Sanırım yardımcı olabilecek şeyler ama emin olamıyorum:
- Pthreads uygulaması
- MPI (ScaLapack) uygulaması
- Manuel Ayarlama (Nasıl yapılacağını bilmiyorum. Bunu önerirseniz lütfen bir kaynak önerin)
Daha fazla ayrıntıya (özellikle bellekle ilgili) ihtiyacınız varsa, lütfen neyi ve nasıl çalışmam gerektiğini bana bildirin. Daha önce hiç hatırlamamıştım.