1 /* Copyright (c) 2006, 2007, 2008, 2009, 2010. 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 */
35 /* xbt_log_control_set("sd.thres=debug"); */
38 INFO1("Usage: %s platform_file", argv[0]);
39 INFO1("example: %s sd_platform.xml", argv[0]);
43 /* creation of the environment */
44 platform_file = argv[1];
45 SD_create_environment(platform_file);
47 /* Change the access mode of the workstations */
48 workstations = SD_workstation_get_list();
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");
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");
71 /* if everything is ok, no exception is forwarded or rethrown by main() */
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);
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);
86 communication_amount[1] = SD_task_get_amount(taskC);
87 communication_amount[2] = 0.0;
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);
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]);
101 kind = SD_task_get_kind(task);
103 INFO1("There is no task running on %s",
104 SD_workstation_get_name(workstations[i]));
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]));
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]));
119 case SD_TASK_NOT_TYPED:
120 INFO1("Task running on %s has no type",
121 SD_workstation_get_name(workstations[i]));
124 ERROR0("Shouldn't be here");
127 xbt_dynar_free_container(&changed_tasks);
130 DEBUG0("Destroying tasks...");
132 SD_task_destroy(taskA);
133 SD_task_destroy(taskB);
134 SD_task_destroy(taskC);
136 DEBUG0("Tasks destroyed. Exiting SimDag...");