1 /* Copyright (c) 2013-2023. 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);
56 namespace simgrid::smpi {
57 static int MPIR_Allreduce_reduce_p2p_MV2(const void *sendbuf,
60 MPI_Datatype datatype,
61 MPI_Op op, MPI_Comm comm)
63 colls::reduce(sendbuf, recvbuf, count, datatype, op, 0, comm);
67 static int MPIR_Allreduce_reduce_shmem_MV2(const void *sendbuf,
70 MPI_Datatype datatype,
71 MPI_Op op, MPI_Comm comm)
73 colls::reduce(sendbuf, recvbuf, count, datatype, op, 0, comm);
78 /* general two level allreduce helper function */
79 int allreduce__mvapich2_two_level(const void *sendbuf,
82 MPI_Datatype datatype,
83 MPI_Op op, MPI_Comm comm)
85 int mpi_errno = MPI_SUCCESS;
87 MPI_Aint true_lb, true_extent;
88 MPI_Comm shmem_comm = MPI_COMM_NULL, leader_comm = MPI_COMM_NULL;
89 int local_rank = -1, local_size = 0;
91 //if not set (use of the algo directly, without mvapich2 selector)
92 if (MV2_Allreduce_intra_function == nullptr)
93 MV2_Allreduce_intra_function = allreduce__mpich;
94 if (MV2_Allreducection == nullptr)
95 MV2_Allreducection = allreduce__rdb;
97 if(comm->get_leaders_comm()==MPI_COMM_NULL){
104 datatype->extent(&true_lb,
107 total_size = comm->size();
108 shmem_comm = comm->get_intra_comm();
109 local_rank = shmem_comm->rank();
110 local_size = shmem_comm->size();
112 leader_comm = comm->get_leaders_comm();
114 if (local_rank == 0) {
115 if (sendbuf != MPI_IN_PLACE) {
116 Datatype::copy(sendbuf, count, datatype, recvbuf,
121 /* Doing the shared memory gather and reduction by the leader */
122 if (local_rank == 0) {
123 if ((MV2_Allreduce_intra_function == &MPIR_Allreduce_reduce_shmem_MV2) ||
124 (MV2_Allreduce_intra_function == &MPIR_Allreduce_reduce_p2p_MV2) ) {
126 MV2_Allreduce_intra_function(sendbuf, recvbuf, count, datatype,
131 MV2_Allreduce_intra_function(sendbuf, recvbuf, count, datatype,
135 if (local_size != total_size) {
136 unsigned char* sendtmpbuf = smpi_get_tmp_sendbuffer(count * datatype->get_extent());
137 Datatype::copy(recvbuf, count, datatype,sendtmpbuf, count, datatype);
138 /* inter-node allreduce */
139 if(MV2_Allreducection == &MPIR_Allreduce_pt2pt_rd_MV2){
141 MPIR_Allreduce_pt2pt_rd_MV2(sendtmpbuf, recvbuf, count, datatype, op,
145 MPIR_Allreduce_pt2pt_rs_MV2(sendtmpbuf, recvbuf, count, datatype, op,
148 smpi_free_tmp_buffer(sendtmpbuf);
151 /* insert the first reduce here */
152 if ((MV2_Allreduce_intra_function == &MPIR_Allreduce_reduce_shmem_MV2) ||
153 (MV2_Allreduce_intra_function == &MPIR_Allreduce_reduce_p2p_MV2) ) {
155 MV2_Allreduce_intra_function(sendbuf, recvbuf, count, datatype,
160 MV2_Allreduce_intra_function(sendbuf, recvbuf, count, datatype,
165 /* Broadcasting the message from leader to the rest */
166 /* Note: shared memory broadcast could improve the performance */
167 mpi_errno = colls::bcast(recvbuf, count, datatype, 0, shmem_comm);
172 } // namespace simgrid::smpi