From c1dad2178ca4ad3b7154e4026be9c31ef4fb8365 Mon Sep 17 00:00:00 2001 From: Alexander Karsakov Date: Wed, 5 Mar 2014 11:25:37 +0400 Subject: [PATCH 1/2] Added Device:: isAMD,isIntel,isNvidia methods. --- modules/core/include/opencv2/core/ocl.hpp | 12 +++++++++ modules/core/src/ocl.cpp | 30 ++++++++++++++++++++++- modules/objdetect/src/cascadedetect.cpp | 8 ++---- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index c6b0cf2d0..686a4f34f 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -161,6 +161,18 @@ public: size_t imageMaxBufferSize() const; size_t imageMaxArraySize() const; + enum + { + UNKNOWN_VENDOR=0, + AMD=1, + INTEL=2, + NVIDIA=3 + }; + + bool isAMD() const; + bool isIntel() const; + bool isNvidia() const; + int maxClockFrequency() const; int maxComputeUnits() const; int maxConstantArgs() const; diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 9c92b8381..6c2bd7848 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1712,6 +1712,17 @@ struct Device::Impl String deviceVersion_ = getStrProp(CL_DEVICE_VERSION); parseDeviceVersion(deviceVersion_, deviceVersionMajor_, deviceVersionMinor_); + + vendorName = getStrProp(CL_DEVICE_VENDOR); + if (vendorName == "Advanced Micro Devices, Inc." || + vendorName == "AMD") + vendor_ = AMD; + else if (vendorName == "Intel(R) Corporation") + vendor_ = INTEL; + else if (vendorName == "NVIDIA Corporation") + vendor_ = NVIDIA; + else + vendor_ = UNKNOWN_VENDOR; } template @@ -1754,6 +1765,8 @@ struct Device::Impl int deviceVersionMajor_; int deviceVersionMinor_; String driverVersion_; + String vendorName; + int vendor_; }; @@ -1814,7 +1827,7 @@ String Device::version() const { return p ? p->version_ : String(); } String Device::vendor() const -{ return p ? p->getStrProp(CL_DEVICE_VENDOR) : String(); } +{ return p ? p->vendorName : String(); } String Device::OpenCL_C_Version() const { return p ? p->getStrProp(CL_DEVICE_OPENCL_C_VERSION) : String(); } @@ -1925,6 +1938,21 @@ size_t Device::imageMaxArraySize() const { CV_REQUIRE_OPENCL_1_2_ERROR; } #endif +bool Device::isAMD() const +{ + return p->vendor_ == AMD; +} + +bool Device::isIntel() const +{ + return p->vendor_ == INTEL; +} + +bool Device::isNvidia() const +{ + return p->vendor_ == NVIDIA; +} + int Device::maxClockFrequency() const { return p ? p->getProp(CL_DEVICE_MAX_CLOCK_FREQUENCY) : 0; } diff --git a/modules/objdetect/src/cascadedetect.cpp b/modules/objdetect/src/cascadedetect.cpp index bb187cd61..3f0e6e38c 100644 --- a/modules/objdetect/src/cascadedetect.cpp +++ b/modules/objdetect/src/cascadedetect.cpp @@ -583,9 +583,7 @@ bool HaarEvaluator::read(const FileNode& node, Size _origWinSize) localSize = lbufSize = Size(0, 0); if (ocl::haveOpenCL()) { - String vname = ocl::Device::getDefault().vendor(); - if (vname == "Advanced Micro Devices, Inc." || - vname == "AMD") + if (ocl::Device::getDefault().isAMD()) { localSize = Size(8, 8); lbufSize = Size(origWinSize.width + localSize.width, @@ -769,9 +767,7 @@ bool LBPEvaluator::read( const FileNode& node, Size _origWinSize ) if (ocl::haveOpenCL()) { const ocl::Device& device = ocl::Device::getDefault(); - String vname = device.vendor(); - if ((vname == "Advanced Micro Devices, Inc." || - vname == "AMD") && !device.hostUnifiedMemory()) + if (device.isAMD() && !device.hostUnifiedMemory()) localSize = Size(8, 8); } return true; From 8660588fe9a34052b9a599e568f17ecf1a2a786e Mon Sep 17 00:00:00 2001 From: Alexander Karsakov Date: Wed, 5 Mar 2014 15:04:44 +0400 Subject: [PATCH 2/2] Pass vendor macro to opencl kernel --- modules/core/include/opencv2/core/ocl.hpp | 15 ++++--- modules/core/src/ocl.cpp | 50 ++++++++++------------- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index 686a4f34f..f7fae9e4e 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -87,7 +87,7 @@ public: String name() const; String extensions() const; String version() const; - String vendor() const; + String vendorName() const; String OpenCL_C_Version() const; String OpenCLVersion() const; int deviceVersionMajor() const; @@ -164,14 +164,13 @@ public: enum { UNKNOWN_VENDOR=0, - AMD=1, - INTEL=2, - NVIDIA=3 + VENDOR_AMD=1, + VENDOR_INTEL=2, + VENDOR_NVIDIA=3 }; - - bool isAMD() const; - bool isIntel() const; - bool isNvidia() const; + int vendorID() const; + inline bool isAMD() const { return vendorID() == VENDOR_AMD; }; + inline bool isIntel() const { return vendorID() == VENDOR_INTEL; }; int maxClockFrequency() const; int maxComputeUnits() const; diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 6c2bd7848..1cbbc2ac4 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1713,16 +1713,16 @@ struct Device::Impl String deviceVersion_ = getStrProp(CL_DEVICE_VERSION); parseDeviceVersion(deviceVersion_, deviceVersionMajor_, deviceVersionMinor_); - vendorName = getStrProp(CL_DEVICE_VENDOR); - if (vendorName == "Advanced Micro Devices, Inc." || - vendorName == "AMD") - vendor_ = AMD; - else if (vendorName == "Intel(R) Corporation") - vendor_ = INTEL; - else if (vendorName == "NVIDIA Corporation") - vendor_ = NVIDIA; + vendorName_ = getStrProp(CL_DEVICE_VENDOR); + if (vendorName_ == "Advanced Micro Devices, Inc." || + vendorName_ == "AMD") + vendorID_ = VENDOR_AMD; + else if (vendorName_ == "Intel(R) Corporation") + vendorID_ = VENDOR_INTEL; + else if (vendorName_ == "NVIDIA Corporation") + vendorID_ = VENDOR_NVIDIA; else - vendor_ = UNKNOWN_VENDOR; + vendorID_ = UNKNOWN_VENDOR; } template @@ -1765,8 +1765,8 @@ struct Device::Impl int deviceVersionMajor_; int deviceVersionMinor_; String driverVersion_; - String vendorName; - int vendor_; + String vendorName_; + int vendorID_; }; @@ -1826,8 +1826,11 @@ String Device::extensions() const String Device::version() const { return p ? p->version_ : String(); } -String Device::vendor() const -{ return p ? p->vendorName : String(); } +String Device::vendorName() const +{ return p ? p->vendorName_ : String(); } + +int Device::vendorID() const +{ return p ? p->vendorID_ : 0; } String Device::OpenCL_C_Version() const { return p ? p->getStrProp(CL_DEVICE_OPENCL_C_VERSION) : String(); } @@ -1938,21 +1941,6 @@ size_t Device::imageMaxArraySize() const { CV_REQUIRE_OPENCL_1_2_ERROR; } #endif -bool Device::isAMD() const -{ - return p->vendor_ == AMD; -} - -bool Device::isIntel() const -{ - return p->vendor_ == INTEL; -} - -bool Device::isNvidia() const -{ - return p->vendor_ == NVIDIA; -} - int Device::maxClockFrequency() const { return p ? p->getProp(CL_DEVICE_MAX_CLOCK_FREQUENCY) : 0; } @@ -3037,6 +3025,12 @@ struct Program::Impl for( i = 0; i < n; i++ ) deviceList[i] = ctx.device(i).ptr(); + Device device = Device::getDefault(); + if (device.isAMD()) + buildflags += " -D AMD_DEVICE"; + else if (device.isIntel()) + buildflags += " -D INTEL_DEVICE"; + retval = clBuildProgram(handle, n, (const cl_device_id*)deviceList, buildflags.c_str(), 0, 0);