Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] MPI_Win_create with size=0 expose memory anyway
From: Barrett, Brian W (bwbarre_at_[hidden])
Date: 2011-02-11 10:21:02


Patrick -

Your program is erroneous, so the behavior of the MPI is not defined. The default implementation of RMA with Open MPI uses active-message like semantics to locally deliver the message, and does not do bounds checking, so the error was not caught.

Brian

On Feb 11, 2011, at 5:41 AM, <Patrick.Le-Dot_at_[hidden]> wrote:

> 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();
> }
>
> _______________________________________________
> users mailing list
> users_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/users
>