diff options
author | Jacques Lucke <jacques@blender.org> | 2022-04-07 10:48:07 +0300 |
---|---|---|
committer | Fabian Schempp <fabianschempp@googlemail.com> | 2022-04-11 01:31:59 +0300 |
commit | 9d373d5ecaf947c5eae496798e3a42202c64e30b (patch) | |
tree | 8ab576bf4cb35102be51b734e62e9eac1dce420a | |
parent | b0516864a3e4ae06fb824aab7dec76a20f89b88b (diff) |
Functions: parallelize materializing arrays after field evaluation
This improves performance e.g. when creating an integer attribute
based on an index field. For 4 million vertices, I measured a speedup
from 3.5 ms to 1.2 ms.
-rw-r--r-- | source/blender/functions/intern/field.cc | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/source/blender/functions/intern/field.cc b/source/blender/functions/intern/field.cc index 986d6ddc19e..944674c23a9 100644 --- a/source/blender/functions/intern/field.cc +++ b/source/blender/functions/intern/field.cc @@ -468,16 +468,21 @@ Vector<GVArray> evaluate_fields(ResourceScope &scope, /* Still have to copy over the data in the destination provided by the caller. */ if (dst_varray.is_span()) { /* Materialize into a span. */ - computed_varray.materialize_to_uninitialized(mask, dst_varray.get_internal_span().data()); + threading::parallel_for(mask.index_range(), 2048, [&](const IndexRange range) { + computed_varray.materialize_to_uninitialized(mask.slice(range), + dst_varray.get_internal_span().data()); + }); } else { /* Slower materialize into a different structure. */ const CPPType &type = computed_varray.type(); - BUFFER_FOR_CPP_TYPE_VALUE(type, buffer); - for (const int i : mask) { - computed_varray.get_to_uninitialized(i, buffer); - dst_varray.set_by_relocate(i, buffer); - } + threading::parallel_for(mask.index_range(), 2048, [&](const IndexRange range) { + BUFFER_FOR_CPP_TYPE_VALUE(type, buffer); + for (const int i : mask.slice(range)) { + computed_varray.get_to_uninitialized(i, buffer); + dst_varray.set_by_relocate(i, buffer); + } + }); } r_varrays[out_index] = dst_varray; } |