-/* Copyright (c) 2011-2017. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2011-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.hpp"
#include "smpi_status.hpp"
-namespace simgrid{
-namespace smpi{
+namespace simgrid::smpi {
static int scatter_for_bcast(
int root,
}
/* This process is responsible for all processes that have bits
- set from the LSB upto (but not including) mask. Because of
+ set from the LSB up to (but not including) mask. Because of
the "not including", we start by shifting mask back down
one. */
}
-int
-Coll_bcast_scatter_rdb_allgather::bcast (
+int bcast__scatter_rdb_allgather(
void *buffer,
int count,
MPI_Datatype datatype,
int relative_rank, mask;
int mpi_errno = MPI_SUCCESS;
int scatter_size, curr_size, recv_size = 0;
- int j, k, i, tmp_mask, is_contig, is_homogeneous;
+ int j, k, i, tmp_mask;
+ bool is_contig, is_homogeneous;
MPI_Aint type_size = 0, nbytes = 0;
int relative_dst, dst_tree_root, my_tree_root, send_offset;
int recv_offset, tree_root, nprocs_completed, offset;
if (comm_size == 1) goto fn_exit;
//if (HANDLE_GET_KIND(datatype) == HANDLE_KIND_BUILTIN)
- if(datatype->flags() & DT_FLAG_CONTIGUOUS)
- is_contig = 1;
- else {
- is_contig = 0;
- }
+ is_contig = ((datatype->flags() & DT_FLAG_CONTIGUOUS) != 0);
- is_homogeneous = 1;
+ is_homogeneous = true;
/* MPI_Type_size() might not give the accurate size of the packed
* datatype for heterogeneous systems (because of padding, encoding,
}
else
{
- tmp_buf=(void*)xbt_malloc(nbytes);
-
- /* TODO: Pipeline the packing and communication */
- position = 0;
- if (rank == root) {
- mpi_errno = datatype->pack(buffer, count, tmp_buf, nbytes,
- &position, comm);
- if (mpi_errno) xbt_die("crash while packing %d", mpi_errno);
- }
+ tmp_buf = new unsigned char[nbytes];
+
+ /* TODO: Pipeline the packing and communication */
+ position = 0;
+ if (rank == root) {
+ mpi_errno = datatype->pack(buffer, count, tmp_buf, nbytes, &position, comm);
+ xbt_assert(mpi_errno == 0, "crash while packing %d", mpi_errno);
+ }
}
mpi_errno = scatter_for_bcast(root, comm,
nbytes, tmp_buf);
- if (mpi_errno) {
- xbt_die("crash while scattering %d", mpi_errno);
- }
+ xbt_assert(mpi_errno == 0, "crash while scattering %d", mpi_errno);
/* curr_size is the amount of data that this process now has stored in
* buffer at byte offset (relative_rank*scatter_size) */
/* check that we received as much as we expected */
/* recvd_size may not be accurate for packed heterogeneous data */
- if (is_homogeneous && curr_size != nbytes) {
- xbt_die("we didn't receive enough !");
- }
+ xbt_assert(not is_homogeneous || curr_size == nbytes, "we didn't receive enough !");
if (not is_contig || not is_homogeneous) {
if (rank != root) {
position = 0;
mpi_errno = MPI_Unpack(tmp_buf, nbytes, &position, buffer, count, datatype, comm);
- if (mpi_errno)
- xbt_die("error when unpacking %d", mpi_errno);
+ xbt_assert(mpi_errno == 0, "error when unpacking %d", mpi_errno);
}
}
fn_exit:
-/* xbt_free(tmp_buf);*/
- return mpi_errno;
+ /* delete[] static_cast<unsigned char*>(tmp_buf); */
+ return mpi_errno;
}
-}
-}
+} // namespace simgrid::smpi