Bu Blogda Ara

7 Şubat 2010 Pazar

builds a communicator from the first q processes * in a communicator containing p = q^2 processes.

/* comm_create.c -- builds a communicator from the first q processes
* in a communicator containing p = q^2 processes.
*
* Input: none
* Output: q -- program tests correct creation of new communicator
* by broadcasting the value 1 to its members -- all other
* processes have the value 0 -- global sum computed across
* all the processes.
*
* Note: Assumes that MPI_COMM_WORLD contains p = q^2 processes
*
* See Chap 7, pp. 117 & ff in PPMPI
*/
#include
#include "mpi.h"
#include
#include

main(int argc, char* argv[]) {
int p;
int q; /* = sqrt(p) */
int my_rank;
MPI_Group group_world;
MPI_Group first_row_group;
MPI_Comm first_row_comm;
int* process_ranks;
int proc;
int test = 0;
int sum;
int my_rank_in_first_row;


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

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

/* Make a list of the processes in the new
* communicator */
process_ranks = (int*) malloc(q*sizeof(int));
for (proc = 0; proc < q; proc++)
process_ranks[proc] = proc;

/* Get the group underlying MPI_COMM_WORLD */
MPI_Comm_group(MPI_COMM_WORLD, &group_world);

/* Create the new group */
MPI_Group_incl(group_world, q, process_ranks,
&first_row_group);

/* Create the new communicator */
MPI_Comm_create(MPI_COMM_WORLD, first_row_group,
&first_row_comm);

/* Now check whether we can do collective ops in first_row_comm */
if (my_rank < q) {
MPI_Comm_rank(first_row_comm, &my_rank_in_first_row);
if (my_rank_in_first_row == 0) test = 1;
MPI_Bcast(&test, 1, MPI_INT, 0, first_row_comm);
}
MPI_Reduce(&test, &sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

if (my_rank == 0) {
printf("q = %d, sum = %d\n", q, sum);
}

MPI_Finalize();
} /* main */

Hiç yorum yok:

Yorum Gönder