Bu Blogda Ara

7 Şubat 2010 Pazar

test basic topology functions

/* top_fcns.c -- test basic topology functions
*
* Input: none
* Output: results of calls to various functions testing topology
* creation
*
* Algorithm:
* 1. Build a 2-dimensional Cartesian communicator from
* MPI_Comm_world
* 2. Print topology information for each process
* 3. Use MPI_Cart_sub to build a communicator for each
* row of the Cartesian communicator
* 4. Carry out a broadcast across each row communicator
* 5. Print results of broadcast
* 6. Use MPI_Cart_sub to build a communicator for each
* column of the Cartesian communicator
* 7. Carry out a broadcast across each column communicator
* 8. Print results of broadcast
*
* Note: Assumes the number of processes, p, is a perfect square
*
* See Chap 7, pp. 121 & ff in PPMPI
*/
#include
#include "mpi.h"
#include

main(int argc, char* argv[]) {
int p;
int my_rank;
int q;
MPI_Comm grid_comm;
int dim_sizes[2];
int wrap_around[2];
int reorder = 1;
int coordinates[2];
int my_grid_rank;
int grid_rank;
int free_coords[2];
MPI_Comm row_comm;
MPI_Comm col_comm;
int row_test;
int col_test;


MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

q = (int) sqrt((double) p);

dim_sizes[0] = dim_sizes[1] = q;
wrap_around[0] = wrap_around[1] = 1;
MPI_Cart_create(MPI_COMM_WORLD, 2, dim_sizes,
wrap_around, reorder, &grid_comm);

MPI_Comm_rank(grid_comm, &my_grid_rank);
MPI_Cart_coords(grid_comm, my_grid_rank, 2,
coordinates);

MPI_Cart_rank(grid_comm, coordinates, &grid_rank);

printf("Process %d > my_grid_rank = %d, coords = (%d,%d), grid_rank = %d\n",
my_rank, my_grid_rank, coordinates[0], coordinates[1], grid_rank);

free_coords[0] = 0;
free_coords[1] = 1;
MPI_Cart_sub(grid_comm, free_coords, &row_comm);
if (coordinates[1] == 0)
row_test = coordinates[0];
else
row_test = -1;
MPI_Bcast(&row_test, 1, MPI_INT, 0, row_comm);
printf("Process %d > coords = (%d,%d), row_test = %d\n",
my_rank, coordinates[0], coordinates[1], row_test);

free_coords[0] = 1;
free_coords[1] = 0;
MPI_Cart_sub(grid_comm, free_coords, &col_comm);
if (coordinates[0] == 0)
col_test = coordinates[1];
else
col_test = -1;
MPI_Bcast(&col_test, 1, MPI_INT, 0, col_comm);
printf("Process %d > coords = (%d,%d), col_test = %d\n",
my_rank, coordinates[0], coordinates[1], col_test);

MPI_Finalize();
} /* main */

Hiç yorum yok:

Yorum Gönder