From a3deef6fff7c395512cf56a64d6e026f84d95db2 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 12 Jan 2022 23:40:05 +0100 Subject: Fix Cycles CPU + GPU render not using CPU after recent changes In some places the task scheduler was not initialized in time. --- intern/cycles/device/cpu/device_impl.cpp | 2 +- intern/cycles/device/device.cpp | 2 +- intern/cycles/util/task.cpp | 5 +++-- intern/cycles/util/task.h | 7 +++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/intern/cycles/device/cpu/device_impl.cpp b/intern/cycles/device/cpu/device_impl.cpp index 6f3c8b42124..0ca24c241f0 100644 --- a/intern/cycles/device/cpu/device_impl.cpp +++ b/intern/cycles/device/cpu/device_impl.cpp @@ -72,7 +72,7 @@ CPUDevice::CPUDevice(const DeviceInfo &info_, Stats &stats_, Profiler &profiler_ << " CPU kernels."; if (info.cpu_threads == 0) { - info.cpu_threads = TaskScheduler::num_threads(); + info.cpu_threads = TaskScheduler::max_concurrency(); } #ifdef WITH_OSL diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp index d3de6c54a17..14c97affb76 100644 --- a/intern/cycles/device/device.cpp +++ b/intern/cycles/device/device.cpp @@ -334,7 +334,7 @@ DeviceInfo Device::get_multi_device(const vector &subdevices, /* Ensure CPU device does not slow down GPU. */ if (device.type == DEVICE_CPU && subdevices.size() > 1) { if (background) { - int orig_cpu_threads = (threads) ? threads : TaskScheduler::num_threads(); + int orig_cpu_threads = (threads) ? threads : TaskScheduler::max_concurrency(); int cpu_threads = max(orig_cpu_threads - (subdevices.size() - 1), 0); VLOG(1) << "CPU render threads reduced from " << orig_cpu_threads << " to " << cpu_threads diff --git a/intern/cycles/util/task.cpp b/intern/cycles/util/task.cpp index eeccbaf1c44..174befce571 100644 --- a/intern/cycles/util/task.cpp +++ b/intern/cycles/util/task.cpp @@ -109,9 +109,10 @@ void TaskScheduler::free_memory() assert(users == 0); } -int TaskScheduler::num_threads() +int TaskScheduler::max_concurrency() { - return active_num_threads; + thread_scoped_lock lock(mutex); + return (users > 0) ? active_num_threads : tbb::this_task_arena::max_concurrency(); } /* Dedicated Task Pool */ diff --git a/intern/cycles/util/task.h b/intern/cycles/util/task.h index 1a8f512b83a..0117c51d05c 100644 --- a/intern/cycles/util/task.h +++ b/intern/cycles/util/task.h @@ -86,10 +86,9 @@ class TaskScheduler { static void exit(); static void free_memory(); - /* Approximate number of threads that will work on task, which may be lower - * or higher than the actual number of threads. Use as little as possible and - * leave splitting up tasks to the scheduler. */ - static int num_threads(); + /* Maximum number of threads that will work on task. Use as little as + * possible and leave scheduling and splitting up tasks to the scheduler. */ + static int max_concurrency(); protected: static thread_mutex mutex; -- cgit v1.2.3