[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