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,7 +452,11 @@ public:
|
|||||||
{
|
{
|
||||||
/* split task into smaller ones */
|
/* split task into smaller ones */
|
||||||
list<DeviceTask> tasks;
|
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)
|
foreach(DeviceTask& task, tasks)
|
||||||
task_pool.push(new CPUDeviceTask(this, task));
|
task_pool.push(new CPUDeviceTask(this, task));
|
||||||
|
@ -35,23 +35,22 @@ DeviceTask::DeviceTask(Type type_)
|
|||||||
last_update_time = time_dt();
|
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) {
|
if(type == SHADER) {
|
||||||
num = (shader_w + max_size - 1)/max_size;
|
max_size_num = (shader_w + max_size - 1)/max_size;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
max_size = max(1, max_size/w);
|
max_size = max(1, max_size/w);
|
||||||
num = (h + max_size - 1)/max_size;
|
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) {
|
if(type == SHADER) {
|
||||||
num = min(shader_w, num);
|
num = min(shader_w, num);
|
||||||
|
|
||||||
|
@ -52,8 +52,7 @@ public:
|
|||||||
|
|
||||||
DeviceTask(Type type = PATH_TRACE);
|
DeviceTask(Type type = PATH_TRACE);
|
||||||
|
|
||||||
void split(list<DeviceTask>& tasks, int num);
|
void split(list<DeviceTask>& tasks, int num, int max_size = 0);
|
||||||
void split_max_size(list<DeviceTask>& tasks, int max_size);
|
|
||||||
|
|
||||||
void update_progress(RenderTile &rtile);
|
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 */
|
/* disabled splitting for now, there's an issue with multi-GPU mem_copy_from */
|
||||||
list<DeviceTask> split_tasks;
|
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) {
|
foreach(DeviceTask& task, split_tasks) {
|
||||||
device->task_add(task);
|
device->task_add(task);
|
||||||
|
Loading…
Reference in New Issue
Block a user