Fix #33107: cycles fixed threads 1 was still having two cores do work,

because main thread works as well.
This commit is contained in:
Brecht Van Lommel 2012-11-07 21:00:49 +00:00
parent b51908b913
commit 204113b791
8 changed files with 25 additions and 13 deletions

@ -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: