並列化したいシリアルC++プログラムがあります。私はMPIの基礎、MPI_Send
、MPI_Recv
などを知っています。基本的に、私はデータ処理アルゴリズムよりもはるかに高速に動作するデータ生成アルゴリズムを持っています。現在、それらはシリーズで実行されていますが、データ処理をルートプロセスで実行し、スレーブプロセスでデータ処理を行い、ルートから処理するデータを含むスレーブにメッセージを送信すると考えていました。このようにして、各スレーブはデータセットを処理し、次のデータセットを待つ。作業がなくなるとMPIスレーブプロセスがハングする
問題は、一旦ルートプロセスがデータを生成すると、スレーブがより多くを待っているのでプログラムがハングすることです。
これは問題の一例です:
#include "mpi.h"
#include <cassert>
#include <cstdio>
class Generator {
public:
Generator(int min, int max) : value(min - 1), max(max) {}
bool NextValue() {
++value;
return value < max;
}
int Value() { return value; }
private:
int value, max;
Generator() {}
Generator(const Generator &other) {}
Generator &operator=(const Generator &other) { return *this; }
};
long fibonnaci(int n) {
assert(n > 0);
if (n == 1 || n == 2) return 1;
return fibonnaci(n-1) + fibonnaci(n-2);
}
int main(int argc, char **argv) {
MPI_Init(&argc, &argv);
int rank, num_procs;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
if (rank == 0) {
Generator generator(1, 2 * num_procs);
int proc = 1;
while (generator.NextValue()) {
int value = generator.Value();
MPI_Send(&value, 1, MPI_INT, proc, 73, MPI_COMM_WORLD);
printf("** Sent %d to process %d.\n", value, proc);
proc = proc % (num_procs - 1) + 1;
}
} else {
while (true) {
int value;
MPI_Status status;
MPI_Recv(&value, 1, MPI_INT, 0, 73, MPI_COMM_WORLD, &status);
printf("** Received %d from process %d.\n", value, status.MPI_SOURCE);
printf("Process %d computed %d.\n", rank, fibonnaci(2 * (value + 10)));
}
}
MPI_Finalize();
return 0;
}
明らかに上記ませんすべてが「良い習慣」ですが、ポイントを全体取得するのに十分です。
スレーブプロセスからwhile(true)
を削除すると、各スレーブが終了したときにプログラムが終了します。私は、ルートプロセスがその仕事をし、すべてのスレーブが送信されたすべてを処理した後にのみ、プログラムを終了したいと思います。
生成されるデータセットの数がわかっていれば、多くのプロセスが実行され、すべてがうまく終了する可能性がありますが、ここでは該当しません。
提案がありますか?これを行うAPIがありますか?より良いトポロジでこれを改善できますか? MPI_Isend
またはMPI_IRecv
はこれを改善しますか?私はMPIにはかなり新しいので、私に同行してください。通常の練習は、すべての作業者に送信することです
おかげ
フィボナッチの実装はO(2^n)です。順序アルゴリズムを最適化する必要があります。 – mfontanini
私は知っています。これは私が解決している実際の問題ではなく、問題をモデル化したと考えることができる単純な例です。 –
多分私は何かが欠落していますが、各プロセスの終わりに単純な障壁があなたの問題を解決しないでしょうか? – suszterpatt