From f90e41d54e12d92ac7f9c0f2cf665b30260b213b Mon Sep 17 00:00:00 2001 From: Konstantin Matskevich Date: Wed, 22 Jan 2014 10:08:42 +0400 Subject: [PATCH] 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 fb9f028..5d339a4 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& platform_info); }} diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index e2f4d2c..c485954 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& 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 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& 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& platformsInfo) +{ + std::vector 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 de674b7..bd31569 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(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 201c5f4..7c9ca9c 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 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()); -- 2.7.4