int Unpack(void * inbuf, int insize, int * position, void *outbuf, int outcount, Datatype type, Comm* comm) { int i, j; MPI_Aint extent; Type_extent(type, &extent); for (i = 0; i < outcount; i++) { for (j = 0; j < type->count; j++) { if ((*position) + Simpletype_length(type->pairs[j].type) > insize) { printf("MPI_Unpack: Data exceeds buffer size\n"); exit(1); } memcpy(outbuf+type->pairs[j].disp + (extent*i), ((char*) inbuf)+(*position) , Simpletype_length(type->pairs[j].type)); *position += Simpletype_length(type->pairs[j].type); } } }
int calc_padding(Datatype datatype) { long size_max = INT_MIN; long type_len; int i; //find the largest datatype size. The epsilon padding is (probably) based on this. for (i = 0; i < datatype->count; i++) { type_len = Simpletype_length(datatype->pairs[i].type); size_max = type_len > size_max ? type_len : size_max; } return size_max; }