当我运行“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次一样)
答案 0 :(得分:3)
许多mpi实现将允许您在输出前加上该进程的等级。然后你可以在事后对其进行排序。在MPICH中,这是--prepend-rank
或-l
。在OpenMPI中,它是--tag-output
答案 1 :(得分:2)
对于大多数MPI实现,分配等级的顺序从不随机,并且通常存在精确控制它的机制。什么是随机的是不同等级的输出通过IO重定向机制到达MPI启动器(mpirun
,mpiexec
等)的顺序。由于通常涉及的缓冲,人们永远不能确定,例如,等级0在等级1之前输出一些文本,然后等级0的输出必然在等级1的输出之前到达。保证文本输出的排序的唯一可移植方式是让所有等级通过单个等级来传递他们的消息。 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
的控制台输出中。