1 /* simple broadcast logic demonstrations */
12 void my_broadcast(int rank, int size, double *message);
14 int main(int argc, char *argv[])
19 MPI_Init(&argc, &argv);
20 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
21 MPI_Comm_size(MPI_COMM_WORLD, &size);
23 /* an arbitrary message */
29 my_broadcast(rank, size, &message);
31 /* check that nodes received message */
32 printf("after broadcast -- node %d -- message %f\n", rank, message);
39 void my_broadcast(int rank, int size, double *message)
42 int shift_ip, n_target;
44 int from_process, target;
45 MPI_Status recv_status;
47 /* build transmission tree */
49 /* size of binary tree */
51 while (1 << maxlevel + 1 < size)
53 /* '<<' is a bitwise shift left, so 1 << b == pow(2, b) */
55 /* make space for local branch of tree */
56 target_process = (int *)malloc((unsigned)(size * sizeof(int)));
58 /* build the branches */
62 for (level = 0; level <= maxlevel; level++) {
63 shift_ip = 1 << level;
65 from_process = rank - shift_ip;
66 if (rank < shift_ip) {
67 target = rank + shift_ip;
69 target_process[n_target] = target;
75 /* debugging output */
76 fprintf(stderr, "process %d -- from_process %d -- %d targets\n",
77 rank, from_process, n_target);
79 for (target = 0; target < n_target; target++)
80 fprintf(stderr, "process %d -- target %d\n",
81 rank, target_process[target]);
84 /* message transmission */
88 fprintf(stderr, "--- receiving %d %d \n", rank, from_process);
90 MPI_Recv(message, 1, MPI_DOUBLE, from_process, TAG_BCAST,
91 MPI_COMM_WORLD, &recv_status);
94 /* send message to all target processes */
96 fprintf(stderr, "--- sending %d %d \n", rank, n_target);
97 for (target = 0; target < n_target; target++)
98 MPI_Ssend(message, 1, MPI_DOUBLE,
99 target_process[target], TAG_BCAST,
104 free(target_process);