3 int flattree_segment_in_byte = 8192;
6 smpi_coll_tuned_bcast_flattree_pipeline(void *buff, int count,
7 MPI_Datatype data_type, int root,
10 int i, j, rank, num_procs;
14 MPI_Type_extent(data_type, &extent);
16 int segment = flattree_segment_in_byte / extent;
17 int pipe_length = count / segment;
18 int increment = segment * extent;
20 MPI_Comm_rank(comm, &rank);
21 MPI_Comm_size(comm, &num_procs);
23 MPI_Request *request_array;
24 MPI_Status *status_array;
26 request_array = (MPI_Request *) malloc(pipe_length * sizeof(MPI_Request));
27 status_array = (MPI_Status *) malloc(pipe_length * sizeof(MPI_Status));
30 for (i = 0; i < pipe_length; i++) {
31 MPI_Irecv((char *)buff + (i * increment), segment, data_type, root, tag, comm,
34 MPI_Waitall(pipe_length, request_array, status_array);
38 // Root sends data to all others
39 for (j = 0; j < num_procs; j++) {
43 for (i = 0; i < pipe_length; i++) {
44 MPI_Send((char *)buff + (i * increment), segment, data_type, j, tag, comm);