reducing.cc
Go to the documentation of this file.
1 #include <ttg.h>
4 
5 const double threshold = 100.0;
6 using Key2 = std::pair<int, int>;
7 
8 namespace std {
9  std::ostream &operator<<(std::ostream &os, const Key2 &key) {
10  os << "{" << std::get<0>(key) << ", " << std::get<1>(key) << "}";
11  return os;
12  }
13 } // namespace std
14 
15 static void b(const Key2 &key, const double &input, std::tuple<ttg::Out<int, double>> &out) {
16  ttg::print("Called task B(", key, ") with input data ", input); ttg::send <0>(std::get<0>(key), input + 1.0, out);
18 }
19 
20 static void c(const int &k, const double &sum, std::tuple<ttg::Out<int, double>> &out) {
21  ttg::print("Called task C(", k, ") with input ", sum);
22  if (sum < threshold) {
23  ttg::print(" ", sum, "<", threshold, " so continuing to iterate"); ttg::send <0>(k + 1, sum, out);
25  } else {
26  ttg::print(" ", sum, ">=", threshold, " so stopping the iterations");
27  }
28 }
29 
30 int main(int argc, char **argv) {
31  ttg::initialize(argc, argv, -1);
32 
33  ttg::Edge<Key2, double> A_B("A(k)->B(k, i)");
34  ttg::Edge<int, double> B_C("B(k, i)->C(k)");
35  ttg::Edge<int, double> C_A("C(k)->A(k)");
36 
37  auto wc(ttg::make_tt(c, ttg::edges(B_C), ttg::edges(C_A), "C", {"From B"}, {"to A"}));
38  wc->set_input_reducer <0>(
40  [](double &a, const double &b) { a += b; });
41 
42  auto wa(ttg::make_tt(
43  [&](const int &k, const double &input, std::tuple<ttg::Out<Key2, double>> &out) {
44  ttg::print("Called task A(", k, ")");
45  wc->set_argstream_size<0>(k, k + 1);
46  for (int i = 0; i < k + 1; i++) {
48  ttg::send <0>(Key2{k, i}, 1.0 + k + input, out);
49  }
50  },
51  ttg::edges(C_A), ttg::edges(A_B), "A", {"from C"}, {"to B"}));
52 
53  auto wb(ttg::make_tt(b, ttg::edges(A_B), ttg::edges(B_C), "B", {"from A"}, {"to C"}));
54 
56 
57  if (wa->get_world().rank() == 0) wa->invoke(0, 0.0);
58 
59  ttg::execute();
61 
62  ttg::finalize();
63  return EXIT_SUCCESS;
64 }
65 
Edge is used to connect In and Out terminals.
Definition: edge.h:25
std::pair< int, int > Key2
Definition: distributed.cc:6
auto make_tt(funcT &&func, const std::tuple< ttg::Edge< keyT, input_edge_valuesT >... > &inedges=std::tuple<>{}, const std::tuple< output_edgesT... > &outedges=std::tuple<>{}, const std::string &name="wrapper", const std::vector< std::string > &innames=std::vector< std::string >(sizeof...(input_edge_valuesT), "input"), const std::vector< std::string > &outnames=std::vector< std::string >(sizeof...(output_edgesT), "output"))
Factory function to assist in wrapping a callable with signature.
Definition: make_tt.h:560
void execute(ttg::World world)
Starts the execution in the given execution context.
Definition: run.h:74
void send(const keyT &key, valueT &&value, ttg::Out< keyT, valueT > &t)
Sends a task id and a value to the given output terminal.
Definition: func.h:158
void initialize(int argc, char **argv, int num_threads=-1, RestOfArgs &&...)
std::enable_if_t<(std::is_convertible_v< decltype(*(std::declval< TTBasePtrs >))), TTBase & > bool make_graph_executable(TTBasePtrs &&...tts)
Definition: func.h:80
void fence(ttg::World world)
Returns when all tasks associated with the given execution context have finished on all ranks.
Definition: run.h:81
void print(const T &t, const Ts &... ts)
atomically prints to std::cout a sequence of items (separated by ttg::print_separator) followed by st...
Definition: print.h:130
std::enable_if_t<!meta::is_void_v< keyT >, void > finalize(const keyT &key, ttg::Out< out_keyT, out_valueT > &t)
Finalize streaming input terminals connecting to the given output terminal for tasks identified by ke...
Definition: func.h:545
ttg::World & get_default_world()
Definition: world.h:80
auto edges(inedgesT &&...args)
Make a tuple of Edges to pass to.
Definition: func.h:147
const double threshold
Definition: reducing.cc:5
int main(int argc, char **argv)
Definition: reducing.cc:30