長い投稿で申し訳ありませんが、最初の段階で関連があると思ったものをすべて含めたかったのです。
私が欲しいもの
Krylov Subspace Methods for Dense Matricesの並列バージョンを実装しています。主にGMRES、QMRおよびCG。(プロファイリング後)私のDGEMVルーチンは哀れなことに気付きました。それで、私はそれを分離することによってそれに集中することに決めました。12コアのマシンで実行してみましたが、以下の結果は4コアのIntel i3ラップトップ用です。傾向に大きな違いはありません。
私のKMP_AFFINITY=VERBOSE
出力はここにあります。
私は小さなコードを書きました:
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
これは、50回の反復でCGの動作をシミュレートすると思います。
私が試したもの:
翻訳
私はもともとFortranでコードを書いていました。C、MATLAB、Python(Numpy)に翻訳しました。言うまでもなく、MATLABとPythonは恐ろしいものでした。驚くべきことに、上記の値ではCはFORTRANよりも1〜2秒優れていました。一貫して。
プロファイリング
実行するコードのプロファイルを作成し、46.075
数秒間実行しました。これは、MKL_DYNAMICがに設定されFALSE
、すべてのコアが使用されていたときです。MKL_DYNAMICをtrueとして使用した場合、特定の時点で使用されていたコアの数は(およそ)半分だけです。詳細は次のとおりです。
Address Line Assembly CPU Time
0x5cb51c mulpd %xmm9, %xmm14 36.591s
最も時間がかかるプロセスは次のようです:
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
以下にいくつかの写真を示します。
結論:
私はプロファイリングの本当の初心者ですが、スピードアップがまだ良くないことを理解しています。シーケンシャル(1コア)コードは53秒で終了します。それは1.1未満のスピードアップです!
本当の質問:スピードアップを改善するにはどうすればよいですか?
私が役立つかもしれないと思うものですが、私は確信できません:
- Pthreadsの実装
- MPI(ScaLapack)の実装
- 手動調整(方法がわかりません。これを提案する場合は、リソースを推奨してください)
誰かが(特にメモリに関して)より多くの詳細を必要とする場合、私が何をどのように実行すべきかを教えてください。以前にメモリのプロファイルを作成したことがありません。