Folks,

Here is attached an oversimplified version of the MPI_Recv_init_null_c
test from the
intel test suite.

the test works fine with v1.6, v1.7 and v1.8 branches but fails with the
trunk.

i wonder wether the bug is in OpenMPI or the test itself.

on one hand, we could consider there is a bug in OpenMPI :
status.MPI_SOURCE should be MPI_PROC_NULL since we explicitly posted a
recv request with MPI_PROC_NULL.

on the other hand, (mpi specs, chapter 3.7.3 and
https://svn.open-mpi.org/trac/ompi/ticket/3475)
we could consider the returned value is not significant, and hence
MPI_Wait should return an
empty status (and empty status has source=MPI_ANY_SOURCE per the MPI specs).

for what it's worth, this test is a success with mpich (e.g.
status.MPI_SOURCE is MPI_PROC_NULL).


what is the correct interpretation of the MPI specs and what should be
done ?
(e.g. fix OpenMPI or fix/skip the test ?)

Cheers,

Gilles
/*
 *  This test program is an over simplified version of the
 *  MPI_Recv_init_null_c test from the intel test suite.
 *
 *  It can be ran on one task :
 *  mpirun -np 1 -host localhost ./a.out
 *
 *  when ran on the trunk, since r28431, the test will fail :
 *  status.MPI_SOURCE is MPI_ANY_SOURCE instead of MPI_PROC_NULL
 *
 * Copyright (c) 2014      Research Organization for Information Science
 *                         and Technology (RIST). All rights reserved.
 */
#include <stdio.h>
#include <mpi.h>

int main (int argc, char *argv[]) {
    MPI_Status status;
    MPI_Request req;
    int ierr;

    MPI_Init(&argc, &argv);

    ierr = MPI_Recv_init(NULL, 0, MPI_INT, MPI_PROC_NULL, MPI_ANY_TAG, 
MPI_COMM_WORLD, &req);
    if (ierr != MPI_SUCCESS) MPI_Abort(MPI_COMM_WORLD, 1);

    ierr = MPI_Start(&req);
    if (ierr != MPI_SUCCESS) MPI_Abort(MPI_COMM_WORLD, 2);

    ierr = MPI_Wait(&req, &status);
    if (ierr != MPI_SUCCESS) MPI_Abort(MPI_COMM_WORLD, 3);

    if (MPI_PROC_NULL != status.MPI_SOURCE) {
        if (MPI_ANY_SOURCE == status.MPI_SOURCE) {
            printf("got MPI_ANY_SOURCE=%d instead of MPI_PROC_NULL=%d\n", 
status.MPI_SOURCE, MPI_PROC_NULL);
        } else {
            printf("got %d instead of MPI_PROC_NULL=%d\n", status.MPI_SOURCE, 
MPI_PROC_NULL);
        }
    } else {
        printf("OK\n");
    }

    MPI_Finalize();
    return 0;
}

Reply via email to