[Libreoffice-commits] core.git: Branch 'private/tml/opencl-default-1' - 6 commits - officecfg/registry sc/source

Tor Lillqvist tml at collabora.com
Wed Nov 12 11:49:40 PST 2014


 officecfg/registry/schema/org/openoffice/Office/Calc.xcs |    2 
 sc/source/core/inc/openclwrapper.hxx                     |    2 
 sc/source/core/opencl/opencl_device.cxx                  |   26 +++
 sc/source/core/opencl/openclwrapper.cxx                  |  117 ++++++---------
 sc/source/core/tool/calcconfig.cxx                       |    2 
 5 files changed, 83 insertions(+), 66 deletions(-)

New commits:
commit 3c00552dac97adea3419d6e97e08047d214cbc4c
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Nov 12 21:49:05 2014 +0200

    Check blacklist and whitelist here, too
    
    Change-Id: I0e411dccf445cb8d1e2e5238c1164d7ac18d8636

diff --git a/sc/source/core/opencl/opencl_device.cxx b/sc/source/core/opencl/opencl_device.cxx
index 2703040..958fd1a 100644
--- a/sc/source/core/opencl/opencl_device.cxx
+++ b/sc/source/core/opencl/opencl_device.cxx
@@ -26,6 +26,8 @@
 #include <boost/scoped_ptr.hpp>
 
 #include "opencl_device.hxx"
+#include "openclwrapper.hxx"
+#include "platforminfo.hxx"
 
 #define INPUTSIZE  15360
 #define OUTPUTSIZE 15360
@@ -400,6 +402,30 @@ ds_status pickBestDevice(ds_profile* profile, int* bestDeviceIdx)
         ds_device device = profile->devices[d];
         LibreOfficeDeviceScore *pScore = (LibreOfficeDeviceScore*)device.score;
 
+        // Check blacklist and whitelist for actual devices
+        if (device.type == DS_DEVICE_OPENCL_DEVICE)
+        {
+            // There is a silly impedance mismatch here. Why do we
+            // need two different ways to describe an OpenCL platform
+            // and an OpenCL device driver?
+
+            OpenCLPlatformInfo aPlatform;
+            OpenCLDeviceInfo aDevice;
+
+            // We know that only the below fields are used by checkForKnownBadCompilers()
+            aPlatform.maVendor = OUString(device.oclPlatformVendor, strlen(device.oclPlatformVendor), RTL_TEXTENCODING_UTF8);
+            aDevice.maName = OUString(device.oclDeviceName, strlen(device.oclDeviceName), RTL_TEXTENCODING_UTF8);
+            aDevice.maDriver = OUString(device.oclDriverVersion, strlen(device.oclDriverVersion), RTL_TEXTENCODING_UTF8);
+
+            // If blacklisted or not whitelisted, ignore it
+            if (opencl::checkForKnownBadCompilers(aPlatform, aDevice))
+            {
+                SAL_INFO("sc.opencl.device", "Device[" << d << "] " << device.oclDeviceName << " is blacklisted or not whitelisted");
+                pScore->fTime = DBL_MAX;
+                pScore->bNoCLErrors = true;
+            }
+        }
+
         double fScore = DBL_MAX;
         if (pScore)
         {
commit 133ba236ac7367d3ce4a506fe93fb6eb144f48c1
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Nov 12 21:45:55 2014 +0200

    Make checkForKnownBadCompilers() public
    
    Change-Id: Icddf3c158e5f45d30467d3da82c197901d8bc380

diff --git a/sc/source/core/inc/openclwrapper.hxx b/sc/source/core/inc/openclwrapper.hxx
index 1f11ffc..3da4afe 100644
--- a/sc/source/core/inc/openclwrapper.hxx
+++ b/sc/source/core/inc/openclwrapper.hxx
@@ -102,6 +102,8 @@ bool switchOpenCLDevice(const OUString* pDeviceId, bool bAutoSelect,
 
 void getOpenCLDeviceInfo(size_t& rDeviceId, size_t& rPlatformId);
 
+bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCLDeviceInfo& rDevice);
+
 }}
 
 #endif
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index 2759fcd..87cc1c5 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -564,27 +564,6 @@ bool match(const ScCalcConfig::OpenCLImplMatcherSet& rList, const OpenCLPlatform
 }
 
 // based on crashes and hanging during kernel compilation
-bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCLDeviceInfo& rDevice)
-{
-    // Check blacklist of known bad OpenCL implementations
-    if (match(ScInterpreter::GetGlobalConfig().maOpenCLBlackList, rPlatform, rDevice, "blacklist"))
-    {
-        SAL_INFO("sc.opencl", "Rejecting");
-        return true;
-    }
-
-    // Check for whitelist of known good OpenCL implementations
-    if (match(ScInterpreter::GetGlobalConfig().maOpenCLWhiteList, rPlatform, rDevice, "whitelist"))
-    {
-        SAL_INFO("sc.opencl", "Approving");
-        return false;
-    }
-
-    // Fallback: reject
-    SAL_INFO("sc.opencl", "Fallback: rejecting platform=" << rPlatform << ", device=" << rDevice);
-    return true;
-}
-
 void createDeviceInfo(cl_device_id aDeviceId, OpenCLPlatformInfo& rPlatformInfo)
 {
     OpenCLDeviceInfo aDeviceInfo;
@@ -685,6 +664,27 @@ bool createPlatformInfo(cl_platform_id nPlatformId, OpenCLPlatformInfo& rPlatfor
 
 }
 
+bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCLDeviceInfo& rDevice)
+{
+    // Check blacklist of known bad OpenCL implementations
+    if (match(ScInterpreter::GetGlobalConfig().maOpenCLBlackList, rPlatform, rDevice, "blacklist"))
+    {
+        SAL_INFO("sc.opencl", "Rejecting");
+        return true;
+    }
+
+    // Check for whitelist of known good OpenCL implementations
+    if (match(ScInterpreter::GetGlobalConfig().maOpenCLWhiteList, rPlatform, rDevice, "whitelist"))
+    {
+        SAL_INFO("sc.opencl", "Approving");
+        return false;
+    }
+
+    // Fallback: reject
+    SAL_INFO("sc.opencl", "Fallback: rejecting platform=" << rPlatform << ", device=" << rDevice);
+    return true;
+}
+
 const std::vector<OpenCLPlatformInfo>& fillOpenCLInfo()
 {
     static std::vector<OpenCLPlatformInfo> aPlatforms;
commit c0b9b011d91d18c78b127b99e9d00283110a5a25
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Nov 12 20:57:15 2014 +0200

    Specify platform vendor, not platform name
    
    Change-Id: I4dc457a08d3baa48d461c27d325638735689f5fe

diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
index 829ad6a..753dda3 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
@@ -1394,7 +1394,7 @@
           <info>
             <desc>Combinations of (OS, OS version, OpenCL platform vendor, OpenCL device name, OpenCL driver version) that are known to be good. Has higher priority than OpenCLBlackList. Each entry is a string consisting of five parts separated by slashes. In case a slash occurs inside a part, it is prefixed by a backslash. And in case a backslash occurs inside a part, it is also prefixed by another backslash. Any part might contain a single asterisk as a wildcard, matching any value, but there is no more generic regexp support.</desc>
           </info>
-          <value oor:separator=";">Linux/*/AMD Accelerated Parallel Processing/*/1445.5 (sse2,avx)/</value>
+          <value oor:separator=";">Linux/*/Advanced Micro Devices, Inc./*/1445.5 (sse2,avx)/</value>
         </prop>
         <prop oor:name="OpenCLBlackList" oor:type="oor:string-list" oor:nillable="false">
           <!-- UIHints: Tools - Options  Spreadsheet  Formula -->
diff --git a/sc/source/core/tool/calcconfig.cxx b/sc/source/core/tool/calcconfig.cxx
index 1a2e69a..0d9b769 100644
--- a/sc/source/core/tool/calcconfig.cxx
+++ b/sc/source/core/tool/calcconfig.cxx
@@ -45,7 +45,7 @@ void ScCalcConfig::setOpenCLConfigToDefault()
     maOpenCLSubsetOpCodes.insert(ocAverage);
     maOpenCLSubsetOpCodes.insert(ocSumIfs);
 
-    maOpenCLWhiteList.insert(OpenCLImplMatcher("Linux", "*", "AMD Accelerated Parallel Processing", "*", "1445.5 (sse2,avx)", ""));
+    maOpenCLWhiteList.insert(OpenCLImplMatcher("Linux", "*", "Advanced Micro Devices, Inc.", "*", "1445.5 (sse2,avx)", ""));
 
     maOpenCLBlackList.insert(OpenCLImplMatcher("Windows", "*", "Intel(R) Corporation", "*", "9.17.10.2884", ""));
     maOpenCLBlackList.insert(OpenCLImplMatcher("SuperOS", "*", "Big Corp, Inc.", "Whizz\\Grafix", "4.2/beta;3", "4.4"));
commit 7257254004c61f20f2d1d0186930e911b64ca2d7
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Nov 12 20:56:11 2014 +0200

    We want the platform vendor here, not the platform name
    
    We already have the platform name in maName.
    
    Change-Id: Iec94ce72cbaba0adf1c82a90892ab98851f5c8ca

diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index 1db26ec..2759fcd 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -661,7 +661,7 @@ bool createPlatformInfo(cl_platform_id nPlatformId, OpenCLPlatformInfo& rPlatfor
     if(nState != CL_SUCCESS)
         return false;
 
-    rPlatformInfo.maVendor = OUString::createFromAscii(pName);
+    rPlatformInfo.maVendor = OUString::createFromAscii(pVendor);
 
     cl_uint nDevices;
     nState = clGetDeviceIDs(nPlatformId, CL_DEVICE_TYPE_ALL, 0, NULL, &nDevices);
commit b2175d1100506102d45b700b2dda324e7162a8f3
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Nov 12 20:45:07 2014 +0200

    Refactor and fix checkForKnownBadCompilers()
    
    Change-Id: Ib2ee1a726fd54c34728234bc1a6b25a05b4e98b5

diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index f91e062..1db26ec 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -517,81 +517,66 @@ bool OpenCLDevice::initOpenCLRunEnv( GPUEnv *gpuInfo )
 
 namespace {
 
-// based on crashes and hanging during kernel compilation
-bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCLDeviceInfo& rDevice)
+bool match(const ScCalcConfig::OpenCLImplMatcher& rListEntry, const OpenCLPlatformInfo& rPlatform, const OpenCLDeviceInfo& rDevice)
 {
-    // Check blacklist of known bad OpenCL implementations
-
-    for (auto i = ScInterpreter::GetGlobalConfig().maOpenCLBlackList.cbegin();
-         i != ScInterpreter::GetGlobalConfig().maOpenCLBlackList.end();
-         ++i)
-    {
-        SAL_INFO("sc.opencl", "Looking for match for platform=" << rPlatform << ", device=" << rDevice << " in blacklist entry=" << *i);
-
 #if defined WNT
-        if (i->maOS != "*" && i->maOS != "Windows")
-            continue;
+    if (rListEntry.maOS != "*" && rListEntry.maOS != "Windows")
+        return false;
 #elif defined LINUX
-        if (i->maOS != "*" && i->maOS != "Linux")
-            continue;
+    if (rListEntry.maOS != "*" && rListEntry.maOS != "Linux")
+        return false;
 #elif defined MACOSX
-        if (i->maOS != "*" && i->maOS != "OS X")
-            continue;
+    if (rListEntry.maOS != "*" && rListEntry.maOS != "OS X")
+        return false;
 #endif
 
-        // OS version check not yet implemented
-
-        if (i->maPlatformVendor != "*" && i->maPlatformVendor != rDevice.maVendor)
-            continue;
+    // OS version check not yet implemented
 
-        if (i->maDevice != "*" && i->maDevice != rDevice.maName)
-            continue;
+    if (rListEntry.maPlatformVendor != "*" && rListEntry.maPlatformVendor != rPlatform.maVendor)
+        return false;
 
-        if (i->maDriverVersionMin != "*" &&
-            (comphelper::string::compareVersionStrings(i->maDriverVersionMin, rDevice.maDriver) > 0 ||
-             (i->maDriverVersionMax != "" && comphelper::string::compareVersionStrings(i->maDriverVersionMax, rDevice.maDriver) < 0) ||
-             (i->maDriverVersionMax == "" && comphelper::string::compareVersionStrings(i->maDriverVersionMin, rDevice.maDriver) < 0)))
-            continue;
+    if (rListEntry.maDevice != "*" && rListEntry.maDevice != rDevice.maName)
+        return false;
 
-        // It matches; reject it
-        SAL_INFO("sc.opencl", "Match! Rejecting");
-        return true;
-    }
+    if (rListEntry.maDriverVersionMin != "*" &&
+        (comphelper::string::compareVersionStrings(rListEntry.maDriverVersionMin, rDevice.maDriver) > 0 ||
+         (rListEntry.maDriverVersionMax != "" && comphelper::string::compareVersionStrings(rListEntry.maDriverVersionMax, rDevice.maDriver) < 0) ||
+         (rListEntry.maDriverVersionMax == "" && comphelper::string::compareVersionStrings(rListEntry.maDriverVersionMin, rDevice.maDriver) < 0)))
+        return false;
 
-    // Check for whitelist of known good OpenCL implementations
+    return true;
+}
 
-    for (auto i = ScInterpreter::GetGlobalConfig().maOpenCLWhiteList.cbegin();
-         i != ScInterpreter::GetGlobalConfig().maOpenCLWhiteList.end();
-         ++i)
+bool match(const ScCalcConfig::OpenCLImplMatcherSet& rList, const OpenCLPlatformInfo& rPlatform, const OpenCLDeviceInfo& rDevice, const char* sKindOfList)
+{
+    for (auto i = rList.cbegin(); i != rList.end(); ++i)
     {
-        SAL_INFO("sc.opencl", "Looking for match for platform=" << rPlatform << ", device=" << rDevice << " in whitelist entry=" << *i);
+        SAL_INFO("sc.opencl", "Looking for match for platform=" << rPlatform << ", device=" << rDevice <<
+                 " in " << sKindOfList << " entry=" << *i);
 
-#if defined WNT
-        if (i->maOS != "*" && i->maOS != "Windows")
-            continue;
-#elif defined LINUX
-        if (i->maOS != "*" && i->maOS != "Linux")
-            continue;
-#elif defined MACOSX
-        if (i->maOS != "*" && i->maOS != "OS X")
-            continue;
-#endif
-
-        // OS version check not yet implemented
-
-        if (i->maPlatformVendor != "*" && i->maPlatformVendor != rPlatform.maVendor)
-            continue;
-
-        if (i->maDevice != "*" && i->maDevice != rDevice.maName)
-            continue;
+        if (match(*i, rPlatform, rDevice))
+        {
+            SAL_INFO("sc.opencl", "Match!");
+            return true;
+        }
+    }
+    return false;
+}
 
-        if (i->maDriverVersionMin != "*" &&
-            (comphelper::string::compareVersionStrings(i->maDriverVersionMin, rDevice.maDriver) > 0 ||
-             comphelper::string::compareVersionStrings(i->maDriverVersionMax, rDevice.maDriver) < 0))
-            continue;
+// based on crashes and hanging during kernel compilation
+bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCLDeviceInfo& rDevice)
+{
+    // Check blacklist of known bad OpenCL implementations
+    if (match(ScInterpreter::GetGlobalConfig().maOpenCLBlackList, rPlatform, rDevice, "blacklist"))
+    {
+        SAL_INFO("sc.opencl", "Rejecting");
+        return true;
+    }
 
-        // It matches; approve it
-        SAL_INFO("sc.opencl", "Match! Approving");
+    // Check for whitelist of known good OpenCL implementations
+    if (match(ScInterpreter::GetGlobalConfig().maOpenCLWhiteList, rPlatform, rDevice, "whitelist"))
+    {
+        SAL_INFO("sc.opencl", "Approving");
         return false;
     }
 
commit e2eaf71ff3f82c63b0282e9168f0687e38121fcd
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Nov 12 20:17:48 2014 +0200

    A bit more informative SAL_INFO logging
    
    Change-Id: I60c38129a532e3843db4a422755ae50e4689b91f

diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index c307371..f91e062 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -526,6 +526,8 @@ bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCL
          i != ScInterpreter::GetGlobalConfig().maOpenCLBlackList.end();
          ++i)
     {
+        SAL_INFO("sc.opencl", "Looking for match for platform=" << rPlatform << ", device=" << rDevice << " in blacklist entry=" << *i);
+
 #if defined WNT
         if (i->maOS != "*" && i->maOS != "Windows")
             continue;
@@ -552,7 +554,7 @@ bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCL
             continue;
 
         // It matches; reject it
-        SAL_INFO("sc.opencl", "Match for platform=" << rPlatform << ", device=" << rDevice << " in blacklist=" << *i);
+        SAL_INFO("sc.opencl", "Match! Rejecting");
         return true;
     }
 
@@ -562,6 +564,8 @@ bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCL
          i != ScInterpreter::GetGlobalConfig().maOpenCLWhiteList.end();
          ++i)
     {
+        SAL_INFO("sc.opencl", "Looking for match for platform=" << rPlatform << ", device=" << rDevice << " in whitelist entry=" << *i);
+
 #if defined WNT
         if (i->maOS != "*" && i->maOS != "Windows")
             continue;
@@ -587,7 +591,7 @@ bool checkForKnownBadCompilers(const OpenCLPlatformInfo& rPlatform, const OpenCL
             continue;
 
         // It matches; approve it
-        SAL_INFO("sc.opencl", "Match for platform=" << rPlatform << ", device=" << rDevice << " in whitelist=" << *i);
+        SAL_INFO("sc.opencl", "Match! Approving");
         return false;
     }
 


More information about the Libreoffice-commits mailing list