2012-01-07 13 views
1

私はより速く実行しようとしている線形代数コードを持っています。これまでのところ、私はMATMUL(Fortran Lib。)、DGEMVを使用しましたが、私自身のMVコードをOpenMPで作成しようとしましたが、アルゴリズムはスケーラビリティの面で優れていません。スピードアップは、私が割り当てているプロセッサの数に関係なく、わずか3.5 - 4です(私は64プロセッサを試しました)。 プロファイリングでは、Matrix-Vectorでかなりの時間が費やされ、残りはかなり公称です。 私の質問は次のとおりです: 私は、RAMとプロセッサのトンを持つ共有メモリシステムを持っています。私はコードのOpenMP実装を調整しようとしましたが(Matrix Vectorを含む)、助けにはなりませんでした。 MPIでのコード作成に役立つでしょうか?私はMPIのプロではありませんが、メッセージ通信を微調整する能力は少し助けになるかもしれませんが、私は確信が持てません。コメントはありますか?MPIとOpenMP。私には選択肢がありますか?

もっと一般的には、文献から私はMPI = Distributed、OpenMP = Sharedを読みましたが、他の領域ではうまくいくのでしょうか?共有のMPIのように?それは働くでしょうか?うまくいけば、OpenMPの実装よりも優れていますか?

答えて

3

共有環境でもMPIを使用できます(ただし、分散型のOpenMPでは使用できません)。しかし、良いスピードアップを達成するには、アルゴリズムやデータの依存関係が、使用されている技術よりもずっと多くなります。共有メモリが大量にあるので、OpenMPに固執し、リソースを最大限に活用しているかどうかを慎重に調べることをお勧めします。

+0

注目。どうもありがとう ! –

4

あなたは、既にマルチコア環境に最適化された線形代数パッケージを使用して、行列ベクトルの乗算に使用するのが最良です。 パッケージ(、AMDの場合ACML、アップルの場合VecLib、すべての費用がかかります)は、すべてが良好です。gotoblas(ネハレム以上の場合は悲しいことですが残念ながら更新されません) 、うまくチューニングされたマルチスレッドBLAS実装。フルタイムの開発チームができることよりも優れていると信じる素晴らしい理由がない限り、それらを使用するのが最良です。

ベクトルが別の行列よりも小さく、作業量が少ないからといって、DGEMMで行うDGEMVとの並列処理の高速化は決してできません。しかし、あなたはまだかなり上手くいくことができます。また、これらのライブラリでは、マルチレベルのキャッシュブロッキングをしていない限り、手作業で行うよりも格段にパフォーマンスが向上します。

+0

私はインテルMKLを使用しています。自分のコードを書くことを再考します。 –

+1

マルチスレッドMKLを使用していますか(Composer XEを使用し、-mkl = parallelを追加していますか?)マルチスレッド対シングルスレッドのスピードアップとは何ですか?マルチスレッドライブラリを使用するには_your_コードを書き直す必要はありません。 –

+0

私のコンパイルフラグは次のとおりです。 輸出MKL_NUM_THREADS = 4 のifort -fp-モデルソースCode.f90 -L $ MKLROOT/libに/ IA32 -lmkl_blas95 -lmkl_intel -lmkl_intel_thread -lmkl_core -openmp -lpthread &&時間 ./a.out私はプロファイリングのためにVTuneを使用します –

関連する問題