Maaf untuk posting lama tapi saya ingin memasukkan semua yang saya pikir relevan pada langkah pertama.
Apa yang saya inginkan
Saya menerapkan versi paralel dari Metode Subruang Krylov untuk Matriks Padat.Terutama GMRES, QMR dan CG. Saya menyadari (setelah membuat profil) bahwa rutinitas DGEMV saya menyedihkan. Jadi saya memutuskan untuk berkonsentrasi pada hal itu dengan mengisolasinya. Saya telah mencoba menjalankannya pada mesin 12 inti tetapi hasilnya di bawah ini untuk Laptop 4 core Intel i3. Tidak ada banyak perbedaan dalam tren.
KMP_AFFINITY=VERBOSE
Output saya tersedia di sini .
Saya menulis kode kecil:
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
Saya percaya ini mensimulasikan perilaku CG untuk 50 iterasi.
Apa yang saya coba:
Terjemahan
Saya awalnya menulis kode di Fortran. Saya menerjemahkannya ke C, MATLAB dan Python (Numpy). Tak perlu dikatakan, MATLAB dan Python mengerikan.Anehnya, C lebih baik daripada FORTRAN dalam satu atau dua detik untuk nilai-nilai di atas. Secara konsisten.
Pembuatan profil
Saya memrofilkan kode saya untuk dijalankan dan berjalan selama beberapa 46.075
detik. Inilah saat MKL_DYNAMIC disetel keFALSE
dan semua core digunakan. Jika saya menggunakan MKL_DYNAMIC sebagai true, hanya (kurang-lebih) setengah dari jumlah core yang digunakan pada suatu titik waktu tertentu. Berikut ini beberapa detailnya:
Address Line Assembly CPU Time
0x5cb51c mulpd %xmm9, %xmm14 36.591s
Proses yang paling memakan waktu adalah:
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
Berikut beberapa foto:
Kesimpulan:
Saya benar-benar pemula dalam membuat profil tetapi saya menyadari bahwa kecepatannya masih belum baik. Kode sekuensial (1 Core) selesai dalam 53 detik. Itu adalah kecepatan kurang dari 1,1!
Pertanyaan Sungguhan: Apa yang harus saya lakukan untuk meningkatkan kecepatan saya?
Hal-hal yang saya pikir mungkin bisa membantu tetapi saya tidak yakin:
- Implementasi pthreads
- Implementasi MPI (ScaLapack)
- Penyesuaian Manual (Saya tidak tahu caranya. Mohon rekomendasikan sumber daya jika Anda menyarankan ini)
Jika ada yang membutuhkan lebih banyak (terutama mengenai memori) detail, beri tahu saya apa yang harus saya jalankan dan caranya. Saya tidak pernah mengingat memori sebelumnya.
sumber
Bagaimana Anda melakukan perkalian matriks-vektor? Sebuah loop ganda dengan tangan? Atau telepon ke BLAS? Jika Anda menggunakan MKL, saya akan sangat menyarankan menggunakan rutinitas BLAS dari versi berulir.
Karena penasaran, Anda mungkin juga ingin mengkompilasi versi ATLAS yang Anda setel sendiri dan melihat bagaimana hal itu terjadi pada masalah Anda.
Memperbarui
Mengikuti diskusi dalam komentar di bawah ini, ternyata Intel Core i3-330M Anda hanya memiliki dua inti "nyata". Dua core yang hilang ditiru dengan hyperthreading . Karena di core hyperthreaded baik bus memori dan unit floating-point dibagikan, Anda tidak akan mendapatkan percepatan apa pun jika salah satu dari keduanya merupakan faktor pembatas. Bahkan, menggunakan empat core bahkan mungkin akan memperlambat segalanya.
Hasil seperti apa yang Anda dapatkan pada "hanya" dua core?
sumber
Saya mendapat kesan bahwa pemesanan baris-utama adalah optimal untuk masalah ini sehubungan dengan waktu akses memori, penggunaan garis cache dan TLB meleset. Saya kira versi FORTRAN Anda menggunakan pemesanan kolom-utama sebagai gantinya, yang dapat menjelaskan mengapa ini lebih lambat daripada versi C secara konsisten.
Seperti yang sudah ditunjukkan sebelumnya, bandwidth memori Anda terbatas di sini. Apa yang mungkin salah adalah vektorb tidak disimpan dalam cache. Anda dapat menguji apakah Anda mengamati bandwidth memori yang sama (efektif) untuk size_N = 15000 daripada untuk size_N = 5000. Jika Anda melakukannya, ada peluang yang cukup bagus bahwa kodenya sudah optimal, dan bahwa bandwidth memori sistem Anda cukup sederhana. tidak terlalu bagus.
Anda juga dapat menguji kecepatan jika Anda hanya meringkas semua elemen dari matriks dalam satu lingkaran, bukan multiplikasi vektor matriks. (Anda mungkin ingin membuka gulungannya dengan faktor 4, karena penambahan non-asosiatif dapat mencegah kompiler melakukan optimasi ini untuk Anda.)
sumber