MPI:一次锁定stdout - 1进程?

时间:2009-04-02 07:54:51

标签: c synchronization mpi

我想打印出每个进程的整数数组的内容。问题是,由于竞争条件,这一切都很混乱。

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

我在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(),然后在打印后释放()。是的,这是一个类似信号量的黑客。但它没有用,有什么想法吗?

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

让其他职级完成真正的工作。我不认为你的上述解决方案会起作用,因为我是每个级别的本地人。

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

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

答案 2 :(得分:1)

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