Cycles: Resolve ridiculous amount of memory used by spatial split builder
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 13 Apr 2016 12:22:53 +0000 (14:22 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 13 Apr 2016 12:25:21 +0000 (14:25 +0200)
This was only visible on systems with lots of threads and root of the issue
was that we've been pre-allocating too much memory for all the threads.

Now we only pre-allocate data for the main thread and rest of the threads
does allocation on-demand.

This brings down memory usage from 36Gig to 6.9Gig when building spatial
split for the Bunny.blend file on our Intel beast.

Originally regression was happened by the threaded spacial split builder
commit.

intern/cycles/bvh/bvh_build.cpp
intern/cycles/bvh/bvh_split.cpp

index 255051c..d666805 100644 (file)
@@ -280,8 +280,8 @@ BVHNode* BVHBuild::run()
                size_t num_bins = max(root.size(), (int)BVHParams::NUM_SPATIAL_BINS) - 1;
                foreach(BVHSpatialStorage &storage, spatial_storage) {
                        storage.right_bounds.clear();
-                       storage.right_bounds.resize(num_bins);
                }
+               spatial_storage[0].right_bounds.resize(num_bins);
        }
        spatial_free_index = 0;
 
index 7b2e342..9185bd9 100644 (file)
@@ -54,6 +54,7 @@ BVHObjectSplit::BVHObjectSplit(BVHBuild *builder,
                /* sweep right to left and determine bounds. */
                BoundBox right_bounds = BoundBox::empty;
 
+               storage_->right_bounds.resize(range.size());
                for(int i = range.size() - 1; i > 0; i--) {
                        right_bounds.grow(ref_ptr[i].bounds());
                        storage_->right_bounds[i - 1] = right_bounds;
@@ -160,6 +161,7 @@ BVHSpatialSplit::BVHSpatialSplit(const BVHBuild& builder,
                /* sweep right to left and determine bounds. */
                BoundBox right_bounds = BoundBox::empty;
 
+               storage_->right_bounds.resize(BVHParams::NUM_SPATIAL_BINS);
                for(int i = BVHParams::NUM_SPATIAL_BINS - 1; i > 0; i--) {
                        right_bounds.grow(storage_->bins[dim][i].bounds);
                        storage_->right_bounds[i - 1] = right_bounds;