Hi,
I have a problem with sending and receiving 2D array using MPI_Send and MPI_Recv.
I've declared a struct type Pixel and a 2D array with this type.
Now I want to send equal parts of the array to all processors. Here is the code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

#define N 8
#define M 6
#define LEN 5
#define CEN 3

typedef struct {
	float data[LEN];
	int x,y;
	int class;
} Pixel;


int main(argc, argv)
	int argc;
	char *argv[];
{

//Variable declarations
int rank, numtasks, tag1, tag2, rc, dest, source=0, chunksize, i, j, k, offset;
Pixel pixels[N][M];
Pixel centroids[CEN];
Pixel *p;

MPI_Status status;

MPI_Datatype pixel_type, oldtypes[2];
int blockcounts[2];
MPI_Aint offsets[2], extent;


if( (rc=MPI_Init(&argc, &argv)) != MPI_SUCCESS ){
	printf("Cannot initialize MPI_Init\n");
	MPI_Abort(MPI_COMM_WORLD, rc);
}

MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(numtasks % 2 != 0) {
   printf("Number of MPI tasks must be divisible by 2.\n");
   MPI_Abort(MPI_COMM_WORLD, rc);
}

chunksize = M/numtasks;
tag1=1;
tag2=2;

//Setup description of the MPI_FLOAT fields
offsets[0] = 0;
oldtypes[0] = MPI_FLOAT;
blockcounts[0] = LEN;
//Setup description of the MPI_INT fields
MPI_Type_extent(MPI_FLOAT, &extent);
offsets[1] = LEN * extent;
oldtypes[1] = MPI_INT;
blockcounts[1] = 3;
//define the MPI struct 
MPI_Type_struct(2, blockcounts, offsets, oldtypes, &pixel_type);
MPI_Type_commit(&pixel_type);


//Initialize the array
if(rank == 0){
	for(i=0; i<N; i++){
		for(j=0; j<M; j++){
			pixels[i][j].x=j;
			pixels[i][j].y=i;
			pixels[i][j].class=0;
			for(k=0; k<LEN; k++)
				pixels[i][j].data[k]=(i+j)*k;
		}
	}
	//Send each proc its part of the array
	offset=chunksize;
	for(dest=1; dest<numtasks; dest++){
		MPI_Send(&offset, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
		for(i=offset; i<(offset+chunksize); i++){
			MPI_Send(&pixels[i][0], M, pixel_type, dest, tag2, MPI_COMM_WORLD);		
		}
		offset+=chunksize;
	}
}

if(rank > 0){
	//All procs receive its data
	MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status);
	for(i=offset; i<(offset+chunksize); i++){
		MPI_Recv(&pixels[i][0], M, pixel_type, source, tag2, MPI_COMM_WORLD, &status);
	}

}



	
}
I've googled this but couldn't find anything helpful, so I hope someone can help me here