Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2022-01-13 01:40:05 +0300
committerBrecht Van Lommel <brecht@blender.org>2022-01-13 12:40:41 +0300
commita3deef6fff7c395512cf56a64d6e026f84d95db2 (patch)
treec2cca7e8582c80b6f349391f6f847529d0744468
parenteaa4cdaa4230d69b470d229017bad27c03c9ef14 (diff)
Fix Cycles CPU + GPU render not using CPU after recent changes
In some places the task scheduler was not initialized in time.
-rw-r--r--intern/cycles/device/cpu/device_impl.cpp2
-rw-r--r--intern/cycles/device/device.cpp2
-rw-r--r--intern/cycles/util/task.cpp5
-rw-r--r--intern/cycles/util/task.h7
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;