67 if (topo->isMasterMachine()) {
71 Int32 machineRank = topo->machineRank();
74 m_targetRank = targetRanks[machineRank];
75 m_targetSize = targetRanks.
size();
77 if ((m_targetSize != m_pm_ini->commSize())
78 && (allow_only_one_rank || m_targetSize > 1)) {
80 m_pm_sub = m_pm_ini->createSubParallelMngRef(targetRanks);
85 m_targetRank = m_pm_ini->commRank();
86 m_targetSize = m_pm_ini->commSize();
88 for (
int i = 0; i < m_targetSize; i++)
90 m_pm_sub = m_pm_ini->createSubParallelMngRef(keptRanks);
93 m_pm_ini->traceMng()->info() <<
"Running on " << m_targetSize <<
" nodes";
97 void initWithMaxRank(
Int32 targetSize)
100 m_targetSize = targetSize;
103 m_contribute =
false;
108 if (m_pm_ini->
commRank() < targetSize) {
111 Int64 my_rank = m_pm_ini->
commRank();
112 Int64 x = my_rank * m_targetSize;
113 m_targetRank = CheckedConvert::toInt32(x / m_pm_ini->
commSize());
116 Int32 step = m_targetSize / m_pm_ini->
commSize();
117 step = (step == 0) ? 1 : step;
118 for (
int i = 0; i < m_targetSize; ++i) {
119 keepProc[i] = i * step;
122 m_pm_sub = m_pm_ini->createSubParallelMngRef(keepProc);
124 if (m_targetSize != m_pm_ini->commSize()) {
131 Int32 size()
const {
return m_targetSize; }
133 bool contribute()
const {
return m_contribute; }
136 template <
typename DataT>
137 SharedArray<DataT> convert(ConstArrayView<DataT> in, Array<DataT>* pattern =
nullptr,
138 bool is_indirection =
false)
const
143 SharedArray<DataT> out(in);
144 if (pattern != NULL) {
148 pattern->resize(size, m_targetRank);
152 ConstArrayView<DataT> toSnd;
155 if (is_indirection) {
156 toSnd = in.subView(0, in.size() - 1);
163 Int32 commSize = m_pm_ini->commSize();
164 UniqueArray<Int32> sndCnt(nInfos * commSize, -1);
165 UniqueArray<Parallel::Request> req;
166 UniqueArray<Int32> n_wanted(nInfos);
167 n_wanted[0] = m_targetRank;
168 n_wanted[1] = toSnd.size();
170 n_wanted[2] =
static_cast<Int32>(in[in.size() - 1]);
172 m_pm_ini->allGather(n_wanted, sndCnt);
174 UniqueArray<Int32> sndNbr(commSize, 0);
175 UniqueArray<Int32> rcvNbr(commSize, 0);
176 UniqueArray<Int32> sndDsp(commSize, 0);
177 UniqueArray<Int32> rcvDsp(commSize, 0);
179 sndNbr[m_targetRank] = toSnd.size();
181 if (pattern != NULL) {
185 Int32 myRank = m_pm_ini->commRank();
187 for (
int i = 0; i < commSize; ++i) {
188 if (sndCnt[nInfos * i] == myRank) {
189 rcvNbr[i] = sndCnt[nInfos * i + 1];
194 pattern->addRange(i, rcvNbr[i]);
197 if (contribute() && is_indirection)
199 SharedArray<DataT> out(begin, -1);
201 m_pm_ini->allToAllVariable(toSnd, sndNbr, sndDsp, out, rcvNbr, rcvDsp);
203 if (contribute() && is_indirection) {
205 DataT* my_iter = out.data();
206 for (
int i = 0; i < commSize; ++i) {
207 if (sndCnt[nInfos * i] == myRank) {
208 Int32 nRecv = sndCnt[nInfos * i + 1];
209 DataT* my_end(my_iter + nRecv);
210 for (; my_iter != my_end; ++my_iter)
211 (*my_iter) += offset;
212 offset += sndCnt[nInfos * i + 2];
215 out[out.size() - 1] = offset;
222 template <
typename DataT>
223 SharedArray<DataT> convertBack(ConstArrayView<DataT> in,
Int32 nRecv)
const
228 SharedArray<DataT> out(in);
233 Int32 commSize = m_pm_ini->commSize();
234 UniqueArray<Int32> sndCnt(nInfos * commSize, -1);
235 UniqueArray<Parallel::Request> req;
236 UniqueArray<Int32> n_wanted(nInfos);
237 n_wanted[0] = m_targetRank;
240 m_pm_ini->allGather(n_wanted, sndCnt);
242 UniqueArray<Int32> sndNbr(commSize, 0);
243 UniqueArray<Int32> rcvNbr(commSize, 0);
244 UniqueArray<Int32> sndDsp(commSize, 0);
245 UniqueArray<Int32> rcvDsp(commSize, 0);
247 rcvNbr[m_targetRank] = nRecv;
249 Int32 myRank = m_pm_ini->commRank();
251 for (
int i = 0; i < commSize; ++i) {
252 if (sndCnt[nInfos * i] == myRank) {
253 sndNbr[i] = sndCnt[nInfos * i + 1];
258 SharedArray<DataT> out(nRecv, -1);
260 m_pm_ini->allToAllVariable(in, sndNbr, sndDsp, out, rcvNbr, rcvDsp);
265 IParallelMng* subParallelMng()
const
267 IParallelMng* pm = m_pm_sub.get();
275 ARCANE_DEPRECATED_REASON(
"Y2024: This method is internal to Arcane. Use subParallelMng()->communicator() instead")
276 MPI_Comm getCommunicator()
const
279 return MPI_COMM_NULL;
280 Parallel::Communicator comm = m_pm_sub->communicator();
281 return (MPI_Comm)comm;
284 ARCANE_DEPRECATED_REASON(
"Y2024: This method is internal to Arcane. Use subParallelMng() instead")
285 IParallelMng* parallelManager()
const
287 return m_pm_sub.get();
292 IParallelMng* m_pm_ini =
nullptr;
293 Ref<IParallelMng> m_pm_sub;
294 Int32 m_targetSize = -1;
295 Int32 m_targetRank = -1;
297 bool m_contribute =
false;
298 bool m_is_init =
false;