27 MFParamType::InterfaceType::Mutable,
43 const int64_t thread_based_grain_size =
mask.size() / thread_count / 4;
44 grain_size =
std::max(grain_size, thread_based_grain_size);
47 const int64_t max_grain_size = 10000;
50 grain_size =
std::min(grain_size, max_grain_size);
57 if (
mask.is_empty()) {
63 if (
mask.size() <= grain_size) {
69 if (!supports_threading) {
75 const IndexMask sliced_mask = mask.slice(sub_range);
76 if (!hints.allocates_array) {
78 this->call(sliced_mask, params, context);
81 if (sliced_mask[0] < grain_size) {
86 const int64_t input_slice_start = sliced_mask[0];
87 const int64_t input_slice_size = sliced_mask.last() - input_slice_start + 1;
88 const IndexRange input_slice_range{input_slice_start, input_slice_size};
91 const IndexMask offset_mask =
mask.slice_and_offset(sub_range, offset_mask_indices);
100 const GVArray &varray =
params.readonly_single_input(param_index);
101 offset_params.add_readonly_single_input(varray.
slice(input_slice_range));
107 offset_params.add_single_mutable(sliced_span);
111 const GMutableSpan span =
params.uninitialized_single_output_if_required(param_index);
113 offset_params.add_ignored_single_output();
117 offset_params.add_uninitialized_single_output(sliced_span);
134 std::string MultiFunction::debug_name()
const
136 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
int64_t min_array_size() const
MFDataType data_type() const
InterfaceType interface_type() const
MFParamCategory category() const
virtual ExecutionHints get_execution_hints() const
MFParamType param_type(int param_index) const
IndexRange param_indices() const
void call_auto(IndexMask mask, MFParams params, MFContext context) const
virtual void call(IndexMask mask, MFParams params, MFContext context) const =0
ExecutionHints execution_hints() const
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
static bool supports_threading_by_slicing_params(const MultiFunction &fn)
static int64_t compute_grain_size(const ExecutionHints &hints, const IndexMask mask)
MultiFunction::ExecutionHints ExecutionHints
void parallel_for(IndexRange range, int64_t grain_size, const Function &function)
bool uniform_execution_time