ttg 1.0.0
Template Task Graph (TTG): flowgraph-based programming model for high-performance distributed-memory algorithms
Loading...
Searching...
No Matches
func.h
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-3-Clause
2#ifndef TTG_FUNC_H
3#define TTG_FUNC_H
4
5#include "ttg/fwd.h"
6
7#include "ttg/edge.h"
8#include "ttg/impl_selector.h"
9#include "ttg/terminal.h"
10#include "ttg/traverse.h"
11#include "ttg/tt.h"
12
13namespace ttg {
14
15 namespace detail {
21 template <ttg::Runtime Runtime>
23 template <typename Value>
24 inline constexpr decltype(auto) operator()(Value &&value) const {
25 return std::forward<Value>(value);
26 }
27 };
28
29 template <typename keyT, typename valueT>
30 inline auto get_out_terminal(size_t i, const char *func) {
31#ifndef NDEBUG
32 auto *base_terminal_ptr = TTBase::get_outputs_tls_ptr()->at(i);
33 auto *terminal_ptr = dynamic_cast<Out<std::decay_t<keyT>, std::decay_t<valueT>> *>(base_terminal_ptr);
34 if (terminal_ptr == nullptr) {
35 std::stringstream ss;
36 ss << func
37 << ": invalid type of ith output terminal, most likely due to mismatch between its type "
38 "and the type of key/value; make sure that the arguments to "
39 << func
40 << "() match the types encoded in the output "
41 "terminals, or pass the output terminal tuple to the task function explicitly";
42 throw std::runtime_error(ss.str());
43 }
44#else
45 auto *base_terminal_ptr = TTBase::get_outputs_tls_ptr()->operator[](i);
46 auto *terminal_ptr = static_cast<Out<std::decay_t<keyT>, std::decay_t<valueT>> *>(base_terminal_ptr);
47#endif
48 return terminal_ptr;
49 }
50
51 template <typename keyT>
52 inline auto get_out_base_terminal(size_t i, const char *func) {
53#ifndef NDEBUG
54 auto *base_terminal_ptr = TTBase::get_outputs_tls_ptr()->at(i);
55 auto *terminal_ptr = dynamic_cast<OutTerminalBase<std::decay_t<keyT>> *>(base_terminal_ptr);
56 if (terminal_ptr == nullptr) {
57 std::stringstream ss;
58 ss << func
59 << ": invalid type of ith output terminal, most likely due to mismatch between its type "
60 "and the type of key; make sure that the arguments to "
61 << func
62 << "() match the types encoded in the output "
63 "terminals, or pass the output terminal tuple to the task function explicitly";
64 throw std::runtime_error(ss.str());
65 }
66#else
67 auto *base_terminal_ptr = TTBase::get_outputs_tls_ptr()->operator[](i);
68 auto *terminal_ptr = static_cast<OutTerminalBase<std::decay_t<keyT>> *>(base_terminal_ptr);
69#endif
70 return terminal_ptr;
71 }
72
73 } // namespace detail
74
79 template <typename... TTBasePtrs>
80 inline std::enable_if_t<(std::is_convertible_v<decltype(*(std::declval<TTBasePtrs>())), TTBase &> && ...), bool>
81 make_graph_executable(TTBasePtrs &&...tts) {
82 auto traverse = ttg::make_traverse([](auto &&x) { std::forward<decltype(x)>(x)->make_executable(); });
83 auto ret = traverse(std::forward<TTBasePtrs>(tts)...);
84 // make sure everyone has traversed the TT
85 auto world = [&](auto&& tt0, auto&&... tts) { return tt0->get_world(); }(std::forward<TTBasePtrs>(tts)...);
86 TTG_IMPL_NS::make_executable_hook(world);
87 return ret;
88 }
89
93 template <typename keyT, typename valueT>
95 out->connect(in);
96 }
97
99 inline void connect(ttg::TerminalBase *out, ttg::TerminalBase *in) { out->connect(in); }
100
107 template <std::size_t outindex, std::size_t inindex, typename producer_tt_ptr, typename successor_tt_ptr>
108 inline void connect(producer_tt_ptr &p, successor_tt_ptr &c) {
109 connect(p->template out<outindex>(), c->template in<inindex>());
110 }
111
117 template <std::size_t outindex, std::size_t inindex, typename producer_tt_ptr, typename successor_tt_ptr>
118 inline void connect(producer_tt_ptr *p, successor_tt_ptr *c) {
119 connect(p->template out<outindex>(), c->template in<inindex>());
120 }
121
127 inline void connect(size_t outindex, size_t inindex, TTBase *producer, TTBase *consumer) {
128 connect(producer->out(outindex), consumer->in(inindex));
129 }
130
137 template <typename keyT, typename... valuesT>
138 inline auto fuse(const Edge<keyT, valuesT> &...args) {
139 using valueT = std::tuple_element_t<0, std::tuple<valuesT...>>; // grab first type
140 return Edge<keyT, valueT>(args...); // This will force all valuesT to be the same
141 }
142
147 template <typename... inedgesT>
148 inline auto edges(inedgesT &&...args) {
149 return std::make_tuple(std::forward<inedgesT>(args)...);
150 }
151
152 // clang-format off
157 // clang-format on
158 template <typename keyT, typename valueT, typename output_terminalT, ttg::Runtime Runtime = ttg::ttg_runtime>
159 inline void send(const keyT &key, valueT &&value, ttg::Out<keyT, valueT> &t) {
161 t.send(key, copy_handler(std::forward<valueT>(value)));
162 }
163
164 // clang-format off
168 // clang-format on
169 template <typename keyT>
170 inline void sendk(const keyT &key, ttg::Out<keyT, void> &t) {
171 t.sendk(key);
172 }
173
174 // clang-format off
178 // clang-format on
179 template <typename valueT, ttg::Runtime Runtime = ttg::ttg_runtime>
180 inline void sendv(valueT &&value, ttg::Out<void, valueT> &t) {
182 t.sendv(copy_handler(std::forward<valueT>(value)));
183 }
184
185 // clang-format off
188 // clang-format on
189 inline void send(ttg::Out<void, void> &t) { t.send(); }
190
191 // clang-format off
197 // clang-format on
198 template <size_t i, typename keyT, typename valueT, typename... out_keysT, typename... out_valuesT,
200 inline std::enable_if_t<meta::is_none_void_v<keyT, std::decay_t<valueT>>, void> send(
201 const keyT &key, valueT &&value, std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
203 std::get<i>(t).send(key, copy_handler(std::forward<valueT>(value)));
204 }
205
206 // clang-format off
211 // clang-format on
212 template <typename keyT, typename valueT, ttg::Runtime Runtime = ttg::ttg_runtime>
213 inline std::enable_if_t<meta::is_none_void_v<keyT, std::decay_t<valueT>>, void> send(size_t i, const keyT &key,
214 valueT &&value) {
215 // to avoid mixups due to value being a terminal tuple
216 static_assert(!meta::is_output_terminal_v<std::decay_t<valueT>> && !meta::is_output_terminal_tuple_v<std::decay_t<valueT>>, "ttg::send(i, key, x) - invalid invocation, x cannot be a terminal or a tuple of terminals; did you mean to call another version of send, e.g. sendk<i>(key, x)?");
218 auto *terminal_ptr = detail::get_out_terminal<keyT, valueT>(i, "ttg::send(i, key, value)");
219 terminal_ptr->send(key, copy_handler(std::forward<valueT>(value)));
220 }
221
222 // clang-format off
228 // clang-format on
229 template <size_t i, typename keyT, typename valueT, ttg::Runtime Runtime = ttg::ttg_runtime>
230 inline std::enable_if_t<meta::is_none_void_v<keyT, std::decay_t<valueT>>, void> send(const keyT &key,
231 valueT &&value) {
232 // to avoid mixups due to value being a terminal tuple
233 static_assert(!meta::is_output_terminal_v<std::decay_t<valueT>> && !meta::is_output_terminal_tuple_v<std::decay_t<valueT>>, "ttg::send<i>(key, x) - invalid invocation, x cannot be a terminal or a tuple of terminals; did you mean to call another version of send, e.g. sendk<i>(key, x)?");
234 send(i, key, std::forward<valueT>(value));
235 }
236
237 // clang-format off
242 // clang-format on
243 template <size_t i, typename keyT, typename... out_keysT, typename... out_valuesT>
244 inline std::enable_if_t<!meta::is_void_v<keyT>, void> sendk(const keyT &key,
245 std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
246 std::get<i>(t).sendk(key);
247 }
248
249 // clang-format off
253 // clang-format on
254 template <typename keyT>
255 inline std::enable_if_t<!meta::is_void_v<keyT>, void> sendk(std::size_t i, const keyT &key) {
256 // to avoid mixups due to key being a terminal tuple
257 static_assert(!meta::is_output_terminal_v<std::decay_t<keyT>> && !meta::is_output_terminal_tuple_v<std::decay_t<keyT>>, "ttg::sendk(i, x) - invalid invocation, x cannot be a terminal or a tuple of terminals; did you mean to call another version of send, e.g. send<i>(x)?");
258 auto *terminal_ptr = detail::get_out_terminal<keyT, void>(i, "ttg::sendk(i, key)");
259 terminal_ptr->sendk(key);
260 }
261
262 // clang-format off
267 // clang-format on
268 template <size_t i, typename keyT>
269 inline std::enable_if_t<!meta::is_void_v<keyT>, void> sendk(const keyT &key) {
270 // to avoid mixups due to key being a terminal tuple
271 static_assert(!meta::is_output_terminal_v<std::decay_t<keyT>> && !meta::is_output_terminal_tuple_v<std::decay_t<keyT>>, "ttg::sendk<i>(x) - invalid invocation, x cannot be a terminal or a tuple of terminals; did you mean to call another version of send, e.g. send<i>(x)?");
272 sendk(i, key);
273 }
274
275 // clang-format off
280 // clang-format on
281 template <size_t i, typename valueT, typename... out_keysT, typename... out_valuesT,
283 inline std::enable_if_t<!meta::is_void_v<std::decay_t<valueT>>, void> sendv(
284 valueT &&value, std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
286 std::get<i>(t).sendv(copy_handler(std::forward<valueT>(value)));
287 }
288
289 // clang-format off
293 // clang-format on
294 template <typename valueT, ttg::Runtime Runtime = ttg::ttg_runtime>
295 inline std::enable_if_t<!meta::is_void_v<std::decay_t<valueT>>, void> sendv(std::size_t i, valueT &&value) {
296 // to avoid mixups due to key being a terminal tuple
297 static_assert(!meta::is_output_terminal_v<std::decay_t<valueT>> && !meta::is_output_terminal_tuple_v<std::decay_t<valueT>>, "ttg::sendv(i, x) - invalid invocation, x cannot be a terminal or a tuple of terminals; did you mean to call another version of send, e.g. send<i>(x)?");
299 auto *terminal_ptr = detail::get_out_terminal<void, valueT>(i, "ttg::sendv(i, value)");
300 terminal_ptr->sendv(copy_handler(std::forward<valueT>(value)));
301 }
302
303 // clang-format off
308 // clang-format on
309 template <size_t i, typename valueT, ttg::Runtime Runtime = ttg::ttg_runtime>
310 inline std::enable_if_t<!meta::is_void_v<std::decay_t<valueT>>, void> sendv(valueT &&value) {
311 // to avoid mixups due to key being a terminal tuple
312 static_assert(!meta::is_output_terminal_v<std::decay_t<valueT>> && !meta::is_output_terminal_tuple_v<std::decay_t<valueT>>, "ttg::sendv<i>(x) - invalid invocation, x cannot be a terminal or a tuple of terminals; did you mean to call another version of send, e.g. send<i>(x)?");
313 sendv(i, std::forward<valueT>(value));
314 }
315
316 // clang-format off
320 // clang-format on
321 template <size_t i, typename... out_keysT, typename... out_valuesT>
322 inline void send(std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
323 std::get<i>(t).send();
324 }
325
326 // clang-format off
329 // clang-format on
330 inline void send(std::size_t i) {
331 auto *terminal_ptr = detail::get_out_terminal<void, void>(i, "ttg::send(i)");
332 terminal_ptr->send();
333 }
334
335 // clang-format off
339 // clang-format on
340 template <size_t i>
341 inline void send() {
342 send(i);
343 }
344
345 namespace detail {
346 template <size_t KeyId, size_t i, size_t... I, typename... RangesT, typename valueT, typename... out_keysT,
347 typename... out_valuesT>
348 inline void broadcast(const std::tuple<RangesT...> &keylists, valueT &&value,
349 std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
350 if constexpr (ttg::meta::is_iterable_v<std::tuple_element_t<KeyId, std::tuple<RangesT...>>>) {
351 if (std::distance(std::begin(std::get<KeyId>(keylists)), std::end(std::get<KeyId>(keylists))) > 0) {
352 std::get<i>(t).broadcast(std::get<KeyId>(keylists), value);
353 }
354 } else {
355 std::get<i>(t).broadcast(std::get<KeyId>(keylists), value);
356 }
357 if constexpr (sizeof...(I) > 0) {
358 detail::broadcast<KeyId + 1, I...>(keylists, value, t);
359 }
360 }
361
362 template <size_t KeyId, size_t i, size_t... I, typename... RangesT, typename valueT>
363 inline void broadcast(const std::tuple<RangesT...> &keylists, valueT &&value) {
364 if constexpr (ttg::meta::is_iterable_v<std::tuple_element_t<KeyId, std::tuple<RangesT...>>>) {
365 if (std::distance(std::begin(std::get<KeyId>(keylists)), std::end(std::get<KeyId>(keylists))) > 0) {
366 using key_t = decltype(*std::begin(std::get<KeyId>(keylists)));
367 auto *terminal_ptr = detail::get_out_terminal<key_t, valueT>(i, "ttg::broadcast(keylists, value)");
368 terminal_ptr->broadcast(std::get<KeyId>(keylists), value);
369 }
370 } else {
371 using key_t = decltype(std::get<KeyId>(keylists));
372 auto *terminal_ptr = detail::get_out_terminal<key_t, valueT>(i, "ttg::broadcast(keylists, value)");
373 terminal_ptr->broadcast(std::get<KeyId>(keylists), value);
374 }
375 if constexpr (sizeof...(I) > 0) {
376 detail::broadcast<KeyId + 1, I...>(keylists, value);
377 }
378 }
379
380 template <size_t KeyId, size_t i, size_t... I, typename... RangesT, typename... out_keysT, typename... out_valuesT>
381 inline void broadcast(const std::tuple<RangesT...> &keylists, std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
382 if constexpr (ttg::meta::is_iterable_v<std::tuple_element_t<KeyId, std::tuple<RangesT...>>>) {
383 if (std::distance(std::begin(std::get<KeyId>(keylists)), std::end(std::get<KeyId>(keylists))) > 0) {
384 std::get<i>(t).broadcast(std::get<KeyId>(keylists));
385 }
386 } else {
387 std::get<i>(t).broadcast(std::get<KeyId>(keylists));
388 }
389 if constexpr (sizeof...(I) > 0) {
390 detail::broadcast<KeyId + 1, I...>(keylists, t);
391 }
392 }
393
394 template <size_t KeyId, size_t i, size_t... I, typename... RangesT>
395 inline void broadcast(const std::tuple<RangesT...> &keylists) {
396 if constexpr (ttg::meta::is_iterable_v<std::tuple_element_t<KeyId, std::tuple<RangesT...>>>) {
397 if (std::distance(std::begin(std::get<KeyId>(keylists)), std::end(std::get<KeyId>(keylists))) > 0) {
398 using key_t = decltype(*std::begin(std::get<KeyId>(keylists)));
399 auto *terminal_ptr = detail::get_out_terminal<key_t, void>(i, "ttg::broadcast(keylists)");
400 terminal_ptr->broadcast(std::get<KeyId>(keylists));
401 }
402 } else {
403 using key_t = decltype(std::get<KeyId>(keylists));
404 auto *terminal_ptr = detail::get_out_terminal<key_t, void>(i, "ttg::broadcast(keylists)");
405 terminal_ptr->broadcast(std::get<KeyId>(keylists));
406 }
407 if constexpr (sizeof...(I) > 0) {
408 detail::broadcast<KeyId + 1, I...>(keylists);
409 }
410 }
411 } // namespace detail
412
413 template <size_t i, typename rangeT, typename valueT, typename... out_keysT, typename... out_valuesT,
415 inline void broadcast(const rangeT &keylist, valueT &&value, std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
417 std::get<i>(t).broadcast(keylist, copy_handler(std::forward<valueT>(value)));
418 }
419
420 template <typename rangeT, typename valueT, ttg::Runtime Runtime = ttg::ttg_runtime>
421 inline void broadcast(std::size_t i, const rangeT &keylist, valueT &&value) {
423 using key_t = decltype(*std::begin(keylist));
424 auto *terminal_ptr = detail::get_out_terminal<key_t, valueT>(i, "ttg::broadcast(keylist, value)");
425 terminal_ptr->broadcast(keylist, copy_handler(std::forward<valueT>(value)));
426 }
427
428 template <size_t i, typename rangeT, typename valueT, ttg::Runtime Runtime = ttg::ttg_runtime>
429 inline void broadcast(const rangeT &keylist, valueT &&value) {
430 broadcast(i, keylist, std::forward<valueT>(value));
431 }
432
433 template <size_t i, size_t... I, typename... RangesT, typename valueT, typename... out_keysT, typename... out_valuesT,
435 inline void broadcast(const std::tuple<RangesT...> &keylists, valueT &&value,
436 std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
437 static_assert(sizeof...(I) + 1 == sizeof...(RangesT),
438 "Number of selected output terminals must match the number of keylists!");
440 detail::broadcast<0, i, I...>(keylists, copy_handler(std::forward<valueT>(value)), t);
441 }
442
443 template <size_t i, size_t... I, typename... RangesT, typename valueT, ttg::Runtime Runtime = ttg::ttg_runtime>
444 inline void broadcast(const std::tuple<RangesT...> &keylists, valueT &&value) {
445 static_assert(sizeof...(I) + 1 == sizeof...(RangesT),
446 "Number of selected output terminals must match the number of keylists!");
448 detail::broadcast<0, i, I...>(keylists, copy_handler(std::forward<valueT>(value)));
449 }
450
451 template <size_t i, typename rangeT, typename... out_keysT, typename... out_valuesT,
453 inline void broadcastk(const rangeT &keylist, std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
454 std::get<i>(t).broadcast(keylist);
455 }
456
457 template <typename rangeT, ttg::Runtime Runtime = ttg::ttg_runtime>
458 inline void broadcastk(std::size_t i, const rangeT &keylist) {
459 using key_t = decltype(*std::begin(keylist));
460 auto *terminal_ptr = detail::get_out_terminal<key_t, void>(i, "ttg::broadcastk(keylist)");
461 terminal_ptr->broadcast(keylist);
462 }
463
464 template <size_t i, typename rangeT, ttg::Runtime Runtime = ttg::ttg_runtime>
465 inline void broadcastk(const rangeT &keylist) {
466 broadcastk(i, keylist);
467 }
468
469 template <size_t i, size_t... I, typename... RangesT, typename... out_keysT, typename... out_valuesT,
471 inline void broadcastk(const std::tuple<RangesT...> &keylists, std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
472 static_assert(sizeof...(I) + 1 == sizeof...(RangesT),
473 "Number of selected output terminals must match the number of keylists!");
474 detail::broadcast<0, i, I...>(keylists, t);
475 }
476
477 template <size_t i, size_t... I, typename... RangesT, ttg::Runtime Runtime = ttg::ttg_runtime>
478 inline void broadcastk(const std::tuple<RangesT...> &keylists) {
479 static_assert(sizeof...(I) + 1 == sizeof...(RangesT),
480 "Number of selected output terminals must match the number of keylists!");
481 detail::broadcast<0, i, I...>(keylists);
482 }
483
484 template <typename keyT, typename out_valueT>
485 inline std::enable_if_t<!meta::is_void_v<keyT>, void> set_size(const keyT &key, const std::size_t size,
487 t.set_size(key, size);
488 }
489
494 template <size_t i, typename keyT, typename... out_keysT, typename... out_valuesT>
495 inline std::enable_if_t<!meta::is_void_v<keyT>, void> set_size(const keyT &key, const std::size_t size,
496 std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
497 std::get<i>(t).set_size(key, size);
498 }
499
500 template <typename keyT>
501 inline std::enable_if_t<!meta::is_void_v<keyT>, void> set_size(std::size_t i, const keyT &key,
502 const std::size_t size) {
503 auto *terminal_ptr = detail::get_out_base_terminal<keyT>(i, "ttg::set_size(i, key, size)");
504 terminal_ptr->set_size(size);
505 }
506
507 template <size_t i, typename keyT>
508 inline std::enable_if_t<!meta::is_void_v<keyT>, void> set_size(const keyT &key, const std::size_t size) {
509 set_size(i, key, size);
510 }
511
515 template <typename out_keyT, typename out_valueT>
516 inline void set_size(const std::size_t size, ttg::Out<out_keyT, out_valueT> &t) {
517 t.set_size(size);
518 }
519
524 template <size_t i, typename... out_keysT, typename... out_valuesT>
525 inline void set_size(const std::size_t size, std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
526 std::get<i>(t).set_size(size);
527 }
528
529 inline void set_size(std::size_t i, const std::size_t size) {
530 auto *terminal_ptr = detail::get_out_base_terminal<void>(i, "ttg::set_size(i, size)");
531 terminal_ptr->set_size(size);
532 }
533
534 template <std::size_t i>
535 inline void set_size(const std::size_t size) {
536 set_size(i, size);
537 }
538
543 template <typename keyT, typename out_keyT, typename out_valueT>
544 inline std::enable_if_t<!meta::is_void_v<keyT>, void> finalize(const keyT &key, ttg::Out<out_keyT, out_valueT> &t) {
545 t.finalize(key);
546 }
547
552 template <size_t i, typename keyT, typename... out_keysT, typename... out_valuesT>
553 inline std::enable_if_t<!meta::is_void_v<keyT>, void> finalize(const keyT &key,
554 std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
555 std::get<i>(t).finalize(key);
556 }
557
558 template <typename keyT>
559 inline std::enable_if_t<!meta::is_void_v<keyT>, void> finalize(std::size_t i, const keyT &key) {
560 auto *terminal_ptr = detail::get_out_base_terminal<keyT>(i, "ttg::finalize(i, key)");
561 terminal_ptr->finalize(key);
562 }
563
564 template <std::size_t i, typename keyT>
565 inline std::enable_if_t<!meta::is_void_v<keyT>, void> finalize(const keyT &key) {
566 finalize(i, key);
567 }
568
571 template <typename out_keyT, typename out_valueT>
573 t.finalize();
574 }
575
579 template <size_t i, typename... out_keysT, typename... out_valuesT>
580 inline void finalize(std::tuple<ttg::Out<out_keysT, out_valuesT>...> &t) {
581 std::get<i>(t).finalize();
582 }
583
584 inline void finalize(std::size_t i) {
585 auto *terminal_ptr = detail::get_out_base_terminal<void>(i, "ttg::finalize(i)");
586 terminal_ptr->finalize();
587 }
588
589 template <std::size_t i>
590 inline void finalize() {
591 finalize(i);
592 }
593
594} // namespace ttg
595
596#endif // TTG_FUNC_H
Edge is used to connect In and Out terminals.
Definition edge.h:26
void connect(TerminalBase *in) override
Definition terminal.h:450
std::enable_if_t< meta::is_void_v< Key > &&!meta::is_void_v< Value >, void > sendv(Value &&value)
Definition terminal.h:488
std::enable_if_t<!meta::is_void_v< Key > &&meta::is_void_v< Value >, void > sendk(const Key &key)
Definition terminal.h:476
std::enable_if_t< meta::is_all_void_v< Key, Value >, void > send()
Definition terminal.h:515
std::enable_if_t<!meta::is_void_v< Key >, void > set_size(const Key &key, std::size_t size)
Definition terminal.h:394
std::enable_if_t<!meta::is_void_v< Key >, void > finalize(const Key &key)
Definition terminal.h:410
A base class for all template tasks.
Definition tt.h:32
ttg::TerminalBase * in(size_t i)
Returns a pointer to the i'th input terminal.
Definition tt.h:237
ttg::TerminalBase * out(size_t i)
Returns a pointer to the i'th output terminal.
Definition tt.h:243
static const std::vector< TerminalBase * > * get_outputs_tls_ptr()
Returns this thread's pointer to the vector of output terminals.
Definition tt.h:231
virtual void connect(TerminalBase *in)=0
auto get_out_terminal(size_t i, const char *func)
Definition func.h:30
auto get_out_base_terminal(size_t i, const char *func)
Definition func.h:52
void broadcast(const std::tuple< RangesT... > &keylists, valueT &&value, std::tuple< ttg::Out< out_keysT, out_valuesT >... > &t)
Definition func.h:348
constexpr auto get(typelist< T, RestOfTs... >)
Definition typelist.h:102
top-level TTG namespace contains runtime-neutral functionality
Definition keymap.h:9
auto fuse(const Edge< keyT, valuesT > &...args)
Fuse edges into one This allows receiving one data from either of the combined edges.
Definition func.h:138
void send()
Sends a control message (message without an accompanying task id or a value) to the template tasks at...
Definition func.h:341
constexpr const ttg::Runtime ttg_runtime
Definition import.h:21
int size(World world=default_execution_context())
Definition run.h:131
Runtime
Definition runtimes.h:16
std::enable_if_t<!meta::is_void_v< keyT >, void > set_size(const keyT &key, const std::size_t size, ttg::Out< keyT, out_valueT > &t)
Definition func.h:485
void sendk(const keyT &key, ttg::Out< keyT, void > &t)
Sends a task id (without an accompanying value) to the given output terminal.
Definition func.h:170
void sendv(valueT &&value, ttg::Out< void, valueT > &t)
Sends a value (without an accompanying task id) to the given output terminal.
Definition func.h:180
void finalize()
Finalizes the TTG runtime.
Definition func.h:590
void connect(ttg::Out< keyT, valueT > *out, ttg::In< keyT, valueT > *in)
Connect output terminal to successor input terminal.
Definition func.h:94
auto make_traverse(TTVisitor &&tt_v=trivial_1param_lambda, InVisitor &&in_v=trivial_1param_lambda, OutVisitor &&out_v=trivial_1param_lambda)
Definition traverse.h:206
void broadcast(const rangeT &keylist, valueT &&value, std::tuple< ttg::Out< out_keysT, out_valuesT >... > &t)
Definition func.h:415
void broadcastk(const rangeT &keylist, std::tuple< ttg::Out< out_keysT, out_valuesT >... > &t)
Definition func.h:453
std::enable_if_t<(std::is_convertible_v< decltype(*(std::declval< TTBasePtrs >())), TTBase & > &&...), bool > make_graph_executable(TTBasePtrs &&...tts)
Make the TTG tts executable. Applies.
Definition func.h:81
auto edges(inedgesT &&...args)
Make a tuple of Edges to pass to.
Definition func.h:148