【问题标题】:MPI Cartesian Topology - MPI_Gather equivalent?MPI笛卡尔拓扑 - MPI_Gather等效?
【发布时间】:2014-01-22 11:17:51
【问题描述】:

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

【问题讨论】:

  • 你使用MPI_Gather。 MPI 中没有诸如“笛卡尔风格”之类的东西,除非您指的是 MPI-3.0 中引入的邻居聚集操作,它允许每个进程仅从笛卡尔拓扑中的邻居执行聚集。
  • 好的,MPI 中有没有非阻塞的 MPI_Gather?我读过 MPI_IGather,但我猜它是在下一个版本中引入的......
  • 你想做什么?您想在屏幕上以二维矩阵的形式打印信息,其中每个值对应网格中的正确值吗?
  • 是的,MPI-3.0 中有MPI_Igather

标签: c parallel-processing mpi


【解决方案1】:

提议邻域集合的原始论文为阻塞和非阻塞邻域 alltoall 操作提供了简单的示例实现,即使您在不支持的 MPI 实现上运行,您也可以将其用作旋转您自己的邻域集合的示例t 还支持所有 3.0 功能:

Hoeffler and Traff: "Sparse Collective Operations for MPI"

MPICH 最近也添加了支持。你可以看看他们的实现,但是他们的代码中有很多无关的东西来支持错误处理、线程安全等。

【讨论】:

    【解决方案2】:

    如果有人仍然感兴趣,我决定使用非阻塞接收,然后是 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
    

    这对我有用 :)

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2012-03-17
      • 2017-12-17
      • 2017-12-18
      • 2016-12-01
      • 2016-02-05
      • 2017-08-22
      • 2014-07-23
      • 2013-04-18
      相关资源
      最近更新 更多