| Backport from https://github.com/Itseez/opencv/commit/a482dcce464acbd5368fb93c6c3d52ba8401776a |
| |
| From a482dcce464acbd5368fb93c6c3d52ba8401776a Mon Sep 17 00:00:00 2001 |
| From: Alexander Alekhin <alexander.alekhin@itseez.com> |
| Date: Thu, 11 Jun 2015 16:53:07 +0300 |
| Subject: [PATCH] fix support for pthreads parallel_for |
| |
| Signed-off-by: Samuel Martin <s.martin49@gmail.com> |
| --- |
| CMakeLists.txt | 29 ++++++++++++++++++++++------- |
| cmake/OpenCVFindLibsPerf.cmake | 14 +++++++++----- |
| cmake/templates/cvconfig.h.in | 6 ++++++ |
| modules/core/src/parallel.cpp | 13 ++++++++----- |
| modules/core/src/parallel_pthreads.cpp | 2 +- |
| modules/core/src/precomp.hpp | 6 ------ |
| 6 files changed, 46 insertions(+), 24 deletions(-) |
| |
| diff --git a/CMakeLists.txt b/CMakeLists.txt |
| index d9a17b3..27d8470 100644 |
| --- a/CMakeLists.txt |
| +++ b/CMakeLists.txt |
| @@ -188,7 +188,7 @@ OCV_OPTION(WITH_QUICKTIME "Use QuickTime for Video I/O insted of QTKit" OFF |
| OCV_OPTION(WITH_TBB "Include Intel TBB support" OFF IF (NOT IOS AND NOT WINRT) ) |
| OCV_OPTION(WITH_OPENMP "Include OpenMP support" OFF) |
| OCV_OPTION(WITH_CSTRIPES "Include C= support" OFF IF (WIN32 AND NOT WINRT) ) |
| -OCV_OPTION(WITH_PTHREADS_PF "Use pthreads-based parallel_for" OFF IF (NOT WIN32) ) |
| +OCV_OPTION(WITH_PTHREADS_PF "Use pthreads-based parallel_for" ON IF (NOT WIN32) ) |
| OCV_OPTION(WITH_TIFF "Include TIFF support" ON IF (NOT IOS) ) |
| OCV_OPTION(WITH_UNICAP "Include Unicap support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) ) |
| OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT ANDROID) ) |
| @@ -1026,6 +1026,27 @@ if(DEFINED WITH_GPHOTO2) |
| endif(DEFINED WITH_GPHOTO2) |
| |
| |
| +# Order is similar to CV_PARALLEL_FRAMEWORK in core/src/parallel.cpp |
| +ocv_clear_vars(CV_PARALLEL_FRAMEWORK) |
| +if(HAVE_TBB) |
| + set(CV_PARALLEL_FRAMEWORK "TBB (ver ${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} interface ${TBB_INTERFACE_VERSION})") |
| +elseif(HAVE_CSTRIPES) |
| + set(CV_PARALLEL_FRAMEWORK "C=") |
| +elseif(HAVE_OPENMP) |
| + set(CV_PARALLEL_FRAMEWORK "OpenMP") |
| +elseif(HAVE_GCD) |
| + set(CV_PARALLEL_FRAMEWORK "GCD") |
| +elseif(WINRT OR HAVE_CONCURRENCY) |
| + set(CV_PARALLEL_FRAMEWORK "Concurrency") |
| +elseif(HAVE_PTHREADS_PF) |
| + set(CV_PARALLEL_FRAMEWORK "pthreads") |
| +else() |
| + set(CV_PARALLEL_FRAMEWORK "none") |
| +endif() |
| +status("") |
| +status(" Parallel framework:" TRUE THEN "${CV_PARALLEL_FRAMEWORK}" ELSE NO) |
| + |
| + |
| # ========================== Other third-party libraries ========================== |
| status("") |
| status(" Other third-party libraries:") |
| @@ -1045,12 +1066,6 @@ status(" Use IPP Async:" HAVE_IPP_A THEN "YES" ELSE NO) |
| endif(DEFINED WITH_IPP_A) |
| |
| status(" Use Eigen:" HAVE_EIGEN THEN "YES (ver ${EIGEN_WORLD_VERSION}.${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION})" ELSE NO) |
| -status(" Use TBB:" HAVE_TBB THEN "YES (ver ${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} interface ${TBB_INTERFACE_VERSION})" ELSE NO) |
| -status(" Use OpenMP:" HAVE_OPENMP THEN YES ELSE NO) |
| -status(" Use GCD" HAVE_GCD THEN YES ELSE NO) |
| -status(" Use Concurrency" HAVE_CONCURRENCY THEN YES ELSE NO) |
| -status(" Use C=:" HAVE_CSTRIPES THEN YES ELSE NO) |
| -status(" Use pthreads for parallel for:" HAVE_PTHREADS_PF THEN YES ELSE NO) |
| status(" Use Cuda:" HAVE_CUDA THEN "YES (ver ${CUDA_VERSION_STRING})" ELSE NO) |
| status(" Use OpenCL:" HAVE_OPENCL THEN YES ELSE NO) |
| |
| diff --git a/cmake/OpenCVFindLibsPerf.cmake b/cmake/OpenCVFindLibsPerf.cmake |
| index bda5d79..d1bc541 100644 |
| --- a/cmake/OpenCVFindLibsPerf.cmake |
| +++ b/cmake/OpenCVFindLibsPerf.cmake |
| @@ -120,12 +120,16 @@ if(WITH_OPENMP) |
| set(HAVE_OPENMP "${OPENMP_FOUND}") |
| endif() |
| |
| -if(UNIX OR ANDROID) |
| -if(NOT APPLE AND NOT HAVE_TBB AND NOT HAVE_OPENMP) |
| - set(HAVE_PTHREADS_PF 1) |
| -else() |
| - set(HAVE_PTHREADS_PF 0) |
| +if(NOT MSVC AND NOT DEFINED HAVE_PTHREADS) |
| + set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/pthread_test.cpp") |
| + file(WRITE "${_fname}" "#include <pthread.h>\nint main() { (void)pthread_self(); return 0; }\n") |
| + try_compile(HAVE_PTHREADS "${CMAKE_BINARY_DIR}" "${_fname}") |
| + file(REMOVE "${_fname}") |
| endif() |
| + |
| +ocv_clear_vars(HAVE_PTHREADS_PF) |
| +if(WITH_PTHREADS_PF) |
| + set(HAVE_PTHREADS_PF ${HAVE_PTHREADS}) |
| else() |
| set(HAVE_PTHREADS_PF 0) |
| endif() |
| diff --git a/cmake/templates/cvconfig.h.in b/cmake/templates/cvconfig.h.in |
| index 4a1d1c6..3330774 100644 |
| --- a/cmake/templates/cvconfig.h.in |
| +++ b/cmake/templates/cvconfig.h.in |
| @@ -139,6 +139,12 @@ |
| /* PNG codec */ |
| #cmakedefine HAVE_PNG |
| |
| +/* Posix threads (pthreads) */ |
| +#cmakedefine HAVE_PTHREADS |
| + |
| +/* parallel_for with pthreads */ |
| +#cmakedefine HAVE_PTHREADS_PF |
| + |
| /* Qt support */ |
| #cmakedefine HAVE_QT |
| |
| diff --git a/modules/core/src/parallel.cpp b/modules/core/src/parallel.cpp |
| index 0b593ee..caa8129 100644 |
| --- a/modules/core/src/parallel.cpp |
| +++ b/modules/core/src/parallel.cpp |
| @@ -80,6 +80,7 @@ |
| 4. HAVE_GCD - system wide, used automatically (APPLE only) |
| 5. WINRT - system wide, used automatically (Windows RT only) |
| 6. HAVE_CONCURRENCY - part of runtime, used automatically (Windows only - MSVS 10, MSVS 11) |
| + 7. HAVE_PTHREADS_PF - pthreads if available |
| */ |
| |
| #if defined HAVE_TBB |
| @@ -125,14 +126,14 @@ |
| # define CV_PARALLEL_FRAMEWORK "winrt-concurrency" |
| #elif defined HAVE_CONCURRENCY |
| # define CV_PARALLEL_FRAMEWORK "ms-concurrency" |
| -#elif defined HAVE_PTHREADS |
| +#elif defined HAVE_PTHREADS_PF |
| # define CV_PARALLEL_FRAMEWORK "pthreads" |
| #endif |
| |
| namespace cv |
| { |
| ParallelLoopBody::~ParallelLoopBody() {} |
| -#if defined HAVE_PTHREADS && HAVE_PTHREADS |
| +#ifdef HAVE_PTHREADS_PF |
| void parallel_for_pthreads(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes); |
| size_t parallel_pthreads_get_threads_num(); |
| void parallel_pthreads_set_threads_num(int num); |
| @@ -306,7 +307,7 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body, |
| Concurrency::CurrentScheduler::Detach(); |
| } |
| |
| -#elif defined HAVE_PTHREADS |
| +#elif defined HAVE_PTHREADS_PF |
| |
| parallel_for_pthreads(range, body, nstripes); |
| |
| @@ -365,7 +366,7 @@ int cv::getNumThreads(void) |
| ? Concurrency::CurrentScheduler::Get()->GetNumberOfVirtualProcessors() |
| : pplScheduler->GetNumberOfVirtualProcessors()); |
| |
| -#elif defined HAVE_PTHREADS |
| +#elif defined HAVE_PTHREADS_PF |
| |
| return parallel_pthreads_get_threads_num(); |
| |
| @@ -426,7 +427,7 @@ void cv::setNumThreads( int threads ) |
| Concurrency::MaxConcurrency, threads-1)); |
| } |
| |
| -#elif defined HAVE_PTHREADS |
| +#elif defined HAVE_PTHREADS_PF |
| |
| parallel_pthreads_set_threads_num(threads); |
| |
| @@ -452,6 +453,8 @@ int cv::getThreadNum(void) |
| return 0; |
| #elif defined HAVE_CONCURRENCY |
| return std::max(0, (int)Concurrency::Context::VirtualProcessorId()); // zero for master thread, unique number for others but not necessary 1,2,3,... |
| +#elif defined HAVE_PTHREADS_PF |
| + return (int)(size_t)(void*)pthread_self(); // no zero-based indexing |
| #else |
| return 0; |
| #endif |
| diff --git a/modules/core/src/parallel_pthreads.cpp b/modules/core/src/parallel_pthreads.cpp |
| index 8c34959..091ea2d 100644 |
| --- a/modules/core/src/parallel_pthreads.cpp |
| +++ b/modules/core/src/parallel_pthreads.cpp |
| @@ -42,7 +42,7 @@ |
| |
| #include "precomp.hpp" |
| |
| -#if defined HAVE_PTHREADS && HAVE_PTHREADS |
| +#ifdef HAVE_PTHREADS_PF |
| |
| #include <algorithm> |
| #include <pthread.h> |
| diff --git a/modules/core/src/precomp.hpp b/modules/core/src/precomp.hpp |
| index d463126..88b60e4 100644 |
| --- a/modules/core/src/precomp.hpp |
| +++ b/modules/core/src/precomp.hpp |
| @@ -292,12 +292,6 @@ TLSData<CoreTLSData>& getCoreTlsData(); |
| #define CL_RUNTIME_EXPORT |
| #endif |
| |
| -#ifndef HAVE_PTHREADS |
| -#if !(defined WIN32 || defined _WIN32 || defined WINCE || defined HAVE_WINRT) |
| -#define HAVE_PTHREADS 1 |
| -#endif |
| -#endif |
| - |
| extern bool __termination; // skip some cleanups, because process is terminating |
| // (for example, if ExitProcess() was already called) |
| |
| -- |
| 2.4.4 |
| |