Warm tip: This article is reproduced from serverfault.com, please click

c-MPI

(c - MPI)

发布于 2013-07-10 12:45:03

我想用C编写一个函数,每个处理器都在其中打印自己的数据。这是我所拥有的:

void print_mesh(int p,int myid,int** U0,int X,int Y){
    int i,m,n;
    for(i=0;i<p;i++){
        if(myid==i){
            printf("myid=%d\n",myid);
            for(n=0;n<X;n++){
                for(m=0;m<Y;m++){
                    printf("%d ",U0[n][m]);
                }
                printf("\n");
            }
        }
        else MPI_Barrier(MPI_COMM_WORLD);
    }
}

由于某种原因,它不起作用。将所有阵列混合打印。你对为什么这行不通有什么见解?还有其他可行的想法吗?如果可能的话,我不想在主进程中发送整个数组。我也不想使用预编译的函数。

Questioner
Κωστας Ιωαννου
Viewed
11
Wesley Bland 2013-07-10 21:18:39

无法保证来自许多不同进程的消息在到达另一个进程时将以“正确”的顺序到达。这本质上就是这里正在发生的事情。

即使你没有显式发送消息,当你将某些内容打印到屏幕上时,也必须将其发送到本地系统(mpiexecmpirun上的进程中,然后才能将其打印到屏幕上。MPI无法知道这些消息的正确顺序,因此仅在它们到达时打印它们。

如果你要求以特定的顺序打印邮件,则必须将它们全部发送到一个等级,以便可以按你喜欢的顺序打印它们。只要所有打印都按一个等级进行,所有消息都将正确排序。

应该说,你可能会找到答案,说可以在字符串的末尾添加换行符,或者使用flush()确保缓冲区被刷新,但这不能保证对缓冲区的排序出于上述原因的远端。