1

より高速に実行しようとしている線形代数コードがあります。これは、ループと行列ベクトルの乗算を含む反復アルゴリズムです。これまでのところ、MATMUL (Fortran Lib.)、DGEMV を使用しました。OpenMP で独自の MV コードを作成しようとしましたが、アルゴリズムはスケーラビリティの点で優れていません。割り当てているプロセッサの数に関係なく、スピードアップはかろうじて 3.5 ~ 4 です (64 個のプロセッサを試しました)。プロファイリングは、Matrix-Vector でかなりの時間が費やされていることを示しており、残りはごくわずかです。私の質問は、大量の RAM とプロセッサを備えた共有メモリ システムを使用していることです。コードの OpenMP 実装 (Matrix Vector を含む) を微調整しようとしましたが、役に立ちませんでした。MPI でのコーディングは役に立ちますか? 私は MPI のプロではありませんが、メッセージ通信を微調整する機能は少し役立つかもしれませんが、確信は持てません。コメントはありますか?

より一般的には、私が読んだ文献によると、MPI = Distributed、OpenMP = Shared ですが、それらは他の領域でうまく機能しますか? Shared の MPI のようなものですか? それはうまくいきますか?うまくやれば、OpenMP 実装よりも優れていますか?

4

2 に答える 2

4

マルチコア環境向けにすでに十分に最適化されている線形代数パッケージを使用し、それを行列とベクトルの乗算に使用するのが最善です。Atlasパッケージ、gotoblas (nehalem またはそれ以前のバージョンをお持ちの場合。残念ながら更新されていません)、またはベンダーの BLAS 実装 ( Intel CPU のMKL、AMD のACML 、Apple のVecLibなど、すべてお金がかかります) はすべて優れた機能を備えています。 、よく調整されたマルチスレッド BLAS 実装。フルタイムの開発チームよりも優れた成果を上げられると信じるに足る十分な理由がない限り、それらを使用するのが最善です。

ベクトルが別の行列よりも小さく、作業が少ないという理由だけで、DGEMM で行うように DGEMV で並列処理を高速化することはできないことに注意してください。しかし、それでもかなりうまくいく可能性があり、すでにマルチレベルのキャッシュ ブロッキングを行っていない限り、これらのライブラリを使用すると、手作業で作成したものよりもはるかに優れたパフォーマンスが得られることがわかります。

于 2012-01-07T16:14:25.057 に答える
3

共有環境でMPIを使用できます(分散環境ではOpenMPは使用できません)。ただし、優れた高速化を実現するには、使用するテクノロジーよりもアルゴリズムとデータの依存関係に大きく依存します。共有メモリがたくさんあるので、OpenMPを使い続け、リソースを最大限に活用しているかどうかを慎重に調べることをお勧めします。

于 2012-01-07T14:07:53.023 に答える