1 /* Copyright (c) 2006-2014. The SimGrid Team.
2 * All rights reserved. */
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. */
9 #include "simdag/simdag.h"
13 XBT_LOG_NEW_DEFAULT_CATEGORY(sd_seq_access,
14 "Logging specific to this SimDag example");
16 int main(int argc, char **argv)
19 const char *platform_file;
20 const SD_workstation_t *workstations;
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 };
28 SD_workstation_t w1, w2;
30 /* initialisation of SD */
33 /* xbt_log_control_set("sd.thres=debug"); */
36 XBT_INFO("Usage: %s platform_file", argv[0]);
37 XBT_INFO("example: %s sd_platform.xml", argv[0]);
41 /* creation of the environment */
42 platform_file = argv[1];
43 SD_create_environment(platform_file);
45 /* Change the access mode of the workstations */
46 workstations = SD_workstation_get_list();
49 for (i = 0; i < 2; i++) {
50 SD_workstation_set_access_mode(workstations[i],
51 SD_WORKSTATION_SEQUENTIAL_ACCESS);
52 XBT_INFO("Access mode of %s is %s",
53 SD_workstation_get_name(workstations[i]),
54 (SD_workstation_get_access_mode(workstations[i]) ==
55 SD_WORKSTATION_SEQUENTIAL_ACCESS) ? "sequential" : "shared");
58 /* creation of the tasks and their dependencies */
59 taskA = SD_task_create_comp_seq("Task A", NULL, 2e9);
60 taskB = SD_task_create_comm_e2e("Task B", NULL, 2e9);
61 taskC = SD_task_create_comp_seq("Task C", NULL, 1e9);
62 TRACE_category ("taskA");
63 TRACE_category ("taskB");
64 TRACE_category ("taskC");
65 TRACE_sd_set_task_category (taskA, "taskA");
66 TRACE_sd_set_task_category (taskB, "taskB");
67 TRACE_sd_set_task_category (taskC, "taskC");
69 /* if everything is ok, no exception is forwarded or rethrown by main() */
72 SD_task_watch(taskA, SD_RUNNING);
73 SD_task_watch(taskB, SD_RUNNING);
74 SD_task_watch(taskC, SD_RUNNING);
75 SD_task_watch(taskC, SD_DONE);
78 /* scheduling parameters */
79 workstation_list[0] = w1;
80 workstation_list[1] = w2;
81 computation_amount[0] = SD_task_get_amount(taskA);
82 computation_amount[1] = SD_task_get_amount(taskB);
84 communication_amount[1] = SD_task_get_amount(taskC);
85 communication_amount[2] = 0.0;
87 SD_task_schedule(taskA, 1, &w1,
88 &(computation_amount[0]), SD_SCHED_NO_COST, rate);
89 SD_task_schedule(taskB, 2, workstation_list,
90 SD_SCHED_NO_COST, communication_amount, rate);
91 SD_task_schedule(taskC, 1, &w1,
92 &(computation_amount[1]), SD_SCHED_NO_COST, rate);
94 /* let's launch the simulation! */
95 while (!xbt_dynar_is_empty(changed_tasks = SD_simulate(-1.0))) {
96 for (i = 0; i < 2; i++) {
97 task = SD_workstation_get_current_task(workstations[i]);
99 kind = SD_task_get_kind(task);
101 XBT_INFO("There is no task running on %s",
102 SD_workstation_get_name(workstations[i]));
107 case SD_TASK_COMP_SEQ:
108 XBT_INFO("%s is currently running on %s (SD_TASK_COMP_SEQ)",
109 SD_task_get_name(task),
110 SD_workstation_get_name(workstations[i]));
112 case SD_TASK_COMM_E2E:
113 XBT_INFO("%s is currently running on %s (SD_TASK_COMM_E2E)",
114 SD_task_get_name(task),
115 SD_workstation_get_name(workstations[i]));
117 case SD_TASK_NOT_TYPED:
118 XBT_INFO("Task running on %s has no type",
119 SD_workstation_get_name(workstations[i]));
122 XBT_ERROR("Shouldn't be here");
125 xbt_dynar_free_container(&changed_tasks);
127 xbt_dynar_free_container(&changed_tasks);
129 XBT_DEBUG("Destroying tasks...");
131 SD_task_destroy(taskA);
132 SD_task_destroy(taskB);
133 SD_task_destroy(taskC);
135 XBT_DEBUG("Tasks destroyed. Exiting SimDag...");