Следующий пример, будучи запущенным, для заданного числа процессоров выведет информацию о размерностях трехмерной решетки раздела.
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <mpix.h>
#define MAXDIMS 4
static void Print_Array(const char *name, int n, const int a[])
{
int i;
printf("%s: (", name);
for (i = 0; i < n-1; ++i)
printf("%d, ", a[i]);
printf("%d)\n", a[n-1]);
}
int main(int argc, char **argv)
{
MPI_Comm comm;
int rank, size;
const int root = 0;
int res;
MPI_Init(&argc, &argv);
/* Create BG/P Cartesian communucator */
res = MPIX_Cart_comm_create(&comm);
if (res != MPI_SUCCESS)
{
fprintf(stderr, "MPIX_Cart_comm_create() failed "
"(return code: %d)\n", res);
MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
}
MPI_Comm_rank(comm, &rank);
if (rank == root)
{
MPI_Comm_size(comm, &size);
printf("size: %d\n", size);
}
/* Print values of some environment variables */
if (rank == root)
{
const char *val, *name;
name = "OMP_NUM_THREADS";
printf("%s: %s\n", name, (val = getenv(name)) ? val: "");
name = "BG_MAPPING";
printf("%s: %s\n", name, (val = getenv(name)) ? val: "");
}
/* Print some info on Cartesian topology */
if (rank == root)
{
int ndims;
int dims[MAXDIMS], periods[MAXDIMS], coords[MAXDIMS];
MPI_Cartdim_get(comm, &ndims);
printf("Number of dimensions: %d\n", ndims);
MPI_Cart_get(comm, MAXDIMS, dims, periods, coords);
Print_Array("Dimensions", ndims, dims);
Print_Array("Periods", ndims, periods);
Print_Array("Coordinates", ndims, coords);
}
/* Mark Cartesian communicator for deallocation */
MPI_Comm_free(&comm);
MPI_Finalize();
return 0;
}