From 5cf4d94a3fecc3a2932ccdcdbdbe266707aedec2 Mon Sep 17 00:00:00 2001
From: MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
Date: Tue, 10 Jul 2018 05:20:32 +0900
Subject: [PATCH] [RUNTIME][OPENCL] Create program lazily when the program is
 built (#1408)

---
 src/runtime/opencl/opencl_module.cc | 38 ++++++++++++++---------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/src/runtime/opencl/opencl_module.cc b/src/runtime/opencl/opencl_module.cc
index 424a6dccf..68907d11c 100644
--- a/src/runtime/opencl/opencl_module.cc
+++ b/src/runtime/opencl/opencl_module.cc
@@ -162,25 +162,6 @@ void OpenCLModuleNode::Init() {
   workspace_ = GetGlobalWorkspace();
   workspace_->Init();
   CHECK(workspace_->context != nullptr) << "No OpenCL device";
-  if (fmt_ == "cl") {
-    const char* s = data_.c_str();
-    size_t len = data_.length();
-    cl_int err;
-    program_ = clCreateProgramWithSource(
-        workspace_->context, 1, &s, &len, &err);
-    OPENCL_CHECK_ERROR(err);
-  } else if (fmt_ == "xclbin" || fmt_ == "awsxclbin") {
-    const unsigned char* s = (const unsigned char *)data_.c_str();
-    size_t len = data_.length();
-    cl_int err;
-    program_ = clCreateProgramWithBinary(
-        workspace_->context, 1, &(workspace_->devices[0]), &len, &s, NULL, &err);
-    if (err != CL_SUCCESS) {
-      LOG(ERROR) << "OpenCL Error: " << cl::CLGetErrorString(err);
-    }
-  } else {
-    LOG(FATAL) << "Unknown OpenCL format " << fmt_;
-  }
   device_built_flag_.resize(workspace_->devices.size(), false);
   // initialize the kernel id, need to lock global table.
   std::lock_guard<std::mutex> lock(workspace_->mu);
@@ -205,6 +186,25 @@ cl_kernel OpenCLModuleNode::InstallKernel(cl::OpenCLWorkspace* w,
   std::lock_guard<std::mutex> lock(build_lock_);
   int device_id = t->context.device_id;
   if (!device_built_flag_[device_id]) {
+    // create program
+    if (fmt_ == "cl") {
+      if (program_ == nullptr) {
+        const char* s = data_.c_str();
+        size_t len = data_.length();
+        cl_int err;
+        program_ = clCreateProgramWithSource(w->context, 1, &s, &len, &err);
+        OPENCL_CHECK_ERROR(err);
+      }
+    } else if (fmt_ == "xclbin" || fmt_ == "awsxclbin") {
+      const unsigned char* s = (const unsigned char *)data_.c_str();
+      size_t len = data_.length();
+      cl_int err;
+      cl_device_id dev = w->devices[device_id];
+      program_ = clCreateProgramWithBinary(w->context, 1, &dev, &len, &s, NULL, &err);
+      OPENCL_CHECK_ERROR(err);
+    } else {
+      LOG(FATAL) << "Unknown OpenCL format " << fmt_;
+    }
     // build program
     cl_int err;
     cl_device_id dev = w->devices[device_id];
-- 
GitLab