/* * DistMatrix.c * * routines for handling of distributed dynamic arrays in C * Distribution: column-block */ #include <errno.h> #include <stdlib.h> #include <mpi.h> #include "DistMatrix.h" void newDistMatrix(DistMatrix *ar, int n, int m) { /* creates local part of global n x m array */ int myId, nTasks; int lx, dx; int flag; /* check, if MPI already running */ MPI_Initialized(&flag); if (flag == 0) { MPI_Init(NULL, NULL); } MPI_Comm_rank(MPI_COMM_WORLD, &myId); MPI_Comm_size(MPI_COMM_WORLD, &nTasks); /* get size and offset of local array */ blockDistribute(n, nTasks, myId, &lx, &dx); if ( MPI_Alloc_mem((MPI_Aint)lx*n*sizeof(TYPE), MPI_INFO_NULL, &(ar->data)) == 0 ) { ar->nx = m; ar->ny = n; ar->lx = lx; ar->ly = n; ar->dx = dx; } else { perror("DistMatrix"); MPI_Finalize(); exit(-1); } } void deleteDistMatrix(DistMatrix ar) { MPI_Free_mem(ar.data); } void blockDistribute(int n, int nt, int id, int *count, int *offset) { /* block distribution of n elements on nt tasks */ /* get number of elements (count) and offset for task id */ *count = n/nt; *offset = id * (n/nt); if (id < (n%nt)) { (*count)++; *offset += id; } else { *offset += n%nt; } }