X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b7ed19dfcc221d7b3eca182abb5c4a3946671172..ef5b1bb2204ec20b7b0c2386500872b913ed3a4a:/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp diff --git a/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp b/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp index d2cb88f90b..3cb8003f6b 100644 --- a/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp +++ b/src/smpi/colls/scatter/scatter-mvapich-two-level.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014. The SimGrid Team. +/* Copyright (c) 2013-2019. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ -#include "../colls_private.h" +#include "../colls_private.hpp" #define MPIR_Scatter_MV2_Binomial Coll_scatter_ompi_binomial::scatter #define MPIR_Scatter_MV2_Direct Coll_scatter_ompi_basic_linear::scatter @@ -43,6 +43,9 @@ extern int (*MV2_Scatter_intra_function) (void *sendbuf, int sendcount, MPI_Data void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); +namespace simgrid{ +namespace smpi{ + int Coll_scatter_mvapich2_two_level_direct::scatter(void *sendbuf, int sendcnt, MPI_Datatype sendtype, @@ -64,7 +67,7 @@ int Coll_scatter_mvapich2_two_level_direct::scatter(void *sendbuf, //if not set (use of the algo directly, without mvapich2 selector) if(MV2_Scatter_intra_function==NULL) MV2_Scatter_intra_function=Coll_scatter_mpich::scatter; - + if(comm->get_leaders_comm()==MPI_COMM_NULL){ comm->init_smp(); } @@ -138,51 +141,46 @@ int Coll_scatter_mvapich2_two_level_direct::scatter(void *sendbuf, } if (leader_comm_size > 1 && local_rank == 0) { - if (!comm->is_uniform()) { - int *displs = NULL; - int *sendcnts = NULL; - int *node_sizes; - int i = 0; - node_sizes = comm->get_non_uniform_map(); - - if (root != leader_of_root) { - if (leader_comm_rank == leader_root) { - displs = static_cast(xbt_malloc(sizeof (int) * leader_comm_size)); - sendcnts = static_cast(xbt_malloc(sizeof (int) * leader_comm_size)); - sendcnts[0] = node_sizes[0] * nbytes; - displs[0] = 0; - - for (i = 1; i < leader_comm_size; i++) { - displs[i] = - displs[i - 1] + node_sizes[i - 1] * nbytes; - sendcnts[i] = node_sizes[i] * nbytes; - } - } - Colls::scatterv(leader_scatter_buf, sendcnts, displs, - MPI_BYTE, tmp_buf, nbytes * local_size, - MPI_BYTE, leader_root, leader_comm); - } else { - if (leader_comm_rank == leader_root) { - displs = static_cast(xbt_malloc(sizeof (int) * leader_comm_size)); - sendcnts = static_cast(xbt_malloc(sizeof (int) * leader_comm_size)); - sendcnts[0] = node_sizes[0] * sendcnt; - displs[0] = 0; - - for (i = 1; i < leader_comm_size; i++) { - displs[i] = - displs[i - 1] + node_sizes[i - 1] * sendcnt; - sendcnts[i] = node_sizes[i] * sendcnt; - } - } - Colls::scatterv(sendbuf, sendcnts, displs, - sendtype, tmp_buf, - nbytes * local_size, MPI_BYTE, - leader_root, leader_comm); + if (not comm->is_uniform()) { + int* displs = NULL; + int* sendcnts = NULL; + int* node_sizes; + int i = 0; + node_sizes = comm->get_non_uniform_map(); + + if (root != leader_of_root) { + if (leader_comm_rank == leader_root) { + displs = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); + sendcnts = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); + sendcnts[0] = node_sizes[0] * nbytes; + displs[0] = 0; + + for (i = 1; i < leader_comm_size; i++) { + displs[i] = displs[i - 1] + node_sizes[i - 1] * nbytes; + sendcnts[i] = node_sizes[i] * nbytes; } - if (leader_comm_rank == leader_root) { - xbt_free(displs); - xbt_free(sendcnts); + } + Colls::scatterv(leader_scatter_buf, sendcnts, displs, MPI_BYTE, tmp_buf, nbytes * local_size, MPI_BYTE, + leader_root, leader_comm); + } else { + if (leader_comm_rank == leader_root) { + displs = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); + sendcnts = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); + sendcnts[0] = node_sizes[0] * sendcnt; + displs[0] = 0; + + for (i = 1; i < leader_comm_size; i++) { + displs[i] = displs[i - 1] + node_sizes[i - 1] * sendcnt; + sendcnts[i] = node_sizes[i] * sendcnt; } + } + Colls::scatterv(sendbuf, sendcnts, displs, sendtype, tmp_buf, nbytes * local_size, MPI_BYTE, leader_root, + leader_comm); + } + if (leader_comm_rank == leader_root) { + xbt_free(displs); + xbt_free(sendcnts); + } } else { if (leader_of_root != root) { mpi_errno = @@ -248,7 +246,7 @@ int Coll_scatter_mvapich2_two_level_binomial::scatter(void *sendbuf, //if not set (use of the algo directly, without mvapich2 selector) if(MV2_Scatter_intra_function==NULL) MV2_Scatter_intra_function=Coll_scatter_mpich::scatter; - + if(comm->get_leaders_comm()==MPI_COMM_NULL){ comm->init_smp(); } @@ -319,51 +317,46 @@ int Coll_scatter_mvapich2_two_level_binomial::scatter(void *sendbuf, } if (leader_comm_size > 1 && local_rank == 0) { - if (!comm->is_uniform()) { - int *displs = NULL; - int *sendcnts = NULL; - int *node_sizes; - int i = 0; - node_sizes = comm->get_non_uniform_map(); - - if (root != leader_of_root) { - if (leader_comm_rank == leader_root) { - displs = static_cast(xbt_malloc(sizeof (int) * leader_comm_size)); - sendcnts = static_cast(xbt_malloc(sizeof (int) * leader_comm_size)); - sendcnts[0] = node_sizes[0] * nbytes; - displs[0] = 0; - - for (i = 1; i < leader_comm_size; i++) { - displs[i] = - displs[i - 1] + node_sizes[i - 1] * nbytes; - sendcnts[i] = node_sizes[i] * nbytes; - } - } - Colls::scatterv(leader_scatter_buf, sendcnts, displs, - MPI_BYTE, tmp_buf, nbytes * local_size, - MPI_BYTE, leader_root, leader_comm); - } else { - if (leader_comm_rank == leader_root) { - displs = static_cast(xbt_malloc(sizeof (int) * leader_comm_size)); - sendcnts = static_cast(xbt_malloc(sizeof (int) * leader_comm_size)); - sendcnts[0] = node_sizes[0] * sendcnt; - displs[0] = 0; - - for (i = 1; i < leader_comm_size; i++) { - displs[i] = - displs[i - 1] + node_sizes[i - 1] * sendcnt; - sendcnts[i] = node_sizes[i] * sendcnt; - } - } - Colls::scatterv(sendbuf, sendcnts, displs, - sendtype, tmp_buf, - nbytes * local_size, MPI_BYTE, - leader_root, leader_comm); + if (not comm->is_uniform()) { + int* displs = NULL; + int* sendcnts = NULL; + int* node_sizes; + int i = 0; + node_sizes = comm->get_non_uniform_map(); + + if (root != leader_of_root) { + if (leader_comm_rank == leader_root) { + displs = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); + sendcnts = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); + sendcnts[0] = node_sizes[0] * nbytes; + displs[0] = 0; + + for (i = 1; i < leader_comm_size; i++) { + displs[i] = displs[i - 1] + node_sizes[i - 1] * nbytes; + sendcnts[i] = node_sizes[i] * nbytes; } - if (leader_comm_rank == leader_root) { - xbt_free(displs); - xbt_free(sendcnts); + } + Colls::scatterv(leader_scatter_buf, sendcnts, displs, MPI_BYTE, tmp_buf, nbytes * local_size, MPI_BYTE, + leader_root, leader_comm); + } else { + if (leader_comm_rank == leader_root) { + displs = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); + sendcnts = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); + sendcnts[0] = node_sizes[0] * sendcnt; + displs[0] = 0; + + for (i = 1; i < leader_comm_size; i++) { + displs[i] = displs[i - 1] + node_sizes[i - 1] * sendcnt; + sendcnts[i] = node_sizes[i] * sendcnt; } + } + Colls::scatterv(sendbuf, sendcnts, displs, sendtype, tmp_buf, nbytes * local_size, MPI_BYTE, leader_root, + leader_comm); + } + if (leader_comm_rank == leader_root) { + xbt_free(displs); + xbt_free(sendcnts); + } } else { if (leader_of_root != root) { mpi_errno = @@ -408,3 +401,6 @@ int Coll_scatter_mvapich2_two_level_binomial::scatter(void *sendbuf, return (mpi_errno); } +} +} +