Hi all,
I am testing the one-sided message passing (MPI_Put, MPI_Get)
and it seems to me that the size parameter of MPI_Win_create()
is definitly not taken into account.

Then I can put/get messages using a window created with size=0
(or put/get after any others limits between 0 and the original buffer size).

I know that size=0 is not an usual practice but the man page say :
"A process may elect to expose no memory by specifying size = 0."

I might still have misunderstood something ?

Hereafter a simple test to reproduce the  with Open MPI 1.5

Thx,
Patrick


/*
 * compilation :
 * mpicc -o a.out a.c
 *
 * execution :
 * srun --resv-ports -n2 -N2 a.out
 *
 */

#include "mpi.h"

#define SIZE_10 10
#define RANK_1   1

int main(int argc, char *argv[]) {
  int i, rank, nprocs, A[SIZE_10], B[SIZE_10];
  MPI_Win win;
  int errs = 0;

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

  if (nprocs != 2) {
    printf("%d is a bad process number : srun -n2 -N2 a.out \n", nprocs);
    MPI_Finalize();
    return -1;
  }

  for (i=0; i<SIZE_10; i++) {
    A[i] = i+1;
    B[i] = (-1)*(i+1);
  }

  printf("[%d] create a window on A[] with size=0 \n", rank);
  MPI_Win_create(A, 0, sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win);

  if (rank == 0) {
    printf("[%d] call MPI_Get(B, %d, ...) \n", rank, SIZE_10);
    MPI_Win_lock(MPI_LOCK_SHARED, RANK_1, 0, win);
    MPI_Get(B, SIZE_10, MPI_INT, RANK_1, 0, SIZE_10, MPI_INT, win);
    MPI_Win_unlock(RANK_1, win);

    for (i=0; i<SIZE_10; i++) {
      if (B[i] != i+1) {
        printf("[%d] MPI_Get error: B[%d]=%d, should be %d \n",rank, i, B[i], 
i+1);
        errs++;
      }
    }

    if (errs == 0) {
      printf("[%d] No Error! \n", rank);
    }

  }

  MPI_Barrier(MPI_COMM_WORLD);
  MPI_Win_free(&win);
  MPI_Finalize();
}

Reply via email to