71 m_recv_index.resize(nb_rank + 1);
73 for (
Int32 r = 0; r < nb_rank; ++r)
74 m_recv_index[r + 1] = m_recv_index[r] + recv_count[r];
75 m_recv.resize(m_recv_index[nb_rank]);
78 for (
Int32 r = 0; r < nb_rank; ++r)
79 send_index[r + 1] = send_index[r] + send_count[r];
81 m_send_count.resize(nb_rank);
82 m_send_index.resize(nb_rank);
83 m_recv_count.resize(nb_rank);
84 m_recv_index32.resize(nb_rank);
87 for (
Int32 r = 0; r < nb_rank; ++r) {
88 m_send_count[r] = CheckedConvert::toInt32(send_count[r]);
89 m_send_index[r] = CheckedConvert::toInt32(send_index[r]);
90 m_recv_count[r] = CheckedConvert::toInt32(recv_count[r]);
91 m_recv_index32[r] = CheckedConvert::toInt32(m_recv_index[r]);
94 m_request = nbc->allToAllVariable(send, m_send_count, m_send_index, m_recv, m_recv_count, m_recv_index32);
98 pm->allToAllVariable(send, m_send_count, m_send_index, m_recv, m_recv_count, m_recv_index32);
106 for (
Int64 k = 0; k < nb_round; ++k) {
109 for (
Int32 r = 0; r < nb_rank; ++r) {
110 const Int64 slo = send_count[r] * k / nb_round;
111 const Int64 shi = send_count[r] * (k + 1) / nb_round;
112 m_send_count[r] = CheckedConvert::toInt32(shi - slo);
114 s += m_send_count[r];
115 const Int64 rlo = recv_count[r] * k / nb_round;
116 const Int64 rhi = recv_count[r] * (k + 1) / nb_round;
117 m_recv_count[r] = CheckedConvert::toInt32(rhi - rlo);
118 m_recv_index32[r] = t;
119 t += m_recv_count[r];
122 for (
Int32 r = 0; r < nb_rank; ++r) {
123 const Int64 slo = send_index[r] + send_count[r] * k / nb_round;
124 for (
Int32 z = 0; z < m_send_count[r]; ++z)
125 sbuf[m_send_index[r] + z] = send.
data()[slo + z];
128 pm->allToAllVariable(sbuf, m_send_count, m_send_index, rbuf, m_recv_count, m_recv_index32);
129 for (
Int32 r = 0; r < nb_rank; ++r) {
130 const Int64 rlo = m_recv_index[r] + recv_count[r] * k / nb_round;
131 for (
Int32 z = 0; z < m_recv_count[r]; ++z)
132 m_recv[rlo + z] = rbuf[m_recv_index32[r] + z];
constexpr __host__ __device__ Span< T, DynExtent > subSpan(Int64 abegin, Int64 asize) const
Sub-view starting from element abegin and containing asize elements.
void start(IParallelMng *pm, ConstArrayView< Int64 > send, ConstArrayView< Int64 > send_count, ConstArrayView< Int64 > recv_count, Int64 nb_round)
Posts the exchange of send, send_count[r] Int64 for rank r.
static Int64 exchangeCounts(IParallelMng *pm, ConstArrayView< Int64 > send_count, Array< Int64 > &recv_count)
Exchanges the counts, per rank, of what an exchange will bring.