X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/19b3962253112b19308537bc2400de141c119d99..b19516b0c55b093120c06185c404bfc22ef90f80:/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp?ds=sidebyside diff --git a/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp b/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp index 35bde00925..1e7504c957 100644 --- a/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp +++ b/src/smpi/colls/allreduce/allreduce-smp-rdb.cpp @@ -1,14 +1,14 @@ -/* 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 * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "../colls_private.h" -/* IMPLEMENTED BY PITCH PATARASUK - Non-topoloty-specific (however, number of cores/node need to be changed) +#include "../colls_private.hpp" +/* IMPLEMENTED BY PITCH PATARASUK + Non-topoloty-specific (however, number of cores/node need to be changed) all-reduce operation designed for smp clusters - It uses 2-layer communication: binomial for intra-communication + It uses 2-layer communication: binomial for intra-communication and rdb for inter-communication*/ @@ -28,12 +28,11 @@ This fucntion performs all-reduce operation as follow. */ namespace simgrid{ namespace smpi{ -int Coll_allreduce_smp_rdb::allreduce(void *send_buf, void *recv_buf, int count, +int Coll_allreduce_smp_rdb::allreduce(const void *send_buf, void *recv_buf, int count, MPI_Datatype dtype, MPI_Op op, MPI_Comm comm) { int comm_size, rank; - void *tmp_buf; int tag = COLL_TAG_ALLREDUCE; int mask, src, dst; MPI_Status status; @@ -49,7 +48,7 @@ int Coll_allreduce_smp_rdb::allreduce(void *send_buf, void *recv_buf, int count, MPI_User_function * uop = MPIR_Op_table[op % 16 - 1]; #else MPI_User_function *uop; - struct MPIR_OP *op_ptr; + MPIR_OP *op_ptr; op_ptr = MPIR_ToPointer(op); uop = op_ptr->op; #endif @@ -58,7 +57,7 @@ int Coll_allreduce_smp_rdb::allreduce(void *send_buf, void *recv_buf, int count, rank = comm->rank(); MPI_Aint extent; extent = dtype->get_extent(); - tmp_buf = (void *) smpi_get_tmp_sendbuffer(count * extent); + unsigned char* tmp_buf = smpi_get_tmp_sendbuffer(count * extent); /* compute intra and inter ranking */ int intra_rank, inter_rank; @@ -91,7 +90,7 @@ int Coll_allreduce_smp_rdb::allreduce(void *send_buf, void *recv_buf, int count, } /* end binomial reduce intra-communication */ - /* start rdb (recursive doubling) all-reduce inter-communication + /* start rdb (recursive doubling) all-reduce inter-communication between each SMP nodes : each node only have one process that can communicate to other nodes */ if (intra_rank == 0) { @@ -124,11 +123,11 @@ int Coll_allreduce_smp_rdb::allreduce(void *send_buf, void *recv_buf, int count, newrank = inter_rank - rem; } - /* example inter-communication RDB rank change algorithm + /* example inter-communication RDB rank change algorithm 0,4,8,12..36 <= true rank (assume 4 core per SMP) 0123 4567 89 <= inter_rank 1 3 4567 89 (1,3 got data from 0,2 : 0,2 will be idle until the end) - 0 1 4567 89 + 0 1 4567 89 0 1 2345 67 => newrank */ @@ -148,8 +147,8 @@ int Coll_allreduce_smp_rdb::allreduce(void *send_buf, void *recv_buf, int count, } } - /* non pof2 case - left-over processes (all even ranks: < 2 * rem) get the result + /* non pof2 case + left-over processes (all even ranks: < 2 * rem) get the result */ if (inter_rank < 2 * rem) { if (inter_rank % 2) {