-/* 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
* Additional copyrights may follow
*/
-#include "../colls_private.h"
-#include "../coll_tuned_topo.h"
+#include "../coll_tuned_topo.hpp"
+#include "../colls_private.hpp"
namespace simgrid{
namespace smpi{
-int smpi_coll_tuned_ompi_reduce_generic( void* sendbuf, void* recvbuf, int original_count,
+int smpi_coll_tuned_ompi_reduce_generic(const void* sendbuf, void* recvbuf, int original_count,
MPI_Datatype datatype, MPI_Op op,
int root, MPI_Comm comm,
ompi_coll_tree_t* tree, int count_by_segment,
* for the first block: thus we must copy sendbuf to accumbuf on intermediate
* to keep the optimized loop happy.
*/
-int smpi_coll_tuned_ompi_reduce_generic( void* sendbuf, void* recvbuf, int original_count,
+int smpi_coll_tuned_ompi_reduce_generic(const void* sendbuf, void* recvbuf, int original_count,
MPI_Datatype datatype, MPI_Op op,
int root, MPI_Comm comm,
ompi_coll_tree_t* tree, int count_by_segment,
sendtmpbuf = (char *)recvbuf;
}
- XBT_DEBUG( "coll:tuned:reduce_generic count %d, msg size %ld, segsize %ld, max_requests %d", original_count, (unsigned long)(num_segments * segment_increment), (unsigned long)segment_increment, max_outstanding_reqs);
+ XBT_DEBUG("coll:tuned:reduce_generic count %d, msg size %lu, segsize %lu, max_requests %d", original_count,
+ (unsigned long)(num_segments * segment_increment), (unsigned long)segment_increment,
+ max_outstanding_reqs);
rank = comm->rank();
else {
int creq = 0;
- MPI_Request* sreq = NULL;
-
- sreq = (MPI_Request*) calloc( max_outstanding_reqs,
- sizeof(MPI_Request ) );
+ MPI_Request* sreq = new (std::nothrow) MPI_Request[max_outstanding_reqs];
if (NULL == sreq) { line = __LINE__; ret = -1; goto error_hndl; }
/* post first group of requests */
MPI_STATUSES_IGNORE );
/* free requests */
- free(sreq);
+ delete[] sreq;
}
}
- free(tree);
+ ompi_coll_tuned_topo_destroy_tree(&tree);
return MPI_SUCCESS;
error_hndl: /* error handler */
XBT_DEBUG("ERROR_HNDL: node %d file %s line %d error %d\n",
rank, __FILE__, line, ret );
- if( inbuf_free[0] != NULL ) free(inbuf_free[0]);
- if( inbuf_free[1] != NULL ) free(inbuf_free[1]);
- if( accumbuf_free != NULL ) free(accumbuf);
+ smpi_free_tmp_buffer(inbuf_free[0]);
+ smpi_free_tmp_buffer(inbuf_free[1]);
+ smpi_free_tmp_buffer(accumbuf);
return ret;
}
*/
-int Coll_reduce_ompi_chain::reduce( void *sendbuf, void *recvbuf, int count,
+int Coll_reduce_ompi_chain::reduce(const void *sendbuf, void *recvbuf, int count,
MPI_Datatype datatype,
MPI_Op op, int root,
MPI_Comm comm
size_t typelng;
int fanout = comm->size()/2;
- XBT_DEBUG("coll:tuned:reduce_intra_chain rank %d fo %d ss %5d", comm->rank(), fanout, segsize);
+ XBT_DEBUG("coll:tuned:reduce_intra_chain rank %d fo %d ss %5u", comm->rank(), fanout, segsize);
/**
* Determine number of segments and number of elements
}
-int Coll_reduce_ompi_pipeline::reduce( void *sendbuf, void *recvbuf,
+int Coll_reduce_ompi_pipeline::reduce(const void *sendbuf, void *recvbuf,
int count, MPI_Datatype datatype,
MPI_Op op, int root,
MPI_Comm comm )
segsize = 64*1024;
}
- XBT_DEBUG("coll:tuned:reduce_intra_pipeline rank %d ss %5d",
- comm->rank(), segsize);
+ XBT_DEBUG("coll:tuned:reduce_intra_pipeline rank %d ss %5u", comm->rank(), segsize);
COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount );
segcount, 0);
}
-int Coll_reduce_ompi_binary::reduce( void *sendbuf, void *recvbuf,
+int Coll_reduce_ompi_binary::reduce(const void *sendbuf, void *recvbuf,
int count, MPI_Datatype datatype,
MPI_Op op, int root,
MPI_Comm comm)
// Binary_32K
segsize = 32*1024;
- XBT_DEBUG("coll:tuned:reduce_intra_binary rank %d ss %5d",
- comm->rank(), segsize);
+ XBT_DEBUG("coll:tuned:reduce_intra_binary rank %d ss %5u", comm->rank(), segsize);
COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount );
segcount, 0);
}
-int Coll_reduce_ompi_binomial::reduce( void *sendbuf, void *recvbuf,
+int Coll_reduce_ompi_binomial::reduce(const void *sendbuf, void *recvbuf,
int count, MPI_Datatype datatype,
MPI_Op op, int root,
MPI_Comm comm)
segsize = 1024;
}
- XBT_DEBUG("coll:tuned:reduce_intra_binomial rank %d ss %5d",
- comm->rank(), segsize);
+ XBT_DEBUG("coll:tuned:reduce_intra_binomial rank %d ss %5u", comm->rank(), segsize);
COLL_TUNED_COMPUTED_SEGCOUNT( segsize, typelng, segcount );
return smpi_coll_tuned_ompi_reduce_generic( sendbuf, recvbuf, count, datatype,
* Acecpts: same as MPI_Reduce()
* Returns: MPI_SUCCESS or error code
*/
-int Coll_reduce_ompi_in_order_binary::reduce( void *sendbuf, void *recvbuf,
+int Coll_reduce_ompi_in_order_binary::reduce(const void *sendbuf, void *recvbuf,
int count,
MPI_Datatype datatype,
MPI_Op op, int root,
int ret;
int rank, size, io_root;
int segcount = count;
- void *use_this_sendbuf = NULL, *use_this_recvbuf = NULL;
size_t typelng;
rank = comm->rank();
size = comm->size();
- XBT_DEBUG("coll:tuned:reduce_intra_in_order_binary rank %d ss %5d",
- rank, segsize);
+ XBT_DEBUG("coll:tuned:reduce_intra_in_order_binary rank %d ss %5u", rank, segsize);
/**
* Determine number of segments and number of elements
operations for non-commutative ops.
*/
io_root = size - 1;
- use_this_sendbuf = sendbuf;
- use_this_recvbuf = recvbuf;
+ const void* use_this_sendbuf = sendbuf;
+ void* use_this_recvbuf = recvbuf;
+ void* tmp_sendbuf = nullptr;
+ void* tmp_recvbuf = nullptr;
if (io_root != root) {
ptrdiff_t text, ext;
- char *tmpbuf = NULL;
ext=datatype->get_extent();
text=datatype->get_extent();
if ((root == rank) && (MPI_IN_PLACE == sendbuf)) {
- tmpbuf = (char *) smpi_get_tmp_sendbuffer(text + (count - 1) * ext);
- if (NULL == tmpbuf) {
- return MPI_ERR_INTERN;
- }
- Datatype::copy (
- (char*)recvbuf, count, datatype,
- (char*)tmpbuf, count, datatype);
- use_this_sendbuf = tmpbuf;
+ tmp_sendbuf = smpi_get_tmp_sendbuffer(text + (count - 1) * ext);
+ if (NULL == tmp_sendbuf) {
+ return MPI_ERR_INTERN;
+ }
+ Datatype::copy(recvbuf, count, datatype, tmp_sendbuf, count, datatype);
+ use_this_sendbuf = tmp_sendbuf;
} else if (io_root == rank) {
- tmpbuf = (char *) smpi_get_tmp_recvbuffer(text + (count - 1) * ext);
- if (NULL == tmpbuf) {
- return MPI_ERR_INTERN;
- }
- use_this_recvbuf = tmpbuf;
+ tmp_recvbuf = smpi_get_tmp_recvbuffer(text + (count - 1) * ext);
+ if (NULL == tmp_recvbuf) {
+ return MPI_ERR_INTERN;
+ }
+ use_this_recvbuf = tmp_recvbuf;
}
}
COLL_TAG_REDUCE, comm,
MPI_STATUS_IGNORE);
if (MPI_IN_PLACE == sendbuf) {
- smpi_free_tmp_buffer(use_this_sendbuf);
+ smpi_free_tmp_buffer(tmp_sendbuf);
}
} else if (io_root == rank) {
Request::send(use_this_recvbuf, count, datatype, root,
COLL_TAG_REDUCE,
comm);
- smpi_free_tmp_buffer(use_this_recvbuf);
+ smpi_free_tmp_buffer(tmp_recvbuf);
}
}
*/
int
-Coll_reduce_ompi_basic_linear::reduce(void *sbuf, void *rbuf, int count,
+Coll_reduce_ompi_basic_linear::reduce(const void *sbuf, void *rbuf, int count,
MPI_Datatype dtype,
MPI_Op op,
int root,