X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b085fe247ae2cf2a6e36863a54f794deb4f342f5..cd9affe6152d6bbec19a72ea6fe26ab9407b51b7:/src/smpi/colls/reduce_scatter-ompi.c diff --git a/src/smpi/colls/reduce_scatter-ompi.c b/src/smpi/colls/reduce_scatter-ompi.c index 90978b88f3..1f3175b156 100644 --- a/src/smpi/colls/reduce_scatter-ompi.c +++ b/src/smpi/colls/reduce_scatter-ompi.c @@ -1,4 +1,9 @@ -/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* Copyright (c) 2013-2014. 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. */ + /* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology @@ -12,17 +17,13 @@ * All rights reserved. * Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2009 University of Houston. All rights reserved. - * $COPYRIGHT$ * * Additional copyrights may follow - * - * $HEADER$ */ #include "colls_private.h" #include "coll_tuned_topo.h" -#define MCA_COLL_BASE_TAG_REDUCE_SCATTER 222 /* * Recursive-halving function is (*mostly*) copied from the BASIC coll module. * I have removed the part which handles "large" message sizes @@ -60,6 +61,8 @@ smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(void *sbuf, size = smpi_comm_size(comm); XBT_DEBUG("coll:tuned:reduce_scatter_ompi_basic_recursivehalving, rank %d", rank); + if(!smpi_op_is_commute(op)) + THROWF(arg_error,0, " reduce_scatter ompi_basic_recursivehalving can only be used for commutative operations! "); /* Find displacements and the like */ disps = (int*) xbt_malloc(sizeof(int) * size); @@ -116,13 +119,13 @@ smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(void *sbuf, if (rank < 2 * remain) { if ((rank & 1) == 0) { smpi_mpi_send(result_buf, count, dtype, rank + 1, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, + COLL_TAG_REDUCE_SCATTER, comm); /* we don't participate from here on out */ tmp_rank = -1; } else { smpi_mpi_recv(recv_buf, count, dtype, rank - 1, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, + COLL_TAG_REDUCE_SCATTER, comm, MPI_STATUS_IGNORE); /* integrate their results into our temp results */ @@ -211,7 +214,7 @@ smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(void *sbuf, if (send_count > 0 && recv_count != 0) { request=smpi_mpi_irecv(recv_buf + (ptrdiff_t)tmp_disps[recv_index] * extent, recv_count, dtype, peer, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, + COLL_TAG_REDUCE_SCATTER, comm); if (MPI_SUCCESS != err) { xbt_free(tmp_rcounts); @@ -222,7 +225,7 @@ smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(void *sbuf, if (recv_count > 0 && send_count != 0) { smpi_mpi_send(result_buf + (ptrdiff_t)tmp_disps[send_index] * extent, send_count, dtype, peer, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, + COLL_TAG_REDUCE_SCATTER, comm); if (MPI_SUCCESS != err) { xbt_free(tmp_rcounts); @@ -271,14 +274,14 @@ smpi_coll_tuned_reduce_scatter_ompi_basic_recursivehalving(void *sbuf, if ((rank & 1) == 0) { if (rcounts[rank]) { smpi_mpi_recv(rbuf, rcounts[rank], dtype, rank + 1, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, + COLL_TAG_REDUCE_SCATTER, comm, MPI_STATUS_IGNORE); } } else { if (rcounts[rank - 1]) { smpi_mpi_send(result_buf + disps[rank - 1] * extent, rcounts[rank - 1], dtype, rank - 1, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, + COLL_TAG_REDUCE_SCATTER, comm); } } @@ -367,7 +370,6 @@ smpi_coll_tuned_reduce_scatter_ompi_ring(void *sbuf, void *rbuf, int *rcounts, char *inbuf_free[2] = {NULL, NULL}, *inbuf[2] = {NULL, NULL}; ptrdiff_t true_lb, true_extent, lb, extent, max_real_segsize; MPI_Request reqs[2] = {NULL, NULL}; - size_t typelng; size = smpi_comm_size(comm); rank = smpi_comm_rank(comm); @@ -406,7 +408,6 @@ smpi_coll_tuned_reduce_scatter_ompi_ring(void *sbuf, void *rbuf, int *rcounts, */ smpi_datatype_extent(dtype, &lb, &extent); smpi_datatype_extent(dtype, &true_lb, &true_extent); - typelng = smpi_datatype_size(dtype); max_real_segsize = true_extent + (ptrdiff_t)(max_block_count - 1) * extent; @@ -454,11 +455,11 @@ smpi_coll_tuned_reduce_scatter_ompi_ring(void *sbuf, void *rbuf, int *rcounts, inbi = 0; /* Initialize first receive from the neighbor on the left */ reqs[inbi]=smpi_mpi_irecv(inbuf[inbi], max_block_count, dtype, recv_from, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, comm + COLL_TAG_REDUCE_SCATTER, comm ); tmpsend = accumbuf + (ptrdiff_t)displs[recv_from] * extent; smpi_mpi_send(tmpsend, rcounts[recv_from], dtype, send_to, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, + COLL_TAG_REDUCE_SCATTER, comm); for (k = 2; k < size; k++) { @@ -468,7 +469,7 @@ smpi_coll_tuned_reduce_scatter_ompi_ring(void *sbuf, void *rbuf, int *rcounts, /* Post irecv for the current block */ reqs[inbi]=smpi_mpi_irecv(inbuf[inbi], max_block_count, dtype, recv_from, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, comm + COLL_TAG_REDUCE_SCATTER, comm ); /* Wait on previous block to arrive */ @@ -482,7 +483,7 @@ smpi_coll_tuned_reduce_scatter_ompi_ring(void *sbuf, void *rbuf, int *rcounts, /* send previous block to send_to */ smpi_mpi_send(tmprecv, rcounts[prevblock], dtype, send_to, - MCA_COLL_BASE_TAG_REDUCE_SCATTER, + COLL_TAG_REDUCE_SCATTER, comm); }