[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