| 182 | AA_POW2_MERGE, |
| 183 | }; |
| 184 | static int AllToAll(TMergePlan* plan, int iter, int sl, EAllToAllMode mode, const TVector<int>& myGroup, TVector<TCoverInterval>* cover) { |
| 185 | TVector<TCoverInterval>& hostCoverage = *cover; |
| 186 | int groupSize = myGroup.ysize(); |
| 187 | |
| 188 | for (int k = 1; k < groupSize; ++k) { |
| 189 | int h1 = myGroup[k - 1]; |
| 190 | int h2 = myGroup[k]; |
| 191 | Y_ABORT_UNLESS(hostCoverage[h1].Fin == hostCoverage[h2].Beg, "Invalid host order in CreateGroupMerge()"); |
| 192 | } |
| 193 | |
| 194 | switch (mode) { |
| 195 | case AA_POW2: { |
| 196 | for (int delta = 1; delta < groupSize; delta *= 2) { |
| 197 | int sz = Min(delta, groupSize - delta); |
| 198 | for (int offset = 0; offset < groupSize; ++offset) { |
| 199 | int srcRank = myGroup[offset]; |
| 200 | int dstRank = myGroup[(offset + delta) % groupSize]; |
| 201 | |
| 202 | int start = offset + 1 - sz; |
| 203 | int finish = offset + 1; |
| 204 | if (start < 0) { |
| 205 | // [start; myGroup.size()) |
| 206 | int dataBeg = hostCoverage[myGroup[start + groupSize]].Beg; |
| 207 | int dataFin = hostCoverage[myGroup.back()].Fin; |
| 208 | plan->Transfer(iter, srcRank, dstRank, sl, dataBeg, dataFin); |
| 209 | // [0; finish) |
| 210 | dataBeg = hostCoverage[myGroup[0]].Beg; |
| 211 | dataFin = hostCoverage[myGroup[finish - 1]].Fin; |
| 212 | plan->Transfer(iter, srcRank, dstRank, sl, dataBeg, dataFin); |
| 213 | } else { |
| 214 | // [start;finish) |
| 215 | int dataBeg = hostCoverage[myGroup[start]].Beg; |
| 216 | int dataFin = hostCoverage[myGroup[finish - 1]].Fin; |
| 217 | plan->Transfer(iter, srcRank, dstRank, sl, dataBeg, dataFin); |
| 218 | } |
| 219 | } |
| 220 | ++iter; |
| 221 | } |
| 222 | } break; |
| 223 | case AA_CIRCLE: { |
| 224 | for (int dataDelta = 1; dataDelta < groupSize; ++dataDelta) { |
| 225 | for (int offset = 0; offset < groupSize; ++offset) { |
| 226 | int srcRank = myGroup[offset]; |
| 227 | int dstRank = myGroup[(offset + 1) % groupSize]; |
| 228 | |
| 229 | int dataRank = myGroup[(offset + 1 - dataDelta + groupSize) % groupSize]; |
| 230 | int dataBeg = hostCoverage[dataRank].Beg; |
| 231 | int dataFin = hostCoverage[dataRank].Fin; |
| 232 | |
| 233 | plan->Transfer(iter, srcRank, dstRank, sl, dataBeg, dataFin); |
| 234 | } |
| 235 | ++iter; |
| 236 | } |
| 237 | } break; |
| 238 | case AA_STAR: { |
| 239 | for (int offset = 0; offset < groupSize; ++offset) { |
| 240 | for (int delta = 1; delta < groupSize; ++delta) { |
| 241 | int srcRank = myGroup[offset]; |
no test coverage detected