Skip to content
Snippets Groups Projects
Commit 3d6ca051 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add preliminary generic messaging

Begin some tests with int and CellType. Must provide a mechanism to convert/view
none POD Arrays as simple types
parent d1ef68c9
No related branches found
No related tags found
1 merge request!11Feature/mpi
......@@ -114,28 +114,35 @@ _broadcast(Array<int>& array, int root_rank) const
return array;
}
template <typename DataType>
void Messenger::
_exchange(const std::vector<Array<const int>>& sent_array_list,
std::vector<Array<int>>& recv_array_list) const
_exchange(const std::vector<Array<DataType>>& sent_array_list,
std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const
{
#ifdef PASTIS_HAS_MPI
std::vector<MPI_Request> request_list;
MPI_Datatype type = [&] () -> MPI_Datatype {
if constexpr (std::is_same_v<int,std::remove_const_t<DataType>>) {
return MPI_INT;
} else if constexpr (std::is_same_v<CellType,std::remove_const_t<DataType>>) {
return MPI_SHORT;
}
} ();
for (size_t i_send=0; i_send<sent_array_list.size(); ++i_send) {
const Array<const int> sent_array = sent_array_list[i_send];
const Array<DataType> sent_array = sent_array_list[i_send];
if (sent_array.size()>0) {
MPI_Request request;
MPI_Isend(&(sent_array[0]), sent_array.size(), MPI_INT, i_send, 0, MPI_COMM_WORLD, &request);
MPI_Isend(&(sent_array[0]), sent_array.size(), type, i_send, 0, MPI_COMM_WORLD, &request);
request_list.push_back(request);
}
}
for (size_t i_recv=0; i_recv<recv_array_list.size(); ++i_recv) {
Array<int> recv_array = recv_array_list[i_recv];
Array<std::remove_const_t<DataType>> recv_array = recv_array_list[i_recv];
if (recv_array.size()>0) {
MPI_Request request;
MPI_Irecv(&(recv_array[0]), recv_array.size(), MPI_INT, i_recv, 0, MPI_COMM_WORLD, &request);
MPI_Irecv(&(recv_array[0]), recv_array.size(), type, i_recv, 0, MPI_COMM_WORLD, &request);
request_list.push_back(request);
}
}
......@@ -152,10 +159,16 @@ _exchange(const std::vector<Array<const int>>& sent_array_list,
#endif // PASTIS_HAS_MPI
}
void Messenger::
_exchange(const std::vector<Array<int>>& sent_array_list,
std::vector<Array<int>>& recv_array_list) const
{
std::cerr << "NIY\n";
std::exit(1);
}
template
void Messenger::_exchange(const std::vector<Array<int>>& sent_array_list,
std::vector<Array<int>>& recv_array_list) const;
template
void Messenger::_exchange(const std::vector<Array<const int>>& sent_array_list,
std::vector<Array<int>>& recv_array_list) const;
template
void Messenger::_exchange(const std::vector<Array<CellType>>& sent_array_list,
std::vector<Array<CellType>>& recv_array_list) const;
template
void Messenger::_exchange(const std::vector<Array<const CellType>>& sent_array_list,
std::vector<Array<CellType>>& recv_array_list) const;
......@@ -6,6 +6,9 @@
#include <Array.hpp>
#warning REMOVE
enum class CellType : unsigned short;
class Messenger
{
private:
......@@ -21,10 +24,10 @@ class Messenger
Array<int> _broadcast(Array<int>& array, int root_rank) const;
Array<int> _allToAll(const Array<int>& sent_array, Array<int>& recv_array) const;
void _exchange(const std::vector<Array<const int>>& sent_array_list,
std::vector<Array<int>>& recv_array_list) const;
void _exchange(const std::vector<Array<int>>& sent_array_list,
std::vector<Array<int>>& recv_array_list) const;
template <typename DataType>
void _exchange(const std::vector<Array<DataType>>& sent_array_list,
std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const;
public:
static void create(int& argc, char* argv[]);
static void destroy();
......@@ -112,6 +115,8 @@ class Messenger
if constexpr(std::is_same<RecvDataType, int>()) {
_exchange(sent_array_list, recv_array_list);
} else if constexpr(std::is_same<RecvDataType, CellType>()) {
_exchange(sent_array_list, recv_array_list);
} else {
static_assert(std::is_same<RecvDataType, int>(), "unexpected type of data");
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment