[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