From f90e41d54e12d92ac7f9c0f2cf665b30260b213b Mon Sep 17 00:00:00 2001 From: Konstantin Matskevich <konstantin.matskevich@itseez.com> Date: Wed, 22 Jan 2014 10:08:42 +0400 Subject: [PATCH 1/3] dumpinfo --- modules/core/include/opencv2/core/ocl.hpp | 21 +++++ modules/core/src/ocl.cpp | 107 ++++++++++++++++++++++ modules/ts/include/opencv2/ts/ts_perf.hpp | 10 ++ modules/ts/src/ocl_test.cpp | 26 ++---- 4 files changed, 148 insertions(+), 16 deletions(-) diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index fb9f0282b..5d339a488 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -59,6 +59,7 @@ class CV_EXPORTS Kernel; class CV_EXPORTS Program; class CV_EXPORTS ProgramSource2; class CV_EXPORTS Queue; +class CV_EXPORTS PlatformInform; class CV_EXPORTS Device { @@ -84,6 +85,7 @@ public: String name() const; String extensions() const; + String version() const; String vendor() const; String OpenCL_C_Version() const; String OpenCLVersion() const; @@ -549,9 +551,28 @@ protected: Impl* p; }; +class CV_EXPORTS PlatformInform +{ +public: + PlatformInform(); + explicit PlatformInform(void* id); + ~PlatformInform(); + + String name() const; + String vendor() const; + String version() const; + int deviceNumber() const; + void getDevice(Device& device, int d) const; + +protected: + struct Impl; + Impl* p; +}; + CV_EXPORTS const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf); CV_EXPORTS const char* typeToStr(int t); CV_EXPORTS const char* memopTypeToStr(int t); +CV_EXPORTS void getPlatfomsInfo(std::vector<PlatformInform>& platform_info); }} diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index e2f4d2c4b..c4859544d 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1693,6 +1693,9 @@ String Device::name() const String Device::extensions() const { return p ? p->getStrProp(CL_DEVICE_EXTENSIONS) : String(); } +String Device::version() const +{ return p ? p->getStrProp(CL_DEVICE_VERSION) : String(); } + String Device::vendor() const { return p ? p->getStrProp(CL_DEVICE_VENDOR) : String(); } @@ -3621,6 +3624,110 @@ MatAllocator* getOpenCLAllocator() return &allocator; } +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static void getDevices(std::vector<cl_device_id>& devices,cl_platform_id& platform) +{ + cl_int status = CL_SUCCESS; + cl_uint numDevices = 0; + status = clGetDeviceIDs(platform, (cl_device_type)Device::TYPE_ALL, 0, NULL, &numDevices); + CV_Assert(status == CL_SUCCESS); + if (numDevices == 0) + return; + devices.resize((size_t)numDevices); + status = clGetDeviceIDs(platform, (cl_device_type)Device::TYPE_ALL, numDevices, &devices[0], &numDevices); + CV_Assert(status == CL_SUCCESS); + devices.resize(numDevices); +} + +struct PlatformInform::Impl +{ + Impl(void* id) + { + handle = *(cl_platform_id*)id; + getDevices(devices, handle); + } + + String getStrProp(cl_device_info prop) const + { + char buf[1024]; + size_t sz=0; + return clGetPlatformInfo(handle, prop, sizeof(buf)-16, buf, &sz) >= 0 && + sz < sizeof(buf) ? String(buf) : String(); + } + + IMPLEMENT_REFCOUNTABLE(); + std::vector<cl_device_id> devices; + cl_platform_id handle; +}; + +PlatformInform::PlatformInform() +{ + p = 0; +} + +PlatformInform::PlatformInform(void* platform_id) +{ + p = new Impl(platform_id); +} + +PlatformInform::~PlatformInform() +{ + if(p) + p->release(); +} + +int PlatformInform::deviceNumber() const +{ + return p ? (int)p->devices.size() : 0; +} + +void PlatformInform::getDevice(Device& device, int d) const +{ + CV_Assert(d < (int)p->devices.size() ); + if(p) + device.set(p->devices[d]); +} + +String PlatformInform::name() const +{ + return p ? p->getStrProp(CL_PLATFORM_NAME) : String(); +} + +String PlatformInform::vendor() const +{ + return p ? p->getStrProp(CL_PLATFORM_VENDOR) : String(); +} + +String PlatformInform::version() const +{ + return p ? p->getStrProp(CL_PLATFORM_VERSION) : String(); +} + +static void getPlatforms(std::vector<cl_platform_id>& platforms) +{ + cl_int status = CL_SUCCESS; + cl_uint numPlatforms = 0; + status = clGetPlatformIDs(0, NULL, &numPlatforms); + CV_Assert(status == CL_SUCCESS); + if (numPlatforms == 0) + return; + platforms.resize((size_t)numPlatforms); + status = clGetPlatformIDs(numPlatforms, &platforms[0], &numPlatforms); + CV_Assert(status == CL_SUCCESS); + platforms.resize(numPlatforms); +} + +void getPlatfomsInfo(std::vector<PlatformInform>& platformsInfo) +{ + std::vector<cl_platform_id> platforms; + getPlatforms(platforms); + for (size_t i = 0; i < platforms.size(); i++) + { + platformsInfo.push_back( PlatformInform((void*)&platforms[i]) ); + } +} + const char* typeToStr(int t) { static const char* tab[]= diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index de674b7f3..bd3156930 100644 --- a/modules/ts/include/opencv2/ts/ts_perf.hpp +++ b/modules/ts/include/opencv2/ts/ts_perf.hpp @@ -509,6 +509,15 @@ CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os); #endif #endif +#if defined(HAVE_OPENCL) && !defined(CV_BUILD_OCL_MODULE) +namespace cvtest { namespace ocl { +void dumpOpenCLDevice(); +}} +#define TEST_DUMP_OCL_INFO cvtest::ocl::dumpOpenCLDevice(); +#else +#define TEST_DUMP_OCL_INFO +#endif + #define CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, ...) \ ::perf::Regression::Init(#modulename); \ ::perf::TestBase::Init(std::vector<std::string>(impls, impls + sizeof impls / sizeof *impls), \ @@ -518,6 +527,7 @@ CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os); ::testing::Test::RecordProperty("cv_module_name", #modulename); \ ::perf::TestBase::RecordRunParameters(); \ __CV_TEST_EXEC_ARGS(__VA_ARGS__) \ + TEST_DUMP_OCL_INFO \ return RUN_ALL_TESTS(); // impls must be an array, not a pointer; "plain" should always be one of the implementations diff --git a/modules/ts/src/ocl_test.cpp b/modules/ts/src/ocl_test.cpp index 201c5f459..7c9ca9c5c 100644 --- a/modules/ts/src/ocl_test.cpp +++ b/modules/ts/src/ocl_test.cpp @@ -98,28 +98,25 @@ void dumpOpenCLDevice() using namespace cv::ocl; try { -#if 0 - Platforms platforms; - getOpenCLPlatforms(platforms); + std::vector<PlatformInform> platforms; + cv::ocl::getPlatfomsInfo(platforms); if (platforms.size() > 0) { DUMP_MESSAGE_STDOUT("OpenCL Platforms: "); for (size_t i = 0; i < platforms.size(); i++) { - const Platform* platform = platforms.at(i); + const PlatformInform* platform = &platforms[i]; DUMP_MESSAGE_STDOUT(" " << platform->name().c_str()); - const Devices& devices = platform->devices(); - for (size_t j = 0; j < devices.size(); j++) + Device current_device; + for (int j = 0; j < platform->deviceNumber(); j++) { - const Device& current_device = *devices.at(j); + platform->getDevice(current_device, j); const char* deviceTypeStr = current_device.type() == Device::TYPE_CPU ? ("CPU") : (current_device.type() == Device::TYPE_GPU ? "GPU" : "unknown"); DUMP_MESSAGE_STDOUT( " " << deviceTypeStr << ": " << current_device.name().c_str() << " (" << current_device.version().c_str() << ")"); - DUMP_PROPERTY_XML(cv::format("cv_ocl_platform_%d_device_%d", (int)i, (int)j), - "(Platform=" << current_device.getPlatform().name().c_str() - << ")(Type=" << deviceTypeStr - << ")(Name=" << current_device.name().c_str() - << ")(Version=" << current_device.version().c_str() << ")"); + DUMP_PROPERTY_XML( cv::format("cv_ocl_platform_%d_device_%d", (int)i, (int)j ), + cv::format("(Platform=%sType=%sName=%sVersion=%s", + platform->name().c_str(), deviceTypeStr, current_device.name().c_str(), current_device.version().c_str()) ); } } } @@ -129,10 +126,9 @@ void dumpOpenCLDevice() DUMP_PROPERTY_XML("cv_ocl", "not available"); return; } -#endif - DUMP_MESSAGE_STDOUT("Current OpenCL device: "); const Device& device = Device::getDefault(); + DUMP_MESSAGE_STDOUT("Current OpenCL device: "); #if 0 DUMP_MESSAGE_STDOUT(" Platform = "<< device.getPlatform().name()); @@ -147,10 +143,8 @@ void dumpOpenCLDevice() DUMP_MESSAGE_STDOUT(" Name = "<< device.name()); DUMP_PROPERTY_XML("cv_ocl_current_deviceName", device.name()); -#if 0 DUMP_MESSAGE_STDOUT(" Version = " << device.version()); DUMP_PROPERTY_XML("cv_ocl_current_deviceVersion", device.version()); -#endif DUMP_MESSAGE_STDOUT(" Compute units = "<< device.maxComputeUnits()); DUMP_PROPERTY_XML("cv_ocl_current_maxComputeUnits", device.maxComputeUnits()); From ae827a638c4b4f25f8e314aa3585340b179f63f8 Mon Sep 17 00:00:00 2001 From: Konstantin Matskevich <konstantin.matskevich@itseez.com> Date: Fri, 24 Jan 2014 14:01:31 +0400 Subject: [PATCH 2/3] fixes --- modules/core/include/opencv2/core/ocl.hpp | 12 ++++++------ modules/core/src/ocl.cpp | 22 +++++++++++----------- modules/ts/src/ocl_test.cpp | 8 ++++---- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp index 5d339a488..12c7b8b06 100644 --- a/modules/core/include/opencv2/core/ocl.hpp +++ b/modules/core/include/opencv2/core/ocl.hpp @@ -59,7 +59,7 @@ class CV_EXPORTS Kernel; class CV_EXPORTS Program; class CV_EXPORTS ProgramSource2; class CV_EXPORTS Queue; -class CV_EXPORTS PlatformInform; +class CV_EXPORTS PlatformInfo2; class CV_EXPORTS Device { @@ -551,12 +551,12 @@ protected: Impl* p; }; -class CV_EXPORTS PlatformInform +class CV_EXPORTS PlatformInfo2 { public: - PlatformInform(); - explicit PlatformInform(void* id); - ~PlatformInform(); + PlatformInfo2(); + explicit PlatformInfo2(void* id); + ~PlatformInfo2(); String name() const; String vendor() const; @@ -572,7 +572,7 @@ protected: CV_EXPORTS const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf); CV_EXPORTS const char* typeToStr(int t); CV_EXPORTS const char* memopTypeToStr(int t); -CV_EXPORTS void getPlatfomsInfo(std::vector<PlatformInform>& platform_info); +CV_EXPORTS void getPlatfomsInfo(std::vector<PlatformInfo2>& platform_info); }} diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index c4859544d..73980629a 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -3640,7 +3640,7 @@ static void getDevices(std::vector<cl_device_id>& devices,cl_platform_id& platfo devices.resize(numDevices); } -struct PlatformInform::Impl +struct PlatformInfo2::Impl { Impl(void* id) { @@ -3661,45 +3661,45 @@ struct PlatformInform::Impl cl_platform_id handle; }; -PlatformInform::PlatformInform() +PlatformInfo2::PlatformInfo2() { p = 0; } -PlatformInform::PlatformInform(void* platform_id) +PlatformInfo2::PlatformInfo2(void* platform_id) { p = new Impl(platform_id); } -PlatformInform::~PlatformInform() +PlatformInfo2::~PlatformInfo2() { if(p) p->release(); } -int PlatformInform::deviceNumber() const +int PlatformInfo2::deviceNumber() const { return p ? (int)p->devices.size() : 0; } -void PlatformInform::getDevice(Device& device, int d) const +void PlatformInfo2::getDevice(Device& device, int d) const { CV_Assert(d < (int)p->devices.size() ); if(p) device.set(p->devices[d]); } -String PlatformInform::name() const +String PlatformInfo2::name() const { return p ? p->getStrProp(CL_PLATFORM_NAME) : String(); } -String PlatformInform::vendor() const +String PlatformInfo2::vendor() const { return p ? p->getStrProp(CL_PLATFORM_VENDOR) : String(); } -String PlatformInform::version() const +String PlatformInfo2::version() const { return p ? p->getStrProp(CL_PLATFORM_VERSION) : String(); } @@ -3718,13 +3718,13 @@ static void getPlatforms(std::vector<cl_platform_id>& platforms) platforms.resize(numPlatforms); } -void getPlatfomsInfo(std::vector<PlatformInform>& platformsInfo) +void getPlatfomsInfo(std::vector<PlatformInfo2>& platformsInfo) { std::vector<cl_platform_id> platforms; getPlatforms(platforms); for (size_t i = 0; i < platforms.size(); i++) { - platformsInfo.push_back( PlatformInform((void*)&platforms[i]) ); + platformsInfo.push_back( PlatformInfo2((void*)&platforms[i]) ); } } diff --git a/modules/ts/src/ocl_test.cpp b/modules/ts/src/ocl_test.cpp index 7c9ca9c5c..32cc5287e 100644 --- a/modules/ts/src/ocl_test.cpp +++ b/modules/ts/src/ocl_test.cpp @@ -98,21 +98,21 @@ void dumpOpenCLDevice() using namespace cv::ocl; try { - std::vector<PlatformInform> platforms; + std::vector<PlatformInfo2> platforms; cv::ocl::getPlatfomsInfo(platforms); if (platforms.size() > 0) { DUMP_MESSAGE_STDOUT("OpenCL Platforms: "); for (size_t i = 0; i < platforms.size(); i++) { - const PlatformInform* platform = &platforms[i]; + const PlatformInfo2* platform = &platforms[i]; DUMP_MESSAGE_STDOUT(" " << platform->name().c_str()); Device current_device; for (int j = 0; j < platform->deviceNumber(); j++) { platform->getDevice(current_device, j); const char* deviceTypeStr = current_device.type() == Device::TYPE_CPU - ? ("CPU") : (current_device.type() == Device::TYPE_GPU ? "GPU" : "unknown"); + ? ("CPU") : (current_device.type() == Device::TYPE_GPU ? current_device.hostUnifiedMemory() ? "iGPU" : "dGPU" : "unknown"); DUMP_MESSAGE_STDOUT( " " << deviceTypeStr << ": " << current_device.name().c_str() << " (" << current_device.version().c_str() << ")"); DUMP_PROPERTY_XML( cv::format("cv_ocl_platform_%d_device_%d", (int)i, (int)j ), cv::format("(Platform=%sType=%sName=%sVersion=%s", @@ -136,7 +136,7 @@ void dumpOpenCLDevice() #endif const char* deviceTypeStr = device.type() == Device::TYPE_CPU - ? "CPU" : (device.type() == Device::TYPE_GPU ? "GPU" : "unknown"); + ? ("CPU") : (device.type() == Device::TYPE_GPU ? device.hostUnifiedMemory() ? "iGPU" : "dGPU" : "unknown"); DUMP_MESSAGE_STDOUT(" Type = "<< deviceTypeStr); DUMP_PROPERTY_XML("cv_ocl_current_deviceType", deviceTypeStr); From c7a6537b8335a310a3e4e7ffdca0506229e31f00 Mon Sep 17 00:00:00 2001 From: Konstantin Matskevich <konstantin.matskevich@itseez.com> Date: Fri, 24 Jan 2014 16:35:51 +0400 Subject: [PATCH 3/3] add brackets --- modules/ts/src/ocl_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ts/src/ocl_test.cpp b/modules/ts/src/ocl_test.cpp index 32cc5287e..0ad3df693 100644 --- a/modules/ts/src/ocl_test.cpp +++ b/modules/ts/src/ocl_test.cpp @@ -115,7 +115,7 @@ void dumpOpenCLDevice() ? ("CPU") : (current_device.type() == Device::TYPE_GPU ? current_device.hostUnifiedMemory() ? "iGPU" : "dGPU" : "unknown"); DUMP_MESSAGE_STDOUT( " " << deviceTypeStr << ": " << current_device.name().c_str() << " (" << current_device.version().c_str() << ")"); DUMP_PROPERTY_XML( cv::format("cv_ocl_platform_%d_device_%d", (int)i, (int)j ), - cv::format("(Platform=%sType=%sName=%sVersion=%s", + cv::format("(Platform=%s)(Type=%s)(Name=%s)(Version=%s)", platform->name().c_str(), deviceTypeStr, current_device.name().c_str(), current_device.version().c_str()) ); } }