問題は、MPI がコンソール入力を多くのプロセスにフィードする方法を提供せず、 rank を持つプロセスにのみ提供すること0
です。の最初の 3 行のためmain
:
int main(int argc, char *argv[]){
int oper;
std::cout << "Enter Size:";
std::cin >> oper; // <------- The problem is right here
Operations* operations = new Operations(oper);
int rank, size;
MPI_Init(&argc, &argv);
int tid;
MPI_Comm_rank(MPI_COMM_WORLD, &tid);
switch(tid)
{
0
取得できないコンソール入力を待機しているブロックをランク付けする以外のすべてのプロセス。main
関数の先頭を次のように書き換える必要があります。
int main(int argc, char *argv[]){
int oper;
MPI_Init(&argc, &argv);
int tid;
MPI_Comm_rank(MPI_COMM_WORLD, &tid);
if (tid == 0) {
std::cout << "Enter Size:";
std::cin >> oper;
}
MPI_Bcast(&oper, 1, MPI_INT, 0, MPI_COMM_WORLD);
Operations* operations = new Operations(oper);
switch(tid)
{
次のように動作します: ランクのみ0
がプロンプトを表示し、コンソール入力を に読み込みますoper
。oper
次に、ランクからの値のブロードキャスト0
が実行され、他のすべてのプロセスが正しい値を取得し、Operations
オブジェクトを作成してから、適切な関数に分岐します。