#include<stdio.h>
#include<mpi.h>
#define NELEMENTS 6
int main(
int argc,
char *argv[]){
int numTasks, rank, source = 0, dest, tag = 1;
int blockLengths[2], displacements[2];
float a[16] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0,
9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0};
float b[NELEMENTS];
MPI_Status status;
MPI_Datatype indexType;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &numTasks);
blockLengths[0] = 4;
displacements[0] = 5;
blockLengths[1] = 2;
displacements[1] = 12;
MPI_Type_indexed(2, blockLengths, displacements, MPI_FLOAT, &indexType);
MPI_Type_commit(&indexType);
if(rank == 0){
int i;
int count = 1;
for(i = 0; i < numTasks; i++){
int dest = i;
MPI_Send(a, count, indexType, dest, tag, MPI_COMM_WORLD);
}
}
MPI_Recv(b, NELEMENTS, MPI_FLOAT, source, tag, MPI_COMM_WORLD, &status);
printf(
"rank = %d b = %3.1f %3.1f %3.1f %3.1f %3.1f %3.1f\n",
rank, b[0], b[1], b[2], b[3], b[4], b[5]);
MPI_Type_free(&indexType);
MPI_Finalize();
}