2018-09-27 02:50:39 +08:00
|
|
|
// This file is part of OpenCV project.
|
|
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
|
|
// of this distribution and at http://opencv.org/license.html.
|
|
|
|
//
|
2020-04-08 22:05:43 +08:00
|
|
|
// Copyright (C) 2018-2020 Intel Corporation
|
2018-09-27 02:50:39 +08:00
|
|
|
|
|
|
|
|
2018-09-28 23:42:09 +08:00
|
|
|
#include "precomp.hpp"
|
|
|
|
|
2018-09-27 02:50:39 +08:00
|
|
|
#include <vector>
|
|
|
|
#include <stack>
|
|
|
|
#include <unordered_map>
|
|
|
|
|
|
|
|
#include <ade/util/algorithm.hpp> // any_of
|
|
|
|
#include <ade/util/zip_range.hpp> // zip_range, indexed
|
|
|
|
|
|
|
|
#include <ade/graph.hpp>
|
|
|
|
#include <ade/passes/check_cycles.hpp>
|
|
|
|
|
|
|
|
#include "api/gcomputation_priv.hpp"
|
|
|
|
#include "api/gnode_priv.hpp" // FIXME: why it is here?
|
|
|
|
#include "api/gproto_priv.hpp" // FIXME: why it is here?
|
|
|
|
#include "api/gcall_priv.hpp" // FIXME: why it is here?
|
2019-04-18 02:54:47 +08:00
|
|
|
|
2018-09-27 02:50:39 +08:00
|
|
|
#include "api/gbackend_priv.hpp" // Backend basic API (newInstance, etc)
|
|
|
|
|
|
|
|
#include "compiler/gmodel.hpp"
|
|
|
|
#include "compiler/gmodelbuilder.hpp"
|
|
|
|
#include "compiler/gcompiler.hpp"
|
|
|
|
#include "compiler/gcompiled_priv.hpp"
|
Merge pull request #15216 from dmatveev:dm/ng-0010-g-api-streaming-api
* G-API-NG/Streaming: Introduced a Streaming API
Now a GComputation can be compiled in a special "streaming" way
and then "played" on a video stream.
Currently only VideoCapture is supported as an input source.
* G-API-NG/Streaming: added threading & real streaming
* G-API-NG/Streaming: Added tests & docs on Copy kernel
- Added very simple pipeline tests, not all data types are covered yet
(in fact, only GMat is tested now);
- Started testing non-OCV backends in the streaming mode;
- Added required fixes to Fluid backend, likely it works OK now;
- Added required fixes to OCL backend, and now it is likely broken
- Also added a UMat-based (OCL) version of Copy kernel
* G-API-NG/Streaming: Added own concurrent queue class
- Used only if TBB is not available
* G-API-NG/Streaming: Fixing various issues
- Added missing header to CMakeLists.txt
- Fixed various CI issues and warnings
* G-API-NG/Streaming: Fixed a compile-time GScalar queue deadlock
- GStreamingExecutor blindly created island's input queues for
compile-time (value-initialized) GScalars which didn't have any
producers, making island actor threads wait there forever
* G-API-NG/Streaming: Dropped own version of Copy kernel
One was added into master already
* G-API-NG/Streaming: Addressed GArray<T> review comments
- Added tests on mov()
- Removed unnecessary changes in garray.hpp
* G-API-NG/Streaming: Added Doxygen comments to new public APIs
Also fixed some other comments in the code
* G-API-NG/Streaming: Removed debug info, added some comments & renamed vars
* G-API-NG/Streaming: Fixed own-vs-cv abstraction leak
- Now every island is triggered with own:: (instead of cv::)
data objects as inputs;
- Changes in Fluid backend required to support cv::Mat/Scalar were
reverted;
* G-API-NG/Streaming: use holds_alternative<> instead of index/index_of test
- Also fixed regression test comments
- Also added metadata check comments for GStreamingCompiled
* G-API-NG/Streaming: Made start()/stop() more robust
- Fixed various possible deadlocks
- Unified the shutdown code
- Added more tests covering different corner cases on start/stop
* G-API-NG/Streaming: Finally fixed Windows crashes
In fact the problem hasn't been Windows-only.
Island thread popped data from queues without preserving the Cmd
objects and without taking the ownership over data acquired so when
islands started to process the data, this data may be already freed.
Linux version worked only by occasion.
* G-API-NG/Streaming: Fixed (I hope so) Windows warnings
* G-API-NG/Streaming: fixed typos in internal comments
- Also added some more explanation on Streaming/OpenCL status
* G-API-NG/Streaming: Added more unit tests on streaming
- Various start()/stop()/setSource() call flow combinations
* G-API-NG/Streaming: Added tests on own concurrent bounded queue
* G-API-NG/Streaming: Added more tests on various data types, + more
- Vector/Scalar passed as input;
- Vector/Scalar passed in-between islands;
- Some more assertions;
- Also fixed a deadlock problem when inputs are mixed (1 constant, 1 stream)
* G-API-NG/Streaming: Added tests on output data types handling
- Vector
- Scalar
* G-API-NG/Streaming: Fixed test issues with IE + Windows warnings
* G-API-NG/Streaming: Decoupled G-API from videoio
- Now the core G-API doesn't use a cv::VideoCapture directly,
it comes in via an abstract interface;
- Polished a little bit the setSource()/start()/stop() semantics,
now setSource() is mandatory before ANY call to start().
* G-API-NG/Streaming: Fix STANDALONE build (errors brought by render)
2019-10-19 00:29:58 +08:00
|
|
|
#include "compiler/gstreaming_priv.hpp"
|
2018-09-27 02:50:39 +08:00
|
|
|
#include "compiler/passes/passes.hpp"
|
2019-09-25 23:19:45 +08:00
|
|
|
#include "compiler/passes/pattern_matching.hpp"
|
2018-09-27 02:50:39 +08:00
|
|
|
|
|
|
|
#include "executor/gexecutor.hpp"
|
Merge pull request #15216 from dmatveev:dm/ng-0010-g-api-streaming-api
* G-API-NG/Streaming: Introduced a Streaming API
Now a GComputation can be compiled in a special "streaming" way
and then "played" on a video stream.
Currently only VideoCapture is supported as an input source.
* G-API-NG/Streaming: added threading & real streaming
* G-API-NG/Streaming: Added tests & docs on Copy kernel
- Added very simple pipeline tests, not all data types are covered yet
(in fact, only GMat is tested now);
- Started testing non-OCV backends in the streaming mode;
- Added required fixes to Fluid backend, likely it works OK now;
- Added required fixes to OCL backend, and now it is likely broken
- Also added a UMat-based (OCL) version of Copy kernel
* G-API-NG/Streaming: Added own concurrent queue class
- Used only if TBB is not available
* G-API-NG/Streaming: Fixing various issues
- Added missing header to CMakeLists.txt
- Fixed various CI issues and warnings
* G-API-NG/Streaming: Fixed a compile-time GScalar queue deadlock
- GStreamingExecutor blindly created island's input queues for
compile-time (value-initialized) GScalars which didn't have any
producers, making island actor threads wait there forever
* G-API-NG/Streaming: Dropped own version of Copy kernel
One was added into master already
* G-API-NG/Streaming: Addressed GArray<T> review comments
- Added tests on mov()
- Removed unnecessary changes in garray.hpp
* G-API-NG/Streaming: Added Doxygen comments to new public APIs
Also fixed some other comments in the code
* G-API-NG/Streaming: Removed debug info, added some comments & renamed vars
* G-API-NG/Streaming: Fixed own-vs-cv abstraction leak
- Now every island is triggered with own:: (instead of cv::)
data objects as inputs;
- Changes in Fluid backend required to support cv::Mat/Scalar were
reverted;
* G-API-NG/Streaming: use holds_alternative<> instead of index/index_of test
- Also fixed regression test comments
- Also added metadata check comments for GStreamingCompiled
* G-API-NG/Streaming: Made start()/stop() more robust
- Fixed various possible deadlocks
- Unified the shutdown code
- Added more tests covering different corner cases on start/stop
* G-API-NG/Streaming: Finally fixed Windows crashes
In fact the problem hasn't been Windows-only.
Island thread popped data from queues without preserving the Cmd
objects and without taking the ownership over data acquired so when
islands started to process the data, this data may be already freed.
Linux version worked only by occasion.
* G-API-NG/Streaming: Fixed (I hope so) Windows warnings
* G-API-NG/Streaming: fixed typos in internal comments
- Also added some more explanation on Streaming/OpenCL status
* G-API-NG/Streaming: Added more unit tests on streaming
- Various start()/stop()/setSource() call flow combinations
* G-API-NG/Streaming: Added tests on own concurrent bounded queue
* G-API-NG/Streaming: Added more tests on various data types, + more
- Vector/Scalar passed as input;
- Vector/Scalar passed in-between islands;
- Some more assertions;
- Also fixed a deadlock problem when inputs are mixed (1 constant, 1 stream)
* G-API-NG/Streaming: Added tests on output data types handling
- Vector
- Scalar
* G-API-NG/Streaming: Fixed test issues with IE + Windows warnings
* G-API-NG/Streaming: Decoupled G-API from videoio
- Now the core G-API doesn't use a cv::VideoCapture directly,
it comes in via an abstract interface;
- Polished a little bit the setSource()/start()/stop() semantics,
now setSource() is mandatory before ANY call to start().
* G-API-NG/Streaming: Fix STANDALONE build (errors brought by render)
2019-10-19 00:29:58 +08:00
|
|
|
#include "executor/gstreamingexecutor.hpp"
|
2018-09-27 02:50:39 +08:00
|
|
|
#include "backends/common/gbackend.hpp"
|
|
|
|
|
|
|
|
// <FIXME:>
|
2018-09-28 23:42:09 +08:00
|
|
|
#if !defined(GAPI_STANDALONE)
|
2020-04-08 22:05:43 +08:00
|
|
|
#include <opencv2/gapi/cpu/core.hpp> // Also directly refer to Core,
|
|
|
|
#include <opencv2/gapi/cpu/imgproc.hpp> // ...Imgproc
|
|
|
|
#include <opencv2/gapi/cpu/video.hpp> // ...and Video kernel implementations
|
Merge pull request #15216 from dmatveev:dm/ng-0010-g-api-streaming-api
* G-API-NG/Streaming: Introduced a Streaming API
Now a GComputation can be compiled in a special "streaming" way
and then "played" on a video stream.
Currently only VideoCapture is supported as an input source.
* G-API-NG/Streaming: added threading & real streaming
* G-API-NG/Streaming: Added tests & docs on Copy kernel
- Added very simple pipeline tests, not all data types are covered yet
(in fact, only GMat is tested now);
- Started testing non-OCV backends in the streaming mode;
- Added required fixes to Fluid backend, likely it works OK now;
- Added required fixes to OCL backend, and now it is likely broken
- Also added a UMat-based (OCL) version of Copy kernel
* G-API-NG/Streaming: Added own concurrent queue class
- Used only if TBB is not available
* G-API-NG/Streaming: Fixing various issues
- Added missing header to CMakeLists.txt
- Fixed various CI issues and warnings
* G-API-NG/Streaming: Fixed a compile-time GScalar queue deadlock
- GStreamingExecutor blindly created island's input queues for
compile-time (value-initialized) GScalars which didn't have any
producers, making island actor threads wait there forever
* G-API-NG/Streaming: Dropped own version of Copy kernel
One was added into master already
* G-API-NG/Streaming: Addressed GArray<T> review comments
- Added tests on mov()
- Removed unnecessary changes in garray.hpp
* G-API-NG/Streaming: Added Doxygen comments to new public APIs
Also fixed some other comments in the code
* G-API-NG/Streaming: Removed debug info, added some comments & renamed vars
* G-API-NG/Streaming: Fixed own-vs-cv abstraction leak
- Now every island is triggered with own:: (instead of cv::)
data objects as inputs;
- Changes in Fluid backend required to support cv::Mat/Scalar were
reverted;
* G-API-NG/Streaming: use holds_alternative<> instead of index/index_of test
- Also fixed regression test comments
- Also added metadata check comments for GStreamingCompiled
* G-API-NG/Streaming: Made start()/stop() more robust
- Fixed various possible deadlocks
- Unified the shutdown code
- Added more tests covering different corner cases on start/stop
* G-API-NG/Streaming: Finally fixed Windows crashes
In fact the problem hasn't been Windows-only.
Island thread popped data from queues without preserving the Cmd
objects and without taking the ownership over data acquired so when
islands started to process the data, this data may be already freed.
Linux version worked only by occasion.
* G-API-NG/Streaming: Fixed (I hope so) Windows warnings
* G-API-NG/Streaming: fixed typos in internal comments
- Also added some more explanation on Streaming/OpenCL status
* G-API-NG/Streaming: Added more unit tests on streaming
- Various start()/stop()/setSource() call flow combinations
* G-API-NG/Streaming: Added tests on own concurrent bounded queue
* G-API-NG/Streaming: Added more tests on various data types, + more
- Vector/Scalar passed as input;
- Vector/Scalar passed in-between islands;
- Some more assertions;
- Also fixed a deadlock problem when inputs are mixed (1 constant, 1 stream)
* G-API-NG/Streaming: Added tests on output data types handling
- Vector
- Scalar
* G-API-NG/Streaming: Fixed test issues with IE + Windows warnings
* G-API-NG/Streaming: Decoupled G-API from videoio
- Now the core G-API doesn't use a cv::VideoCapture directly,
it comes in via an abstract interface;
- Polished a little bit the setSource()/start()/stop() semantics,
now setSource() is mandatory before ANY call to start().
* G-API-NG/Streaming: Fix STANDALONE build (errors brought by render)
2019-10-19 00:29:58 +08:00
|
|
|
#include <opencv2/gapi/render/render.hpp> // render::ocv::backend()
|
2018-09-28 23:42:09 +08:00
|
|
|
#endif // !defined(GAPI_STANDALONE)
|
2018-09-27 02:50:39 +08:00
|
|
|
// </FIXME:>
|
|
|
|
|
2019-06-15 00:27:19 +08:00
|
|
|
#include <opencv2/gapi/gcompoundkernel.hpp> // compound::backend()
|
2018-09-27 02:50:39 +08:00
|
|
|
|
|
|
|
#include "logger.hpp"
|
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
cv::gapi::GKernelPackage getKernelPackage(cv::GCompileArgs &args)
|
|
|
|
{
|
2019-05-23 02:13:13 +08:00
|
|
|
auto withAuxKernels = [](const cv::gapi::GKernelPackage& pkg) {
|
|
|
|
cv::gapi::GKernelPackage aux_pkg;
|
|
|
|
for (const auto &b : pkg.backends()) {
|
|
|
|
aux_pkg = combine(aux_pkg, b.priv().auxiliaryKernels());
|
|
|
|
}
|
|
|
|
return combine(pkg, aux_pkg);
|
|
|
|
};
|
|
|
|
|
2020-06-25 05:43:12 +08:00
|
|
|
auto has_use_only = cv::gapi::getCompileArg<cv::gapi::use_only>(args);
|
2019-05-22 19:53:44 +08:00
|
|
|
if (has_use_only)
|
2019-05-23 02:13:13 +08:00
|
|
|
return withAuxKernels(has_use_only.value().pkg);
|
2019-05-22 19:53:44 +08:00
|
|
|
|
2018-09-28 23:42:09 +08:00
|
|
|
static auto ocv_pkg =
|
|
|
|
#if !defined(GAPI_STANDALONE)
|
2020-04-08 22:05:43 +08:00
|
|
|
combine(cv::gapi::core::cpu::kernels(),
|
|
|
|
cv::gapi::imgproc::cpu::kernels(),
|
|
|
|
cv::gapi::video::cpu::kernels(),
|
2019-10-18 02:04:03 +08:00
|
|
|
cv::gapi::render::ocv::kernels());
|
2018-09-28 23:42:09 +08:00
|
|
|
#else
|
|
|
|
cv::gapi::GKernelPackage();
|
|
|
|
#endif // !defined(GAPI_STANDALONE)
|
2019-10-18 02:04:03 +08:00
|
|
|
|
2020-06-25 05:43:12 +08:00
|
|
|
auto user_pkg = cv::gapi::getCompileArg<cv::gapi::GKernelPackage>(args);
|
2019-05-23 02:13:13 +08:00
|
|
|
auto user_pkg_with_aux = withAuxKernels(user_pkg.value_or(cv::gapi::GKernelPackage{}));
|
|
|
|
return combine(ocv_pkg, user_pkg_with_aux);
|
2018-09-27 02:50:39 +08:00
|
|
|
}
|
|
|
|
|
2019-08-05 22:56:34 +08:00
|
|
|
cv::gapi::GNetPackage getNetworkPackage(cv::GCompileArgs &args)
|
|
|
|
{
|
2020-06-25 05:43:12 +08:00
|
|
|
return cv::gapi::getCompileArg<cv::gapi::GNetPackage>(args)
|
2019-08-05 22:56:34 +08:00
|
|
|
.value_or(cv::gapi::GNetPackage{});
|
|
|
|
}
|
|
|
|
|
2018-09-27 02:50:39 +08:00
|
|
|
cv::util::optional<std::string> getGraphDumpDirectory(cv::GCompileArgs& args)
|
|
|
|
{
|
2020-06-25 05:43:12 +08:00
|
|
|
auto dump_info = cv::gapi::getCompileArg<cv::graph_dump_path>(args);
|
2018-09-27 02:50:39 +08:00
|
|
|
if (!dump_info.has_value())
|
|
|
|
{
|
|
|
|
const char* path = std::getenv("GRAPH_DUMP_PATH");
|
|
|
|
return path
|
|
|
|
? cv::util::make_optional(std::string(path))
|
|
|
|
: cv::util::optional<std::string>();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return cv::util::make_optional(dump_info.value().m_dump_path);
|
|
|
|
}
|
|
|
|
}
|
2019-08-05 22:56:34 +08:00
|
|
|
|
|
|
|
template<typename C>
|
|
|
|
cv::gapi::GKernelPackage auxKernelsFrom(const C& c) {
|
|
|
|
cv::gapi::GKernelPackage result;
|
|
|
|
for (const auto &b : c) {
|
|
|
|
result = cv::gapi::combine(result, b.priv().auxiliaryKernels());
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2019-09-25 23:19:45 +08:00
|
|
|
// Creates ADE graph from input/output proto args
|
|
|
|
std::unique_ptr<ade::Graph> makeGraph(const cv::GProtoArgs &ins, const cv::GProtoArgs &outs) {
|
|
|
|
std::unique_ptr<ade::Graph> pG(new ade::Graph);
|
|
|
|
ade::Graph& g = *pG;
|
|
|
|
|
|
|
|
cv::gimpl::GModel::Graph gm(g);
|
|
|
|
cv::gimpl::GModel::init(gm);
|
|
|
|
cv::gimpl::GModelBuilder builder(g);
|
|
|
|
auto proto_slots = builder.put(ins, outs);
|
|
|
|
|
|
|
|
// Store Computation's protocol in metadata
|
|
|
|
cv::gimpl::Protocol p;
|
|
|
|
std::tie(p.inputs, p.outputs, p.in_nhs, p.out_nhs) = proto_slots;
|
|
|
|
gm.metadata().set(p);
|
|
|
|
|
|
|
|
return pG;
|
|
|
|
}
|
|
|
|
|
|
|
|
using adeGraphs = std::vector<std::unique_ptr<ade::Graph>>;
|
|
|
|
|
|
|
|
// Creates ADE graphs (patterns and substitutes) from pkg's transformations
|
|
|
|
void makeTransformationGraphs(const cv::gapi::GKernelPackage& pkg,
|
|
|
|
adeGraphs& patterns,
|
|
|
|
adeGraphs& substitutes) {
|
|
|
|
const auto& transforms = pkg.get_transformations();
|
|
|
|
const auto size = transforms.size();
|
|
|
|
if (0u == size) return;
|
|
|
|
|
|
|
|
// pre-generate all required graphs
|
|
|
|
patterns.resize(size);
|
|
|
|
substitutes.resize(size);
|
|
|
|
for (auto it : ade::util::zip(ade::util::toRange(transforms),
|
|
|
|
ade::util::toRange(patterns),
|
|
|
|
ade::util::toRange(substitutes))) {
|
|
|
|
const auto& t = std::get<0>(it);
|
|
|
|
auto& p = std::get<1>(it);
|
|
|
|
auto& s = std::get<2>(it);
|
|
|
|
|
|
|
|
auto pattern_comp = t.pattern();
|
|
|
|
p = makeGraph(pattern_comp.priv().m_ins, pattern_comp.priv().m_outs);
|
|
|
|
|
|
|
|
auto substitute_comp = t.substitute();
|
|
|
|
s = makeGraph(substitute_comp.priv().m_ins, substitute_comp.priv().m_outs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void checkTransformations(const cv::gapi::GKernelPackage& pkg,
|
|
|
|
const adeGraphs& patterns,
|
|
|
|
const adeGraphs& substitutes) {
|
|
|
|
const auto& transforms = pkg.get_transformations();
|
|
|
|
const auto size = transforms.size();
|
|
|
|
if (0u == size) return;
|
|
|
|
|
|
|
|
GAPI_Assert(size == patterns.size());
|
|
|
|
GAPI_Assert(size == substitutes.size());
|
|
|
|
|
|
|
|
const auto empty = [] (const cv::gimpl::SubgraphMatch& m) {
|
|
|
|
return m.inputDataNodes.empty() && m.startOpNodes.empty()
|
|
|
|
&& m.finishOpNodes.empty() && m.outputDataNodes.empty()
|
|
|
|
&& m.inputTestDataNodes.empty() && m.outputTestDataNodes.empty();
|
|
|
|
};
|
|
|
|
|
|
|
|
// **FIXME**: verify other types of endless loops. now, only checking if pattern exists in
|
|
|
|
// substitute within __the same__ transformation
|
|
|
|
for (size_t i = 0; i < size; ++i) {
|
|
|
|
const auto& p = patterns[i];
|
|
|
|
const auto& s = substitutes[i];
|
|
|
|
|
|
|
|
auto matchInSubstitute = cv::gimpl::findMatches(*p, *s);
|
|
|
|
if (!empty(matchInSubstitute)) {
|
|
|
|
std::stringstream ss;
|
|
|
|
ss << "Error: (in transformation with description: '"
|
|
|
|
<< transforms[i].description
|
|
|
|
<< "') pattern is detected inside substitute";
|
|
|
|
throw std::runtime_error(ss.str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-09-27 02:50:39 +08:00
|
|
|
} // anonymous namespace
|
|
|
|
|
|
|
|
|
|
|
|
// GCompiler implementation ////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
cv::gimpl::GCompiler::GCompiler(const cv::GComputation &c,
|
|
|
|
GMetaArgs &&metas,
|
|
|
|
GCompileArgs &&args)
|
|
|
|
: m_c(c), m_metas(std::move(metas)), m_args(std::move(args))
|
|
|
|
{
|
|
|
|
using namespace std::placeholders;
|
2019-08-05 22:56:34 +08:00
|
|
|
|
|
|
|
auto kernels_to_use = getKernelPackage(m_args);
|
|
|
|
auto networks_to_use = getNetworkPackage(m_args);
|
|
|
|
std::unordered_set<cv::gapi::GBackend> all_backends;
|
|
|
|
const auto take = [&](std::vector<cv::gapi::GBackend> &&v) {
|
|
|
|
all_backends.insert(v.begin(), v.end());
|
|
|
|
};
|
|
|
|
take(kernels_to_use.backends());
|
|
|
|
take(networks_to_use.backends());
|
2019-10-18 02:04:03 +08:00
|
|
|
|
|
|
|
m_all_kernels = cv::gapi::combine(kernels_to_use,
|
|
|
|
auxKernelsFrom(all_backends));
|
2019-08-05 22:56:34 +08:00
|
|
|
// NB: The expectation in the line above is that
|
|
|
|
// NN backends (present here via network package) always add their
|
|
|
|
// inference kernels via auxiliary...()
|
|
|
|
|
2019-09-25 23:19:45 +08:00
|
|
|
// sanity check transformations
|
|
|
|
{
|
|
|
|
adeGraphs patterns, substitutes;
|
|
|
|
// FIXME: returning vectors of unique_ptrs from makeTransformationGraphs results in
|
|
|
|
// compile error (at least) on GCC 9 with usage of copy-ctor of std::unique_ptr, so
|
|
|
|
// using initialization by lvalue reference instead
|
|
|
|
makeTransformationGraphs(m_all_kernels, patterns, substitutes);
|
|
|
|
checkTransformations(m_all_kernels, patterns, substitutes);
|
|
|
|
|
|
|
|
// NB: saving generated patterns to m_all_patterns to be used later in passes
|
|
|
|
m_all_patterns = std::move(patterns);
|
|
|
|
}
|
|
|
|
|
2019-08-05 22:56:34 +08:00
|
|
|
auto dump_path = getGraphDumpDirectory(m_args);
|
2018-09-27 02:50:39 +08:00
|
|
|
|
|
|
|
m_e.addPassStage("init");
|
|
|
|
m_e.addPass("init", "check_cycles", ade::passes::CheckCycles());
|
2019-09-25 23:19:45 +08:00
|
|
|
m_e.addPass("init", "apply_transformations",
|
|
|
|
std::bind(passes::applyTransformations, _1, std::cref(m_all_kernels),
|
|
|
|
std::cref(m_all_patterns))); // Note: and re-using patterns here
|
2019-08-05 22:56:34 +08:00
|
|
|
m_e.addPass("init", "expand_kernels",
|
|
|
|
std::bind(passes::expandKernels, _1,
|
|
|
|
m_all_kernels)); // NB: package is copied
|
2018-09-27 02:50:39 +08:00
|
|
|
m_e.addPass("init", "topo_sort", ade::passes::TopologicalSort());
|
|
|
|
m_e.addPass("init", "init_islands", passes::initIslands);
|
|
|
|
m_e.addPass("init", "check_islands", passes::checkIslands);
|
|
|
|
// TODO:
|
|
|
|
// - Check basic graph validity (i.e., all inputs are connected)
|
|
|
|
// - Complex dependencies (i.e. parent-child) unrolling
|
|
|
|
// - etc, etc, etc
|
|
|
|
|
|
|
|
// Remove GCompoundBackend to avoid calling setupBackend() with it in the list
|
|
|
|
m_all_kernels.remove(cv::gapi::compound::backend());
|
2018-12-12 22:22:52 +08:00
|
|
|
|
|
|
|
m_e.addPassStage("kernels");
|
2019-08-05 22:56:34 +08:00
|
|
|
m_e.addPass("kernels", "bind_net_params",
|
|
|
|
std::bind(passes::bindNetParams, _1,
|
|
|
|
networks_to_use));
|
|
|
|
m_e.addPass("kernels", "resolve_kernels",
|
|
|
|
std::bind(passes::resolveKernels, _1,
|
|
|
|
std::ref(m_all_kernels))); // NB: and not copied here
|
|
|
|
// (no compound backend present here)
|
2018-12-12 22:22:52 +08:00
|
|
|
m_e.addPass("kernels", "check_islands_content", passes::checkIslandsContent);
|
2018-09-27 02:50:39 +08:00
|
|
|
|
2019-12-04 00:14:13 +08:00
|
|
|
//Input metas may be empty when a graph is compiled for streaming
|
2018-09-27 02:50:39 +08:00
|
|
|
m_e.addPassStage("meta");
|
2019-12-04 00:14:13 +08:00
|
|
|
if (!m_metas.empty())
|
|
|
|
{
|
|
|
|
m_e.addPass("meta", "initialize", std::bind(passes::initMeta, _1, std::ref(m_metas)));
|
|
|
|
m_e.addPass("meta", "propagate", std::bind(passes::inferMeta, _1, false));
|
|
|
|
m_e.addPass("meta", "finalize", passes::storeResultingMeta);
|
|
|
|
// moved to another stage, FIXME: two dumps?
|
|
|
|
// m_e.addPass("meta", "dump_dot", passes::dumpDotStdout);
|
|
|
|
}
|
2018-09-27 02:50:39 +08:00
|
|
|
// Special stage for backend-specific transformations
|
|
|
|
// FIXME: document passes hierarchy and order for backend developers
|
|
|
|
m_e.addPassStage("transform");
|
|
|
|
|
|
|
|
m_e.addPassStage("exec");
|
|
|
|
m_e.addPass("exec", "fuse_islands", passes::fuseIslands);
|
|
|
|
m_e.addPass("exec", "sync_islands", passes::syncIslandTags);
|
|
|
|
|
Merge pull request #15216 from dmatveev:dm/ng-0010-g-api-streaming-api
* G-API-NG/Streaming: Introduced a Streaming API
Now a GComputation can be compiled in a special "streaming" way
and then "played" on a video stream.
Currently only VideoCapture is supported as an input source.
* G-API-NG/Streaming: added threading & real streaming
* G-API-NG/Streaming: Added tests & docs on Copy kernel
- Added very simple pipeline tests, not all data types are covered yet
(in fact, only GMat is tested now);
- Started testing non-OCV backends in the streaming mode;
- Added required fixes to Fluid backend, likely it works OK now;
- Added required fixes to OCL backend, and now it is likely broken
- Also added a UMat-based (OCL) version of Copy kernel
* G-API-NG/Streaming: Added own concurrent queue class
- Used only if TBB is not available
* G-API-NG/Streaming: Fixing various issues
- Added missing header to CMakeLists.txt
- Fixed various CI issues and warnings
* G-API-NG/Streaming: Fixed a compile-time GScalar queue deadlock
- GStreamingExecutor blindly created island's input queues for
compile-time (value-initialized) GScalars which didn't have any
producers, making island actor threads wait there forever
* G-API-NG/Streaming: Dropped own version of Copy kernel
One was added into master already
* G-API-NG/Streaming: Addressed GArray<T> review comments
- Added tests on mov()
- Removed unnecessary changes in garray.hpp
* G-API-NG/Streaming: Added Doxygen comments to new public APIs
Also fixed some other comments in the code
* G-API-NG/Streaming: Removed debug info, added some comments & renamed vars
* G-API-NG/Streaming: Fixed own-vs-cv abstraction leak
- Now every island is triggered with own:: (instead of cv::)
data objects as inputs;
- Changes in Fluid backend required to support cv::Mat/Scalar were
reverted;
* G-API-NG/Streaming: use holds_alternative<> instead of index/index_of test
- Also fixed regression test comments
- Also added metadata check comments for GStreamingCompiled
* G-API-NG/Streaming: Made start()/stop() more robust
- Fixed various possible deadlocks
- Unified the shutdown code
- Added more tests covering different corner cases on start/stop
* G-API-NG/Streaming: Finally fixed Windows crashes
In fact the problem hasn't been Windows-only.
Island thread popped data from queues without preserving the Cmd
objects and without taking the ownership over data acquired so when
islands started to process the data, this data may be already freed.
Linux version worked only by occasion.
* G-API-NG/Streaming: Fixed (I hope so) Windows warnings
* G-API-NG/Streaming: fixed typos in internal comments
- Also added some more explanation on Streaming/OpenCL status
* G-API-NG/Streaming: Added more unit tests on streaming
- Various start()/stop()/setSource() call flow combinations
* G-API-NG/Streaming: Added tests on own concurrent bounded queue
* G-API-NG/Streaming: Added more tests on various data types, + more
- Vector/Scalar passed as input;
- Vector/Scalar passed in-between islands;
- Some more assertions;
- Also fixed a deadlock problem when inputs are mixed (1 constant, 1 stream)
* G-API-NG/Streaming: Added tests on output data types handling
- Vector
- Scalar
* G-API-NG/Streaming: Fixed test issues with IE + Windows warnings
* G-API-NG/Streaming: Decoupled G-API from videoio
- Now the core G-API doesn't use a cv::VideoCapture directly,
it comes in via an abstract interface;
- Polished a little bit the setSource()/start()/stop() semantics,
now setSource() is mandatory before ANY call to start().
* G-API-NG/Streaming: Fix STANDALONE build (errors brought by render)
2019-10-19 00:29:58 +08:00
|
|
|
// FIXME: Since a set of passes is shared between
|
|
|
|
// GCompiled/GStreamingCompiled, this pass is added here unconditionally
|
|
|
|
// (even if it is not actually required to produce a GCompiled).
|
|
|
|
// FIXME: add a better way to do that!
|
|
|
|
m_e.addPass("exec", "add_streaming", passes::addStreaming);
|
|
|
|
|
2019-12-04 00:14:13 +08:00
|
|
|
// Note: Must be called after addStreaming as addStreaming pass
|
|
|
|
// can possibly add new nodes to the IslandModel
|
|
|
|
m_e.addPass("exec", "sort_islands", passes::topoSortIslands);
|
|
|
|
|
2018-09-27 02:50:39 +08:00
|
|
|
if (dump_path.has_value())
|
|
|
|
{
|
|
|
|
m_e.addPass("exec", "dump_dot", std::bind(passes::dumpGraph, _1,
|
|
|
|
dump_path.value()));
|
|
|
|
}
|
|
|
|
|
2019-08-05 22:56:34 +08:00
|
|
|
// FIXME: This should be called for "ActiveBackends" only (see metadata).
|
|
|
|
// However, ActiveBackends are known only after passes are actually executed.
|
|
|
|
// At these stage, they are not executed yet.
|
2018-09-27 02:50:39 +08:00
|
|
|
ade::ExecutionEngineSetupContext ectx(m_e);
|
|
|
|
auto backends = m_all_kernels.backends();
|
|
|
|
for (auto &b : backends)
|
|
|
|
{
|
|
|
|
b.priv().addBackendPasses(ectx);
|
2019-12-04 00:14:13 +08:00
|
|
|
if (!m_metas.empty())
|
|
|
|
{
|
|
|
|
b.priv().addMetaSensitiveBackendPasses(ectx);
|
|
|
|
}
|
2018-09-27 02:50:39 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void cv::gimpl::GCompiler::validateInputMeta()
|
|
|
|
{
|
|
|
|
if (m_metas.size() != m_c.priv().m_ins.size())
|
|
|
|
{
|
|
|
|
util::throw_error(std::logic_error
|
|
|
|
("COMPILE: GComputation interface / metadata mismatch! "
|
|
|
|
"(expected " + std::to_string(m_c.priv().m_ins.size()) + ", "
|
|
|
|
"got " + std::to_string(m_metas.size()) + " meta arguments)"));
|
|
|
|
}
|
|
|
|
|
|
|
|
const auto meta_matches = [](const GMetaArg &meta, const GProtoArg &proto) {
|
|
|
|
switch (proto.index())
|
|
|
|
{
|
|
|
|
// FIXME: Auto-generate methods like this from traits:
|
|
|
|
case GProtoArg::index_of<cv::GMat>():
|
2019-04-30 00:21:14 +08:00
|
|
|
case GProtoArg::index_of<cv::GMatP>():
|
2020-03-11 20:45:35 +08:00
|
|
|
case GProtoArg::index_of<cv::GFrame>():
|
2018-09-27 02:50:39 +08:00
|
|
|
return util::holds_alternative<cv::GMatDesc>(meta);
|
|
|
|
|
|
|
|
case GProtoArg::index_of<cv::GScalar>():
|
|
|
|
return util::holds_alternative<cv::GScalarDesc>(meta);
|
|
|
|
|
|
|
|
case GProtoArg::index_of<cv::detail::GArrayU>():
|
|
|
|
return util::holds_alternative<cv::GArrayDesc>(meta);
|
|
|
|
|
2020-01-31 02:08:11 +08:00
|
|
|
case GProtoArg::index_of<cv::detail::GOpaqueU>():
|
|
|
|
return util::holds_alternative<cv::GOpaqueDesc>(meta);
|
|
|
|
|
2018-09-27 02:50:39 +08:00
|
|
|
default:
|
|
|
|
GAPI_Assert(false);
|
|
|
|
}
|
|
|
|
return false; // should never happen
|
|
|
|
};
|
|
|
|
|
|
|
|
for (const auto &meta_arg_idx : ade::util::indexed(ade::util::zip(m_metas, m_c.priv().m_ins)))
|
|
|
|
{
|
|
|
|
const auto &meta = std::get<0>(ade::util::value(meta_arg_idx));
|
|
|
|
const auto &proto = std::get<1>(ade::util::value(meta_arg_idx));
|
|
|
|
|
|
|
|
if (!meta_matches(meta, proto))
|
|
|
|
{
|
|
|
|
const auto index = ade::util::index(meta_arg_idx);
|
|
|
|
util::throw_error(std::logic_error
|
|
|
|
("GComputation object type / metadata descriptor mismatch "
|
|
|
|
"(argument " + std::to_string(index) + ")"));
|
|
|
|
// FIXME: report what we've got and what we've expected
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// All checks are ok
|
|
|
|
}
|
|
|
|
|
|
|
|
void cv::gimpl::GCompiler::validateOutProtoArgs()
|
|
|
|
{
|
|
|
|
for (const auto &out_pos : ade::util::indexed(m_c.priv().m_outs))
|
|
|
|
{
|
|
|
|
const auto &node = proto::origin_of(ade::util::value(out_pos)).node;
|
|
|
|
if (node.shape() != cv::GNode::NodeShape::CALL)
|
|
|
|
{
|
|
|
|
auto pos = ade::util::index(out_pos);
|
|
|
|
util::throw_error(std::logic_error
|
|
|
|
("Computation output " + std::to_string(pos) +
|
|
|
|
" is not a result of any operation"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cv::gimpl::GCompiler::GPtr cv::gimpl::GCompiler::generateGraph()
|
|
|
|
{
|
2019-12-04 00:14:13 +08:00
|
|
|
if (!m_metas.empty())
|
|
|
|
{
|
|
|
|
// Metadata may be empty if we're compiling our graph for streaming
|
|
|
|
validateInputMeta();
|
|
|
|
}
|
2018-09-27 02:50:39 +08:00
|
|
|
validateOutProtoArgs();
|
2019-12-04 00:14:13 +08:00
|
|
|
auto g = makeGraph(m_c.priv().m_ins, m_c.priv().m_outs);
|
|
|
|
if (!m_metas.empty())
|
|
|
|
{
|
|
|
|
GModel::Graph(*g).metadata().set(OriginalInputMeta{m_metas});
|
|
|
|
}
|
|
|
|
return g;
|
2018-09-27 02:50:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void cv::gimpl::GCompiler::runPasses(ade::Graph &g)
|
|
|
|
{
|
|
|
|
m_e.runPasses(g);
|
|
|
|
GAPI_LOG_INFO(NULL, "All compiler passes are successful");
|
|
|
|
}
|
|
|
|
|
|
|
|
void cv::gimpl::GCompiler::compileIslands(ade::Graph &g)
|
2019-12-04 00:14:13 +08:00
|
|
|
{
|
|
|
|
compileIslands(g, m_args);
|
|
|
|
}
|
|
|
|
|
|
|
|
void cv::gimpl::GCompiler::compileIslands(ade::Graph &g, const cv::GCompileArgs &args)
|
2018-09-27 02:50:39 +08:00
|
|
|
{
|
|
|
|
GModel::Graph gm(g);
|
|
|
|
std::shared_ptr<ade::Graph> gptr(gm.metadata().get<IslandModel>().model);
|
|
|
|
GIslandModel::Graph gim(*gptr);
|
|
|
|
|
2019-12-04 00:14:13 +08:00
|
|
|
GIslandModel::compileIslands(gim, g, args);
|
2018-09-27 02:50:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
cv::GCompiled cv::gimpl::GCompiler::produceCompiled(GPtr &&pg)
|
|
|
|
{
|
|
|
|
// This is the final compilation step. Here:
|
Fix modules/ typos
Found using `codespell -q 3 -S ./3rdparty -L activ,amin,ang,atleast,childs,dof,endwhile,halfs,hist,iff,nd,od,uint`
2019-08-16 06:02:09 +08:00
|
|
|
// - An instance of GExecutor is created. Depending on the platform,
|
2018-09-27 02:50:39 +08:00
|
|
|
// build configuration, etc, a GExecutor may be:
|
|
|
|
// - a naive single-thread graph interpreter;
|
|
|
|
// - a std::thread-based thing
|
|
|
|
// - a TBB-based thing, etc.
|
|
|
|
// - All this stuff is wrapped into a GCompiled object and returned
|
|
|
|
// to user.
|
|
|
|
|
|
|
|
// Note: this happens in the last pass ("compile_islands"):
|
|
|
|
// - Each GIsland of GIslandModel instantiates its own,
|
|
|
|
// backend-specific executable object
|
|
|
|
// - Every backend gets a subgraph to execute, and builds
|
|
|
|
// an execution plan for it (backend-specific execution)
|
|
|
|
// ...before call to produceCompiled();
|
|
|
|
|
|
|
|
const auto &outMetas = GModel::ConstGraph(*pg).metadata()
|
|
|
|
.get<OutputMeta>().outMeta;
|
|
|
|
std::unique_ptr<GExecutor> pE(new GExecutor(std::move(pg)));
|
|
|
|
// FIXME: select which executor will be actually used,
|
|
|
|
// make GExecutor abstract.
|
|
|
|
|
|
|
|
GCompiled compiled;
|
|
|
|
compiled.priv().setup(m_metas, outMetas, std::move(pE));
|
|
|
|
return compiled;
|
|
|
|
}
|
|
|
|
|
Merge pull request #15216 from dmatveev:dm/ng-0010-g-api-streaming-api
* G-API-NG/Streaming: Introduced a Streaming API
Now a GComputation can be compiled in a special "streaming" way
and then "played" on a video stream.
Currently only VideoCapture is supported as an input source.
* G-API-NG/Streaming: added threading & real streaming
* G-API-NG/Streaming: Added tests & docs on Copy kernel
- Added very simple pipeline tests, not all data types are covered yet
(in fact, only GMat is tested now);
- Started testing non-OCV backends in the streaming mode;
- Added required fixes to Fluid backend, likely it works OK now;
- Added required fixes to OCL backend, and now it is likely broken
- Also added a UMat-based (OCL) version of Copy kernel
* G-API-NG/Streaming: Added own concurrent queue class
- Used only if TBB is not available
* G-API-NG/Streaming: Fixing various issues
- Added missing header to CMakeLists.txt
- Fixed various CI issues and warnings
* G-API-NG/Streaming: Fixed a compile-time GScalar queue deadlock
- GStreamingExecutor blindly created island's input queues for
compile-time (value-initialized) GScalars which didn't have any
producers, making island actor threads wait there forever
* G-API-NG/Streaming: Dropped own version of Copy kernel
One was added into master already
* G-API-NG/Streaming: Addressed GArray<T> review comments
- Added tests on mov()
- Removed unnecessary changes in garray.hpp
* G-API-NG/Streaming: Added Doxygen comments to new public APIs
Also fixed some other comments in the code
* G-API-NG/Streaming: Removed debug info, added some comments & renamed vars
* G-API-NG/Streaming: Fixed own-vs-cv abstraction leak
- Now every island is triggered with own:: (instead of cv::)
data objects as inputs;
- Changes in Fluid backend required to support cv::Mat/Scalar were
reverted;
* G-API-NG/Streaming: use holds_alternative<> instead of index/index_of test
- Also fixed regression test comments
- Also added metadata check comments for GStreamingCompiled
* G-API-NG/Streaming: Made start()/stop() more robust
- Fixed various possible deadlocks
- Unified the shutdown code
- Added more tests covering different corner cases on start/stop
* G-API-NG/Streaming: Finally fixed Windows crashes
In fact the problem hasn't been Windows-only.
Island thread popped data from queues without preserving the Cmd
objects and without taking the ownership over data acquired so when
islands started to process the data, this data may be already freed.
Linux version worked only by occasion.
* G-API-NG/Streaming: Fixed (I hope so) Windows warnings
* G-API-NG/Streaming: fixed typos in internal comments
- Also added some more explanation on Streaming/OpenCL status
* G-API-NG/Streaming: Added more unit tests on streaming
- Various start()/stop()/setSource() call flow combinations
* G-API-NG/Streaming: Added tests on own concurrent bounded queue
* G-API-NG/Streaming: Added more tests on various data types, + more
- Vector/Scalar passed as input;
- Vector/Scalar passed in-between islands;
- Some more assertions;
- Also fixed a deadlock problem when inputs are mixed (1 constant, 1 stream)
* G-API-NG/Streaming: Added tests on output data types handling
- Vector
- Scalar
* G-API-NG/Streaming: Fixed test issues with IE + Windows warnings
* G-API-NG/Streaming: Decoupled G-API from videoio
- Now the core G-API doesn't use a cv::VideoCapture directly,
it comes in via an abstract interface;
- Polished a little bit the setSource()/start()/stop() semantics,
now setSource() is mandatory before ANY call to start().
* G-API-NG/Streaming: Fix STANDALONE build (errors brought by render)
2019-10-19 00:29:58 +08:00
|
|
|
cv::GStreamingCompiled cv::gimpl::GCompiler::produceStreamingCompiled(GPtr &&pg)
|
|
|
|
{
|
|
|
|
GStreamingCompiled compiled;
|
2019-12-04 00:14:13 +08:00
|
|
|
GMetaArgs outMetas;
|
|
|
|
|
|
|
|
// FIXME: the whole below construct is ugly, need to revise
|
|
|
|
// how G*Compiled learns about its meta.
|
|
|
|
if (!m_metas.empty())
|
|
|
|
{
|
|
|
|
outMetas = GModel::ConstGraph(*pg).metadata().get<OutputMeta>().outMeta;
|
|
|
|
}
|
|
|
|
|
2020-06-25 05:43:12 +08:00
|
|
|
std::unique_ptr<GStreamingExecutor> pE(new GStreamingExecutor(std::move(pg),
|
|
|
|
m_args));
|
2019-12-04 00:14:13 +08:00
|
|
|
if (!m_metas.empty() && !outMetas.empty())
|
|
|
|
{
|
|
|
|
compiled.priv().setup(m_metas, outMetas, std::move(pE));
|
|
|
|
}
|
|
|
|
else if (m_metas.empty() && outMetas.empty())
|
|
|
|
{
|
|
|
|
// Otherwise, set it up with executor object only
|
|
|
|
compiled.priv().setup(std::move(pE));
|
|
|
|
}
|
|
|
|
else GAPI_Assert(false && "Impossible happened -- please report a bug");
|
Merge pull request #15216 from dmatveev:dm/ng-0010-g-api-streaming-api
* G-API-NG/Streaming: Introduced a Streaming API
Now a GComputation can be compiled in a special "streaming" way
and then "played" on a video stream.
Currently only VideoCapture is supported as an input source.
* G-API-NG/Streaming: added threading & real streaming
* G-API-NG/Streaming: Added tests & docs on Copy kernel
- Added very simple pipeline tests, not all data types are covered yet
(in fact, only GMat is tested now);
- Started testing non-OCV backends in the streaming mode;
- Added required fixes to Fluid backend, likely it works OK now;
- Added required fixes to OCL backend, and now it is likely broken
- Also added a UMat-based (OCL) version of Copy kernel
* G-API-NG/Streaming: Added own concurrent queue class
- Used only if TBB is not available
* G-API-NG/Streaming: Fixing various issues
- Added missing header to CMakeLists.txt
- Fixed various CI issues and warnings
* G-API-NG/Streaming: Fixed a compile-time GScalar queue deadlock
- GStreamingExecutor blindly created island's input queues for
compile-time (value-initialized) GScalars which didn't have any
producers, making island actor threads wait there forever
* G-API-NG/Streaming: Dropped own version of Copy kernel
One was added into master already
* G-API-NG/Streaming: Addressed GArray<T> review comments
- Added tests on mov()
- Removed unnecessary changes in garray.hpp
* G-API-NG/Streaming: Added Doxygen comments to new public APIs
Also fixed some other comments in the code
* G-API-NG/Streaming: Removed debug info, added some comments & renamed vars
* G-API-NG/Streaming: Fixed own-vs-cv abstraction leak
- Now every island is triggered with own:: (instead of cv::)
data objects as inputs;
- Changes in Fluid backend required to support cv::Mat/Scalar were
reverted;
* G-API-NG/Streaming: use holds_alternative<> instead of index/index_of test
- Also fixed regression test comments
- Also added metadata check comments for GStreamingCompiled
* G-API-NG/Streaming: Made start()/stop() more robust
- Fixed various possible deadlocks
- Unified the shutdown code
- Added more tests covering different corner cases on start/stop
* G-API-NG/Streaming: Finally fixed Windows crashes
In fact the problem hasn't been Windows-only.
Island thread popped data from queues without preserving the Cmd
objects and without taking the ownership over data acquired so when
islands started to process the data, this data may be already freed.
Linux version worked only by occasion.
* G-API-NG/Streaming: Fixed (I hope so) Windows warnings
* G-API-NG/Streaming: fixed typos in internal comments
- Also added some more explanation on Streaming/OpenCL status
* G-API-NG/Streaming: Added more unit tests on streaming
- Various start()/stop()/setSource() call flow combinations
* G-API-NG/Streaming: Added tests on own concurrent bounded queue
* G-API-NG/Streaming: Added more tests on various data types, + more
- Vector/Scalar passed as input;
- Vector/Scalar passed in-between islands;
- Some more assertions;
- Also fixed a deadlock problem when inputs are mixed (1 constant, 1 stream)
* G-API-NG/Streaming: Added tests on output data types handling
- Vector
- Scalar
* G-API-NG/Streaming: Fixed test issues with IE + Windows warnings
* G-API-NG/Streaming: Decoupled G-API from videoio
- Now the core G-API doesn't use a cv::VideoCapture directly,
it comes in via an abstract interface;
- Polished a little bit the setSource()/start()/stop() semantics,
now setSource() is mandatory before ANY call to start().
* G-API-NG/Streaming: Fix STANDALONE build (errors brought by render)
2019-10-19 00:29:58 +08:00
|
|
|
return compiled;
|
|
|
|
}
|
|
|
|
|
2018-09-27 02:50:39 +08:00
|
|
|
cv::GCompiled cv::gimpl::GCompiler::compile()
|
|
|
|
{
|
|
|
|
std::unique_ptr<ade::Graph> pG = generateGraph();
|
|
|
|
runPasses(*pG);
|
|
|
|
compileIslands(*pG);
|
|
|
|
return produceCompiled(std::move(pG));
|
|
|
|
}
|
Merge pull request #15216 from dmatveev:dm/ng-0010-g-api-streaming-api
* G-API-NG/Streaming: Introduced a Streaming API
Now a GComputation can be compiled in a special "streaming" way
and then "played" on a video stream.
Currently only VideoCapture is supported as an input source.
* G-API-NG/Streaming: added threading & real streaming
* G-API-NG/Streaming: Added tests & docs on Copy kernel
- Added very simple pipeline tests, not all data types are covered yet
(in fact, only GMat is tested now);
- Started testing non-OCV backends in the streaming mode;
- Added required fixes to Fluid backend, likely it works OK now;
- Added required fixes to OCL backend, and now it is likely broken
- Also added a UMat-based (OCL) version of Copy kernel
* G-API-NG/Streaming: Added own concurrent queue class
- Used only if TBB is not available
* G-API-NG/Streaming: Fixing various issues
- Added missing header to CMakeLists.txt
- Fixed various CI issues and warnings
* G-API-NG/Streaming: Fixed a compile-time GScalar queue deadlock
- GStreamingExecutor blindly created island's input queues for
compile-time (value-initialized) GScalars which didn't have any
producers, making island actor threads wait there forever
* G-API-NG/Streaming: Dropped own version of Copy kernel
One was added into master already
* G-API-NG/Streaming: Addressed GArray<T> review comments
- Added tests on mov()
- Removed unnecessary changes in garray.hpp
* G-API-NG/Streaming: Added Doxygen comments to new public APIs
Also fixed some other comments in the code
* G-API-NG/Streaming: Removed debug info, added some comments & renamed vars
* G-API-NG/Streaming: Fixed own-vs-cv abstraction leak
- Now every island is triggered with own:: (instead of cv::)
data objects as inputs;
- Changes in Fluid backend required to support cv::Mat/Scalar were
reverted;
* G-API-NG/Streaming: use holds_alternative<> instead of index/index_of test
- Also fixed regression test comments
- Also added metadata check comments for GStreamingCompiled
* G-API-NG/Streaming: Made start()/stop() more robust
- Fixed various possible deadlocks
- Unified the shutdown code
- Added more tests covering different corner cases on start/stop
* G-API-NG/Streaming: Finally fixed Windows crashes
In fact the problem hasn't been Windows-only.
Island thread popped data from queues without preserving the Cmd
objects and without taking the ownership over data acquired so when
islands started to process the data, this data may be already freed.
Linux version worked only by occasion.
* G-API-NG/Streaming: Fixed (I hope so) Windows warnings
* G-API-NG/Streaming: fixed typos in internal comments
- Also added some more explanation on Streaming/OpenCL status
* G-API-NG/Streaming: Added more unit tests on streaming
- Various start()/stop()/setSource() call flow combinations
* G-API-NG/Streaming: Added tests on own concurrent bounded queue
* G-API-NG/Streaming: Added more tests on various data types, + more
- Vector/Scalar passed as input;
- Vector/Scalar passed in-between islands;
- Some more assertions;
- Also fixed a deadlock problem when inputs are mixed (1 constant, 1 stream)
* G-API-NG/Streaming: Added tests on output data types handling
- Vector
- Scalar
* G-API-NG/Streaming: Fixed test issues with IE + Windows warnings
* G-API-NG/Streaming: Decoupled G-API from videoio
- Now the core G-API doesn't use a cv::VideoCapture directly,
it comes in via an abstract interface;
- Polished a little bit the setSource()/start()/stop() semantics,
now setSource() is mandatory before ANY call to start().
* G-API-NG/Streaming: Fix STANDALONE build (errors brought by render)
2019-10-19 00:29:58 +08:00
|
|
|
|
|
|
|
cv::GStreamingCompiled cv::gimpl::GCompiler::compileStreaming()
|
|
|
|
{
|
|
|
|
// FIXME: self-note to DM: now keep these compile()/compileStreaming() in sync!
|
|
|
|
std::unique_ptr<ade::Graph> pG = generateGraph();
|
|
|
|
GModel::Graph(*pG).metadata().set(Streaming{});
|
|
|
|
runPasses(*pG);
|
2019-12-04 00:14:13 +08:00
|
|
|
if (!m_metas.empty())
|
|
|
|
{
|
|
|
|
// If the metadata has been passed, compile our islands!
|
|
|
|
compileIslands(*pG);
|
|
|
|
}
|
Merge pull request #15216 from dmatveev:dm/ng-0010-g-api-streaming-api
* G-API-NG/Streaming: Introduced a Streaming API
Now a GComputation can be compiled in a special "streaming" way
and then "played" on a video stream.
Currently only VideoCapture is supported as an input source.
* G-API-NG/Streaming: added threading & real streaming
* G-API-NG/Streaming: Added tests & docs on Copy kernel
- Added very simple pipeline tests, not all data types are covered yet
(in fact, only GMat is tested now);
- Started testing non-OCV backends in the streaming mode;
- Added required fixes to Fluid backend, likely it works OK now;
- Added required fixes to OCL backend, and now it is likely broken
- Also added a UMat-based (OCL) version of Copy kernel
* G-API-NG/Streaming: Added own concurrent queue class
- Used only if TBB is not available
* G-API-NG/Streaming: Fixing various issues
- Added missing header to CMakeLists.txt
- Fixed various CI issues and warnings
* G-API-NG/Streaming: Fixed a compile-time GScalar queue deadlock
- GStreamingExecutor blindly created island's input queues for
compile-time (value-initialized) GScalars which didn't have any
producers, making island actor threads wait there forever
* G-API-NG/Streaming: Dropped own version of Copy kernel
One was added into master already
* G-API-NG/Streaming: Addressed GArray<T> review comments
- Added tests on mov()
- Removed unnecessary changes in garray.hpp
* G-API-NG/Streaming: Added Doxygen comments to new public APIs
Also fixed some other comments in the code
* G-API-NG/Streaming: Removed debug info, added some comments & renamed vars
* G-API-NG/Streaming: Fixed own-vs-cv abstraction leak
- Now every island is triggered with own:: (instead of cv::)
data objects as inputs;
- Changes in Fluid backend required to support cv::Mat/Scalar were
reverted;
* G-API-NG/Streaming: use holds_alternative<> instead of index/index_of test
- Also fixed regression test comments
- Also added metadata check comments for GStreamingCompiled
* G-API-NG/Streaming: Made start()/stop() more robust
- Fixed various possible deadlocks
- Unified the shutdown code
- Added more tests covering different corner cases on start/stop
* G-API-NG/Streaming: Finally fixed Windows crashes
In fact the problem hasn't been Windows-only.
Island thread popped data from queues without preserving the Cmd
objects and without taking the ownership over data acquired so when
islands started to process the data, this data may be already freed.
Linux version worked only by occasion.
* G-API-NG/Streaming: Fixed (I hope so) Windows warnings
* G-API-NG/Streaming: fixed typos in internal comments
- Also added some more explanation on Streaming/OpenCL status
* G-API-NG/Streaming: Added more unit tests on streaming
- Various start()/stop()/setSource() call flow combinations
* G-API-NG/Streaming: Added tests on own concurrent bounded queue
* G-API-NG/Streaming: Added more tests on various data types, + more
- Vector/Scalar passed as input;
- Vector/Scalar passed in-between islands;
- Some more assertions;
- Also fixed a deadlock problem when inputs are mixed (1 constant, 1 stream)
* G-API-NG/Streaming: Added tests on output data types handling
- Vector
- Scalar
* G-API-NG/Streaming: Fixed test issues with IE + Windows warnings
* G-API-NG/Streaming: Decoupled G-API from videoio
- Now the core G-API doesn't use a cv::VideoCapture directly,
it comes in via an abstract interface;
- Polished a little bit the setSource()/start()/stop() semantics,
now setSource() is mandatory before ANY call to start().
* G-API-NG/Streaming: Fix STANDALONE build (errors brought by render)
2019-10-19 00:29:58 +08:00
|
|
|
return produceStreamingCompiled(std::move(pG));
|
|
|
|
}
|
2019-12-04 00:14:13 +08:00
|
|
|
|
|
|
|
void cv::gimpl::GCompiler::runMetaPasses(ade::Graph &g, const cv::GMetaArgs &metas)
|
|
|
|
{
|
|
|
|
auto pass_ctx = ade::passes::PassContext{g};
|
|
|
|
cv::gimpl::passes::initMeta(pass_ctx, metas);
|
|
|
|
cv::gimpl::passes::inferMeta(pass_ctx, true);
|
|
|
|
cv::gimpl::passes::storeResultingMeta(pass_ctx);
|
|
|
|
|
|
|
|
// Also run meta-sensitive backend-specific passes, if there's any.
|
|
|
|
// FIXME: This may be hazardous if our backend are not very robust
|
|
|
|
// in their passes -- how can we guarantee correct functioning in the
|
|
|
|
// future?
|
|
|
|
ade::ExecutionEngine engine;
|
|
|
|
engine.addPassStage("exec"); // FIXME: Need a better decision on how we replicate
|
|
|
|
// our main compiler stages here.
|
|
|
|
ade::ExecutionEngineSetupContext ectx(engine);
|
|
|
|
|
|
|
|
// NB: &&b or &b doesn't work here since "backends" is a set. Nevermind
|
|
|
|
for (auto b : GModel::Graph(g).metadata().get<ActiveBackends>().backends)
|
|
|
|
{
|
|
|
|
b.priv().addMetaSensitiveBackendPasses(ectx);
|
|
|
|
}
|
|
|
|
engine.runPasses(g);
|
|
|
|
}
|