我想用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);
}
}
由于某种原因,它不起作用。将所有阵列混合打印。你对为什么这行不通有什么见解?还有其他可行的想法吗?如果可能的话,我不想在主进程中发送整个数组。我也不想使用预编译的函数。
无法保证来自许多不同进程的消息在到达另一个进程时将以“正确”的顺序到达。这本质上就是这里正在发生的事情。
即使你没有显式发送消息,当你将某些内容打印到屏幕上时,也必须将其发送到本地系统(mpiexec
或mpirun
)上的进程中,然后才能将其打印到屏幕上。MPI无法知道这些消息的正确顺序,因此仅在它们到达时打印它们。
如果你要求以特定的顺序打印邮件,则必须将它们全部发送到一个等级,以便可以按你喜欢的顺序打印它们。只要所有打印都按一个等级进行,所有消息都将正确排序。
应该说,你可能会找到答案,说可以在字符串的末尾添加换行符,或者使用flush()确保缓冲区被刷新,但这不能保证对缓冲区的排序出于上述原因的远端。
+1;
fflush(stdout)
当然值得尝试,但是,是的,不能保证,在一个系统上有效的方法可能在另一个系统上无效。