| 789 | } |
| 790 | |
| 791 | Status SubarrayPartitioner::compute_current_start_end(bool* found) { |
| 792 | // Compute the tile overlap. Note that the ranges in `tile_overlap` may have |
| 793 | // been truncated the ending bound due to memory constraints. |
| 794 | subarray_.precompute_tile_overlap( |
| 795 | state_.start_, state_.end_, config_, compute_tp_); |
| 796 | const SubarrayTileOverlap* const tile_overlap = |
| 797 | subarray_.subarray_tile_overlap(); |
| 798 | iassert(tile_overlap->range_idx_start() == state_.start_); |
| 799 | iassert(tile_overlap->range_idx_end() <= state_.end_); |
| 800 | |
| 801 | // Preparation |
| 802 | auto array = subarray_.array(); |
| 803 | auto meta = array->fragment_metadata(); |
| 804 | std::vector<Subarray::ResultSize> cur_sizes; |
| 805 | std::vector<Subarray::MemorySize> mem_sizes; |
| 806 | std::vector<std::string> names; |
| 807 | std::vector<ResultBudget> budgets; |
| 808 | names.reserve(budget_.size()); |
| 809 | budgets.reserve(budget_.size()); |
| 810 | cur_sizes.resize(budget_.size(), Subarray::ResultSize({0.0, 0.0, 0.0})); |
| 811 | mem_sizes.resize(budget_.size(), Subarray::MemorySize({0, 0, 0})); |
| 812 | for (const auto& budget_it : budget_) { |
| 813 | names.emplace_back(budget_it.first); |
| 814 | budgets.emplace_back(budget_it.second); |
| 815 | } |
| 816 | |
| 817 | // Compute the estimated result sizes |
| 818 | std::vector<std::vector<Subarray::ResultSize>> result_sizes; |
| 819 | std::vector<std::vector<Subarray::MemorySize>> memory_sizes; |
| 820 | subarray_.compute_relevant_fragment_est_result_sizes( |
| 821 | names, |
| 822 | tile_overlap->range_idx_start(), |
| 823 | tile_overlap->range_idx_end(), |
| 824 | &result_sizes, |
| 825 | &memory_sizes, |
| 826 | compute_tp_); |
| 827 | |
| 828 | bool done = false; |
| 829 | current_.start_ = tile_overlap->range_idx_start(); |
| 830 | for (current_.end_ = tile_overlap->range_idx_start(); |
| 831 | current_.end_ <= tile_overlap->range_idx_end(); |
| 832 | ++current_.end_) { |
| 833 | size_t r = current_.end_ - tile_overlap->range_idx_start(); |
| 834 | for (size_t i = 0; i < names.size(); ++i) { |
| 835 | auto& cur_size = cur_sizes[i]; |
| 836 | auto& mem_size = mem_sizes[i]; |
| 837 | const auto& budget = budgets[i]; |
| 838 | cur_size.size_fixed_ += result_sizes[r][i].size_fixed_; |
| 839 | cur_size.size_var_ += result_sizes[r][i].size_var_; |
| 840 | cur_size.size_validity_ += result_sizes[r][i].size_validity_; |
| 841 | mem_size.size_fixed_ += memory_sizes[r][i].size_fixed_; |
| 842 | mem_size.size_var_ += memory_sizes[r][i].size_var_; |
| 843 | mem_size.size_validity_ += memory_sizes[r][i].size_validity_; |
| 844 | if ((!skip_split_on_est_size_ && |
| 845 | (cur_size.size_fixed_ > budget.size_fixed_ || |
| 846 | cur_size.size_var_ > budget.size_var_ || |
| 847 | cur_size.size_validity_ > budget.size_validity_)) || |
| 848 | mem_size.size_fixed_ > memory_budget_ || |
nothing calls this directly
no test coverage detected