【问题标题】:MPI: Locking the stdout -- 1 process at a time?MPI:一次锁定标准输出——1个进程?
【发布时间】:2010-10-17 01:29:37
【问题描述】:

我想打印出每个进程的整数数组的内容。问题是,由于竞态条件,一切都变得杂乱无章。

什么是最简单的解决方案?我不想调试。我想显示内容,因为我正在做排序算法。所以在排序前后显示是很有用的。

我在 lock.c 中添加了这个:

#include <stdio.h>
static int lock=0;   //Don't use if timing execution
void capture(int rank) {
    while(lock!=0);
    lock = 1;
    printf("\nCaptured by %d\n", rank);
}
void release() {
    lock = 0;
}

在打印之前调用 capture(),然后在打印之后调用 release()。是的,这是一个类似信号量的 hack。但它不起作用,有什么想法吗?

【问题讨论】:

  • 当你说“它不工作”时,你是什么意思:个人,我怀疑你的意思是不同线程的输出混淆了?是这个意思吗?

标签: c synchronization mpi


【解决方案1】:

假设您使用的是收集所有进程的 STDOUT 的 MPI,您可以使用 MPI_Barrier() 来强制执行排序,如下所示:

for( int i = 0; i < size; ++i ) {
    MPI_Barrier( MPI_COMM_WORLD );
    if ( i == rank ) {
         printf( "..." );
    }
 }

当然,这是低效的,但它可能比安排将所有信息发送回 0 级要简单一些。

【讨论】:

【解决方案2】:

假设您指的是消息传递接口,最好的方法是将输出字符串写入缓冲区并将它们发送到 rank 0 进程。此过程不应用于执行实际工作,而应仅用于过滤和输出输出字符串。

让其他队伍去做真正的工作。我认为您的上述解决方案行不通,因为我是每个级别的本地人。

您也不想使用消息传递来阻止各个等级(直到他们可以输出),因为他们将无法在此期间进行排序工作。

只需让 1 到 N 的每个等级都起作用,并将字符串发送到等级 0。字符串可以是 "NNN:SSSSSS" 的形式,其中 N 是等级,S 是字符串。然后 Rank 0 可以过滤掉特定消息或将不同的消息写入不同的文件,然后在所有工作 rank 关闭后将它们组合(排序)。

【讨论】:

    【解决方案3】:

    每个进程都有自己的变量副本。所以它不是共享的,你不能用它来同步。

    【讨论】:

    • 锁被限定为静态的,因此在线程之间共享。
    • @OfekShilon 但 MPI 不是共享内存系统,因此虽然它可以在线程之间共享,但它不会在 MPI 进程之间共享。
    猜你喜欢
    • 2012-04-26
    • 2013-12-19
    • 1970-01-01
    • 2018-03-08
    • 2017-12-26
    • 2010-11-23
    • 2016-04-30
    • 2011-07-04
    • 2017-01-19
    相关资源
    最近更新 更多