[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