From e50f1ddc6540680d2aafc1c76f8339d69350f84a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 5 Jun 2020 16:39:57 +0200 Subject: Cycles: use TBB for task pools and task scheduler No significant performance improvement is expected, but it means we have a single thread pool throughout Blender. And it should make adding more parallellization in the future easier. After previous refactoring commits this is basically a drop-in replacement. One difference is that the task pool had a mechanism for scheduling tasks to the front of the queue to minimize memory usage. TBB has a smarter algorithm to balance depth-first and breadth-first scheduling of tasks and we assume that removes the need to manually provide hints to the scheduler. Fixes T77533 --- intern/cycles/bvh/bvh_build.cpp | 20 ++++++++------------ intern/cycles/bvh/bvh_sort.cpp | 2 +- 2 files changed, 9 insertions(+), 13 deletions(-) (limited to 'intern/cycles/bvh') diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp index 116576b101d..0235ac33c77 100644 --- a/intern/cycles/bvh/bvh_build.cpp +++ b/intern/cycles/bvh/bvh_build.cpp @@ -626,8 +626,8 @@ BVHNode *BVHBuild::build_node(const BVHObjectBinning &range, int level) /* Threaded build */ inner = new InnerNode(bounds); - task_pool.push([=] { thread_build_node(inner, 0, left, level + 1); }, true); - task_pool.push([=] { thread_build_node(inner, 1, right, level + 1); }, true); + task_pool.push([=] { thread_build_node(inner, 0, left, level + 1); }); + task_pool.push([=] { thread_build_node(inner, 1, right, level + 1); }); } if (do_unalinged_split) { @@ -742,16 +742,12 @@ BVHNode *BVHBuild::build_node(const BVHRange &range, /* Create tasks for left and right nodes, using copy for most arguments and * move for reference to avoid memory copies. */ - task_pool.push( - [=, refs = std::move(left_references)]() mutable { - thread_build_spatial_split_node(inner, 0, left, refs, level + 1); - }, - true); - task_pool.push( - [=, refs = std::move(right_references)]() mutable { - thread_build_spatial_split_node(inner, 1, right, refs, level + 1); - }, - true); + task_pool.push([=, refs = std::move(left_references)]() mutable { + thread_build_spatial_split_node(inner, 0, left, refs, level + 1); + }); + task_pool.push([=, refs = std::move(right_references)]() mutable { + thread_build_spatial_split_node(inner, 1, right, refs, level + 1); + }); } if (do_unalinged_split) { diff --git a/intern/cycles/bvh/bvh_sort.cpp b/intern/cycles/bvh/bvh_sort.cpp index 5bdded354bc..b01785b547a 100644 --- a/intern/cycles/bvh/bvh_sort.cpp +++ b/intern/cycles/bvh/bvh_sort.cpp @@ -147,7 +147,7 @@ static void bvh_reference_sort_threaded(TaskPool *task_pool, if (left < end) { if (start < right) { task_pool->push( - function_bind(bvh_reference_sort_threaded, task_pool, data, left, end, compare), true); + function_bind(bvh_reference_sort_threaded, task_pool, data, left, end, compare)); } else { start = left; -- cgit v1.2.3