問題は、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オブジェクトを作成してから、適切な関数に分岐します。