[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