| 759 | } |
| 760 | |
| 761 | void DFB::gatherFinalErrors() |
| 762 | { |
| 763 | using namespace mpicommon; |
| 764 | using namespace rkcommon; |
| 765 | |
| 766 | std::vector<int> tilesFromRank(workerSize(), 0); |
| 767 | const int myTileCount = tileIDs.size(); |
| 768 | gather(&myTileCount, |
| 769 | 1, |
| 770 | MPI_INT, |
| 771 | tilesFromRank.data(), |
| 772 | 1, |
| 773 | MPI_INT, |
| 774 | masterRank(), |
| 775 | mpiGroup.comm) |
| 776 | .wait(); |
| 777 | |
| 778 | std::vector<char> tileGatherResult; |
| 779 | std::vector<int> tileBytesExpected(workerSize(), 0); |
| 780 | std::vector<int> processOffsets(workerSize(), 0); |
| 781 | const size_t tileInfoSize = sizeof(float) + sizeof(vec2i); |
| 782 | if (IamTheMaster()) { |
| 783 | size_t recvOffset = 0; |
| 784 | for (int i = 0; i < workerSize(); ++i) { |
| 785 | processOffsets[i] = recvOffset; |
| 786 | tileBytesExpected[i] = tilesFromRank[i] * tileInfoSize; |
| 787 | recvOffset += tileBytesExpected[i]; |
| 788 | } |
| 789 | tileGatherResult.resize(recvOffset); |
| 790 | } |
| 791 | |
| 792 | std::vector<char> sendBuffer(myTileCount * tileInfoSize); |
| 793 | std::memcpy( |
| 794 | sendBuffer.data(), tileIDs.data(), tileIDs.size() * sizeof(vec2i)); |
| 795 | std::memcpy(sendBuffer.data() + tileIDs.size() * sizeof(vec2i), |
| 796 | tileErrors.data(), |
| 797 | tileErrors.size() * sizeof(float)); |
| 798 | |
| 799 | gatherv(sendBuffer.data(), |
| 800 | sendBuffer.size(), |
| 801 | MPI_BYTE, |
| 802 | tileGatherResult.data(), |
| 803 | tileBytesExpected, |
| 804 | processOffsets, |
| 805 | MPI_BYTE, |
| 806 | masterRank(), |
| 807 | mpiGroup.comm) |
| 808 | .wait(); |
| 809 | |
| 810 | if (IamTheMaster()) { |
| 811 | tasking::parallel_for(workerSize(), [&](int rank) { |
| 812 | const vec2i *tileID = reinterpret_cast<vec2i *>( |
| 813 | tileGatherResult.data() + processOffsets[rank]); |
| 814 | const float *error = reinterpret_cast<float *>(tileGatherResult.data() |
| 815 | + processOffsets[rank] + tilesFromRank[rank] * sizeof(vec2i)); |
| 816 | for (int i = 0; i < tilesFromRank[rank]; ++i) { |
| 817 | if (error[i] < (float)inf) { |
| 818 | tileErrorRegion.update(tileID[i], error[i]); |
nothing calls this directly
no test coverage detected