【问题标题】:MPI_Put does not work when use MPI_Win_create_dynamic, why?使用 MPI_Win_create_dynamic 时 MPI_Put 不起作用,为什么?
【发布时间】:2019-04-26 03:53:45
【问题描述】:

我用MPI_Put和MPI_Win_create_dynamic一起使用,但是不起作用,只是卡在MPI_Win_fence之前,无法通过,不知道为什么?

但是当我添加 MPI_Win_flush 时,我只是得到了以下错误:

[susans-MacBook-Pro:05235] *** An error occurred in MPI_Win_flush
[susans-MacBook-Pro:05235] *** reported by process [3117416449,1]
[susans-MacBook-Pro:05235] *** on win pt2pt window 3
[susans-MacBook-Pro:05235] *** MPI_ERR_RMA_SYNC: error executing rma sync
[susans-MacBook-Pro:05235] *** MPI_ERRORS_ARE_FATAL (processes in this win will now abort,
[susans-MacBook-Pro:05235] ***    and potentially your MPI job)

MPI_Put 调用有什么问题吗?

源码coe如下:

```mpi-c++
#include <stdio.h>
#include <iostream>
#include "mpi.h"
using namespace std;

#define NROWS 10
#define NCOLS 10

int main(int argc, char *argv[])
{
    int rank, nprocs, A[NROWS][NCOLS], i, j;
    MPI_Win win;
    MPI_Datatype column, xpose;
    int errs = 0;

    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);

   MPI_Win_create_dynamic(MPI_INFO_NULL, MPI_COMM_WORLD, &win);

   if(rank==0)
    { /* rank = 0*/
        for (i=0; i<NROWS; i++)
            for (j=0; j<NCOLS; j++)
                A[i][j] = i*NCOLS + j;
        MPI_Win_attach(win, A, NROWS*NCOLS*sizeof(int));

    }

    MPI_Win_fence(0, win);

    if (rank > 0)
    {
        for (i=0; i<NROWS; i++)
            for (j=0; j<NCOLS; j++)
                A[i][j] = -1;


        int target=0,disp=0;

        MPI_Get(A, NROWS*NCOLS, MPI_INT, target, disp, NROWS*NCOLS, MPI_INT, win)!=MPI_SUCCESS)

        MPI_Win_flush(target,win);

        MPI_Win_fence(0, win);


    }
    else if(rank==0)
    { /* rank = 0 */
        MPI_Win_fence(0, win);
        MPI_Win_detach(win,A);
   }


    MPI_Win_free(&win);
    MPI_Finalize();
    return errs;
}

```

【问题讨论】:

  • 但如果我将 MPI_Win_create_dynamic 更改为 MPI_Win_create,它运行良好。这是为什么?它让我发疯......帮助......
  • 看来,如果我使用 MPI_Get_address 来获取共享内存的 disp,然后 bcast ,则效果很好。 MPI_Get_address(buf_shared, &disp); MPI_Bcast(&disp, 1, MPI_AINT, 0, comm);

标签: mpic++


【解决方案1】:

看来,如果我使用 MPI_Get_address 来获取共享内存的 disp,然后 bcast 它,那么它就可以正常工作了。

MPI_Get_address(buf_shared, &disp); 
MPI_Bcast(&disp, 1, MPI_AINT, 0, comm);

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2014-05-25
    • 2021-11-14
    • 2016-02-24
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多