ocl: added cv::ocl::Device::isExtensionSupported() method

This commit is contained in:
Alexander Alekhin 2017-09-06 23:15:47 +03:00 committed by Alexander Alekhin
parent 597b3f4456
commit 169add5aa6
2 changed files with 29 additions and 19 deletions

View File

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

View File

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