The issue happens in the MPI code. The new code is attached.
Code:
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#include <string.h>
typedef struct message message;
struct message
{
message*prev;
message*next;
int recv_pe;
};
//typedef struct message message;
int main (int argc, char **argv)
{
int rank, size;
int iter=1000;
int number=15;
int ierr,errclass;
ierr=0;
MPI_Request request;
MPI_Status status;
int send_buffer[5],recv_buffer[5];
MPI_Init (&argc, &argv); /* starts MPI */
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */
// MPI_Errhandler_set(MPI_COMM_WORLD,MPI_ERRORS_RETURN); /* return info about
// errors */
// printf( "Hello world from process %d of %d\n", rank, size );
if(rank==0)
{
int kk;
for(kk=0;kk<iter;kk++)
{
int buffsize= number*sizeof(message);
char*buffer=(char*)malloc(buffsize*sizeof(char));
// void*buffer=(char*)malloc((unsigned)buffsize);
int position=0;
message* sendevent[number];
int i;
for(i=0,position=0;i<number;i++,position+=sizeof(message))
{
sendevent[i]=malloc(sizeof(message));
sendevent[i]->recv_pe=i;
memcpy(&buffer[position],sendevent[i],sizeof(message));
}
ierr= MPI_Isend(buffer,buffsize, MPI_BYTE,1, 1,MPI_COMM_WORLD,&request);
}
}
else
{
int kk;
for(kk=0;kk<iter;kk++)
{
int buffsize=number*sizeof(message);
char*buffer=(char*)malloc(sizeof(char)*buffsize);
int position=0;
message *tmp=NULL;
int flag=0;
int i;
MPI_Request request;
while(flag==0)
{
MPI_Iprobe(MPI_ANY_SOURCE,
MPI_ANY_TAG,
MPI_COMM_WORLD,
&flag,
&status);
}
ierr=MPI_Irecv(buffer,buffsize,MPI_BYTE,0,1,MPI_COMM_WORLD,&request);
for(i=0,position=0;i<number;i++,position+=sizeof(message))
{
// MPI_Unpack(buffer,buffsize,&position,&revevent[i],sizeof(revevent[i]),MPI_BYTE,MPI_COMM_WORLD);
tmp=(message*)&buffer[position];
if(i==1&&tmp->recv_pe==0)
printf("error :recv data invalid\n");
}
}
}
MPI_Finalize();
return 0;
}