[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