[Bf-blender-cvs] [210e84234bf] devirtualizer: use in CustomMF_SI_SI_SO
Jacques Lucke
noreply at git.blender.org
Sun Apr 10 16:00:28 CEST 2022
Commit: 210e84234bfb4aa205d8e6f31074330cb68b4189
Author: Jacques Lucke
Date: Sun Apr 10 15:47:38 2022 +0200
Branches: devirtualizer
https://developer.blender.org/rB210e84234bfb4aa205d8e6f31074330cb68b4189
use in CustomMF_SI_SI_SO
===================================================================
M source/blender/functions/FN_multi_function_builder.hh
===================================================================
diff --git a/source/blender/functions/FN_multi_function_builder.hh b/source/blender/functions/FN_multi_function_builder.hh
index 25dabec8d38..f2ea9136dc1 100644
--- a/source/blender/functions/FN_multi_function_builder.hh
+++ b/source/blender/functions/FN_multi_function_builder.hh
@@ -49,7 +49,7 @@ template<typename In1, typename Out1> class CustomMF_SI_SO : public MultiFunctio
template<typename ElementFuncT> static FunctionT create_function(ElementFuncT element_fn)
{
return [=](IndexMask mask, const VArray<In1> &in1, MutableSpan<Out1> out1) {
- auto fn = [&](auto in_indices, auto out_indices, auto in1, Out1 *out1) {
+ auto fn = [&](auto in_indices, auto out_indices, auto in1, Out1 *__restrict out1) {
BLI_assert(in_indices.size() == out_indices.size());
for (const int64_t i : IndexRange(in_indices.size())) {
const int64_t in_index = in_indices[i];
@@ -111,11 +111,23 @@ class CustomMF_SI_SI_SO : public MultiFunction {
const VArray<In1> &in1,
const VArray<In2> &in2,
MutableSpan<Out1> out1) {
- /* Devirtualization results in a 2-3x speedup for some simple functions. */
- devirtualize_varray2(in1, in2, [&](const auto &in1, const auto &in2) {
- mask.to_best_mask_type(
- [&](const auto &mask) { execute_SI_SI_SO(element_fn, mask, in1, in2, out1.data()); });
- });
+ auto fn = [&](auto in_indices, auto out_indices, auto in1, auto in2, Out1 *__restrict out1) {
+ BLI_assert(in_indices.size() == out_indices.size());
+ for (const int64_t i : IndexRange(in_indices.size())) {
+ const int64_t in_index = in_indices[i];
+ const int64_t out_index = out_indices[i];
+ new (out1 + out_index) Out1(element_fn(in1[in_index], in2[in_index]));
+ }
+ };
+
+ ArrayDevirtualizer<decltype(fn),
+ SingleInputTag<In1>,
+ SingleInputTag<In2>,
+ SingleOutputTag<Out1>>
+ devirtualizer{fn, &mask, &in1, &in2, &out1};
+ if (!devirtualizer.try_execute_devirtualized()) {
+ devirtualizer.execute_materialized();
+ }
};
}
More information about the Bf-blender-cvs
mailing list