微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在没有其他进程重叠的情况下从进程打印某些东西?

如何解决如何在没有其他进程重叠的情况下从进程打印某些东西?

我编写了一个 MPI 代码,我正在使用 16 个进程运行该代码,并且正在打印 4x4 矩阵作为每个进程的输出

printf("\n This is the output of %d\n",myrank);
for(int i=0;i<count;i++)
{
    for(int j=0;j<count;j++)
    {
        printf("%f ",m[i][j]);
    }
    printf("\n");
}

但问题是每个进程的输出都会与其他进程混淆。像这样--

 This is the output of 3
0.750000 0.750000 0.750000 0.500000 
 This is the output of 9
1.000000 1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 0.750000 
1.000000 1.000000 1.000000 0.750000 1.000000 
1.000000 1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 1.000000 
1.000000 1.000000 1.000000 0.750000 

如何防止这种行为?

解决方法

我编写了一个 MPI 代码,我正在使用 16 个进程运行它,并且我 正在打印 4x4 矩阵作为每个过程的输出。

这不是 MPI 的使用方式,实际上是 IMO 中的并行性。进程间将输出打印到控制台的协调会大大降低并行版本的性能。

大多数情况下,最好只让一个进程负责将输出打印到控制台(通常是 master 进程 ie, 使用 {{1} }).

尽管如此,您可以尝试使用 MPI_Barrier 执行以下操作,如下所示:

rank = 0

对于您的情况:

int rank;
MPI_Comm_rank (MPI_COMM_WORLD,&rank);  /* get current process id */
...
MPI_Barrier(MPI_COMM_WORLD);
if(rank == /** the rank of the process that will print the output **/)
{
   // printing the data to the output
}
MPI_Barrier(MPI_COMM_WORLD);

这至少可以避免输出 MPI_Barrier(MPI_COMM_WORLD); printf("\n This is the output of %d\n",myrank); MPI_Barrier(MPI_COMM_WORLD); for(int i=0;i<count;i++) { for(int j=0;j<count;j++) { printf("%f ",m[i][j]); } printf("\n"); } 与矩阵的输出混合。

但是请记住(引用自 Hristo Iliev 友好提供的评论):

使用这样的障碍只适用于本地发布时(如果) 进程共享同一个控制终端。否则就是 完全由 MPI 的 I/O 重定向机制决定 实施。

按顺序打印矩阵需要更复杂的机制,您将使用 "This is the output of 3"MPI_Send。可能类似于进程在 MPI_Recv 上等待另一个进程发送消息,表明该进程刚刚完成打印矩阵的一部分。例如,有 4 个进程:

进程MPI_Recv等待进程1的消息,进程0等待进程2的消息等等。进程1 打印矩阵的一部分并将消息发送到进程0,进程以同样的方式进行。但是,您最好还是将整个矩阵发送到处理 1 并让该处理将矩阵打印到控制台。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?