diff options
author | Brecht Van Lommel <brecht@blender.org> | 2022-01-13 01:40:05 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2022-01-13 12:40:41 +0300 |
commit | a3deef6fff7c395512cf56a64d6e026f84d95db2 (patch) | |
tree | c2cca7e8582c80b6f349391f6f847529d0744468 /intern/cycles | |
parent | eaa4cdaa4230d69b470d229017bad27c03c9ef14 (diff) |
Fix Cycles CPU + GPU render not using CPU after recent changes
In some places the task scheduler was not initialized in time.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/device/cpu/device_impl.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/device/device.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/util/task.cpp | 5 | ||||
-rw-r--r-- | 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<DeviceInfo> &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; |