X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/40616078da72e823931c1fb884949054699ec39d..d5cc61332edae35867a41bb38ad9401faaab2716:/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 e76d75625d..613a3068d8 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,16 +34,19 @@ * (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 smpi_coll_tuned_scatter_ompi_binomial -#define MPIR_Scatter_MV2_Direct smpi_coll_tuned_scatter_ompi_basic_linear +#define MPIR_Scatter_MV2_Binomial Coll_scatter_ompi_binomial::scatter +#define MPIR_Scatter_MV2_Direct Coll_scatter_ompi_basic_linear::scatter -extern int (*MV2_Scatter_intra_function) (void *sendbuf, int sendcount, MPI_Datatype sendtype, +extern int (*MV2_Scatter_intra_function) (const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); -int smpi_coll_tuned_scatter_mvapich2_two_level_direct(void *sendbuf, +namespace simgrid{ +namespace smpi{ + +int Coll_scatter_mvapich2_two_level_direct::scatter(const void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, @@ -63,8 +66,8 @@ int smpi_coll_tuned_scatter_mvapich2_two_level_direct(void *sendbuf, MPI_Comm shmem_comm, leader_comm; //if not set (use of the algo directly, without mvapich2 selector) if(MV2_Scatter_intra_function==NULL) - MV2_Scatter_intra_function=smpi_coll_tuned_scatter_mpich; - + MV2_Scatter_intra_function=Coll_scatter_mpich::scatter; + if(comm->get_leaders_comm()==MPI_COMM_NULL){ comm->init_smp(); } @@ -138,51 +141,46 @@ int smpi_coll_tuned_scatter_mvapich2_two_level_direct(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; - } - } - smpi_mpi_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; - } - } - smpi_mpi_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 = new int[leader_comm_size]; + sendcnts = new 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 = new int[leader_comm_size]; + sendcnts = new 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) { + delete[] displs; + delete[] sendcnts; + } } else { if (leader_of_root != root) { mpi_errno = @@ -225,7 +223,7 @@ int smpi_coll_tuned_scatter_mvapich2_two_level_direct(void *sendbuf, } -int smpi_coll_tuned_scatter_mvapich2_two_level_binomial(void *sendbuf, +int Coll_scatter_mvapich2_two_level_binomial::scatter(const void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, @@ -247,8 +245,8 @@ int smpi_coll_tuned_scatter_mvapich2_two_level_binomial(void *sendbuf, //if not set (use of the algo directly, without mvapich2 selector) if(MV2_Scatter_intra_function==NULL) - MV2_Scatter_intra_function=smpi_coll_tuned_scatter_mpich; - + MV2_Scatter_intra_function=Coll_scatter_mpich::scatter; + if(comm->get_leaders_comm()==MPI_COMM_NULL){ comm->init_smp(); } @@ -319,51 +317,46 @@ int smpi_coll_tuned_scatter_mvapich2_two_level_binomial(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; - } - } - smpi_mpi_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; - } - } - smpi_mpi_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 = new int[leader_comm_size]; + sendcnts = new 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 = new int[leader_comm_size]; + sendcnts = new 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) { + delete[] displs; + delete[] sendcnts; + } } else { if (leader_of_root != root) { mpi_errno = @@ -408,3 +401,6 @@ int smpi_coll_tuned_scatter_mvapich2_two_level_binomial(void *sendbuf, return (mpi_errno); } +} +} +