Я использую 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?
Исходный коэффициент выглядит следующим образом:
```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;
}
```