1 /* Copyright (c) 2013-2021. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
8 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
9 * University Research and Technology
10 * Corporation. All rights reserved.
11 * Copyright (c) 2004-2009 The University of Tennessee and The University
12 * of Tennessee Research Foundation. All rights
14 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
15 * University of Stuttgart. All rights reserved.
16 * Copyright (c) 2004-2005 The Regents of the University of California.
17 * All rights reserved.
19 * Additional copyrights may follow
21 /* -*- Mode: C; c-basic-offset:4 ; -*- */
22 /* Copyright (c) 2001-2014, The Ohio State University. All rights
25 * This file is part of the MVAPICH2 software package developed by the
26 * team members of The Ohio State University's Network-Based Computing
27 * Laboratory (NBCL), headed by Professor Dhabaleswar K. (DK) Panda.
29 * For detailed copyright and licensing information, please refer to the
30 * copyright file COPYRIGHT in the top level MVAPICH2 directory.
34 * (C) 2001 by Argonne National Laboratory.
35 * See COPYRIGHT in top-level directory.
38 #include "../colls_private.hpp"
40 #define MPIR_Allreduce_pt2pt_rd_MV2 allreduce__rdb
41 #define MPIR_Allreduce_pt2pt_rs_MV2 allreduce__mvapich2_rs
43 extern int (*MV2_Allreducection)(const void *sendbuf,
46 MPI_Datatype datatype,
47 MPI_Op op, MPI_Comm comm);
50 extern int (*MV2_Allreduce_intra_function)(const void *sendbuf,
53 MPI_Datatype datatype,
54 MPI_Op op, MPI_Comm comm);
59 static int MPIR_Allreduce_reduce_p2p_MV2(const void *sendbuf,
62 MPI_Datatype datatype,
63 MPI_Op op, MPI_Comm comm)
65 colls::reduce(sendbuf, recvbuf, count, datatype, op, 0, comm);
69 static int MPIR_Allreduce_reduce_shmem_MV2(const void *sendbuf,
72 MPI_Datatype datatype,
73 MPI_Op op, MPI_Comm comm)
75 colls::reduce(sendbuf, recvbuf, count, datatype, op, 0, comm);
80 /* general two level allreduce helper function */
81 int allreduce__mvapich2_two_level(const void *sendbuf,
84 MPI_Datatype datatype,
85 MPI_Op op, MPI_Comm comm)
87 int mpi_errno = MPI_SUCCESS;
89 MPI_Aint true_lb, true_extent;
90 MPI_Comm shmem_comm = MPI_COMM_NULL, leader_comm = MPI_COMM_NULL;
91 int local_rank = -1, local_size = 0;
93 //if not set (use of the algo directly, without mvapich2 selector)
94 if (MV2_Allreduce_intra_function == nullptr)
95 MV2_Allreduce_intra_function = allreduce__mpich;
96 if (MV2_Allreducection == nullptr)
97 MV2_Allreducection = allreduce__rdb;
99 if(comm->get_leaders_comm()==MPI_COMM_NULL){
106 datatype->extent(&true_lb,
109 total_size = comm->size();
110 shmem_comm = comm->get_intra_comm();
111 local_rank = shmem_comm->rank();
112 local_size = shmem_comm->size();
114 leader_comm = comm->get_leaders_comm();
116 if (local_rank == 0) {
117 if (sendbuf != MPI_IN_PLACE) {
118 Datatype::copy(sendbuf, count, datatype, recvbuf,
123 /* Doing the shared memory gather and reduction by the leader */
124 if (local_rank == 0) {
125 if ((MV2_Allreduce_intra_function == &MPIR_Allreduce_reduce_shmem_MV2) ||
126 (MV2_Allreduce_intra_function == &MPIR_Allreduce_reduce_p2p_MV2) ) {
128 MV2_Allreduce_intra_function(sendbuf, recvbuf, count, datatype,
133 MV2_Allreduce_intra_function(sendbuf, recvbuf, count, datatype,
137 if (local_size != total_size) {
138 unsigned char* sendtmpbuf = smpi_get_tmp_sendbuffer(count * datatype->get_extent());
139 Datatype::copy(recvbuf, count, datatype,sendtmpbuf, count, datatype);
140 /* inter-node allreduce */
141 if(MV2_Allreducection == &MPIR_Allreduce_pt2pt_rd_MV2){
143 MPIR_Allreduce_pt2pt_rd_MV2(sendtmpbuf, recvbuf, count, datatype, op,
147 MPIR_Allreduce_pt2pt_rs_MV2(sendtmpbuf, recvbuf, count, datatype, op,
150 smpi_free_tmp_buffer(sendtmpbuf);
153 /* insert the first reduce here */
154 if ((MV2_Allreduce_intra_function == &MPIR_Allreduce_reduce_shmem_MV2) ||
155 (MV2_Allreduce_intra_function == &MPIR_Allreduce_reduce_p2p_MV2) ) {
157 MV2_Allreduce_intra_function(sendbuf, recvbuf, count, datatype,
162 MV2_Allreduce_intra_function(sendbuf, recvbuf, count, datatype,
167 /* Broadcasting the message from leader to the rest */
168 /* Note: shared memory broadcast could improve the performance */
169 mpi_errno = colls::bcast(recvbuf, count, datatype, 0, shmem_comm);