18#include "DoKDistributorComm.h"
20#include <alien/kernels/redistributor/RedistributorCommPlan.h>
24using namespace Arccore;
27: m_comm_plan(commPlan)
28, m_pm_super(m_comm_plan->superParallelMng())
29, m_pm_dst(m_comm_plan->tgtParallelMng().get())
32void DoKDistributorComm::computeCommPlan(
const Arccore::Span<Int32> base)
34 Int32 super_comm_size = m_pm_super->commSize();
38 ConstArrayView<Int32> tgt_dist = m_comm_plan->tgtDist();
41 auto size = base.size();
45 auto is_mine = [&](Int32 p, Int32 rowid) {
46 return (tgt_dist[p] <= rowid) && (rowid < tgt_dist[p + 1]);
49 m_snd_offset.resize(super_comm_size + 1);
50 m_snd_offset.fill(-1);
53 for (
auto row_id : base) {
54 while (p < super_comm_size
55 && (!is_mine(p, row_id))) {
61 for (
int p2 = p; p2 < super_comm_size; p2++) {
62 m_snd_offset[p2 + 1] = size;
65 UniqueArray<Int32> snd_count(super_comm_size);
66 Alien::RedistributionTools::computeCounts(m_snd_offset.constView(), snd_count.view());
67 m_rcv_offset.resize(super_comm_size + 1);
68 UniqueArray<Int32> rcv_count(super_comm_size);
70 Arccore::MessagePassing::mpAllToAll(m_pm_super, snd_count, rcv_count, 1);
73 for (p = 0; p < super_comm_size; ++p) {
74 m_rcv_offset[p + 1] = m_rcv_offset[p] + rcv_count[p];
83 size = rev_index->size();
87 UniqueArray<Int32> snd_rows(size, 0);
88 UniqueArray<Int32> snd_cols(size, 0);
90 for (IReverseIndexer::Offset offset = 0; offset < size; ++offset) {
91 auto ij = (*rev_index)[offset].value();
92 snd_rows[offset] = ij.first;
93 snd_cols[offset] = ij.second;
96 this->computeCommPlan(snd_rows);
99 m_rcv_rows.resize(m_rcv_offset[m_pm_super->commSize()]);
100 m_rcv_cols.resize(m_rcv_offset[m_pm_super->commSize()]);
102 Alien::RedistributionTools::exchange(m_pm_super, snd_rows.constView(),
103 m_snd_offset.constView(), m_rcv_rows.view(), m_rcv_offset.constView());
104 Alien::RedistributionTools::exchange(m_pm_super, snd_cols.constView(),
105 m_snd_offset.constView(), m_rcv_cols.view(), m_rcv_offset.constView());
DoKDistributorComm(const RedistributorCommPlan *commPlan)
Construct a DoKDistributorComm object over parallelMng:
Reverse indexer: associates an Index (i,j) to an offset.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --