1 #include "colls_private.h"
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 extent = smpi_datatype_get_extent(data_type);
16 int segment = flattree_segment_in_byte / extent;
17 int pipe_length = count / segment;
18 int increment = segment * extent;
20 XBT_WARN("MPI_bcast_flattree_pipeline use default MPI_bcast_flattree.");
21 return smpi_coll_tuned_bcast_flattree(buff, count, data_type, root, comm);
23 rank = smpi_comm_rank(comm);
24 num_procs = smpi_comm_size(comm);
26 MPI_Request *request_array;
27 MPI_Status *status_array;
29 request_array = (MPI_Request *) xbt_malloc(pipe_length * sizeof(MPI_Request));
30 status_array = (MPI_Status *) xbt_malloc(pipe_length * sizeof(MPI_Status));
33 for (i = 0; i < pipe_length; i++) {
34 request_array[i] = smpi_mpi_irecv((char *)buff + (i * increment), segment, data_type, root, tag, comm);
36 smpi_mpi_waitall(pipe_length, request_array, status_array);
40 // Root sends data to all others
41 for (j = 0; j < num_procs; j++) {
45 for (i = 0; i < pipe_length; i++) {
46 smpi_mpi_send((char *)buff + (i * increment), segment, data_type, j, tag, comm);