我在MPI程序中使用笛卡尔拓扑。现在我想在程序结束时在每个处理器上收集有关变量的信息(让我们称之为'状态'),并在屏幕上打印结果(从根进程)。通常我会做MPI_Gather,但我怎么能用“笛卡尔风格”来做呢?
答案 0 :(得分:1)
提出邻居集体的原始论文提供了阻塞和非阻塞邻居alltoall操作的简单示例实现,您可以使用它们作为示例来旋转您自己的邻居聚集,即使您正在运行的MPI实现也没有尚未支持所有3.0功能:
Hoeffler and Traff: "Sparse Collective Operations for MPI"
MPICH最近也增加了支持。你可以看一下他们的实现,但是他们的代码中有很多无关紧要的东西来支持错误处理,线程安全等等。
答案 1 :(得分:1)
如果有人仍然感兴趣,我决定采用非阻塞接收,然后是Waitall:
if (rank == 0) {
for (i=0; i<m*n; i++) {
MPI_Irecv(&states[i], 10, MPI_CHAR, MPI_ANY_SOURCE, final_tag, MPI_COMM_WORLD, &report_requests[i]); // Receive final states from all processes
}
}
// Further computation
if (rank == 0) {
MPI_Waitall(m*n, report_requests, MPI_STATUSES_IGNORE); // Wait for state reports from all processes
// Process
这对我来说很有用:)