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 255051c92dcbacd1ceb10d30a6764706f6754eb9..d666805557411732c0cc897270e98f94d34d0793 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 7b2e342637fbe8eeed8acff2225ad81cacb2f617..9185bd99d108a8804379470f680a2540f23222bc 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;