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

Begin synchronization optimizations

Quite crappy but at least do not rebuild exchange info for each synchronization
parent b78a82cd
No related branches found
No related tags found
1 merge request!11Feature/mpi
......@@ -8,6 +8,51 @@
class ItemValueSynchronizer
{
template <ItemType item_type>
using ExchangeItemTypeInfo = std::vector<Array<const ItemIdT<item_type>>>;
ExchangeItemTypeInfo<ItemType::cell> m_requested_cell_info;
ExchangeItemTypeInfo<ItemType::cell> m_provided_cell_info;
ExchangeItemTypeInfo<ItemType::face> m_requested_face_info;
ExchangeItemTypeInfo<ItemType::face> m_provided_face_info;
ExchangeItemTypeInfo<ItemType::edge> m_requested_edge_info;
ExchangeItemTypeInfo<ItemType::edge> m_provided_edge_info;
ExchangeItemTypeInfo<ItemType::node> m_requested_node_info;
ExchangeItemTypeInfo<ItemType::node> m_provided_node_info;
template <ItemType item_type>
PASTIS_INLINE
constexpr auto& _getRequestedItemInfo()
{
if constexpr (item_type == ItemType::cell) {
return m_requested_cell_info;
} else if constexpr (item_type == ItemType::face) {
return m_requested_face_info;
} else if constexpr (item_type == ItemType::edge) {
return m_requested_edge_info;
} else if constexpr (item_type == ItemType::node) {
return m_requested_node_info;
}
}
template <ItemType item_type>
PASTIS_INLINE
constexpr auto& _getProvidedItemInfo()
{
if constexpr (item_type == ItemType::cell) {
return m_provided_cell_info;
} else if constexpr (item_type == ItemType::face) {
return m_provided_face_info;
} else if constexpr (item_type == ItemType::edge) {
return m_provided_edge_info;
} else if constexpr (item_type == ItemType::node) {
return m_provided_node_info;
}
}
template <typename ConnectivityType,
typename DataType,
ItemType item_type,
......@@ -23,7 +68,14 @@ class ItemValueSynchronizer
const auto& item_owner = connectivity.template owner<item_type>();
std::vector<Array<const ItemId>> ghost_items_per_proc
auto& ghost_items_per_proc = this->_getRequestedItemInfo<item_type>();
auto& to_send_item_id_list_by_proc = this->_getProvidedItemInfo<item_type>();
Assert(ghost_items_per_proc.size() == to_send_item_id_list_by_proc.size());
if (ghost_items_per_proc.size() == 0) {
pout() << "... building synchronization info\n";
ghost_items_per_proc
= [&] () {
std::vector<std::vector<ItemId>> ghost_items_vector_per_proc(parallel::size());
for (ItemId item_id=0; item_id<item_value.size(); ++item_id) {
......@@ -70,6 +122,8 @@ class ItemValueSynchronizer
item_number_to_id_correspondance[item_number[item_id]] = item_id;
}
to_send_item_id_list_by_proc
= [&] () {
std::vector<Array<const ItemId>> to_send_item_id_list_by_proc(parallel::size());
for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
Array<ItemId> to_send_item_id{local_number_of_values_to_send[i_rank]};
......@@ -79,11 +133,14 @@ class ItemValueSynchronizer
}
to_send_item_id_list_by_proc[i_rank] = to_send_item_id;
}
return to_send_item_id_list_by_proc;
} ();
}
std::vector<Array<const DataType>> to_send_data_by_proc(parallel::size());
for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
Array<DataType> to_send_data{local_number_of_values_to_send[i_rank]};
const Array<const ItemId>& to_send_item_id = to_send_item_id_list_by_proc[i_rank];
Array<DataType> to_send_data{to_send_item_id.size()};
parallel_for(to_send_item_id.size(), PASTIS_LAMBDA(size_t i) {
to_send_data[i] = item_value[to_send_item_id[i]];
});
......@@ -115,9 +172,6 @@ class ItemValueSynchronizer
PASTIS_INLINE
void synchronize(ItemValue<DataType, item_type, ConnectivityPtr>& item_value)
{
static int cpt=0;
pout() << "Calling synchronize(" << cpt++ << ")...\n";
Assert(item_value.connectivity_ptr().use_count()>0, "No connectivity is associated to this ItemValue");
const IConnectivity& connectivity = *item_value.connectivity_ptr();
......
......@@ -300,7 +300,7 @@ void synchronize(ItemValue<DataType, item_type, ConnectivityPtr>& item_value)
{
static_assert(not std::is_const_v<DataType>, "cannot synchronize ItemValue of const data");
if (parallel::size() > 1) {
ItemValueSynchronizer synchronizer;
static ItemValueSynchronizer synchronizer;
synchronizer.synchronize(item_value);
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment