62 template<
typename... ParamTags,
typename... LoadedParams,
size_t...
I>
64 std::index_sequence<I...> ,
65 const std::tuple<LoadedParams...> &loaded_params)
const
67 return std::make_tuple([&]() {
71 const GVArrayImpl &varray_impl = *std::get<I>(loaded_params);
78 T *
ptr = std::get<I>(loaded_params);
94 template<
typename... ParamTags,
typename... LoadedParams,
size_t...
I>
96 std::index_sequence<I...> ,
97 const std::tuple<LoadedParams...> &loaded_params)
const
99 return std::make_tuple([&]() {
104 constexpr bool UseSpan =
ValueSequence<size_t, Indices...>::template contains<I>();
105 const GVArrayImpl &varray_impl = *std::get<I>(loaded_params);
112 T *
ptr = std::get<I>(loaded_params);
128template<
typename MaskT,
typename... Args,
typename... ParamTags,
size_t...
I,
typename ElementFn>
131#if (defined(__GNUC__) && !defined(__clang__))
132[[gnu::optimize(
"-funroll-loops")]] [[gnu::optimize(
"O3")]]
136 std::index_sequence<I...> ,
137 ElementFn element_fn,
141 Args &&__restrict... args)
143 if constexpr (std::is_same_v<std::decay_t<MaskT>,
IndexRange>) {
148 element_fn(args[
i]...);
153 element_fn(args[
i]...);
173template<
typename... ParamTags,
typename ElementFn,
typename... Chunks>
174#if (defined(__GNUC__) && !defined(__clang__))
175[[gnu::optimize(
"-funroll-loops")]] [[gnu::optimize(
"O3")]]
179 const ElementFn element_fn,
181 Chunks &&__restrict... chunks)
184 element_fn(chunks[
i]...);
193template<
typename... ParamTags,
size_t...
I,
typename ElementFn,
typename... LoadedParams>
195 std::index_sequence<I...> ,
196 const ElementFn element_fn,
198 const std::tuple<LoadedParams...> &loaded_params)
205 static constexpr int64_t MaxChunkSize = 64;
207 const int64_t tmp_buffer_size = std::min(mask_size, MaxChunkSize);
210 std::tuple<TypedBuffer<typename ParamTags::base_type, MaxChunkSize>...> temporary_buffers;
213 std::tuple<MaterializeArgInfo<ParamTags>...> args_info;
223 const GVArrayImpl &varray_impl = *std::get<I>(loaded_params);
228 const T &in_single = *
static_cast<const T *
>(common_info.
data);
229 T *tmp_buffer = std::get<I>(temporary_buffers).ptr();
248 for (
int64_t chunk_start = 0; chunk_start < mask_size; chunk_start += MaxChunkSize) {
249 const int64_t chunk_end = std::min<int64_t>(chunk_start + MaxChunkSize, mask_size);
250 const int64_t chunk_size = chunk_end - chunk_start;
252 const int64_t mask_start = sliced_mask[0];
257 if (!sliced_mask_is_range) {
264 T *tmp_buffer = std::get<I>(temporary_buffers).ptr();
265 T *param_buffer = std::get<I>(loaded_params);
267 new (tmp_buffer +
i)
T(std::move(param_buffer[sliced_mask[
i]]));
274 const IndexMask *current_segment_mask =
nullptr;
285 T *tmp_buffer = std::get<I>(temporary_buffers);
289 return const_cast<const T *
>(tmp_buffer);
297 const GVArrayImpl &varray_impl = *std::get<I>(loaded_params);
298 if (current_segment_mask ==
nullptr) {
299 current_segment_mask = &index_mask_from_segment.
update(
300 {segment_offset, sliced_mask.
base_span()});
308 return const_cast<const T *
>(tmp_buffer);
315 if (sliced_mask_is_range) {
317 T *param_buffer = std::get<I>(loaded_params);
318 return param_buffer + mask_start;
327 if (!sliced_mask_is_range) {
337 T *tmp_buffer = std::get<I>(temporary_buffers).ptr();
338 T *param_buffer = std::get<I>(loaded_params);
340 new (param_buffer + sliced_mask[
i])
T(std::move(tmp_buffer[
i]));
341 std::destroy_at(tmp_buffer +
i);
357 T *tmp_buffer = std::get<I>(temporary_buffers).ptr();
374 T *tmp_buffer = std::get<I>(temporary_buffers).ptr();
382template<
typename ElementFn,
typename ExecPreset,
typename... ParamTags,
size_t...
I>
384 const ExecPreset exec_preset,
388 std::index_sequence<I...> )
393 const auto loaded_params = std::make_tuple([&]() {
399 return params.readonly_single_input(
I).get_implementation();
402 return static_cast<T *
>(
params.uninitialized_single_output(
I).
data());
405 return static_cast<T *
>(
params.single_mutable(
I).
data());
410 bool executed_devirtualized =
false;
411 if constexpr (ExecPreset::use_devirtualization) {
414 mask.to_spans_and_ranges<16>();
416 const auto devirtualizers = exec_preset.create_devirtualizers(
419 devirtualizers, [&](
auto &&...args) {
420 for (
const std::variant<IndexRange, IndexMaskSegment> &segment : mask_segments) {
421 if (std::holds_alternative<IndexRange>(segment)) {
422 const auto segment_range = std::get<IndexRange>(segment);
424 std::index_sequence<I...>(),
427 std::forward<
decltype(args)>(args)...);
430 const auto segment_indices = std::get<IndexMaskSegment>(segment);
432 std::index_sequence<I...>(),
435 std::forward<
decltype(args)>(args)...);
446 if (!executed_devirtualized) {
452 std::index_sequence<I...>(),
467 const GVArrayImpl &varray_impl = *std::get<I>(loaded_params);
474 T *
ptr = std::get<I>(loaded_params);
489template<
typename ElementFn,
typename ExecPreset,
typename... ParamTags>
491 const ExecPreset exec_preset,
500 std::make_index_sequence<
sizeof...(ParamTags)>());
514 : call_fn_(std::move(call_fn))
518 ([&] { builder.
add(ParamTags(),
""); }(), ...);
528template<
typename Out,
typename... In,
typename ElementFn,
typename ExecPreset>
530 const ElementFn element_fn,
531 const ExecPreset exec_preset,
537 [element_fn](
const In &...
in, Out &
out) {
new (&
out) Out(element_fn(
in...)); },
540 return CustomMF(name, call_fn, param_tags);
543template<
typename Out1,
typename Out2,
typename... In,
typename ElementFn,
typename ExecPreset>
545 const ElementFn element_fn,
546 const ExecPreset exec_preset,
553 return CustomMF(name, call_fn, param_tags);
559template<
typename In1,
564 const ElementFn element_fn,
572template<
typename In1,
578 const ElementFn element_fn,
586template<
typename In1,
593 const ElementFn element_fn,
601template<
typename In1,
609 const ElementFn element_fn,
617template<
typename In1,
626 const ElementFn element_fn,
634template<
typename In1,
644 const ElementFn element_fn,
652template<
typename In1,
664 const ElementFn element_fn,
668 name, element_fn, exec_preset,
TypeSequence<In1, In2, In3, In4, In5, In6, In7, In8>());
672template<
typename Mut1,
typename ElementFn,
typename ExecPreset = exec_presets::AllSpanOrSingle>
673inline auto SM(
const char *name,
674 const ElementFn element_fn,
679 element_fn, exec_preset, param_tags);
684template<
typename In1,
690 const ElementFn element_fn,
698template<
typename In1,
705 const ElementFn element_fn,
713template<
typename In1,
721 const ElementFn element_fn,
729template<
typename In1,
738 const ElementFn element_fn,
746template<
typename In1,
756 const ElementFn element_fn,
764template<
typename In1,
771 const ElementFn element_fn,
779 element_fn, exec_preset, param_tags);
784template<
typename In1,
792 const ElementFn element_fn,
801 element_fn, exec_preset, param_tags);
875 if (other1 !=
nullptr) {
876 return value_ == other1->value_;
880 if (other2 !=
nullptr) {
882 if (type == other2->type_) {
883 return type.
is_equal_or_false(
static_cast<const void *
>(&value_), other2->value_);
BMesh const char void * data
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static const CPPType & get()
bool is_equal_or_false(const void *a, const void *b) const
virtual void materialize_compressed_to_uninitialized(const IndexMask &mask, void *dst) const
virtual CommonVArrayInfo common_info() const
VArray< T > typed() const
Span< BaseT > base_span() const
CustomMF_Constant(U &&value)
bool equals(const MultiFunction &other) const override
uint64_t hash() const override
void call(const IndexMask &mask, Params params, Context) const override
CustomMF_DefaultOutput(Span< DataType > input_types, Span< DataType > output_types)
void call(const IndexMask &mask, Params params, Context context) const override
void call(const IndexMask &mask, Params params, Context context) const override
CustomMF_GenericConstantArray(GSpan array)
CustomMF_GenericConstant(const CPPType &type, const void *value, bool make_value_copy)
uint64_t hash() const override
~CustomMF_GenericConstant() override
bool equals(const MultiFunction &other) const override
friend class CustomMF_Constant
void call(const IndexMask &mask, Params params, Context context) const override
CustomMF_GenericCopy(DataType data_type)
void call(const IndexMask &mask, Params params, Context context) const override
StringRefNull name() const
void set_signature(const Signature *signature)
void add(ParamTag< Category, T >, const char *name)
void single_output(const char *name, const ParamFlag flag=ParamFlag::None)
CustomMF(const char *name, CallFn call_fn, TypeSequence< ParamTags... >)
void call(const IndexMask &mask, Params params, Context) const override
const IndexMask & update(IndexMaskSegment segment)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
auto build_multi_function_with_n_inputs_two_outputs(const char *name, const ElementFn element_fn, const ExecPreset exec_preset, TypeSequence< In... >)
auto build_multi_function_with_n_inputs_one_output(const char *name, const ElementFn element_fn, const ExecPreset exec_preset, TypeSequence< In... >)
void execute_element_fn_as_multi_function(const ElementFn element_fn, const ExecPreset exec_preset, const IndexMask &mask, Params params, TypeSequence< ParamTags... >, std::index_sequence< I... >)
auto build_multi_function_call_from_element_fn(const ElementFn element_fn, const ExecPreset exec_preset, TypeSequence< ParamTags... >)
void execute_array(TypeSequence< ParamTags... >, std::index_sequence< I... >, ElementFn element_fn, MaskT mask, Args &&__restrict... args)
void execute_materialized_impl(TypeSequence< ParamTags... >, const ElementFn element_fn, const int64_t size, Chunks &&__restrict... chunks)
void execute_materialized(TypeSequence< ParamTags... >, std::index_sequence< I... >, const ElementFn element_fn, const IndexMaskSegment mask, const std::tuple< LoadedParams... > &loaded_params)
auto SI1_SO(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI3_SO2(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI5_SO(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI4_SO(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI1_SO2(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SM(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::AllSpanOrSingle())
auto SI3_SO(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI4_SO2(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI2_SO2(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI1_SO3(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI1_SO4(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI6_SO(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI2_SO(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI5_SO2(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
auto SI8_SO(const char *name, const ElementFn element_fn, const ExecPreset exec_preset=exec_presets::Materialized())
bool non_empty_is_range(const Span< T > indices)
uint64_t get_default_hash(const T &v, const Args &...args)
bool call_with_devirtualized_parameters(const std::tuple< Devirtualizers... > &devis, const Fn &fn)
void uninitialized_fill_n(T *dst, int64_t n, const T &value)
void destruct_n(T *ptr, int64_t n)
static constexpr ParamCategory category
const ParamTag::base_type * internal_span_data
static constexpr FallbackMode fallback_mode
auto create_devirtualizers(TypeSequence< ParamTags... >, std::index_sequence< I... >, const std::tuple< LoadedParams... > &loaded_params) const
static constexpr bool use_devirtualization
static constexpr FallbackMode fallback_mode
static constexpr bool use_devirtualization
static constexpr bool use_devirtualization
static constexpr FallbackMode fallback_mode
auto create_devirtualizers(TypeSequence< ParamTags... >, std::index_sequence< I... >, const std::tuple< LoadedParams... > &loaded_params) const
static constexpr FallbackMode fallback_mode
static constexpr bool use_devirtualization