#include #include #include "mpi.h" #define PARALLEL_IO_PATH_TO_FILE "./output_c.dat" #define ind(i,j) (i*lsizes[1]+j) int main( int argc, char *argv[] ) { // Declare variables (or do it later) const int m = 10; // rows of global matrix const int n = 10; // cols of global matrix // Start MPI MPI_Init( &argc, &argv ); // Set cartesian topology int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int dims[2]; dims[0] = 0; dims[1] = 0; MPI_Dims_create(world_size, 2, dims); int periods[2]; periods[0] = 0; periods[1] = 0; MPI_Comm comm; MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods, 1, &comm); int rank, coords[2]; MPI_Comm_rank(comm, &rank); MPI_Cart_coords(comm, rank, 2, coords); if (rank == 0) { printf("\nUsing a grid of [%d][%d] processes\n", dims[0], dims[1]); } // set subarray info int rem; int gsizes[2], psizes[2]; int lsizes[2], start_indices[2]; gsizes[0] = m; /* no. of rows in global array */ gsizes[1] = n; /* no. of columns in global array*/ psizes[0] = dims[0]; /* no. of processes in vertical dimension of process grid */ psizes[1] = dims[1]; /* no. of processes in horizontal dimension of process grid */ lsizes[0] = m/psizes[0]; /* no. of rows in local array */ rem = m%psizes[0]; if (rem && coords[0] < rem) { lsizes[0]++; start_indices[0] = coords[0] * lsizes[0]; } else { start_indices[0] = rem + coords[0] * lsizes[0]; } lsizes[1] = n/psizes[1]; /* no. of columns in local array */ rem = n%psizes[1]; if (rem && coords[1] < rem) { lsizes[1]++; start_indices[1] = coords[1] * lsizes[1]; } else { start_indices[1] = rem + coords[1] * lsizes[1]; } // initialize local matrix (array) int local_array_size = lsizes[0] * lsizes[1]; int *local_array = (int *) malloc( local_array_size * sizeof(int) ); for (int i=0; i