[MPICH] MPI_Probe and thread
Rajeev Thakur
thakur at mcs.anl.gov
Fri Jul 28 12:35:02 CDT 2006
Wei-keng,
I stand corrected. I didn't notice that there is a bug in the test
program. Instead of MPI_Init, you need to use MPI_Init_thread with
MPI_THREAD_MULTIPLE (and check whether that is provided by the
implementation). You cannot call MPI from multiple threads without calling
MPI_Init_thread. With that change, the code works with both 1.0.3 and the
current source.
Rajeev
> -----Original Message-----
> From: Rajeev Thakur [mailto:thakur at mcs.anl.gov]
> Sent: Friday, July 28, 2006 10:10 AM
> To: 'Wei-keng Liao'; 'mpich-discuss at mcs.anl.gov'
> Subject: RE: [MPICH] MPI_Probe and thread
>
> Wei-keng,
> The specific bug you mention has been fixed in our
> current source. However, a different bug has crept in that
> causes the recv to hang, not the probe. We were planning to
> release version 1.0.4 later today, so your bug report is
> timely! We will fix it before the release.
>
> Thanks,
> Rajeev
>
>
> > -----Original Message-----
> > From: owner-mpich-discuss at mcs.anl.gov
> > [mailto:owner-mpich-discuss at mcs.anl.gov] On Behalf Of Wei-keng Liao
> > Sent: Friday, July 28, 2006 12:24 AM
> > To: mpich-discuss at mcs.anl.gov
> > Subject: [MPICH] MPI_Probe and thread
> >
> >
> > I am testing if an MPI node can send message to itself, using
> > MPI_Send and
> > MPI_Probe on 2 different threads. Below is the MPI program
> > that creates a
> > 2nd thread, then sends an integer to the thread. The 2nd
> thread calls
> > MPI_Probe, receives the message, and exits.
> >
> > If MPI_Probe happens before MPI_Send, I found that the
> > program will hang
> > due to the 2nd thread is blocked in MPI_Probe. That is,
> > MPI_Probe is busy
> > waiting and will not release/yield to the main thread.
> >
> > If I add a pthread_yield() or sleep(2) before MPI_Probe to
> > ensure MPI_Send
> > occurs before MPI_Probe, the 2nd thread's probe will get the
> > message and
> > exit successfully.
> >
> > Is there a limitation on using MPI_Probe in multi-threading
> > environment?
> > I am using MPICH-2.1.0.3 which is configured with
> > multi-threading enabled.
> >
> > Wei-keng
> >
> > ---------------------
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <mpi.h>
> > #include <pthread.h>
> >
> > int SELF;
> >
> > /*----< thread_func()
> >---------------------------------------------*/
> > void* thread_func(void *args) {
> > MPI_Status status;
> > int src = -1, msg;
> >
> > /*
> > pthread_yield();
> > sleep(1);
> > */
> > printf("P%d (thread): thread started\n", SELF);
> > MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
> &status);
> > src = status.MPI_SOURCE;
> > printf("P%d (thread): MPI_Probe() MPI_SOURCE = %d\n",
> SELF, src);
> > MPI_Recv(&msg, 1, MPI_INT, src, 0, MPI_COMM_WORLD, &status);
> > }
> >
> > /*----< main()
> >----------------------------------------------------*/
> > int main(int argc, char **argv) {
> > int i, msg;
> > pthread_t thread_id;
> >
> > MPI_Init(&argc, &argv);
> > MPI_Comm_rank(MPI_COMM_WORLD, &SELF);
> >
> > pthread_create(&thread_id, NULL, thread_func, NULL);
> >
> > MPI_Ssend(&msg, 1, MPI_INT, SELF, 0, MPI_COMM_WORLD);
> >
> > pthread_join(thread_id, NULL);
> > printf("P%d ( main ): 2nd thread joined ---- exit\n", SELF);
> >
> > MPI_Finalize();
> > return 0;
> > }
> >
> >
>
More information about the mpich-discuss
mailing list