Merge pull request #9603 from alalek:ocl_device_extensions

pull/9623/head
Vadim Pisarevsky 8 years ago
commit 32bb71d686
  1. 2
      modules/core/include/opencv2/core/ocl.hpp
  2. 46
      modules/core/src/ocl.cpp
  3. 17
      modules/ts/src/ocl_test.cpp

@ -91,6 +91,7 @@ public:
String name() const; String name() const;
String extensions() const; String extensions() const;
bool isExtensionSupported(const String& extensionName) const;
String version() const; String version() const;
String vendorName() const; String vendorName() const;
String OpenCL_C_Version() const; String OpenCL_C_Version() const;
@ -160,6 +161,7 @@ public:
uint imagePitchAlignment() const; uint imagePitchAlignment() const;
uint imageBaseAddressAlignment() const; uint imageBaseAddressAlignment() const;
/// deprecated, use isExtensionSupported() method (probably with "cl_khr_subgroups" value)
bool intelSubgroupsSupport() const; bool intelSubgroupsSupport() const;
size_t image2DMaxWidth() const; size_t image2DMaxWidth() const;

@ -43,6 +43,7 @@
#include <list> #include <list>
#include <map> #include <map>
#include <deque> #include <deque>
#include <set>
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <iostream> // std::cerr #include <iostream> // std::cerr
@ -518,6 +519,7 @@ struct Device::Impl
name_ = getStrProp(CL_DEVICE_NAME); name_ = getStrProp(CL_DEVICE_NAME);
version_ = getStrProp(CL_DEVICE_VERSION); version_ = getStrProp(CL_DEVICE_VERSION);
extensions_ = getStrProp(CL_DEVICE_EXTENSIONS);
doubleFPConfig_ = getProp<cl_device_fp_config, int>(CL_DEVICE_DOUBLE_FP_CONFIG); doubleFPConfig_ = getProp<cl_device_fp_config, int>(CL_DEVICE_DOUBLE_FP_CONFIG);
hostUnifiedMemory_ = getBoolProp(CL_DEVICE_HOST_UNIFIED_MEMORY); hostUnifiedMemory_ = getBoolProp(CL_DEVICE_HOST_UNIFIED_MEMORY);
maxComputeUnits_ = getProp<cl_uint, int>(CL_DEVICE_MAX_COMPUTE_UNITS); maxComputeUnits_ = getProp<cl_uint, int>(CL_DEVICE_MAX_COMPUTE_UNITS);
@ -528,6 +530,20 @@ struct Device::Impl
String deviceVersion_ = getStrProp(CL_DEVICE_VERSION); String deviceVersion_ = getStrProp(CL_DEVICE_VERSION);
parseDeviceVersion(deviceVersion_, deviceVersionMajor_, deviceVersionMinor_); parseDeviceVersion(deviceVersion_, deviceVersionMajor_, deviceVersionMinor_);
size_t pos = 0;
while (pos < extensions_.size())
{
size_t pos2 = extensions_.find(' ', pos);
if (pos2 == String::npos)
pos2 = extensions_.size();
if (pos2 > pos)
{
std::string extensionName = extensions_.substr(pos, pos2 - pos);
extensions_set_.insert(extensionName);
}
pos = pos2 + 1;
}
intelSubgroupsSupport_ = isExtensionSupported("cl_intel_subgroups"); intelSubgroupsSupport_ = isExtensionSupported("cl_intel_subgroups");
vendorName_ = getStrProp(CL_DEVICE_VENDOR); vendorName_ = getStrProp(CL_DEVICE_VENDOR);
@ -569,23 +585,19 @@ struct Device::Impl
sz < sizeof(buf) ? String(buf) : String(); sz < sizeof(buf) ? String(buf) : String();
} }
bool isExtensionSupported(const String& extensionName) const bool isExtensionSupported(const std::string& extensionName) const
{ {
bool ret = false; return extensions_set_.count(extensionName) > 0;
size_t pos = getStrProp(CL_DEVICE_EXTENSIONS).find(extensionName);
if (pos != String::npos)
{
ret = true;
}
return ret;
} }
IMPLEMENT_REFCOUNTABLE(); IMPLEMENT_REFCOUNTABLE();
cl_device_id handle; cl_device_id handle;
String name_; String name_;
String version_; String version_;
std::string extensions_;
int doubleFPConfig_; int doubleFPConfig_;
bool hostUnifiedMemory_; bool hostUnifiedMemory_;
int maxComputeUnits_; int maxComputeUnits_;
@ -597,6 +609,8 @@ struct Device::Impl
String vendorName_; String vendorName_;
int vendorID_; int vendorID_;
bool intelSubgroupsSupport_; bool intelSubgroupsSupport_;
std::set<std::string> extensions_set_;
}; };
@ -651,7 +665,10 @@ String Device::name() const
{ return p ? p->name_ : String(); } { return p ? p->name_ : String(); }
String Device::extensions() const String Device::extensions() const
{ return p ? p->getStrProp(CL_DEVICE_EXTENSIONS) : String(); } { return p ? String(p->extensions_) : String(); }
bool Device::isExtensionSupported(const String& extensionName) const
{ return p ? p->isExtensionSupported(extensionName) : false; }
String Device::version() const String Device::version() const
{ return p ? p->version_ : String(); } { return p ? p->version_ : String(); }
@ -744,16 +761,7 @@ bool Device::imageSupport() const
bool Device::imageFromBufferSupport() const bool Device::imageFromBufferSupport() const
{ {
bool ret = false; return p ? p->isExtensionSupported("cl_khr_image2d_from_buffer") : false;
if (p)
{
size_t pos = p->getStrProp(CL_DEVICE_EXTENSIONS).find("cl_khr_image2d_from_buffer");
if (pos != String::npos)
{
ret = true;
}
}
return ret;
} }
uint Device::imagePitchAlignment() const uint Device::imagePitchAlignment() const

@ -181,6 +181,23 @@ void dumpOpenCLDevice()
DUMP_MESSAGE_STDOUT(" Host unified memory = "<< isUnifiedMemoryStr); DUMP_MESSAGE_STDOUT(" Host unified memory = "<< isUnifiedMemoryStr);
DUMP_PROPERTY_XML("cv_ocl_current_hostUnifiedMemory", device.hostUnifiedMemory()); DUMP_PROPERTY_XML("cv_ocl_current_hostUnifiedMemory", device.hostUnifiedMemory());
DUMP_MESSAGE_STDOUT(" Device extensions:");
String extensionsStr = device.extensions();
size_t pos = 0;
while (pos < extensionsStr.size())
{
size_t pos2 = extensionsStr.find(' ', pos);
if (pos2 == String::npos)
pos2 = extensionsStr.size();
if (pos2 > pos)
{
String extensionName = extensionsStr.substr(pos, pos2 - pos);
DUMP_MESSAGE_STDOUT(" " << extensionName);
}
pos = pos2 + 1;
}
DUMP_PROPERTY_XML("cv_ocl_current_extensions", extensionsStr.c_str());
const char* haveAmdBlasStr = haveAmdBlas() ? "Yes" : "No"; const char* haveAmdBlasStr = haveAmdBlas() ? "Yes" : "No";
DUMP_MESSAGE_STDOUT(" Has AMD Blas = "<< haveAmdBlasStr); DUMP_MESSAGE_STDOUT(" Has AMD Blas = "<< haveAmdBlasStr);
DUMP_PROPERTY_XML("cv_ocl_current_AmdBlas", haveAmdBlas()); DUMP_PROPERTY_XML("cv_ocl_current_AmdBlas", haveAmdBlas());

Loading…
Cancel
Save