Skip to content

Instantly share code, notes, and snippets.

@bmount
Created June 7, 2019 00:52
Show Gist options
  • Save bmount/f5c46afde90d1df23f511cb74eedbd0b to your computer and use it in GitHub Desktop.
Save bmount/f5c46afde90d1df23f511cb74eedbd0b to your computer and use it in GitHub Desktop.
minimal diff showing kernel re-use
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