diff options
author | Hristo Gueorguiev <prem.nirved@gmail.com> | 2017-03-08 19:56:06 +0300 |
---|---|---|
committer | Hristo Gueorguiev <prem.nirved@gmail.com> | 2017-03-08 19:56:06 +0300 |
commit | 0c70c2eb5123efa42078a61df313c621f4b734f0 (patch) | |
tree | afff094ef0f75b1fed8220fa039f461cfbbdff23 | |
parent | a4f8766265bf660536dd29468b3d220514760282 (diff) |
Cycles: add single program debug option for split kerneltemp_cycles_split_kernel
Single program generally compiles kernels faster (2-3 times), loads faster,
takes less drive space (2-3 times), and reduces the number of cached kernels.
-rw-r--r-- | intern/cycles/blender/addon/properties.py | 2 | ||||
-rw-r--r-- | intern/cycles/blender/addon/ui.py | 1 | ||||
-rw-r--r-- | intern/cycles/blender/blender_python.cpp | 1 | ||||
-rw-r--r-- | intern/cycles/device/opencl/opencl.h | 1 | ||||
-rw-r--r-- | intern/cycles/device/opencl/opencl_split.cpp | 21 | ||||
-rw-r--r-- | intern/cycles/device/opencl/opencl_util.cpp | 5 | ||||
-rw-r--r-- | intern/cycles/kernel/CMakeLists.txt | 2 | ||||
-rw-r--r-- | intern/cycles/util/util_debug.cpp | 11 | ||||
-rw-r--r-- | intern/cycles/util/util_debug.h | 3 |
9 files changed, 35 insertions, 12 deletions
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index ca109734314..6c5bcf09305 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -695,6 +695,8 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): update=devices_update_callback ) + cls.debug_opencl_kernel_single_program = BoolProperty(name="Single Program", default=False, update=devices_update_callback); + cls.debug_use_opencl_debug = BoolProperty(name="Debug OpenCL", default=False) @classmethod diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 7c1e3e270fb..3a689913230 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -1529,6 +1529,7 @@ class CyclesRender_PT_debug(CyclesButtonsPanel, Panel): col.label('OpenCL Flags:') col.prop(cscene, "debug_opencl_kernel_type", text="Kernel") col.prop(cscene, "debug_opencl_device_type", text="Device") + col.prop(cscene, "debug_opencl_kernel_single_program", text="Single Program") col.prop(cscene, "debug_use_opencl_debug", text="Debug") diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 75118c43747..fc0df3410c6 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -106,6 +106,7 @@ bool debug_flags_sync_from_scene(BL::Scene b_scene) } /* Synchronize other OpenCL flags. */ flags.opencl.debug = get_boolean(cscene, "debug_use_opencl_debug"); + flags.opencl.single_program = get_boolean(cscene, "debug_opencl_kernel_single_program"); return flags.opencl.device_type != opencl_device_type || flags.opencl.kernel_type != opencl_kernel_type; } diff --git a/intern/cycles/device/opencl/opencl.h b/intern/cycles/device/opencl/opencl.h index 14e1db7a7aa..1c47dd18c2d 100644 --- a/intern/cycles/device/opencl/opencl.h +++ b/intern/cycles/device/opencl/opencl.h @@ -90,6 +90,7 @@ public: cl_device_id device_id); static void get_usable_devices(vector<OpenCLPlatformDevice> *usable_devices, bool force_all = false); + static bool use_single_program(); }; /* Thread safe cache for contexts and programs. diff --git a/intern/cycles/device/opencl/opencl_split.cpp b/intern/cycles/device/opencl/opencl_split.cpp index be931599e39..4c6c9387864 100644 --- a/intern/cycles/device/opencl/opencl_split.cpp +++ b/intern/cycles/device/opencl/opencl_split.cpp @@ -77,16 +77,18 @@ public: virtual bool load_kernels(const DeviceRequestedFeatures& requested_features, vector<OpenCLDeviceBase::OpenCLProgram*> &programs) { + bool single_program = OpenCLInfo::use_single_program(); program_data_init = OpenCLDeviceBase::OpenCLProgram(this, - "split_data_init", - "kernel_data_init.cl", + single_program ? "split" : "split_data_init", + single_program ? "kernel_split.cl" : "kernel_data_init.cl", get_build_options(this, requested_features)); + program_data_init.add_kernel(ustring("path_trace_data_init")); programs.push_back(&program_data_init); program_state_buffer_size = OpenCLDeviceBase::OpenCLProgram(this, - "split_state_buffer_size", - "kernel_state_buffer_size.cl", + single_program ? "split" : "split_state_buffer_size", + single_program ? "kernel_split.cl" : "kernel_state_buffer_size.cl", get_build_options(this, requested_features)); program_state_buffer_size.add_kernel(ustring("path_trace_state_buffer_size")); programs.push_back(&program_state_buffer_size); @@ -209,10 +211,13 @@ public: { OpenCLSplitKernelFunction* kernel = new OpenCLSplitKernelFunction(device); - kernel->program = OpenCLDeviceBase::OpenCLProgram(device, - "split_" + kernel_name, - "kernel_" + kernel_name + ".cl", - get_build_options(device, requested_features)); + bool single_program = OpenCLInfo::use_single_program(); + kernel->program = + OpenCLDeviceBase::OpenCLProgram(device, + single_program ? "split" : "split_" + kernel_name, + single_program ? "kernel_split.cl" : "kernel_" + kernel_name + ".cl", + get_build_options(device, requested_features)); + kernel->program.add_kernel(ustring("path_trace_" + kernel_name)); kernel->program.load(); diff --git a/intern/cycles/device/opencl/opencl_util.cpp b/intern/cycles/device/opencl/opencl_util.cpp index d5c19bf5386..e2d0ff71786 100644 --- a/intern/cycles/device/opencl/opencl_util.cpp +++ b/intern/cycles/device/opencl/opencl_util.cpp @@ -552,6 +552,11 @@ bool OpenCLInfo::use_debug() return DebugFlags().opencl.debug; } +bool OpenCLInfo::use_single_program() +{ + return DebugFlags().opencl.single_program; +} + bool OpenCLInfo::kernel_use_advanced_shading(const string& platform) { /* keep this in sync with kernel_types.h! */ diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index e285c382946..18c352d835c 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -16,6 +16,7 @@ set(SRC kernels/cpu/kernel_split.cpp kernels/opencl/kernel.cl kernels/opencl/kernel_state_buffer_size.cl + kernels/opencl/kernel_split.cl kernels/opencl/kernel_data_init.cl kernels/opencl/kernel_path_init.cl kernels/opencl/kernel_queue_enqueue.cl @@ -412,6 +413,7 @@ endif() delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "kernels/opencl/kernel.cl" ${CYCLES_INSTALL_PATH}/kernel/kernels/opencl) delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "kernels/opencl/kernel_state_buffer_size.cl" ${CYCLES_INSTALL_PATH}/kernel/kernels/opencl) +delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "kernels/opencl/kernel_split.cl" ${CYCLES_INSTALL_PATH}/kernel/kernels/opencl) delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "kernels/opencl/kernel_data_init.cl" ${CYCLES_INSTALL_PATH}/kernel/kernels/opencl) delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "kernels/opencl/kernel_path_init.cl" ${CYCLES_INSTALL_PATH}/kernel/kernels/opencl) delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "kernels/opencl/kernel_queue_enqueue.cl" ${CYCLES_INSTALL_PATH}/kernel/kernels/opencl) diff --git a/intern/cycles/util/util_debug.cpp b/intern/cycles/util/util_debug.cpp index f12c5e28c80..da3ccae45bf 100644 --- a/intern/cycles/util/util_debug.cpp +++ b/intern/cycles/util/util_debug.cpp @@ -77,7 +77,8 @@ void DebugFlags::CUDA::reset() DebugFlags::OpenCL::OpenCL() : device_type(DebugFlags::OpenCL::DEVICE_ALL), kernel_type(DebugFlags::OpenCL::KERNEL_DEFAULT), - debug(false) + debug(false), + single_program(false) { reset(); } @@ -117,6 +118,7 @@ void DebugFlags::OpenCL::reset() } /* Initialize other flags from environment variables. */ debug = (getenv("CYCLES_OPENCL_DEBUG") != NULL); + single_program = (getenv("CYCLES_OPENCL_SINGLE_PROGRAM") != NULL); } DebugFlags::DebugFlags() @@ -179,9 +181,10 @@ std::ostream& operator <<(std::ostream &os, break; } os << "OpenCL flags:\n" - << " Device type : " << opencl_device_type << "\n" - << " Kernel type : " << opencl_kernel_type << "\n" - << " Debug : " << string_from_bool(debug_flags.opencl.debug) + << " Device type : " << opencl_device_type << "\n" + << " Kernel type : " << opencl_kernel_type << "\n" + << " Debug : " << string_from_bool(debug_flags.opencl.debug) << "\n" + << " Signle program : " << string_from_bool(debug_flags.opencl.single_program) << "\n"; return os; } diff --git a/intern/cycles/util/util_debug.h b/intern/cycles/util/util_debug.h index 911c95de4ab..5aa0d911884 100644 --- a/intern/cycles/util/util_debug.h +++ b/intern/cycles/util/util_debug.h @@ -112,6 +112,9 @@ public: /* Use debug version of the kernel. */ bool debug; + + /* Use single program */ + bool single_program; }; /* Get instance of debug flags registry. */ |