-/* 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
#include "../colls_private.hpp"
-namespace simgrid{
-namespace smpi{
-int
-Coll_allreduce_ompi_ring_segmented::allreduce(void *sbuf, void *rbuf, int count,
- MPI_Datatype dtype,
- MPI_Op op,
- MPI_Comm comm)
+namespace simgrid {
+namespace smpi {
+int allreduce__ompi_ring_segmented(const void *sbuf, void *rbuf, int count,
+ MPI_Datatype dtype,
+ MPI_Op op,
+ MPI_Comm comm)
{
int ret = MPI_SUCCESS;
int line;
unsigned int inbi;
size_t typelng;
char *tmpsend = NULL, *tmprecv = NULL;
- char *inbuf[2] = {NULL, NULL};
+ unsigned char* inbuf[2] = {nullptr, nullptr};
ptrdiff_t true_extent, extent;
ptrdiff_t block_offset, max_real_segsize;
MPI_Request reqs[2] = {NULL, NULL};
/* Special case for count less than size * segcount - use regular ring */
if (count < size * segcount) {
XBT_DEBUG( "coll:tuned:allreduce_ring_segmented rank %d/%d, count %d, switching to regular ring", rank, size, count);
- return (Coll_allreduce_lr::allreduce(sbuf, rbuf, count, dtype, op,
- comm));
+ return (allreduce__lr(sbuf, rbuf, count, dtype, op, comm));
}
/* Determine the number of phases of the algorithm */
max_real_segsize = true_extent + (max_segcount - 1) * extent;
/* Allocate and initialize temporary buffers */
- inbuf[0] = (char*)smpi_get_tmp_sendbuffer(max_real_segsize);
+ inbuf[0] = smpi_get_tmp_sendbuffer(max_real_segsize);
if (NULL == inbuf[0]) { ret = -1; line = __LINE__; goto error_hndl; }
if (size > 2) {
- inbuf[1] = (char*)smpi_get_tmp_recvbuffer(max_real_segsize);
- if (NULL == inbuf[1]) { ret = -1; line = __LINE__; goto error_hndl; }
+ inbuf[1] = smpi_get_tmp_recvbuffer(max_real_segsize);
+ if (nullptr == inbuf[1]) {
+ ret = -1;
+ line = __LINE__;
+ goto error_hndl;
+ }
}
/* Handle MPI_IN_PLACE */
- wait on block (r + 1)
- compute on block (r + 1)
- send block (r + 1) to rank (r + 1)
- Note that we must be careful when computing the begining of buffers and
+ Note that we must be careful when computing the beginning of buffers and
for send operations and computation we must compute the exact block size.
*/
send_to = (rank + 1) % size;
}
- if (NULL != inbuf[0]) smpi_free_tmp_buffer(inbuf[0]);
- if (NULL != inbuf[1]) smpi_free_tmp_buffer(inbuf[1]);
+ smpi_free_tmp_buffer(inbuf[0]);
+ smpi_free_tmp_buffer(inbuf[1]);
return MPI_SUCCESS;
error_hndl:
XBT_DEBUG("%s:%4d\tRank %d Error occurred %d\n",
__FILE__, line, rank, ret);
- if (NULL != inbuf[0]) smpi_free_tmp_buffer(inbuf[0]);
- if (NULL != inbuf[1]) smpi_free_tmp_buffer(inbuf[1]);
+ smpi_free_tmp_buffer(inbuf[0]);
+ smpi_free_tmp_buffer(inbuf[1]);
return ret;
}
}