46 const int64_t thread_based_grain_size = mask.size() / thread_count / 4;
47 grain_size = std::max(grain_size, thread_based_grain_size);
50 const int64_t max_grain_size = 10000;
53 grain_size = std::min(grain_size, max_grain_size);
60 if (grain_size <= 512) {
73 for (
const int param_index : signature.
params.index_range()) {
118 if (mask.is_empty()) {
124 if (mask.size() <= grain_size) {
130 if (!supports_threading) {
137 mask.index_range(), grain_size, alignment, [&](
const IndexRange sub_range) {
138 const IndexMask sliced_mask = mask.slice(sub_range);
139 if (!hints.allocates_array) {
141 this->call(sliced_mask, params, context);
144 if (sliced_mask[0] < grain_size) {
149 const int64_t input_slice_start = sliced_mask[0];
150 const int64_t input_slice_size = sliced_mask.last() - input_slice_start + 1;
151 const IndexRange input_slice_range{input_slice_start, input_slice_size};
154 const int64_t offset = -input_slice_start;
159 this->
call(shifted_mask, sliced_params, context);
163std::string MultiFunction::debug_name()
const
165 return signature_ref_->function_name;
#define BLI_assert_unreachable()
int BLI_system_thread_count(void)
GMutableSpan slice(const int64_t start, int64_t size) const
GVArray slice(IndexRange slice) const
ExecutionHints execution_hints() const
ParamType param_type(int param_index) const
virtual void call(const IndexMask &mask, Params params, Context context) const =0
IndexRange param_indices() const
virtual ExecutionHints get_execution_hints() const
void call_auto(const IndexMask &mask, Params params, Context context) const
const DataType & data_type() const
InterfaceType interface_type() const
ParamCategory category() const
void add_single_mutable(GMutableSpan ref, StringRef expected_name="")
void add_ignored_single_output(StringRef expected_name="")
void add_uninitialized_single_output(T *value, StringRef expected_name="")
void add_readonly_single_input(const T *value, StringRef expected_name="")
MutableSpan< T > uninitialized_single_output_if_required(int param_index, StringRef name="")
MutableSpan< T > uninitialized_single_output(int param_index, StringRef name="")
MutableSpan< T > single_mutable(int param_index, StringRef name="")
VArray< T > readonly_single_input(int param_index, StringRef name="")
IndexMask slice_and_shift(IndexRange range, int64_t offset, IndexMaskMemory &memory) const
static bool supports_threading_by_slicing_params(const MultiFunction &fn)
static void add_sliced_parameters(const Signature &signature, Params &full_params, const IndexRange slice_range, ParamsBuilder &r_sliced_params)
static int64_t compute_alignment(const int64_t grain_size)
static int64_t compute_grain_size(const ExecutionHints &hints, const IndexMask &mask)
void parallel_for_aligned(const IndexRange range, const int64_t grain_size, const int64_t alignment, const Function &function)
bool uniform_execution_time
Vector< ParamInfo > params