【问题标题】:Open MPI ranks are not in order开放的 MPI 排名不按顺序排列
【发布时间】:2014-01-05 03:32:29
【问题描述】:

当我运行“Open MPI”程序时,它通常按我想知道的随机顺序分配排名 有没有办法总是按顺序分配等级?

所以不是这个

Hello, World. I am 2 of 3
Hello, World. I am 0 of 3
Hello, World. I am 1 of 3 

我可以得到这个

Hello, World. I am 0 of 3
Hello, World. I am 1 of 3
Hello, World. I am 2 of 3 

编辑

这里是代码

    PROGRAM hello
INCLUDE 'mpif.h'
INTEGER*4 :: numprocs, rank, ierr
CALL MPI_INIT(ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
write(*,*) 'Hello World. I am', rank, 'of', numprocs
CALL MPI_FINALIZE(ierr)
    END PROGRAM hello

我在 i5 处理器(4 线程)上运行时测试过

    mpirun -np 4 myprog

它按我的意愿工作,按 0-3 的顺序打印,否则(如上图所示的 3)它不会这样做(测试了 100 次)

【问题讨论】:

  • rank 到主机/核心的映射在每个 MPI 实现中都是确定性的。在工作过程中,每个级别的确切进度(很大程度上)是独立的。打印的“无序”性质说明每个进程都进行了写入,并且该写入通过 stdout 传输回 mpirun 命令以以不同的顺序输出到终端。这是 MPI 程序的基本性质。队伍之间充其量只是“松散”的协调。跨所有行列的同步是并行编程的基本问题之一。
  • @StanGraves 非常感谢

标签: mpi openmpi mpich


【解决方案1】:

在大多数 MPI 实现中,分配等级的顺序绝不是随机的,通常有机制可以精确控制它。随机的是不同rank的输出通过IO重定向机制到达MPI启动器(mpirunmpiexec等)的顺序。由于通常涉及缓冲,人们永远无法确定,例如,如果rank 0 在 rank 1 之前输出一些文本,那么 rank 0 的输出必然会在 rank 1 的输出之前到达。保证文本输出排序的唯一可移植方法是让所有 rank 通过单个 rank 传递它们的消息IO。

通过某些实现,可能会执行诸如线性令牌传递或一系列障碍之类的操作,例如:

int rank, size;

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

for (int i = 0; i < size; i++)
{
   if (i == rank)
      printf("Hello world! I am %d of %d\n", rank, size);
   MPI_Barrier(MPI_COMM_WORLD);
}

此类代码背后的基本原理是MPI_Barrier 可能会在完成之前进行挂起的通信操作,包括那些携带重定向标准输出的操作。仍然不能保证printf() 的输出会立即显示在mpirun/mpiexec 的控制台输出中。

【讨论】:

  • 如果我有一个从 1 到 3560 的循环,我将循环中的工作除以 5 个处理器,因此每个处理器执行 730 次循环迭代。现在排名不按顺序排列(我已经尝试过),排名 0 进行迭代 [731 - 1461] 但我希望它进行迭代 [1 - 730]
  • 你的问题没有意义。只需让您的应用程序进行检查,if (rank == 0) {do 1 - 730}
【解决方案2】:

许多 mpi 实现允许您在输出前加上该进程的等级。然后你可以在事后对其进行排序。在 MPICH 中,这是 --prepend-rank-l。在 OpenMPI 中是 --tag-output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多