Created
June 7, 2019 00:52
-
-
Save bmount/f5c46afde90d1df23f511cb74eedbd0b to your computer and use it in GitHub Desktop.
minimal diff showing kernel re-use
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/runtime/opencl.cpp b/src/runtime/opencl.cpp | |
index 3fb98b4..4b5eca2 100644 | |
--- a/src/runtime/opencl.cpp | |
+++ b/src/runtime/opencl.cpp | |
+} // extern C | |
+ | |
+#include <map> | |
+struct kernel_cache_t { bool cached; cl_kernel kernel; inline kernel_cache_t() : cached(false) {} }; | |
+std::map<const char*, kernel_cache_t> precompiled_kernels; | |
+ | |
+extern "C" { | |
+ | |
WEAK int halide_opencl_run(void *user_context, | |
void *state_ptr, | |
const char* entry_name, | |
@@ -924,7 +932,7 @@ WEAK int halide_opencl_run(void *user_context, | |
<< "shmem: " << shared_mem_bytes << "\n"; | |
- cl_int err; | |
+ cl_int err = CL_SUCCESS; | |
ClContext ctx(user_context); | |
if (ctx.error != CL_SUCCESS) { | |
return ctx.error; | |
@@ -937,10 +945,19 @@ WEAK int halide_opencl_run(void *user_context, | |
// Create kernel object for entry_name from the program for this module. | |
halide_assert(user_context, state_ptr); | |
cl_program program = ((module_state*)state_ptr)->program; | |
- | |
halide_assert(user_context, program); | |
- debug(user_context) << " clCreateKernel " << entry_name << " -> "; | |
- cl_kernel f = clCreateKernel(program, entry_name, &err); | |
+ | |
+ kernel_cache_t& entry = precompiled_kernels[entry_name]; | |
+ cl_kernel f; | |
+ | |
+ if (!entry.cached) { | |
+ debug(user_context) << " clCreateKernel " << entry_name << " -> "; | |
+ f = clCreateKernel(program, entry_name, &err); | |
+ entry.cached = true; | |
+ entry.kernel = f; | |
+ } else { | |
+ f = entry.kernel; | |
+ } | |
if (err != CL_SUCCESS) { | |
debug(user_context) << get_opencl_error_name(err) << "\n"; | |
error(user_context) << "CL: clCreateKernel " << entry_name << " failed: " | |
@@ -1055,9 +1072,9 @@ WEAK int halide_opencl_run(void *user_context, | |
return err; | |
} | |
- debug(user_context) << " Releasing kernel " << (void *)f << "\n"; | |
- clReleaseKernel(f); | |
- debug(user_context) << " clReleaseKernel finished" << (void *)f << "\n"; | |
+ //debug(user_context) << " Releasing kernel " << (void *)f << "\n"; | |
+ //clReleaseKernel(f); | |
+ //debug(user_context) << " clReleaseKernel finished" << (void *)f << "\n"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment