Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update copyright lines.
[simgrid.git] / examples / s4u / trace-masterworkers / s4u-trace-masterworkers.cpp
1 /* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include <simgrid/instr.h>
7 #include <simgrid/s4u.hpp>
8
9 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_trace_masterworker, "Messages specific for this example");
10
11 struct Task {
12   std::string name;
13   std::string category;
14   double flops;
15 };
16
17 static void master(std::vector<std::string> args)
18 {
19   xbt_assert(args.size() > 4, "The master function expects at least 3 arguments");
20
21   long tasks_count        = std::stol(args[1]);
22   double compute_cost     = std::stod(args[2]);
23   long communication_cost = std::stol(args[3]);
24   size_t workers_count    = args.size() - 4;
25   const char* my_hostname = simgrid::s4u::this_actor::get_host()->get_cname();
26   auto mailbox            = simgrid::s4u::Mailbox::by_name("master_mailbox");
27
28   XBT_DEBUG("Got %zu workers and %ld tasks to process", workers_count, tasks_count);
29
30   // setting the variable "is_master" (previously declared) to value 1
31   TRACE_host_variable_set(my_hostname, "is_master", 1);
32
33   TRACE_mark("msmark", "start_send_tasks");
34   for (int i = 0; i < tasks_count; i++) {
35     // setting the variable "task_creation" to value i
36     TRACE_host_variable_set(my_hostname, "task_creation", i);
37
38     // setting the category of task to "compute"
39     Task task = {"task", "compute", compute_cost};
40     mailbox->put(new Task(task), communication_cost);
41   }
42   TRACE_mark("msmark", "finish_send_tasks");
43
44   XBT_DEBUG("All tasks have been dispatched. Request all workers to stop.");
45   for (unsigned int i = 0; i < workers_count; i++) {
46     Task finalize = {"finalize", "finalize", 0};
47     mailbox->put(new Task(finalize), 0);
48   }
49 }
50
51 static void worker(std::vector<std::string> args)
52 {
53   xbt_assert(args.size() == 1, "The worker expects no argument");
54
55   const char* my_hostname = simgrid::s4u::this_actor::get_host()->get_cname();
56   auto mailbox            = simgrid::s4u::Mailbox::by_name("master_mailbox");
57
58   TRACE_host_variable_set(my_hostname, "is_worker", 1);
59   TRACE_host_variable_set(my_hostname, "task_computation", 0);
60
61   while (true) {
62     auto task = mailbox->get_unique<Task>();
63     if (task->name == "finalize") {
64       break;
65     }
66     // adding the task's cost to the variable "task_computation"
67     TRACE_host_variable_add(my_hostname, "task_computation", task->flops);
68     simgrid::s4u::this_actor::exec_init(task->flops)
69         ->set_name(task->name)
70         ->set_tracing_category(task->category)
71         ->wait();
72   }
73
74   XBT_DEBUG("Exiting now.");
75 }
76
77 int main(int argc, char* argv[])
78 {
79   simgrid::s4u::Engine e(&argc, argv);
80   xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n", argv[0]);
81
82   e.load_platform(argv[1]);
83
84   // declaring user variables
85   TRACE_host_variable_declare("is_worker");
86   TRACE_host_variable_declare("is_master");
87   TRACE_host_variable_declare("task_creation");
88   TRACE_host_variable_declare("task_computation");
89
90   // declaring user markers and values
91   TRACE_declare_mark("msmark");
92   TRACE_declare_mark_value("msmark", "start_send_tasks");
93   TRACE_declare_mark_value("msmark", "finish_send_tasks");
94
95   // declaring user categories with RGB colors (values from 0 to 1)
96   TRACE_category_with_color("compute", "1 0 0");  // compute is red
97   TRACE_category_with_color("finalize", "0 1 0"); // finalize is green
98   // categories without user-defined colors receive random colors generated by the tracing system
99   TRACE_category("request");
100   TRACE_category_with_color("report", nullptr);
101
102   e.register_function("master", &master);
103   e.register_function("worker", &worker);
104   e.load_deployment(argv[2]);
105
106   e.run();
107
108   XBT_DEBUG("Simulation is over");
109
110   unsigned int cursor;
111   xbt_dynar_t categories = TRACE_get_categories();
112   if (categories) {
113     XBT_INFO("Declared tracing categories:");
114     char* category;
115     xbt_dynar_foreach (categories, cursor, category) {
116       XBT_INFO("%s", category);
117     }
118     xbt_dynar_free(&categories);
119   }
120
121   xbt_dynar_t marks = TRACE_get_marks();
122   if (marks) {
123     XBT_INFO("Declared marks:");
124     char* mark;
125     xbt_dynar_foreach (marks, cursor, mark) {
126       XBT_INFO("%s", mark);
127     }
128     xbt_dynar_free(&marks);
129   }
130
131   return 0;
132 }