From 758156a9b65427655e4a6bf3583a8a62f9ae19b1 Mon Sep 17 00:00:00 2001 From: Anton Potapov Date: Tue, 3 Sep 2019 15:03:51 +0300 Subject: [PATCH] Fluid Internal Parallelism: - add comments on signature of custom parallel_for - use cv::parallel_for_ by default --- .../opencv2/gapi/fluid/gfluidkernel.hpp | 5 +++- .../gapi/src/backends/fluid/gfluidbackend.cpp | 26 ++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/modules/gapi/include/opencv2/gapi/fluid/gfluidkernel.hpp b/modules/gapi/include/opencv2/gapi/fluid/gfluidkernel.hpp index b454e854f9..3235de791e 100644 --- a/modules/gapi/include/opencv2/gapi/fluid/gfluidkernel.hpp +++ b/modules/gapi/include/opencv2/gapi/fluid/gfluidkernel.hpp @@ -106,7 +106,10 @@ struct GFluidParallelOutputRois struct GFluidParallelFor { - std::function)> parallel_for; + //this function accepts: + // - size of the "parallel" range as the first argument + // - and a function to be called on the range items, designated by item index + std::function)> parallel_for; }; namespace detail diff --git a/modules/gapi/src/backends/fluid/gfluidbackend.cpp b/modules/gapi/src/backends/fluid/gfluidbackend.cpp index ab909733c9..78bc20229b 100644 --- a/modules/gapi/src/backends/fluid/gfluidbackend.cpp +++ b/modules/gapi/src/backends/fluid/gfluidbackend.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -96,12 +97,31 @@ namespace const auto parallel_out_rois = cv::gimpl::getCompileArg(args); const auto gpfor = cv::gimpl::getCompileArg(args); - auto serial_for = [](std::size_t count, std::function f){ - for (std::size_t i = 0; i < count; ++i){ +#if !defined(GAPI_STANDALONE) + auto default_pfor = [](std::size_t count, std::function f){ + struct Body : cv::ParallelLoopBody { + decltype(f) func; + Body( decltype(f) && _f) : func(_f){} + virtual void operator() (const cv::Range& r) const CV_OVERRIDE + { + for (std::size_t i : ade::util::iota(r.start, r.end)) + { + func(i); + } + } + }; + cv::parallel_for_(cv::Range{0,static_cast(count)}, Body{std::move(f)}); + }; +#else + auto default_pfor = [](std::size_t count, std::function f){ + for (auto i : ade::util::iota(count)){ f(i); } }; - auto pfor = gpfor.has_value() ? gpfor.value().parallel_for : serial_for; +#endif + + auto pfor = gpfor.has_value() ? gpfor.value().parallel_for : default_pfor; + return parallel_out_rois.has_value() ? EPtr{new cv::gimpl::GParallelFluidExecutable (graph, graph_data, std::move(parallel_out_rois.value().parallel_rois), pfor)} : EPtr{new cv::gimpl::GFluidExecutable (graph, graph_data, std::move(rois.rois))}