X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d5b29830df70e823202e384a7655e4371193ecd7..5089a0a98b27f5eeee62321dff4f025f1648f025:/src/smpi/colls/gather/gather-mvapich.cpp diff --git a/src/smpi/colls/gather/gather-mvapich.cpp b/src/smpi/colls/gather/gather-mvapich.cpp index 9cc9a36259..c5ca478959 100644 --- a/src/smpi/colls/gather/gather-mvapich.cpp +++ b/src/smpi/colls/gather/gather-mvapich.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017. 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 @@ -35,16 +35,13 @@ * See COPYRIGHT in top-level directory. */ -#include "../colls_private.h" +#include "../colls_private.hpp" +#include - - - - -#define MPIR_Gather_MV2_Direct Coll_gather_ompi_basic_linear::gather -#define MPIR_Gather_MV2_two_level_Direct Coll_gather_ompi_basic_linear::gather -#define MPIR_Gather_intra Coll_gather_mpich::gather -typedef int (*MV2_Gather_function_ptr) (void *sendbuf, +#define MPIR_Gather_MV2_Direct gather__ompi_basic_linear +#define MPIR_Gather_MV2_two_level_Direct gather__ompi_basic_linear +#define MPIR_Gather_intra gather__mpich +typedef int (*MV2_Gather_function_ptr) (const void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, @@ -83,7 +80,7 @@ namespace smpi{ * intra node gather function * errflag - (out) to record errors */ -static int MPIR_pt_pt_intra_gather( void *sendbuf, int sendcnt, MPI_Datatype sendtype, +static int MPIR_pt_pt_intra_gather( const void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, int rank, void *tmp_buf, int nbytes, @@ -130,35 +127,34 @@ static int MPIR_pt_pt_intra_gather( void *sendbuf, int sendcnt, MPI_Datatype sen -int Coll_gather_mvapich2_two_level::gather(void *sendbuf, - int sendcnt, - MPI_Datatype sendtype, - void *recvbuf, - int recvcnt, - MPI_Datatype recvtype, - int root, - MPI_Comm comm) +int gather__mvapich2_two_level(const void *sendbuf, + int sendcnt, + MPI_Datatype sendtype, + void *recvbuf, + int recvcnt, + MPI_Datatype recvtype, + int root, + MPI_Comm comm) { - void *leader_gather_buf = NULL; - int comm_size, rank; - int local_rank, local_size; - int leader_comm_rank = -1, leader_comm_size = 0; - int mpi_errno = MPI_SUCCESS; - int recvtype_size = 0, sendtype_size = 0, nbytes=0; - int leader_root, leader_of_root; - MPI_Status status; - MPI_Aint sendtype_extent = 0, recvtype_extent = 0; /* Datatype extent */ - MPI_Aint true_lb = 0, sendtype_true_extent = 0, recvtype_true_extent = 0; - MPI_Comm shmem_comm, leader_comm; - void* tmp_buf = NULL; - - - //if not set (use of the algo directly, without mvapich2 selector) - if(MV2_Gather_intra_node_function==NULL) - MV2_Gather_intra_node_function= Coll_gather_mpich::gather; - - if(comm->get_leaders_comm()==MPI_COMM_NULL){ - comm->init_smp(); + unsigned char* leader_gather_buf = NULL; + int comm_size, rank; + int local_rank, local_size; + int leader_comm_rank = -1, leader_comm_size = 0; + int mpi_errno = MPI_SUCCESS; + int recvtype_size = 0, sendtype_size = 0, nbytes = 0; + int leader_root, leader_of_root; + MPI_Status status; + MPI_Aint sendtype_extent = 0, recvtype_extent = 0; /* Datatype extent */ + MPI_Aint true_lb = 0, sendtype_true_extent = 0, recvtype_true_extent = 0; + MPI_Comm shmem_comm, leader_comm; + unsigned char* tmp_buf = NULL; + + // if not set (use of the algo directly, without mvapich2 selector) + if (MV2_Gather_intra_node_function == NULL) + MV2_Gather_intra_node_function = gather__mpich; + + if (comm->get_leaders_comm() == MPI_COMM_NULL) { + comm->init_smp(); } comm_size = comm->size(); rank = comm->rank(); @@ -227,12 +223,9 @@ int Coll_gather_mvapich2_two_level::gather(void *sendbuf, if (local_rank == 0) { /* Node leader, allocate tmp_buffer */ if (rank == root) { - tmp_buf = smpi_get_tmp_recvbuffer(recvcnt * MAX(recvtype_extent, - recvtype_true_extent) * local_size); + tmp_buf = smpi_get_tmp_recvbuffer(recvcnt * std::max(recvtype_extent, recvtype_true_extent) * local_size); } else { - tmp_buf = smpi_get_tmp_sendbuffer(sendcnt * MAX(sendtype_extent, - sendtype_true_extent) * - local_size); + tmp_buf = smpi_get_tmp_sendbuffer(sendcnt * std::max(sendtype_extent, sendtype_true_extent) * local_size); } if (tmp_buf == NULL) { mpi_errno = MPI_ERR_OTHER; @@ -295,10 +288,10 @@ int Coll_gather_mvapich2_two_level::gather(void *sendbuf, * is the same as leader_root */ if (rank == root) { leader_gather_buf = - smpi_get_tmp_recvbuffer(recvcnt * MAX(recvtype_extent, recvtype_true_extent) * comm_size); + smpi_get_tmp_recvbuffer(recvcnt * std::max(recvtype_extent, recvtype_true_extent) * comm_size); } else { leader_gather_buf = - smpi_get_tmp_sendbuffer(sendcnt * MAX(sendtype_extent, sendtype_true_extent) * comm_size); + smpi_get_tmp_sendbuffer(sendcnt * std::max(sendtype_extent, sendtype_true_extent) * comm_size); } if (leader_gather_buf == NULL) { mpi_errno = MPI_ERR_OTHER; @@ -309,12 +302,8 @@ int Coll_gather_mvapich2_two_level::gather(void *sendbuf, node_sizes = comm->get_non_uniform_map(); if (leader_comm_rank == leader_root) { - displs = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); - recvcnts = static_cast(xbt_malloc(sizeof(int) * leader_comm_size)); - if (not displs || not recvcnts) { - mpi_errno = MPI_ERR_OTHER; - return mpi_errno; - } + displs = new int[leader_comm_size]; + recvcnts = new int[leader_comm_size]; } if (root == leader_of_root) { @@ -348,8 +337,8 @@ int Coll_gather_mvapich2_two_level::gather(void *sendbuf, leader_root, leader_comm); } if (leader_comm_rank == leader_root) { - xbt_free(displs); - xbt_free(recvcnts); + delete[] displs; + delete[] recvcnts; } } } else {