[Bf-blender-cvs] [0075efc] master: Fix T40306: cycles baking not distributing work among CPU cores well.

Brecht van Lommel noreply at git.blender.org
Mon May 26 13:52:33 CEST 2014


Commit: 0075efc4d201da992d590ef6c6462cd957955068
Author: Brecht van Lommel
Date:   Mon May 26 13:40:16 2014 +0200
https://developer.blender.org/rB0075efc4d201da992d590ef6c6462cd957955068

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

===================================================================

M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/device/device_task.cpp
M	intern/cycles/device/device_task.h
M	intern/cycles/render/light.cpp

===================================================================

diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index c9cc759..b0739dd 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 7d0eeab..f436b54 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 c1bd39b..9139067 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);
 
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 7bdb1fb..1325627 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -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);




More information about the Bf-blender-cvs mailing list