[Bf-blender-cvs] [224d26fd33d] master: Geometry Nodes: Parallelize reading and writing vertex groups

Hans Goudey noreply at git.blender.org
Wed Jan 4 22:28:07 CET 2023


Commit: 224d26fd33d362c1e191f53e19a8c48372c621af
Author: Hans Goudey
Date:   Wed Jan 4 16:25:01 2023 -0500
Branches: master
https://developer.blender.org/rB224d26fd33d362c1e191f53e19a8c48372c621af

Geometry Nodes: Parallelize reading and writing vertex groups

Reading or writing a vertex group is expensive enough that it's worth
parallelizing. On a Ryzen 3700x, in a grid of 250k vertices with
30 randomly assigned vertex groups (each to 10-50% of vertices),
I observed a 4x improvement for writing to a group and a 3x
improvement when reading their data. This significantly speeds
up nodes that create a new mesh from a mesh that had vertex groups.

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

M	source/blender/blenkernel/intern/geometry_component_mesh.cc

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

diff --git a/source/blender/blenkernel/intern/geometry_component_mesh.cc b/source/blender/blenkernel/intern/geometry_component_mesh.cc
index ac19fb43568..b9702466d17 100644
--- a/source/blender/blenkernel/intern/geometry_component_mesh.cc
+++ b/source/blender/blenkernel/intern/geometry_component_mesh.cc
@@ -997,9 +997,11 @@ class VArrayImpl_For_VertexWeights final : public VMutableArrayImpl<float> {
 
   void set_all(Span<float> src) override
   {
-    for (const int64_t index : src.index_range()) {
-      this->set(index, src[index]);
-    }
+    threading::parallel_for(src.index_range(), 4096, [&](const IndexRange range) {
+      for (const int64_t i : range) {
+        this->set(i, src[i]);
+      }
+    });
   }
 
   void materialize(IndexMask mask, MutableSpan<float> r_span) const override
@@ -1007,14 +1009,16 @@ class VArrayImpl_For_VertexWeights final : public VMutableArrayImpl<float> {
     if (dverts_ == nullptr) {
       return r_span.fill_indices(mask, 0.0f);
     }
-    for (const int64_t index : mask) {
-      if (const MDeformWeight *weight = this->find_weight_at_index(index)) {
-        r_span[index] = weight->weight;
-      }
-      else {
-        r_span[index] = 0.0f;
+    threading::parallel_for(mask.index_range(), 4096, [&](const IndexRange range) {
+      for (const int64_t i : mask.slice(range)) {
+        if (const MDeformWeight *weight = this->find_weight_at_index(i)) {
+          r_span[i] = weight->weight;
+        }
+        else {
+          r_span[i] = 0.0f;
+        }
       }
-    }
+    });
   }
 
   void materialize_to_uninitialized(IndexMask mask, MutableSpan<float> r_span) const override



More information about the Bf-blender-cvs mailing list