Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
653562eea5fc874dfd41ee9f6eb3c5761af4f473
[simgrid.git] / examples / simdag / sd_avail.c
1 /* Copyright (c) 2012-2016. 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 "simgrid/simdag.h"
8 #include "xbt/log.h"
9
10 XBT_LOG_NEW_DEFAULT_CATEGORY(sd_avail, "Logging specific to this SimDag example");
11
12 /* Test of dynamic availability traces
13  * Scenario:
14  *  - A chain of tasks: t1 -> c1 -> t2 -> c2 -> t3 -> c3 -> t4 alternatively
15  *    scheduled across two workstations (Tremblay and Jupiter) connected by a
16  *    single link (link1)
17  *  - Make the characteristics of the resources change across time
18  *      Jupiter
19  *         [0.000000 -> 2.000000[ runs at half speed: 12500000
20  *         [2.000000 -> end[      runs at full speed: 25000000
21  *      Tremblay
22  *         [0.000000 -> 1.000000[ runs at half speed: 15000000
23  *         [1.000000 -> 4.000000[ runs at full speed: 25000000
24  *         [4.000000 -> 6.000000[ runs at half speed: 12500000
25  *         then loop back.
26  *      link1
27  *         [0.000000 -> 2.000000[ bandwidth = 125000000
28  *         [2.000000 -> 4.000000[ bandwidth = 62500000
29  *         [4.000000 -> 6.000000[ bandwidth = 31250000
30  *         then loop back.
31  *  - Adjust tasks' amounts to have comprehensive execution times
32  *      t1: 25000000 flops, should last 2 seconds
33  *      c1: 125000000 bytes, should last 1.0001 seconds
34  *      t2: 25000000 flops, should last 1 second
35  *      c2: 62500000 bytes, should last 1.0001 seconds
36  *      t3: 25000000 flops, should last 1 second
37  *      c3: 31250000 bytes, should last 1.0001 seconds
38  *      t4: 25000000 flops, should last 1 second
39  */
40
41 int main(int argc, char **argv)
42 {
43   unsigned int ctr;
44   const sg_host_t *hosts;
45   SD_task_t t1, c1, t2, c2, t3, c3, t4, task;
46   xbt_dynar_t changed_tasks;
47
48   SD_init(&argc, argv);
49   SD_create_environment(argv[1]);
50   hosts = sg_host_list();
51
52   t1 = SD_task_create_comp_seq("t1", NULL, 25000000);
53   c1 = SD_task_create_comm_e2e("c1", NULL, 125000000);
54   t2 = SD_task_create_comp_seq("t2", NULL, 25000000);
55   c2 = SD_task_create_comm_e2e("c2", NULL, 62500000);
56   t3 = SD_task_create_comp_seq("t3", NULL, 25000000);
57   c3 = SD_task_create_comm_e2e("c3", NULL, 31250000);
58   t4 = SD_task_create_comp_seq("t4", NULL, 25000000);
59
60   /* Add dependencies: t1->c1->t2->c2->t3 */
61   SD_task_dependency_add(NULL, NULL, t1, c1);
62   SD_task_dependency_add(NULL, NULL, c1, t2);
63   SD_task_dependency_add(NULL, NULL, t2, c2);
64   SD_task_dependency_add(NULL, NULL, c2, t3);
65   SD_task_dependency_add(NULL, NULL, t3, c3);
66   SD_task_dependency_add(NULL, NULL, c3, t4);
67
68   /* Schedule tasks t1 and w3 on first host, t2 on second host */
69   /* Transfers are auto-scheduled */
70   SD_task_schedulel(t1, 1, hosts[0]);
71   SD_task_schedulel(t2, 1, hosts[1]);
72   SD_task_schedulel(t3, 1, hosts[0]);
73   SD_task_schedulel(t4, 1, hosts[1]);
74
75   /* Add some watchpoint upon task completion */
76   SD_task_watch(t1, SD_DONE);
77   SD_task_watch(c1, SD_DONE);
78   SD_task_watch(t2, SD_DONE);
79   SD_task_watch(c2, SD_DONE);
80   SD_task_watch(t3, SD_DONE);
81   SD_task_watch(c3, SD_DONE);
82   SD_task_watch(t4, SD_DONE);
83
84   while (!xbt_dynar_is_empty((changed_tasks = SD_simulate(-1.0)))) {
85     XBT_INFO("link1: bw=%.0f, lat=%f", SD_route_get_bandwidth(hosts[0], hosts[1]),
86              SD_route_get_latency(hosts[0], hosts[1]));
87     XBT_INFO("Jupiter: speed=%.0f", sg_host_speed(hosts[0])* sg_host_get_available_speed(hosts[0]));
88     XBT_INFO("Tremblay: speed=%.0f", sg_host_speed(hosts[1])* sg_host_get_available_speed(hosts[1]));
89     xbt_dynar_foreach(changed_tasks, ctr, task) {
90       XBT_INFO("Task '%s' start time: %f, finish time: %f", SD_task_get_name(task),
91            SD_task_get_start_time(task), SD_task_get_finish_time(task));
92       if (SD_task_get_state(task)==SD_DONE)
93         SD_task_destroy(task);
94     }
95   }
96   SD_exit();
97   return 0;
98 }