Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
adding an example of simdag with tracing functions
[simgrid.git] / examples / simdag / simdag_trace.c
1 /* Copyright (c) 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include "simdag/simdag.h"
10 #include "xbt/ex.h"
11 #include "xbt/log.h"
12
13 XBT_LOG_NEW_DEFAULT_CATEGORY(sd_seq_access,
14                              "Logging specific to this SimDag example");
15
16 int main(int argc, char **argv)
17 {
18   int i;
19   const char *platform_file;
20   const SD_workstation_t *workstations;
21   int kind;
22   SD_task_t task, taskA, taskB, taskC;
23   xbt_dynar_t changed_tasks;
24   SD_workstation_t workstation_list[2];
25   double computation_amount[2];
26   double communication_amount[4] = { 0 };
27   double rate = -1.0;
28   SD_workstation_t w1, w2;
29
30   /* initialisation of SD */
31   SD_init(&argc, argv);
32
33   TRACE_start ();
34
35   /*  xbt_log_control_set("sd.thres=debug"); */
36
37   if (argc < 2) {
38     INFO1("Usage: %s platform_file", argv[0]);
39     INFO1("example: %s sd_platform.xml", argv[0]);
40     exit(1);
41   }
42
43   /* creation of the environment */
44   platform_file = argv[1];
45   SD_create_environment(platform_file);
46
47   /* Change the access mode of the workstations */
48   workstations = SD_workstation_get_list();
49   w1 = workstations[0];
50   w2 = workstations[1];
51   for (i = 0; i < 2; i++) {
52     SD_workstation_set_access_mode(workstations[i],
53                                    SD_WORKSTATION_SEQUENTIAL_ACCESS);
54     INFO2("Access mode of %s is %s",
55           SD_workstation_get_name(workstations[i]),
56           (SD_workstation_get_access_mode(workstations[i]) ==
57            SD_WORKSTATION_SEQUENTIAL_ACCESS) ? "sequential" : "shared");
58   }
59
60   /* creation of the tasks and their dependencies */
61   taskA = SD_task_create_comp_seq("Task A", NULL, 2e9);
62   taskB = SD_task_create_comm_e2e("Task B", NULL, 2e9);
63   taskC = SD_task_create_comp_seq("Task C", NULL, 1e9);
64   TRACE_category ("taskA");
65   TRACE_category ("taskB");
66   TRACE_category ("taskC");
67   TRACE_sd_set_task_category (taskA, "taskA");
68   TRACE_sd_set_task_category (taskB, "taskB");
69   TRACE_sd_set_task_category (taskC, "taskC");
70
71   /* if everything is ok, no exception is forwarded or rethrown by main() */
72
73   /* watch points */
74   SD_task_watch(taskA, SD_RUNNING);
75   SD_task_watch(taskB, SD_RUNNING);
76   SD_task_watch(taskC, SD_RUNNING);
77   SD_task_watch(taskC, SD_DONE);
78
79
80   /* scheduling parameters */
81   workstation_list[0] = w1;
82   workstation_list[1] = w2;
83   computation_amount[0] = SD_task_get_amount(taskA);
84   computation_amount[1] = SD_task_get_amount(taskB);
85
86   communication_amount[1] = SD_task_get_amount(taskC);
87   communication_amount[2] = 0.0;
88
89   SD_task_schedule(taskA, 1, &w1,
90                    &(computation_amount[0]), SD_SCHED_NO_COST, rate);
91   SD_task_schedule(taskB, 2, workstation_list,
92                    SD_SCHED_NO_COST, communication_amount, rate);
93   SD_task_schedule(taskC, 1, &w1,
94                    &(computation_amount[1]), SD_SCHED_NO_COST, rate);
95
96   /* let's launch the simulation! */
97   while (xbt_dynar_length(changed_tasks = SD_simulate(-1.0)) > 0) {
98     for (i = 0; i < 2; i++) {
99       task = SD_workstation_get_current_task(workstations[i]);
100       if (task)
101         kind = SD_task_get_kind(task);
102       else {
103         INFO1("There is no task running on %s",
104               SD_workstation_get_name(workstations[i]));
105         continue;
106       }
107
108       switch (kind) {
109       case SD_TASK_COMP_SEQ:
110         INFO2("%s is currently running on %s (SD_TASK_COMP_SEQ)",
111               SD_task_get_name(task),
112               SD_workstation_get_name(workstations[i]));
113         break;
114       case SD_TASK_COMM_E2E:
115         INFO2("%s is currently running on %s (SD_TASK_COMM_E2E)",
116               SD_task_get_name(task),
117               SD_workstation_get_name(workstations[i]));
118         break;
119       case SD_TASK_NOT_TYPED:
120         INFO1("Task running on %s has no type",
121               SD_workstation_get_name(workstations[i]));
122         break;
123       default:
124         ERROR0("Shouldn't be here");
125       }
126     }
127     xbt_dynar_free_container(&changed_tasks);
128   }
129
130   DEBUG0("Destroying tasks...");
131
132   SD_task_destroy(taskA);
133   SD_task_destroy(taskB);
134   SD_task_destroy(taskC);
135
136   DEBUG0("Tasks destroyed. Exiting SimDag...");
137
138   SD_exit();
139   TRACE_end();
140   return 0;
141 }