[Libreoffice-commits] core.git: Branch 'libreoffice-5-2' - include/opencl opencl/source

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Wed Oct 19 10:00:15 UTC 2016


 include/opencl/openclwrapper.hxx |    1 
 opencl/source/openclwrapper.cxx  |   81 +++++++++++++++++++++++----------------
 2 files changed, 49 insertions(+), 33 deletions(-)

New commits:
commit 4969015d138cbd9b20bf3a9bee0af9d6222f1a68
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Thu Oct 13 12:55:57 2016 +0200

    tdf#103204 opencl: initialize command queue on demand
    
    Change-Id: Ie3da1d6ec91e951b1ffc15abf376c7af57789e47
    Reviewed-on: https://gerrit.libreoffice.org/29802
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
    Tested-by: Tomaž Vajngerl <quikee at gmail.com>
    (cherry picked from commit 4eea4af8924e3b1bb00c22cf1f9d21fc4dec6e83)
    Reviewed-on: https://gerrit.libreoffice.org/29994
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/include/opencl/openclwrapper.hxx b/include/opencl/openclwrapper.hxx
index dae1192..233412f 100644
--- a/include/opencl/openclwrapper.hxx
+++ b/include/opencl/openclwrapper.hxx
@@ -42,6 +42,7 @@ struct OPENCL_DLLPUBLIC GPUEnv
     cl_context mpContext;
     cl_device_id mpDevID;
     cl_command_queue mpCmdQueue[OPENCL_CMDQUEUE_SIZE];
+    bool mbCommandQueueInitialized;
     cl_program mpArryPrograms[MAX_CLFILE_NUM]; //one program object maps one kernel source file
     int mnIsUserCreated; // 1: created , 0:no create and needed to create by opencl wrapper
     int mnCmdQueuePos;
diff --git a/opencl/source/openclwrapper.cxx b/opencl/source/openclwrapper.cxx
index d8d16c3..5d40a54 100644
--- a/opencl/source/openclwrapper.cxx
+++ b/opencl/source/openclwrapper.cxx
@@ -103,8 +103,54 @@ OString getCacheFolder()
 
 }
 
+bool initializeCommandQueue(GPUEnv& aGpuEnv)
+{
+    OpenCLZone zone;
+
+    cl_int nState;
+    cl_command_queue command_queue[OPENCL_CMDQUEUE_SIZE];
+
+    for (int i = 0; i < OPENCL_CMDQUEUE_SIZE; ++i)
+    {
+        command_queue[i] = clCreateCommandQueue(aGpuEnv.mpContext, aGpuEnv.mpDevID, 0, &nState);
+        if (nState != CL_SUCCESS)
+            SAL_WARN("opencl", "clCreateCommandQueue failed: " << errorString(nState));
+
+        if (command_queue[i] == nullptr || nState != CL_SUCCESS)
+        {
+            // Release all command queues created so far.
+            for (int j = 0; j <= i; ++j)
+            {
+                if (command_queue[j])
+                {
+                    clReleaseCommandQueue(command_queue[j]);
+                    command_queue[j] = nullptr;
+                }
+            }
+
+            clReleaseContext(aGpuEnv.mpContext);
+            SAL_WARN("opencl", "failed to set/switch opencl device");
+            return false;
+        }
+
+        SAL_INFO("opencl", "Created command queue " << command_queue[i] << " for context " << aGpuEnv.mpContext);
+    }
+
+    for (int i = 0; i < OPENCL_CMDQUEUE_SIZE; ++i)
+    {
+        aGpuEnv.mpCmdQueue[i] = command_queue[i];
+    }
+    aGpuEnv.mbCommandQueueInitialized = true;
+    return true;
+}
+
 void setKernelEnv( KernelEnv *envInfo )
 {
+    if (!gpuEnv.mbCommandQueueInitialized)
+    {
+        initializeCommandQueue(gpuEnv);
+    }
+
     envInfo->mpkContext = gpuEnv.mpContext;
     envInfo->mpkProgram = gpuEnv.mpArryPrograms[0];
 
@@ -265,8 +311,7 @@ bool initOpenCLAttr( OpenCLEnv * env )
 
     gpuEnv.mnIsUserCreated = 1;
 
-    for (int i = 0; i < OPENCL_CMDQUEUE_SIZE; ++i)
-        gpuEnv.mpCmdQueue[i] = env->mpOclCmdQueue[i];
+    gpuEnv.mbCommandQueueInitialized = false;
 
     gpuEnv.mnCmdQueuePos = 0; // default to 0.
 
@@ -765,7 +810,6 @@ bool switchOpenCLDevice(const OUString* pDevice, bool bAutoSelect, bool bForceEv
 
     cl_context context;
     cl_platform_id platformId;
-    cl_command_queue command_queue[OPENCL_CMDQUEUE_SIZE];
 
     {
         OpenCLZone zone;
@@ -790,33 +834,6 @@ bool switchOpenCLDevice(const OUString* pDevice, bool bAutoSelect, bool bForceEv
         }
         SAL_INFO("opencl", "Created context " << context << " for platform " << platformId << ", device " << pDeviceId);
 
-        for (int i = 0; i < OPENCL_CMDQUEUE_SIZE; ++i)
-        {
-            command_queue[i] = clCreateCommandQueue(
-                context, pDeviceId, 0, &nState);
-            if (nState != CL_SUCCESS)
-                SAL_WARN("opencl", "clCreateCommandQueue failed: " << errorString(nState));
-
-            if (command_queue[i] == nullptr || nState != CL_SUCCESS)
-            {
-                // Release all command queues created so far.
-                for (int j = 0; j <= i; ++j)
-                {
-                    if (command_queue[j])
-                    {
-                        clReleaseCommandQueue(command_queue[j]);
-                        command_queue[j] = nullptr;
-                    }
-                }
-
-                clReleaseContext(context);
-                SAL_WARN("opencl", "failed to set/switch opencl device");
-                return false;
-            }
-
-            SAL_INFO("opencl", "Created command queue " << command_queue[i] << " for context " << context);
-        }
-
         OString sDeviceID = getDeviceInfoString(pDeviceId, CL_DEVICE_VENDOR) + " " + getDeviceInfoString(pDeviceId, CL_DRIVER_VERSION);
         rOutSelectedDeviceVersionIDString = OStringToOUString(sDeviceID, RTL_TEXTENCODING_UTF8);
     }
@@ -824,14 +841,12 @@ bool switchOpenCLDevice(const OUString* pDevice, bool bAutoSelect, bool bForceEv
     setOpenCLCmdQueuePosition(0); // Call this just to avoid the method being deleted from unused function deleter.
 
     releaseOpenCLEnv(&gpuEnv);
+
     OpenCLEnv env;
     env.mpOclPlatformID = platformId;
     env.mpOclContext = context;
     env.mpOclDevsID = pDeviceId;
 
-    for (int i = 0; i < OPENCL_CMDQUEUE_SIZE; ++i)
-        env.mpOclCmdQueue[i] = command_queue[i];
-
     initOpenCLAttr(&env);
 
     return !initOpenCLRunEnv(0);


More information about the Libreoffice-commits mailing list