MPI:MPI\u无法工作

MPI:MPI\u无法工作,mpi,mpi-rma,Mpi,Mpi Rma,下面的代码在进程0(主进程)中创建了一个窗口,其他进程在其中放入了一些值,我每次都试图从其他进程获取主进程的窗口来打印它,但我得到的结果完全令人困惑。代码如下: int main ( int argc, char *argv[] ) { int id; MPI_Init ( &argc, &argv ); MPI_Comm_rank ( MPI_COMM_WORLD, &id ); MPI_Win win; if (id ==

下面的代码在进程0(主进程)中创建了一个窗口,其他进程在其中放入了一些值,我每次都试图从其他进程获取主进程的窗口来打印它,但我得到的结果完全令人困惑。代码如下:

int main ( int argc, char *argv[] )
{
    int id;
    MPI_Init ( &argc, &argv );

    MPI_Comm_rank ( MPI_COMM_WORLD, &id );
    MPI_Win win;

    if (id == 0)
    {
        int *arr;
        int in = 0;
        MPI_Alloc_mem(10 * sizeof(int), MPI_INFO_NULL, &arr);
        for(in = 1; in < 10; in++)
        {
            arr[in] = -1;
        }
        arr[0] = 0;
        MPI_Win_create(arr, 10 * sizeof(int), sizeof(int), MPI_INFO_NULL,MPI_COMM_WORLD, &win);
        int ready = 0;
        while (!ready)
        {
            MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win);
            ready = fini(arr);
            MPI_Win_unlock(0, win);
        }
        printf("All workers checked in using RMA\n");

        MPI_Win_free(&win);
        MPI_Free_mem(arr);

        printf("Master done\n");
    }
    else
    {
        int one = id;
        int *local;
        int i = 0;
        MPI_Alloc_mem(sizeof(int)*10, MPI_INFO_NULL, &local);
        MPI_Win_create(NULL, 0, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &win);

        MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);

        for(i = 0; i < 10; i++)
        {
            MPI_Get(&local[i], 1, MPI_INT, 0, i,1, MPI_INT, win);
        }

        printf("Worker before %d: ", id);
        pt(local); //Printing array "local"
        MPI_Put(&one, 1, MPI_INT, 0, id, 1, MPI_INT, win);
        for(i = 0; i < 10; i++)
        {
            MPI_Get(&local[i], 1, MPI_INT, 0, i,1, MPI_INT, win);
        }

        printf("Worker %d done: ", id);
        pt(local);

        MPI_Win_unlock(0, win);

        MPI_Win_free(&win);
    }

    MPI_Finalize ( );

    return 0;
}

int fini ( int table[] )
{
    int i = 0;

    while(i < 10)
    {
        if(table[i] == -1) return 0;
        i++;
    }

    return 1;
}

void pt(int t[])
{
    int i = 0;
    while(i < 10)
    {
        printf("%d ",t[i]);
        i++;
    }
    printf("\n");
}
你能帮我找出我的代码出了什么问题吗?谢谢


编辑:显然问题在于MPI\u Get没有填充“本地”缓冲区…

问题在于
MPI\u Get
是非阻塞的,并且不能保证在调用
pt()
时开始读取发起者的值之前传输会完成。当人们刚开始使用MPI RMA语义时,它们可能会非常混乱。让这里的一些军事革命大师,比如@Jeff,向你解释应该如何正确地完成它。@HristoIliev嗨,谢谢你的回答,我希望这位大师能帮我弄清楚!)我快要发疯了…添加
MPI\u Win\u flush(0,Win)pt()
之前,将第二次调用移动到
pt()
MPI\u Win\u unlock()
调用之后,您将获得所需的行为。我不确定是否允许
MPI\u Put()
后跟重叠的
MPI\u Get()
,而无需在单个访问周期内进行中间同步(尽管它与我桌面上的Open MPI一起工作),因此不会写答案。另外,使用
MPI_-Get(local,10,MPI_-INT,0,0,10,MPI_-INT,win)而不是10次单独调用
MPI\u Get()
@hristoliev嘿!我试过这个,确实对我有用!!所以每次我执行MPI_Get时都要这样做?非常感谢。我对MPI RMA的理解很差。如前所述,还有其他人可以提供更有教育意义的答案。
Worker before 4: 1152288776 32731 1152288776 32731 4 0 0 0 48 0 
Worker 4 done: 1152288776 32731 1152288776 32731 4 0 0 0 48 0 
Worker before 1: 1525372936 32743 1525372936 32743 4 0 0 0 48 0 
Worker 1 done: 1525372936 32743 1525372936 32743 4 0 0 0 48 0 
Worker before 3: 1422645256 32661 1422645256 32661 4 0 0 0 48 0 
Worker 3 done: 1422645256 32661 1422645256 32661 4 0 0 0 48 0 
Worker before 6: 1553508328 32675 34348016 0 0 0 33 0 1553508280 32675 
Worker 6 done: 1553508328 32675 34348016 0 0 0 33 0 1553508280 32675 
Worker before 5: -1745405976 32676 33995760 0 0 0 33 0 -1745406024 32676 
Worker 5 done: -1745405976 32676 33995760 0 0 0 33 0 -1745406024 32676 
Worker before 9: -990742552 32568 20737008 0 0 0 33 0 -990742600 32568 
Worker 9 done: -990742552 32568 20737008 0 0 0 33 0 -990742600 32568 
Worker before 2: 1455122440 32635 1455122440 32635 4 0 0 0 48 0 
Worker 2 done: 1455122440 32635 1455122440 32635 4 0 0 0 48 0 
Worker before 7: -1086933016 32650 18463728 0 0 0 33 0 -1086933064 32650 
Worker 7 done: -1086933016 32650 18463728 0 0 0 33 0 -1086933064 32650 
Worker before 8: 1328670696 32548 24464368 0 0 0 33 0 1328670648 32548 
Worker 8 done: 1328670696 32548 24464368 0 0 0 33 0 1328670648 32548