在一个简单的 MPI 程序中,我使用了一个大矩阵的列式除法。
如何对输出进行排序,以便每个矩阵都出现在另一个已排序的矩阵旁边?
我已经尝试过这个简单的代码,效果与想要的完全不同:
for(int i=0;i<10;i++)
{
for(int k=0;k<numprocs;k++)
{
if (my_id==k){
for(int j=1;j<10;j++)
printf("%d",data[i][j]);
}
MPI_Barrier(com);
}
if(my_id==0)
printf("\n");
}
似乎每个进程都有自己的标准输出,因此如果不将所有数据发送到一个将打印出来的主站,就不可能有有序的行输出。我的猜测是真的吗?或者我做错了什么?
最佳答案
你猜对了。 MPI 标准没有指定如何收集来自不同节点的 stdout 以在原始进程中打印。通常情况下,当多个进程进行打印时,输出将以未指定的方式合并。 fflush
没有帮助。
如果您希望以某种方式对输出进行排序,则 最便携方法是将数据发送到主进程进行打印。
例如,在伪代码中:
if (rank == 0) {
print_col(0);
for (i = 1; i < comm_size; i++) {
MPI_Recv(buffer, .... i, ...);
print_col(i);
}
} else {
MPI_Send(data, ..., 0, ...);
}
另一种方法可以有时工作 将使用 barries 锁定步骤进程,以便每个进程依次打印。这当然取决于 MPI 实现以及它如何处理标准输出。
for(i = 0; i < comm_size; i++) {
MPI_Barrier(MPI_COMM_WORLD);
if (i == rank) {
printf(...);
}
}
当然,在数据太大而无法合理打印的生产代码中,最终通过让每个进程写入单独的文件并单独合并或使用 MPI I/O 来合并数据。 ( defined in the MPI2 standards ) 来协调并行写入。
关于stdout - 在 MPI 中排序输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5305061/