[mpich-discuss] Question reg usage with MPI_THREAD_MULTIPLE
    Ramesh Vinayagam 
    rvinayagam.85 at gmail.com
       
    Mon Jun 25 17:58:47 CDT 2012
    
    
  
Hello,
I having a question regarding the usage of MPI_THREAD_MULTIPLE.
I was wondering whether this scenario works with MPI
Process 0
Thread 1 -> probes and receives
Thread 2 -> Sends to  process 0
Process 1
Thread 1 -> probes and receives
Thread 2 -> Sends to  process 1
I wrote a simple code, and it seems to hang with mpich2. I am not sure
whether or not this feature is supported with MPI, can anyone let me know
whether what I do here is correct or wrong?
Here is the code.. This code hangs when I use it with two processes. It
works with one process.
Thanks
Ramesh
____________________________________________________________________________________________________________________________________________________
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <string.h>
#include <assert.h>
typedef struct
{
  int thread;
  MPI_Comm comm;
  int rank;
} thdata;
void probe_recv (void *ptr){
  thdata *data;
  data = (thdata *) ptr;
  int count, flag = 0;
  MPI_Status status;
  char buf[256];
  printf("%d :Thread :%d Prbes and receives \n", data->rank, data->thread);
  while (!flag){
    MPI_Iprobe(data->rank, 0, data->comm, &flag, &status);
  }
  MPI_Get_count( &status, MPI_CHAR, &count);
  printf("%d :Thread :%d count : %d \n", data->rank, data->thread, count);
  MPI_Recv( &buf,
    count,
    MPI_CHAR,
    data->rank,
    status.MPI_TAG,
    data->comm,
    MPI_STATUS_IGNORE);
  printf("%d Message : %s \n", data->rank,buf);
}
void send(void *ptr){
  thdata *data;
  char buffer[256];
  data = (thdata *) ptr;
  printf("%d: Thread :%d Sends \n", data->rank, data->thread);
  strcpy(buffer,"Hello World");
  MPI_Send(&buffer,256, MPI_CHAR, data->rank, 0, data->comm);
  printf("%d: Thread :%d send completed \n",
 data->rank,
 data->thread);
}
int main(int argc, char *argv[]){
  int provided, i[2], rank, size;
  MPI_Status  status;
  pthread_t thread_a, thread_b;
  MPI_Comm communicator[2];
  thdata data1, data2;
  MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
  if (provided != MPI_THREAD_MULTIPLE){
printf("Error\n");
MPI_Abort(911, MPI_COMM_WORLD);
  }
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  assert (size == 2);
  MPI_Comm_dup(MPI_COMM_WORLD,&communicator[rank]);
  data1.comm = communicator[rank];
  data1.thread = 1;
  data1.rank = rank;
  pthread_create (&thread_a, NULL, (void *) &probe_recv, (void *)&data1);
  data2.comm = communicator[rank];
  data2.thread = 2;
  data2.rank = rank;
  pthread_create (&thread_b, NULL, (void *) &send, (void *)&data2);
  pthread_join(thread_a, NULL);
  pthread_join(thread_b, NULL);
  MPI_Finalize();
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/mpich-discuss/attachments/20120625/c021dd57/attachment.html>
    
    
More information about the mpich-discuss
mailing list