行列とベクトルの乗算を並列化する MPI ルーチンを作成しました。スピードアップは、存在しないことに失望しています。私はネット上で多くのルーチンを見つけましたが、ほとんどのルーチンとほぼ同じ方法でこれを処理しています。私が見つけることができなかったのは、実際のマシンでの実際の高速化に関する多くのデータです。サイズが 100x100 から 1000x1000 の行列で、プロセッサの数が 2 から 64 までの、適度なサイズの問題だと思います。行列をほぼ正方形の市松模様に分解しています。この問題のサイズとプロセッサ数の範囲で現実的にどのようなスピードアップを期待できるかについて、誰かが私にデータを指摘できますか? ありがとう。
1 に答える
行列に length のベクトルを掛けるには2*N^2
FP 演算が必要です。1000に等しい場合、これは 2.10 6操作になります。最新の CPU コアは、1 サイクルあたり 4 つの FP 操作を実行し、約 2.10 9サイクル/秒で実行されます。したがって、 1 つの CPU コアで行列とベクトルの乗算を実行するのに 250 µs しかかかりません。マトリックスが小さいほど、所要時間は 2 倍短くなります。その時間を一緒に動作している CPU コアの数で割ります。N x N
N
N
すべての並列化テクノロジは、何らかのオーバーヘッドをもたらします。このオーバーヘッドが、各処理要素 (= CPU コア) によって実行される作業量よりも大幅に小さい場合にのみ、このようなテクノロジを採用する意味があります。
行列のサイズを大きくすると、時間がかかる問題が発生するため、オーバーヘッドが比較的少なくなります。しかし、メモリ帯域幅というまったく別の問題が発生することになります。行列とベクトルの乗算はメモリ バウンドの問題であり、最新の CPU では、乗算を実行する 1 つまたは 2 つのスレッドによって、1 つのソケットの帯域幅が簡単に「消費」される可能性があります。スレッドにデータを供給するのに十分なメモリ帯域幅がないため、スレッドを増やしても何も起こりません。CPU ソケットを追加するだけで、使用可能なメモリ帯域幅が効果的に増加するため、パフォーマンスが向上します。
それだけです - 行列とベクトルの乗算は非常に単純ですが、並列化に関しては非常にトリッキーな問題でもあります。