Fix #33107: cycles fixed threads 1 was still having two cores do work,
because main thread works as well.
This commit is contained in:
parent
b51908b913
commit
204113b791
@ -379,7 +379,10 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine b_engine, BL::Use
|
||||
params.start_resolution = get_int(cscene, "preview_start_resolution");
|
||||
|
||||
/* other parameters */
|
||||
params.threads = b_scene.render().threads();
|
||||
if(b_scene.render().threads_mode() == BL::RenderSettings::threads_mode_FIXED)
|
||||
params.threads = b_scene.render().threads();
|
||||
else
|
||||
params.threads = 0;
|
||||
|
||||
params.cancel_timeout = get_float(cscene, "debug_cancel_timeout");
|
||||
params.reset_timeout = get_float(cscene, "debug_reset_timeout");
|
||||
|
@ -78,13 +78,13 @@ void Device::draw_pixels(device_memory& rgba, int y, int w, int h, int dy, int w
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
|
||||
Device *Device::create(DeviceInfo& info, Stats &stats, bool background, int threads)
|
||||
Device *Device::create(DeviceInfo& info, Stats &stats, bool background)
|
||||
{
|
||||
Device *device;
|
||||
|
||||
switch(info.type) {
|
||||
case DEVICE_CPU:
|
||||
device = device_cpu_create(info, stats, threads);
|
||||
device = device_cpu_create(info, stats);
|
||||
break;
|
||||
#ifdef WITH_CUDA
|
||||
case DEVICE_CUDA:
|
||||
|
@ -134,7 +134,7 @@ public:
|
||||
virtual int device_number(Device *sub_device) { return 0; }
|
||||
|
||||
/* static */
|
||||
static Device *create(DeviceInfo& info, Stats &stats, bool background = true, int threads = 0);
|
||||
static Device *create(DeviceInfo& info, Stats &stats, bool background = true);
|
||||
|
||||
static DeviceType type_from_string(const char *name);
|
||||
static string string_from_type(DeviceType type);
|
||||
|
@ -45,7 +45,7 @@ public:
|
||||
TaskPool task_pool;
|
||||
KernelGlobals *kg;
|
||||
|
||||
CPUDevice(Stats &stats, int threads_num) : Device(stats)
|
||||
CPUDevice(Stats &stats) : Device(stats)
|
||||
{
|
||||
kg = kernel_globals_create();
|
||||
|
||||
@ -274,7 +274,7 @@ public:
|
||||
/* split task into smaller ones, more than number of threads for uneven
|
||||
* workloads where some parts of the image render slower than others */
|
||||
list<DeviceTask> tasks;
|
||||
task.split(tasks, TaskScheduler::num_threads()+1);
|
||||
task.split(tasks, TaskScheduler::num_threads());
|
||||
|
||||
foreach(DeviceTask& task, tasks)
|
||||
task_pool.push(new CPUDeviceTask(this, task));
|
||||
@ -291,9 +291,9 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
Device *device_cpu_create(DeviceInfo& info, Stats &stats, int threads)
|
||||
Device *device_cpu_create(DeviceInfo& info, Stats &stats)
|
||||
{
|
||||
return new CPUDevice(stats, threads);
|
||||
return new CPUDevice(stats);
|
||||
}
|
||||
|
||||
void device_cpu_info(vector<DeviceInfo>& devices)
|
||||
|
@ -23,7 +23,7 @@ CCL_NAMESPACE_BEGIN
|
||||
|
||||
class Device;
|
||||
|
||||
Device *device_cpu_create(DeviceInfo& info, Stats &stats, int threads);
|
||||
Device *device_cpu_create(DeviceInfo& info, Stats &stats);
|
||||
Device *device_opencl_create(DeviceInfo& info, Stats &stats, bool background);
|
||||
Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background);
|
||||
Device *device_network_create(DeviceInfo& info, Stats &stats, const char *address);
|
||||
|
@ -49,7 +49,7 @@ Session::Session(const SessionParams& params_)
|
||||
|
||||
TaskScheduler::init(params.threads);
|
||||
|
||||
device = Device::create(params.device, stats, params.background, params.threads);
|
||||
device = Device::create(params.device, stats, params.background);
|
||||
|
||||
if(params.background) {
|
||||
buffers = NULL;
|
||||
|
@ -168,10 +168,16 @@ void TaskScheduler::init(int num_threads)
|
||||
if(users == 0) {
|
||||
do_exit = false;
|
||||
|
||||
/* launch threads that will be waiting for work */
|
||||
if(num_threads == 0)
|
||||
if(num_threads == 0) {
|
||||
/* automatic number of threads will be main thread + num cores */
|
||||
num_threads = system_cpu_thread_count();
|
||||
}
|
||||
else {
|
||||
/* main thread will also work, for fixed threads we count it too */
|
||||
num_threads -= 1;
|
||||
}
|
||||
|
||||
/* launch threads that will be waiting for work */
|
||||
threads.resize(num_threads);
|
||||
thread_level.resize(num_threads);
|
||||
|
||||
|
@ -94,7 +94,10 @@ public:
|
||||
static void init(int num_threads = 0);
|
||||
static void exit();
|
||||
|
||||
static int num_threads() { return threads.size(); }
|
||||
/* number of threads that can work on tasks, main thread counts too */
|
||||
static int num_threads() { return threads.size() + 1; }
|
||||
|
||||
/* test if any session is using the scheduler */
|
||||
static bool active() { return users != 0; }
|
||||
|
||||
protected:
|
||||
|
Loading…
Reference in New Issue
Block a user