MPI笛卡尔拓扑 - MPI_Gather相当于?

时间:2014-01-04 20:40:14

标签: c parallel-processing mpi

我在MPI程序中使用笛卡尔拓扑。现在我想在程序结束时在每个处理器上收集有关变量的信息(让我们称之为'状态'),并在屏幕上打印结果(从根进程)。通常我会做MPI_Gather,但我怎么能用“笛卡尔风格”来做呢?

2 个答案:

答案 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

这对我来说很有用:)