-/* Copyright (c) 2013-2017. The SimGrid Team.
+/* Copyright (c) 2013-2023. 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"
+#include "../colls_private.hpp"
-/* IMPLEMENTED BY PITCH PATARASUK
- Non-topoloty-specific all-reduce operation designed bandwidth optimally
+/* IMPLEMENTED BY PITCH PATARASUK
+ Non-topology-specific all-reduce operation designed bandwidth optimally
Bug fixing by Xin Yuan, 04/04/2008
*/
*/
//#include <star-reduction.c>
-namespace simgrid{
-namespace smpi{
-int
-Coll_allreduce_lr::allreduce(void *sbuf, void *rbuf, int rcount,
- MPI_Datatype dtype, MPI_Op op, MPI_Comm comm)
+namespace simgrid::smpi {
+int allreduce__lr(const void *sbuf, void *rbuf, int rcount,
+ MPI_Datatype dtype, MPI_Op op, MPI_Comm comm)
{
int tag = COLL_TAG_ALLREDUCE;
MPI_Status status;
MPI_Aint extent;
extent = dtype->get_extent();
- /* when communication size is smaller than number of process (not support) */
if (rcount < size) {
- XBT_WARN("MPI_allreduce_lr use default MPI_allreduce.");
- Coll_allreduce_default::allreduce(sbuf, rbuf, rcount, dtype, op, comm);
- return MPI_SUCCESS;
+ XBT_INFO("MPI_allreduce_lr: communication size smaller than number of process, use default MPI_allreduce.");
+ allreduce__redbcast(sbuf, rbuf, rcount, dtype, op, comm);
+ return MPI_SUCCESS;
}
- /* when communication size is not divisible by number of process:
+ /* when communication size is not divisible by number of process:
call the native implementation for the remain chunk at the end of the operation */
if (rcount % size != 0) {
remainder = rcount % size;
/* our ALL-REDUCE implementation
1. copy (partial of)send_buf to recv_buf
2. use logical ring reduce-scatter
- 3. use logical ring all-gather
+ 3. use logical ring all-gather
*/
// copy partial data
((rank + size - 1) % size), tag + i, comm, &status);
}
- /* when communication size is not divisible by number of process:
+ /* when communication size is not divisible by number of process:
call the native implementation for the remain chunk at the end of the operation */
if (remainder_flag) {
- return Colls::allreduce((char *) sbuf + remainder_offset,
- (char *) rbuf + remainder_offset, remainder, dtype, op,
- comm);
+ return colls::allreduce((char*)sbuf + remainder_offset, (char*)rbuf + remainder_offset, remainder, dtype, op, comm);
}
return 0;
}
-}
-}
+} // namespace simgrid::smpi