[Bf-blender-cvs] [198f5e5] master: Cycles: CUDA changes for kernel evaluation cancel

Brecht Van Lommel noreply at git.blender.org
Sat May 3 02:19:39 CEST 2014


Commit: 198f5e506a9a673bc962ffc782464067460dc7f5
Author: Brecht Van Lommel
Date:   Wed Apr 30 13:16:48 2014 -0300
https://developer.blender.org/rB198f5e506a9a673bc962ffc782464067460dc7f5

Cycles: CUDA changes for kernel evaluation cancel

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

M	intern/cycles/device/device_cuda.cpp

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

diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index 48bde70..0257153 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -760,36 +760,49 @@ public:
 
 		/* get kernel function */
 		cuda_assert(cuModuleGetFunction(&cuShader, cuModule, "kernel_cuda_shader"))
-		
-		/* pass in parameters */
-		int offset = 0;
-		
-		cuda_assert(cuParamSetv(cuShader, offset, &d_input, sizeof(d_input)))
-		offset += sizeof(d_input);
 
-		cuda_assert(cuParamSetv(cuShader, offset, &d_output, sizeof(d_output)))
-		offset += sizeof(d_output);
+		/* do tasks in smaller chunks, so we can cancel it */
+		const int shader_chunk_size = 65536;
+		const int start = task.shader_x;
+		const int end = task.shader_x + task.shader_w;
 
-		int shader_eval_type = task.shader_eval_type;
-		offset = align_up(offset, __alignof(shader_eval_type));
+		for(int shader_x = start; shader_x < end; shader_x += shader_chunk_size) {
+			if(task.get_cancel())
+				break;
 
-		cuda_assert(cuParamSeti(cuShader, offset, task.shader_eval_type))
-		offset += sizeof(task.shader_eval_type);
+			/* pass in parameters */
+			int offset = 0;
 
-		cuda_assert(cuParamSeti(cuShader, offset, task.shader_x))
-		offset += sizeof(task.shader_x);
+			cuda_assert(cuParamSetv(cuShader, offset, &d_input, sizeof(d_input)))
+			offset += sizeof(d_input);
 
-		cuda_assert(cuParamSetSize(cuShader, offset))
+			cuda_assert(cuParamSetv(cuShader, offset, &d_output, sizeof(d_output)))
+			offset += sizeof(d_output);
 
-		/* launch kernel */
-		int threads_per_block;
-		cuda_assert(cuFuncGetAttribute(&threads_per_block, CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK, cuShader))
+			int shader_eval_type = task.shader_eval_type;
+			offset = align_up(offset, __alignof(shader_eval_type));
+
+			cuda_assert(cuParamSeti(cuShader, offset, task.shader_eval_type))
+			offset += sizeof(task.shader_eval_type);
 
-		int xblocks = (task.shader_w + threads_per_block - 1)/threads_per_block;
+			cuda_assert(cuParamSeti(cuShader, offset, shader_x))
+			offset += sizeof(shader_x);
 
-		cuda_assert(cuFuncSetCacheConfig(cuShader, CU_FUNC_CACHE_PREFER_L1))
-		cuda_assert(cuFuncSetBlockShape(cuShader, threads_per_block, 1, 1))
-		cuda_assert(cuLaunchGrid(cuShader, xblocks, 1))
+			cuda_assert(cuParamSetSize(cuShader, offset))
+
+			/* launch kernel */
+			int threads_per_block;
+			cuda_assert(cuFuncGetAttribute(&threads_per_block, CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK, cuShader))
+
+			int shader_w = min(shader_chunk_size, end - shader_x);
+			int xblocks = (shader_w + threads_per_block - 1)/threads_per_block;
+
+			cuda_assert(cuFuncSetCacheConfig(cuShader, CU_FUNC_CACHE_PREFER_L1))
+			cuda_assert(cuFuncSetBlockShape(cuShader, threads_per_block, 1, 1))
+			cuda_assert(cuLaunchGrid(cuShader, xblocks, 1))
+
+			cuda_assert(cuCtxSynchronize())
+		}
 
 		cuda_pop_context();
 	}




More information about the Bf-blender-cvs mailing list