MPI_Waitany 没有等待某些进程
MPI_Waitany is not waiting some processes
我正在尝试将动态进程创建与 mpi 结合使用,但在接收来自 child 进程的响应时遇到问题。我创建了一个名为 sum_partial 的向量来存储每个 child 的结果。当我 运行 有 4 个进程时(1 parent 进程 + 3 children)这工作正常。但是当我运行有更多的进程时,sum_partial没有得到一些children.
的结果
我不确定问题出在 MPI_Irecv 还是 MPI_Waitany。我尝试过使用 MPI_Wait、MPI_Waitall、MPI_Test 的其他方法。然而,问题重演。
这是我在 parent 过程中使用的 MPI 代码块。
//Some code here...
for(j=0;j<num_Proc;j++){
sprintf(argv[2], "%llu", vetIni[j+1]);
sprintf(argv[3], "%llu", vetEnd[j+1]);
MPI_Comm_spawn(bin, argv, 1, localInfo, 0, MPI_COMM_SELF, &intercommChild[j], err);
}
long long int sum_local=0, *sum_partial = calloc(num_Proc, sizeof(long long int));
for(j=0;j<num_Proc;j++)
MPI_Irecv(&sum_partial[j], 1, MPI_LONG, 0, 99, intercommChild[j], &req[j]);
long long int ini = vetIni[0], end = vetEnd[0];
for(i=ini;i<end;i++)
sum_local += i * (N-i); //Parent process do it's computation
for(j=0;j<num_Proc;j++){
MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
sum_local += sum_partial[j]; //Sum all results
}
MPI_Finalize();
这是 child 处理 运行 的代码。
//Some code here...
long long int ini = atol(argv[2]);
long long int end = atol(argv[3]);
long long int sum=0, i;
for(i=ini;i<end;i++)
sum += i*(N-i);
MPI_Send(&sum, 1, MPI_LONG, 0, 99, intercommPai);
MPI_Finalize();
如果我打印 sum_partial 运行 7 child,它会像:
-8393498447644280608
4191132954560973024
0
0
-3708736119148578592
9184626552355719392
-903258050952161056
这些零不应该存在。其他结果都对。
任何人都可以确定我的代码中存在什么问题吗?
谢谢。
这是你在 master 上的循环
for(j=0;j<num_Proc;j++){
MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
sum_local += sum_partial[j]; //Sum all results
}
所以在迭代 j
你等待来自任何任务的数据,但是你隐含地假设来自任务 j
的数据已收到(例如你访问 sum_partial[j]
)。
你可以
for(j=0;j<num_Proc;j++){
MPI_Wait(&req[j], MPI_STATUS_IGNORE);
sum_local += sum_partial[j]; //Sum all results
}
或更有可能
for(j=0;j<num_Proc;j++){
MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
sum_local += sum_partial[source]; //Sum all results
}
澄清一下,您认为它 "work" 完成了 4 个任务,但您真的很幸运。
我正在尝试将动态进程创建与 mpi 结合使用,但在接收来自 child 进程的响应时遇到问题。我创建了一个名为 sum_partial 的向量来存储每个 child 的结果。当我 运行 有 4 个进程时(1 parent 进程 + 3 children)这工作正常。但是当我运行有更多的进程时,sum_partial没有得到一些children.
的结果我不确定问题出在 MPI_Irecv 还是 MPI_Waitany。我尝试过使用 MPI_Wait、MPI_Waitall、MPI_Test 的其他方法。然而,问题重演。
这是我在 parent 过程中使用的 MPI 代码块。
//Some code here...
for(j=0;j<num_Proc;j++){
sprintf(argv[2], "%llu", vetIni[j+1]);
sprintf(argv[3], "%llu", vetEnd[j+1]);
MPI_Comm_spawn(bin, argv, 1, localInfo, 0, MPI_COMM_SELF, &intercommChild[j], err);
}
long long int sum_local=0, *sum_partial = calloc(num_Proc, sizeof(long long int));
for(j=0;j<num_Proc;j++)
MPI_Irecv(&sum_partial[j], 1, MPI_LONG, 0, 99, intercommChild[j], &req[j]);
long long int ini = vetIni[0], end = vetEnd[0];
for(i=ini;i<end;i++)
sum_local += i * (N-i); //Parent process do it's computation
for(j=0;j<num_Proc;j++){
MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
sum_local += sum_partial[j]; //Sum all results
}
MPI_Finalize();
这是 child 处理 运行 的代码。
//Some code here...
long long int ini = atol(argv[2]);
long long int end = atol(argv[3]);
long long int sum=0, i;
for(i=ini;i<end;i++)
sum += i*(N-i);
MPI_Send(&sum, 1, MPI_LONG, 0, 99, intercommPai);
MPI_Finalize();
如果我打印 sum_partial 运行 7 child,它会像:
-8393498447644280608
4191132954560973024
0
0
-3708736119148578592
9184626552355719392
-903258050952161056
这些零不应该存在。其他结果都对。
任何人都可以确定我的代码中存在什么问题吗?
谢谢。
这是你在 master 上的循环
for(j=0;j<num_Proc;j++){
MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
sum_local += sum_partial[j]; //Sum all results
}
所以在迭代 j
你等待来自任何任务的数据,但是你隐含地假设来自任务 j
的数据已收到(例如你访问 sum_partial[j]
)。
你可以
for(j=0;j<num_Proc;j++){
MPI_Wait(&req[j], MPI_STATUS_IGNORE);
sum_local += sum_partial[j]; //Sum all results
}
或更有可能
for(j=0;j<num_Proc;j++){
MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
sum_local += sum_partial[source]; //Sum all results
}
澄清一下,您认为它 "work" 完成了 4 个任务,但您真的很幸运。