Fix T40306: cycles baking not distributing work among CPU cores well.

This commit is contained in:
Brecht van Lommel 2014-05-26 13:40:16 +02:00
parent 3b4f792ce1
commit 0075efc4d2
4 changed files with 19 additions and 17 deletions

@ -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));

@ -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;
}
num = max(max_size_num, num);
}
split(tasks, num);
}
void DeviceTask::split(list<DeviceTask>& tasks, int num)
{
if(type == SHADER) {
num = min(shader_w, num);

@ -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);

@ -70,7 +70,7 @@ static void shade_background_pixels(Device *device, DeviceScene *dscene, int res
/* disabled splitting for now, there's an issue with multi-GPU mem_copy_from */
list<DeviceTask> split_tasks;
main_task.split_max_size(split_tasks, 128*128);
main_task.split(split_tasks, 1, 128*128);
foreach(DeviceTask& task, split_tasks) {
device->task_add(task);