[Bf-blender-cvs] [bddc6999b05] functions: support for caching auto vectorized functions

Jacques Lucke noreply at git.blender.org
Mon May 20 11:20:10 CEST 2019


Commit: bddc6999b05d7fe4fd6eeb747de23435e71353b2
Author: Jacques Lucke
Date:   Mon May 20 11:19:06 2019 +0200
Branches: functions
https://developer.blender.org/rBbddc6999b05d7fe4fd6eeb747de23435e71353b2

support for caching auto vectorized functions

===================================================================

M	source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
M	source/blender/functions/frontends/data_flow_nodes/inserters/nodes.cpp
M	source/blender/functions/functions/auto_vectorization.cpp
M	source/blender/functions/functions/auto_vectorization.hpp

===================================================================

diff --git a/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp b/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
index 5ecb0eba647..94e3a3cad1c 100644
--- a/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
@@ -23,8 +23,8 @@ Optional<SharedFunction> generate_function(bNodeTree *btree)
   fgraph_add_DependenciesBody(fn, fgraph);
   fgraph_add_LLVMBuildIRBody(fn, fgraph);
 
-  // fgraph_add_TupleCallBody(fn, fgraph);
-  derive_TupleCallBody_from_LLVMBuildIRBody(fn);
+  fgraph_add_TupleCallBody(fn, fgraph);
+  // derive_TupleCallBody_from_LLVMBuildIRBody(fn);
   return fn;
 }
 
diff --git a/source/blender/functions/frontends/data_flow_nodes/inserters/nodes.cpp b/source/blender/functions/frontends/data_flow_nodes/inserters/nodes.cpp
index 08a5c8a70fc..57a47afda0f 100644
--- a/source/blender/functions/frontends/data_flow_nodes/inserters/nodes.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/inserters/nodes.cpp
@@ -20,7 +20,8 @@ struct AutoVectorizedInput {
 
 static SharedFunction get_vectorized_function(SharedFunction &original_fn,
                                               PointerRNA &node_rna,
-                                              ArrayRef<AutoVectorizedInput> auto_vectorized_inputs)
+                                              ArrayRef<AutoVectorizedInput> auto_vectorized_inputs,
+                                              bool use_cache = true)
 {
   BLI_assert(original_fn->input_amount() == auto_vectorized_inputs.size());
 
@@ -40,8 +41,14 @@ static SharedFunction get_vectorized_function(SharedFunction &original_fn,
   }
 
   if (vectorized_inputs.contains(true)) {
-    return Functions::to_vectorized_function(
-        original_fn, vectorized_inputs, used_default_value_builders);
+    if (use_cache) {
+      return Functions::to_vectorized_function__with_cache(
+          original_fn, vectorized_inputs, used_default_value_builders);
+    }
+    else {
+      return Functions::to_vectorized_function(
+          original_fn, vectorized_inputs, used_default_value_builders);
+    }
   }
   else {
     return original_fn;
diff --git a/source/blender/functions/functions/auto_vectorization.cpp b/source/blender/functions/functions/auto_vectorization.cpp
index ea92e2699d9..0daa1976989 100644
--- a/source/blender/functions/functions/auto_vectorization.cpp
+++ b/source/blender/functions/functions/auto_vectorization.cpp
@@ -398,9 +398,10 @@ class AutoVectorization : public TupleCallBody {
   }
 };
 
-SharedFunction to_vectorized_function(SharedFunction &original_fn,
-                                      ArrayRef<bool> vectorized_inputs_mask,
-                                      ArrayRef<SharedFunction> empty_list_value_builders)
+static SharedFunction to_vectorized_function_internal(
+    SharedFunction &original_fn,
+    ArrayRef<bool> &vectorized_inputs_mask,
+    ArrayRef<SharedFunction> &empty_list_value_builders)
 {
   uint input_amount = original_fn->input_amount();
   uint output_amount = original_fn->output_amount();
@@ -446,5 +447,64 @@ SharedFunction to_vectorized_function(SharedFunction &original_fn,
   return fn;
 }
 
+SharedFunction to_vectorized_function(SharedFunction &original_fn,
+                                      ArrayRef<bool> vectorized_inputs_mask,
+                                      ArrayRef<SharedFunction> empty_list_value_builders)
+{
+  return to_vectorized_function_internal(
+      original_fn, vectorized_inputs_mask, empty_list_value_builders);
+}
+
+struct AutoVectorizationInput {
+  SharedFunction m_original_fn;
+  SmallVector<bool> m_vectorized_inputs_mask;
+  SmallVector<SharedFunction> m_empty_list_value_builders;
+
+  AutoVectorizationInput(SharedFunction &original_fn,
+                         ArrayRef<bool> vectorized_inputs_mask,
+                         ArrayRef<SharedFunction> empty_list_value_builders)
+      : m_original_fn(original_fn),
+        m_vectorized_inputs_mask(vectorized_inputs_mask.to_small_vector()),
+        m_empty_list_value_builders(empty_list_value_builders.to_small_vector())
+  {
+  }
+
+  friend bool operator==(const AutoVectorizationInput &a, const AutoVectorizationInput &b)
+  {
+    return (a.m_original_fn == b.m_original_fn &&
+            SmallVector<bool>::all_equal(a.m_vectorized_inputs_mask, b.m_vectorized_inputs_mask) &&
+            SmallVector<SharedFunction>::all_equal(a.m_empty_list_value_builders,
+                                                   b.m_empty_list_value_builders));
+  }
+};
+
+SharedFunction to_vectorized_function__with_cache(
+    SharedFunction &original_fn,
+    ArrayRef<bool> vectorized_inputs_mask,
+    ArrayRef<SharedFunction> empty_list_value_builders)
+{
+  static SmallMap<AutoVectorizationInput, SharedFunction> cache;
+
+  AutoVectorizationInput cache_key(original_fn, vectorized_inputs_mask, empty_list_value_builders);
+  return cache.lookup_ref_or_insert_func(cache_key,
+                                         to_vectorized_function_internal,
+                                         original_fn,
+                                         vectorized_inputs_mask,
+                                         empty_list_value_builders);
+}
+
 }  // namespace Functions
 }  // namespace FN
+
+namespace std {
+template<> struct hash<FN::Functions::AutoVectorizationInput> {
+  typedef FN::Functions::AutoVectorizationInput argument_type;
+  typedef size_t result_type;
+
+  result_type operator()(argument_type const &v) const noexcept
+  {
+    /* TODO: take other struct fields into account. */
+    return BLI_ghashutil_ptrhash(v.m_original_fn.ptr());
+  }
+};
+}  // namespace std
diff --git a/source/blender/functions/functions/auto_vectorization.hpp b/source/blender/functions/functions/auto_vectorization.hpp
index 3496c28c8a8..72ba2e9cebb 100644
--- a/source/blender/functions/functions/auto_vectorization.hpp
+++ b/source/blender/functions/functions/auto_vectorization.hpp
@@ -8,5 +8,11 @@ namespace Functions {
 SharedFunction to_vectorized_function(SharedFunction &fn,
                                       ArrayRef<bool> vectorized_inputs_mask,
                                       ArrayRef<SharedFunction> empty_list_value_builders);
-}
+
+SharedFunction to_vectorized_function__with_cache(
+    SharedFunction &fn,
+    ArrayRef<bool> vectorized_inputs_mask,
+    ArrayRef<SharedFunction> empty_list_value_builders);
+
+}  // namespace Functions
 }  // namespace FN



More information about the Bf-blender-cvs mailing list