From 0595ab3eefcc24832142fdd0aca1bc4a1343e7c7 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 1 Dec 2017 14:02:20 +0300 Subject: [PATCH] ocl: fix usage of invalid OpenCL cache on mixed 64/32-bit platforms Observed during launch of 32/64-bit applications on Windows. Added '32-bit' prefix for 32-bit OpenCL devices. No prefix on 64-bit configurations. --- modules/core/src/ocl.cpp | 14 +++++++++++--- modules/ts/src/ocl_test.cpp | 3 +++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index b368fc6..778efe9 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1163,6 +1163,7 @@ struct Device::Impl maxWorkGroupSize_ = getProp(CL_DEVICE_MAX_WORK_GROUP_SIZE); type_ = getProp(CL_DEVICE_TYPE); driverVersion_ = getStrProp(CL_DRIVER_VERSION); + addressBits_ = getProp(CL_DEVICE_ADDRESS_BITS); String deviceVersion_ = getStrProp(CL_DEVICE_VERSION); parseDeviceVersion(deviceVersion_, deviceVersionMajor_, deviceVersionMinor_); @@ -1240,6 +1241,7 @@ struct Device::Impl int maxComputeUnits_; size_t maxWorkGroupSize_; int type_; + int addressBits_; int deviceVersionMajor_; int deviceVersionMinor_; String driverVersion_; @@ -1335,7 +1337,7 @@ int Device::type() const { return p ? p->type_ : 0; } int Device::addressBits() const -{ return p ? p->getProp(CL_DEVICE_ADDRESS_BITS) : 0; } +{ return p ? p->addressBits_ : 0; } bool Device::available() const { return p ? p->getBoolProp(CL_DEVICE_AVAILABLE) : false; } @@ -2062,7 +2064,10 @@ struct Context::Impl { CV_Assert(!devices.empty()); const Device& d = devices[0]; - prefix = d.vendorName() + "--" + d.name() + "--" + d.driverVersion(); + int bits = d.addressBits(); + if (bits > 0 && bits != 64) + prefix = cv::format("%d-bit--", bits); + prefix += d.vendorName() + "--" + d.name() + "--" + d.driverVersion(); // sanitize chars for (size_t i = 0; i < prefix.size(); i++) { @@ -2081,7 +2086,10 @@ struct Context::Impl if (prefix_base.empty()) { const Device& d = devices[0]; - prefix_base = d.vendorName() + "--" + d.name() + "--"; + int bits = d.addressBits(); + if (bits > 0 && bits != 64) + prefix_base = cv::format("%d-bit--", bits); + prefix_base += d.vendorName() + "--" + d.name() + "--"; // sanitize chars for (size_t i = 0; i < prefix_base.size(); i++) { diff --git a/modules/ts/src/ocl_test.cpp b/modules/ts/src/ocl_test.cpp index 7c4d7d6..6e25468 100644 --- a/modules/ts/src/ocl_test.cpp +++ b/modules/ts/src/ocl_test.cpp @@ -159,6 +159,9 @@ void dumpOpenCLDevice() DUMP_MESSAGE_STDOUT(" Driver version = " << device.driverVersion()); DUMP_PROPERTY_XML("cv_ocl_current_driverVersion", device.driverVersion()); + DUMP_MESSAGE_STDOUT(" Address bits = " << device.addressBits()); + DUMP_PROPERTY_XML("cv_ocl_current_addressBits", device.addressBits()); + DUMP_MESSAGE_STDOUT(" Compute units = "<< device.maxComputeUnits()); DUMP_PROPERTY_XML("cv_ocl_current_maxComputeUnits", device.maxComputeUnits()); -- 2.7.4