17 #ifndef __TBB_flow_graph_streaming_H 18 #define __TBB_flow_graph_streaming_H 20 #ifndef __TBB_flow_graph_H 21 #error Do not #include this internal file directly; use public TBB headers instead. 24 #if __TBB_PREVIEW_STREAMING_NODE 30 template <
int N1,
int N2>
33 static const int size = N2 - N1 + 1;
40 template <
int N1,
int N2 = N1>
52 template <
int N1,
int N2>
57 template <
int N1,
int N2>
62 template <
typename... Args>
67 template <
typename T,
typename... Rest>
78 template<
typename Key>
84 template<
typename Key>
90 template<
typename Device,
typename Key>
103 template <
typename T>
108 template <
int N1,
int N2>
113 template <
int N1,
int N2>
118 template <
typename T>
123 template <
typename ...Args1>
126 template <
typename A1,
typename ...Args1>
128 static const size_t my_delta = 1;
130 template <
typename F,
typename Tuple,
typename ...Args2>
131 static void doit(F& f, Tuple& t, A1& a1, Args1&... args1, Args2&... args2) {
134 template <
typename F,
typename Tuple,
typename ...Args2>
138 template <
typename F,
typename Tuple,
int N1,
int N2,
typename ...Args2>
141 args2..., std::get<N1 + my_delta>(t));
143 template <
typename F,
typename Tuple,
int N,
typename ...Args2>
148 template <
typename F,
typename Tuple,
int N1,
int N2,
typename ...Args2>
150 doit_impl(x, f, t,
fn(), args1..., args2...);
152 template <
typename F,
typename Tuple,
int N,
typename ...Args2>
154 doit_impl(x, f, t,
fn(), args1..., args2...);
160 template <
typename F,
typename Tuple,
typename ...Args2>
161 static void doit(F& f, Tuple&, Args2&... args2) {
167 template<
typename JP,
typename StreamFactory,
typename... Ports>
170 template <
typename T>
185 template<
typename StreamFactory,
typename KernelInputTuple,
typename =
void>
191 template <
typename ...Args>
193 factory.send_kernel( device, kernel, args... );
198 template<
typename StreamFactory,
typename KernelInputTuple>
207 struct range_wrapper {
209 virtual range_wrapper *clone()
const = 0;
213 struct range_value :
public range_wrapper {
223 return new range_value(my_value);
230 struct range_mapper :
public range_wrapper {
235 return get<N + 1>(ip).data(
false);
239 return new range_mapper<N>;
244 template <
typename ...Args>
246 __TBB_ASSERT(my_range_wrapper,
"Range is not set. Call set_range() before running streaming_node.");
247 factory.send_kernel( device, kernel, my_range_wrapper->get_range(ip), args... );
257 executor.my_range_wrapper = NULL;
261 if (my_range_wrapper)
delete my_range_wrapper;
265 my_range_wrapper =
new range_value(work_size);
269 my_range_wrapper =
new range_value(
std::move(work_size));
274 my_range_wrapper =
new range_mapper<N>;
279 my_range_wrapper =
new range_mapper<N>;
301 template<
typename... Args>
304 template<
typename... Ports,
typename JP,
typename StreamFactory>
307 :
public composite_node < typename internal::streaming_node_traits<JP, StreamFactory, Ports...>::input_tuple,
308 typename internal::streaming_node_traits<JP, StreamFactory, Ports...>::output_tuple >
319 typedef composite_node<input_tuple, output_tuple>
base_type;
334 return std::tie( internal::input_port<S>( my_indexer_node )... );
339 return std::tie( internal::output_port<S>( my_kernel_node )... );
352 make_edge( internal::output_port<N>( my_device_selector_node ), internal::input_port<N>( my_join_node ) );
358 make_edge( my_indexer_node, my_device_selector_node );
359 make_edge( my_device_selector_node, my_join_node );
361 make_edge( my_join_node, my_kernel_node );
368 class device_selector_base {
370 virtual void operator()(
const indexer_node_output_type &v,
typename device_selector_node::output_ports_type &op ) = 0;
371 virtual device_selector_base *clone(
streaming_node &n )
const = 0;
375 template <
typename UserFunctor>
380 , my_user_functor( uf ), my_node(n), my_factory( f )
382 my_port_epoches.fill( 0 );
386 (this->*my_dispatch_funcs[ v.tag() ])( my_port_epoches[ v.tag() ], v, op );
388 || my_port_epoches[v.tag()] == 0,
"Epoch is changed when key matching is requested" );
392 return new device_selector( my_user_functor, n, my_factory );
395 typedef void(device_selector<UserFunctor>::*send_and_put_fn_type)(
size_t &,
const indexer_node_output_type &,
typename device_selector_node::output_ports_type &);
404 template <
typename T>
410 template <
typename T>
413 return key_from_message<key_type>( t );
418 typedef typename tuple_element<N + 1, typename device_selector_node::output_ports_type>::type::output_type elem_type;
419 elem_type e = internal::cast_to<elem_type>( v );
421 my_factory.send_data( device, e );
422 get<N + 1>( op ).try_put( e );
425 template<
typename DevicePort >
428 if ( it == my_devices.end() ) {
430 std::tie( it, std::ignore ) = my_devices.insert( std::make_pair(
key,
d ) );
433 my_node.notify_new_device(
d );
435 epoch_desc &e = it->second;
437 if ( ++e.my_request_number == NUM_INPUTS ) my_devices.erase( it );
455 class device_selector_body {
460 (*my_device_selector)(v, op);
473 virtual args_storage_base *clone()
const = 0;
478 : my_kernel( kernel ), my_factory( f )
482 :
tbb::
internal::no_copy(), my_kernel( k.my_kernel ), my_factory( k.my_factory )
489 template <
typename... Args>
490 class args_storage :
public args_storage_base {
496 const auto& t = get<N + 1>( ip );
497 auto &port = get<N>( op );
498 return port.try_put( t );
510 : my_kernel_func( ip, node, storage, get<0>(ip).device() ) {}
514 template <
typename... FnArgs>
526 : my_ip( ip ), my_node( node ), my_storage( storage ), my_device( device )
529 template <
typename... FnArgs>
531 my_node.enqueue_kernel( my_ip, my_storage.my_factory, my_device, my_storage.my_kernel, args... );
536 template<
typename FinalizeFn>
540 : my_ip( ip ), my_finalize_func( factory, get<0>(ip).device(),
fn ) {}
544 template <
typename... FnArgs>
557 : my_factory(factory), my_device(device), my_fn(
fn) {}
559 template <
typename... FnArgs>
561 my_factory.finalize( my_device, my_fn, args... );
566 template<
typename FinalizeFn>
568 return run_finalize_func<FinalizeFn>( ip, factory,
fn );
574 : my_factory(factory), my_device(
d ) {}
576 template <
typename... FnArgs>
578 my_factory.send_data( my_device, args... );
587 : args_storage_base( kernel, f )
588 , my_args_pack( std::forward<Args>(args)... )
591 args_storage(
const args_storage &k ) : args_storage_base( k ), my_args_pack( k.my_args_pack ) {}
593 args_storage(
const args_storage_base &k, Args&&... args ) : args_storage_base( k ), my_args_pack( std::forward<Args>(args)... ) {}
604 graph& g = n.my_graph;
606 g.increment_wait_count();
612 g.decrement_wait_count();
613 }), const_args_pack );
625 return new args_storage<Args...>( *this );
639 __TBB_ASSERT( (my_node.my_args_storage != NULL),
"No arguments storage" );
641 my_node.my_args_storage->enqueue( ip, op, my_node );
648 struct wrap_to_async {
652 template <
typename T>
657 template <
typename... Args>
660 return new args_storage<Args...>(storage, std::forward<Args>(args)...);
664 my_args_storage->send(
d );
667 template <
typename ...Args>
673 template <
typename DeviceSelector>
676 , my_indexer_node( g )
677 , my_device_selector( new device_selector<DeviceSelector>(
d, *this, f ) )
678 , my_device_selector_node( g,
serial, device_selector_body( my_device_selector ) )
680 , my_kernel_node( g,
serial, kernel_body( *this ) )
682 , my_args_storage( make_args_storage( args_storage<>(kernel, f),
port_ref<0, NUM_INPUTS - 1>() ) )
684 base_type::set_external_ports( get_input_ports(), get_output_ports() );
690 , my_indexer_node( node.my_indexer_node )
691 , my_device_selector( node.my_device_selector->clone( *this ) )
692 , my_device_selector_node( node.my_graph,
serial, device_selector_body( my_device_selector ) )
693 , my_join_node( node.my_join_node )
694 , my_kernel_node( node.my_graph,
serial, kernel_body( *this ) )
695 , my_args_storage( node.my_args_storage->clone() )
697 base_type::set_external_ports( get_input_ports(), get_output_ports() );
703 , my_indexer_node( std::
move( node.my_indexer_node ) )
704 , my_device_selector( node.my_device_selector->clone(*this) )
705 , my_device_selector_node( node.my_graph,
serial, device_selector_body( my_device_selector ) )
706 , my_join_node( std::
move( node.my_join_node ) )
707 , my_kernel_node( node.my_graph,
serial, kernel_body( *this ) )
708 , my_args_storage( node.my_args_storage )
710 base_type::set_external_ports( get_input_ports(), get_output_ports() );
713 node.my_args_storage = NULL;
717 if ( my_args_storage )
delete my_args_storage;
718 if ( my_device_selector )
delete my_device_selector;
721 template <
typename... Args>
724 args_storage_base *
const new_args_storage = make_args_storage( *my_args_storage,
typename wrap_to_async<Args>::type(std::forward<Args>(args))...);
725 delete my_args_storage;
726 my_args_storage = new_args_storage;
742 #endif // __TBB_PREVIEW_STREAMING_NODE 743 #endif // __TBB_flow_graph_streaming_H args_storage_base * make_args_storage(const args_storage_base &storage, Args &&... args) const
static void doit_impl(std::false_type, F &f, Tuple &t, A1 &a1, Args1 &... args1, Args2 &... args2)
KernelInputTuple kernel_input_tuple
void operator()(FnArgs &... args)
void set_range(const range_type &work_size)
tuple< typename async_msg_type< Ports >::type... > input_tuple
void set_range(port_ref_impl< N, N >(*)())
bool_constant< true > true_type
args_storage_base::output_ports_type output_ports_type
kernel_multifunction_node my_kernel_node
streaming_node(graph &g, const kernel_type &kernel, DeviceSelector d, StreamFactory &f)
internal::make_sequence< NUM_OUTPUTS >::type output_sequence
void set_range(port_ref_impl< N, N >)
internal::streaming_node_traits< JP, StreamFactory, Ports... >::input_tuple input_tuple
streaming_device_with_key()
void call(F &&f, Pack &&p)
Calls the given function with arguments taken from a stored_pack.
void enqueue_kernel_impl(kernel_input_tuple &, StreamFactory &factory, device_type device, const kernel_type &kernel, Args &... args) const
static run_finalize_func< FinalizeFn > make_run_finalize_func(kernel_input_tuple &ip, StreamFactory &factory, FinalizeFn fn)
range_wrapper * clone() const __TBB_override
static void doit(F &f, Tuple &t, A1 &a1, Args1 &... args1, Args2 &... args2)
kernel_executor_helper(const kernel_executor_helper &executor)
const kernel_type my_kernel
const streaming_node & my_node
run_finalize_func(kernel_input_tuple &ip, StreamFactory &factory, FinalizeFn fn)
internal::streaming_node_traits< JP, StreamFactory, Ports... >::kernel_input_tuple kernel_input_tuple
streaming_device_with_key(const Device &d, Key k)
is_port_ref_impl< typename tbb::internal::strip< T >::type >::type type
void notify_new_device(device_type d)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d __itt_event ITT_FORMAT __itt_group_mark d void const wchar_t const wchar_t int ITT_FORMAT __itt_group_sync __itt_group_fsync x void const wchar_t int const wchar_t int int ITT_FORMAT __itt_group_sync __itt_group_fsync x void ITT_FORMAT __itt_group_sync __itt_group_fsync p void ITT_FORMAT __itt_group_sync __itt_group_fsync p void size_t ITT_FORMAT lu no args __itt_obj_prop_t __itt_obj_state_t ITT_FORMAT d const char ITT_FORMAT s const char ITT_FORMAT s __itt_frame ITT_FORMAT p __itt_counter ITT_FORMAT p __itt_counter unsigned long long ITT_FORMAT lu __itt_counter unsigned long long ITT_FORMAT lu __itt_counter __itt_clock_domain unsigned long long void ITT_FORMAT p const wchar_t ITT_FORMAT S __itt_mark_type const wchar_t ITT_FORMAT S __itt_mark_type const char ITT_FORMAT s __itt_mark_type ITT_FORMAT d __itt_caller ITT_FORMAT p __itt_caller ITT_FORMAT p no args const __itt_domain __itt_clock_domain unsigned long long __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_id void * fn
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark S
key_type get_key(std::false_type, const T &, size_t &epoch)
kernel_func(kernel_input_tuple &ip, const streaming_node &node, const args_storage &storage, device_type device)
composite_node< input_tuple, output_tuple > base_type
std::unordered_map< typename std::decay< key_type >::type, epoch_desc > my_devices
key_type get_key(std::true_type, const T &t, size_t &)
device_selector_base * my_device_selector
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle * key
streaming_node(streaming_node &&node)
static dispatch_funcs_type create_dispatch_funcs(internal::sequence< S... >)
StreamFactory::kernel_type kernel_type
static void doit_impl(std::true_type x, F &f, Tuple &t, port_ref_impl< N1, N2 >(*fn)(), Args1 &... args1, Args2 &... args2)
static void doit_impl(std::true_type x, F &f, Tuple &t, port_ref_impl< N, N >(*fn)(), Args1 &... args1, Args2 &... args2)
StreamFactory::device_type device_type
device_selector_base * clone(streaming_node &n) const __TBB_override
Base class for types that should not be assigned.
void ignore_return_values(Args &&...)
void send(device_type d) __TBB_override
class __TBB_DEPRECATED streaming_node
std::false_type is_key_matching
internal::key_from_policy< JP >::type key_type
std::array< send_and_put_fn_type, NUM_INPUTS > dispatch_funcs_type
base_type::input_ports_type get_input_ports()
void reset_node(reset_flags=rf_reset_protocol) __TBB_override
kernel_input_tuple & my_ip
tuple< streaming_device_with_key< typename StreamFactory::device_type, typename key_from_policy< JP >::type >, typename async_msg_type< Ports >::type... > kernel_input_tuple
bool_constant< false > false_type
kernel_multifunction_node::output_ports_type output_ports_type
base_type::output_ports_type get_output_ports()
StreamFactory::template async_msg_type< typename tbb::internal::strip< T >::type > type
args_storage_base * my_args_storage
void operator()(FnArgs &... args)
StreamFactory::range_type range_type
range_wrapper * clone() const __TBB_override
void send_and_put_impl(size_t &epoch, const indexer_node_output_type &v, typename device_selector_node::output_ports_type &op)
send_func(StreamFactory &factory, device_type d)
static void doit_impl(std::true_type, F &f, Tuple &t, port_ref_impl< N, N >, Args1 &... args1, Args2 &... args2)
#define __TBB_STATIC_ASSERT(condition, msg)
std::true_type is_key_matching
internal::streaming_device_with_key< device_type, key_type > device_with_key_type
void set_args(Args &&... args)
void operator()(FnArgs &... args)
void operator()(kernel_input_tuple ip, typename args_storage_base::output_ports_type &op)
device_selector_node my_device_selector_node
args_pack_type my_args_pack
__TBB_DEPRECATED internal::port_ref_impl< N1, N2 > port_ref()
~kernel_executor_helper()
task * do_try_put(const T &v, void *p)
void set_range(range_type &&work_size)
args_storage(const args_storage &k)
base_type::output_ports_type get_output_ports(internal::sequence< S... >)
std::array< size_t, NUM_INPUTS > my_port_epoches
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
StreamFactory::kernel_type kernel_type
void operator()(FnArgs &... args)
StreamFactory::device_type device_type
range_value(const range_type &value)
StreamFactory & my_factory
range_wrapper * my_range_wrapper
virtual ~args_storage_base()
std::decay< Key >::type my_key
indexer_node_type::output_type indexer_node_output_type
void enqueue_kernel(kernel_input_tuple &ip, StreamFactory &factory, device_type device, const kernel_type &kernel, Args &... args) const
internal::make_sequence< NUM_INPUTS >::type input_sequence
StreamFactory::template async_msg_type< T > type
#define __TBB_ASSERT_EX(predicate, comment)
"Extended" version is useful to suppress warnings if a variable is only used with an assert
streaming_node(const streaming_node &node)
kernel_input_tuple & my_ip
const Device & device() const
void operator()(const indexer_node_output_type &v, typename device_selector_node::output_ports_type &op) __TBB_override
void operator()(const indexer_node_output_type &v, typename device_selector_node::output_ports_type &op)
Base class for types that should not be copied or assigned.
virtual ~device_selector_base()
indexer_node_type my_indexer_node
StreamFactory & my_factory
dispatch_funcs_type my_dispatch_funcs
internal::streaming_node_traits< JP, StreamFactory, Ports... >::indexer_node_type indexer_node_type
StreamFactory & my_factory
device_type get_device(key_type key, DevicePort &dp)
static void doit(F &f, Tuple &, Args2 &... args2)
args_storage_base(const args_storage_base &k)
device_selector_body(device_selector_base *d)
void operator()(FnArgs &... args)
args_storage(const args_storage_base &k, Args &&... args)
UserFunctor my_user_functor
StreamFactory::kernel_type kernel_type
args_storage_base(const kernel_type &kernel, StreamFactory &f)
Detects whether two given types are the same.
range_value(range_type &&value)
void make_edge(sender< T > &p, receiver< T > &s)
Makes an edge between a single predecessor and a single successor.
void make_edges(internal::sequence< S... >)
StreamFactory & my_factory
run_kernel_func(kernel_input_tuple &ip, const streaming_node &node, const args_storage &storage)
bool do_try_put(const kernel_input_tuple &ip, output_ports_type &op, internal::sequence< S... >) const
range_type get_range(const kernel_input_tuple &) const __TBB_override
finalize_func(StreamFactory &factory, device_type device, FinalizeFn fn)
field of type K being used for matching.
void enqueue(kernel_input_tuple &ip, output_ports_type &op, const streaming_node &n) __TBB_override
kernel_body(const streaming_node &node)
bool do_try_put(const kernel_input_tuple &ip, output_ports_type &op) const
multifunction_node< kernel_input_tuple, output_tuple > kernel_multifunction_node
device_selector_base * my_device_selector
multifunction_node< indexer_node_output_type, kernel_input_tuple > device_selector_node
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
device_selector(UserFunctor uf, streaming_node &n, StreamFactory &f)
tbb::internal::stored_pack< Args... > args_pack_type
static void doit_impl(std::true_type x, F &f, Tuple &t, port_ref_impl< N1, N2 >, Args1 &... args1, Args2 &... args2)
join_node< kernel_input_tuple, JP > my_join_node
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
args_storage_base * clone() const __TBB_override
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
const args_storage & my_storage
args_storage(const kernel_type &kernel, StreamFactory &f, Args &&... args)
epoch_desc(device_type d)
StreamFactory::device_type device_type
KernelInputTuple kernel_input_tuple
const streaming_node & my_node
internal::streaming_node_traits< JP, StreamFactory, Ports... >::output_tuple output_tuple
void enqueue_kernel_impl(kernel_input_tuple &ip, StreamFactory &factory, device_type device, const kernel_type &kernel, Args &... args) const
std::true_type is_key_matching
indexer_node< typename async_msg_type< Ports >::type... > indexer_node_type
kernel_executor_helper(kernel_executor_helper &&executor)
range_type get_range(const kernel_input_tuple &ip) const __TBB_override
K key_from_message(const T &t)
T or_return_values(T &&t)
base_type::input_ports_type get_input_ports(internal::sequence< S... >)
void move(tbb_thread &t1, tbb_thread &t2)