forked from bartvdbraak/blender
Fix T40306: cycles baking not distributing work among CPU cores well.
This commit is contained in:
parent
3b4f792ce1
commit
0075efc4d2
@ -452,6 +452,10 @@ public:
|
||||
{
|
||||
/* split task into smaller ones */
|
||||
list<DeviceTask> tasks;
|
||||
|
||||
if(task.type == DeviceTask::SHADER)
|
||||
task.split(tasks, TaskScheduler::num_threads(), 256);
|
||||
else
|
||||
task.split(tasks, TaskScheduler::num_threads());
|
||||
|
||||
foreach(DeviceTask& task, tasks)
|
||||
|
@ -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;
|
||||
max_size_num = (shader_w + max_size - 1)/max_size;
|
||||
}
|
||||
else {
|
||||
max_size = max(1, max_size/w);
|
||||
num = (h + max_size - 1)/max_size;
|
||||
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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user