I need to implement a simple code in MPI with use of MPI_Bcast(). I wanted to make it more useful with use of MPI_Probe(), so I wouldn't have to write message size into MPI_Recv() manually every time.
I'm used to do this with MPI_Send(), but with MPI_Bcast() the program hangs on MPI_Probe(). Do you have any idea why?
My code
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define ARR_LEN 1
int main() {
MPI_Init(NULL, NULL);
typedef struct Values {
int id;
char * c;
} Values;
Values val1;
val1.id = 5;
val1.c = "Ahoj";
MPI_Datatype valuesDatatypeTmp;
int blockLengths[2] = {1, 3};
MPI_Aint indices[2];
MPI_Address( &val1.id, &indices[0] );
MPI_Address( &val1.c, &indices[1] );
indices[1] -= indices[0];
indices[0] = 0;
MPI_Datatype types[2] = {MPI_INT, MPI_CHAR};
MPI_Type_create_struct( 2, blockLengths, indices, types, &valuesDatatypeTmp );
MPI_Datatype valuesDatatype;
MPI_Type_create_resized( valuesDatatypeTmp,
indices[0],
(MPI_Aint)sizeof(struct Values),
&valuesDatatype );
MPI_Type_free( &valuesDatatypeTmp );
MPI_Type_commit( &valuesDatatype );
//-----------------------//
//--- Message passing ---//
//-----------------------//
int world_size;
MPI_Comm_size( MPI_COMM_WORLD, &world_size );
int world_rank;
MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
MPI_Status status;
Values * buf;
Values val[ARR_LEN] = {val1};
switch( world_rank ) {
case 0:
printf("Toto je proces cislo %d - root.\n", world_rank);
MPI_Bcast( val, ARR_LEN, valuesDatatype, 0, MPI_COMM_WORLD );
break;
default:
MPI_Probe( 0, 0, MPI_COMM_WORLD, &status );
int status_size;
MPI_Get_count( &status, valuesDatatype, &status_size );
buf = (Values *) malloc( sizeof(struct Values) * status_size );
MPI_Recv( buf, status_size, valuesDatatype, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE );
printf( "Toto je proces cislo %d.\n", world_rank );
for( int i = 0; i < ARR_LEN; i++ ) {
printf("Prijata zprava je %d %s\n"\
"Delka zpravy byla %d\n",
buf[i].id,
buf[i].c,
status_size);
}
break;
}
MPI_Type_free( &valuesDatatype );
MPI_Finalize();
return 0;
}