Skip to content

Commit 0595ab3

Browse files
committed
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.
1 parent 800294a commit 0595ab3

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

modules/core/src/ocl.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,6 +1163,7 @@ struct Device::Impl
11631163
maxWorkGroupSize_ = getProp<size_t, size_t>(CL_DEVICE_MAX_WORK_GROUP_SIZE);
11641164
type_ = getProp<cl_device_type, int>(CL_DEVICE_TYPE);
11651165
driverVersion_ = getStrProp(CL_DRIVER_VERSION);
1166+
addressBits_ = getProp<cl_uint, int>(CL_DEVICE_ADDRESS_BITS);
11661167

11671168
String deviceVersion_ = getStrProp(CL_DEVICE_VERSION);
11681169
parseDeviceVersion(deviceVersion_, deviceVersionMajor_, deviceVersionMinor_);
@@ -1240,6 +1241,7 @@ struct Device::Impl
12401241
int maxComputeUnits_;
12411242
size_t maxWorkGroupSize_;
12421243
int type_;
1244+
int addressBits_;
12431245
int deviceVersionMajor_;
12441246
int deviceVersionMinor_;
12451247
String driverVersion_;
@@ -1335,7 +1337,7 @@ int Device::type() const
13351337
{ return p ? p->type_ : 0; }
13361338

13371339
int Device::addressBits() const
1338-
{ return p ? p->getProp<cl_uint, int>(CL_DEVICE_ADDRESS_BITS) : 0; }
1340+
{ return p ? p->addressBits_ : 0; }
13391341

13401342
bool Device::available() const
13411343
{ return p ? p->getBoolProp(CL_DEVICE_AVAILABLE) : false; }
@@ -2062,7 +2064,10 @@ struct Context::Impl
20622064
{
20632065
CV_Assert(!devices.empty());
20642066
const Device& d = devices[0];
2065-
prefix = d.vendorName() + "--" + d.name() + "--" + d.driverVersion();
2067+
int bits = d.addressBits();
2068+
if (bits > 0 && bits != 64)
2069+
prefix = cv::format("%d-bit--", bits);
2070+
prefix += d.vendorName() + "--" + d.name() + "--" + d.driverVersion();
20662071
// sanitize chars
20672072
for (size_t i = 0; i < prefix.size(); i++)
20682073
{
@@ -2081,7 +2086,10 @@ struct Context::Impl
20812086
if (prefix_base.empty())
20822087
{
20832088
const Device& d = devices[0];
2084-
prefix_base = d.vendorName() + "--" + d.name() + "--";
2089+
int bits = d.addressBits();
2090+
if (bits > 0 && bits != 64)
2091+
prefix_base = cv::format("%d-bit--", bits);
2092+
prefix_base += d.vendorName() + "--" + d.name() + "--";
20852093
// sanitize chars
20862094
for (size_t i = 0; i < prefix_base.size(); i++)
20872095
{

modules/ts/src/ocl_test.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ void dumpOpenCLDevice()
159159
DUMP_MESSAGE_STDOUT(" Driver version = " << device.driverVersion());
160160
DUMP_PROPERTY_XML("cv_ocl_current_driverVersion", device.driverVersion());
161161

162+
DUMP_MESSAGE_STDOUT(" Address bits = " << device.addressBits());
163+
DUMP_PROPERTY_XML("cv_ocl_current_addressBits", device.addressBits());
164+
162165
DUMP_MESSAGE_STDOUT(" Compute units = "<< device.maxComputeUnits());
163166
DUMP_PROPERTY_XML("cv_ocl_current_maxComputeUnits", device.maxComputeUnits());
164167

0 commit comments

Comments
 (0)