diff options
author | Brecht van Lommel <brechtvanlommel@gmail.com> | 2014-05-26 15:40:16 +0400 |
---|---|---|
committer | Brecht van Lommel <brechtvanlommel@gmail.com> | 2014-05-26 15:51:11 +0400 |
commit | 0075efc4d201da992d590ef6c6462cd957955068 (patch) | |
tree | 875f90577f22120f09b45d5770a22b1c083ddaba /intern/cycles/device | |
parent | 3b4f792ce102f5c892e4108c19512dd3b9968335 (diff) |
Fix T40306: cycles baking not distributing work among CPU cores well.
Diffstat (limited to 'intern/cycles/device')
-rw-r--r-- | intern/cycles/device/device_cpu.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/device/device_task.cpp | 25 | ||||
-rw-r--r-- | intern/cycles/device/device_task.h | 3 |
3 files changed, 18 insertions, 16 deletions
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp index c9cc7592028..b0739dd20b4 100644 --- a/intern/cycles/device/device_cpu.cpp +++ b/intern/cycles/device/device_cpu.cpp @@ -452,7 +452,11 @@ public: { /* split task into smaller ones */ list<DeviceTask> tasks; - task.split(tasks, TaskScheduler::num_threads()); + + if(task.type == DeviceTask::SHADER) + task.split(tasks, TaskScheduler::num_threads(), 256); + else + task.split(tasks, TaskScheduler::num_threads()); foreach(DeviceTask& task, tasks) task_pool.push(new CPUDeviceTask(this, task)); diff --git a/intern/cycles/device/device_task.cpp b/intern/cycles/device/device_task.cpp index 7d0eeab780d..f436b54df68 100644 --- a/intern/cycles/device/device_task.cpp +++ b/intern/cycles/device/device_task.cpp @@ -35,23 +35,22 @@ DeviceTask::DeviceTask(Type type_) last_update_time = time_dt(); } -void DeviceTask::split_max_size(list<DeviceTask>& tasks, int max_size) +void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size) { - int num; + if(max_size != 0) { + int max_size_num; - if(type == SHADER) { - num = (shader_w + max_size - 1)/max_size; - } - else { - max_size = max(1, max_size/w); - num = (h + max_size - 1)/max_size; - } + if(type == SHADER) { + max_size_num = (shader_w + max_size - 1)/max_size; + } + else { + max_size = max(1, max_size/w); + max_size_num = (h + max_size - 1)/max_size; + } - split(tasks, num); -} + num = max(max_size_num, num); + } -void DeviceTask::split(list<DeviceTask>& tasks, int num) -{ if(type == SHADER) { num = min(shader_w, num); diff --git a/intern/cycles/device/device_task.h b/intern/cycles/device/device_task.h index c1bd39b70ca..91390674286 100644 --- a/intern/cycles/device/device_task.h +++ b/intern/cycles/device/device_task.h @@ -52,8 +52,7 @@ public: DeviceTask(Type type = PATH_TRACE); - void split(list<DeviceTask>& tasks, int num); - void split_max_size(list<DeviceTask>& tasks, int max_size); + void split(list<DeviceTask>& tasks, int num, int max_size = 0); void update_progress(RenderTile &rtile); |