Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
New platform files (just add AS tag)
[simgrid.git] / examples / simdag / sd_seq_access.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   /*  xbt_log_control_set("sd.thres=debug"); */
34
35   if (argc < 2) {
36     INFO1("Usage: %s platform_file", argv[0]);
37     INFO1("example: %s sd_platform.xml", argv[0]);
38     exit(1);
39   }
40
41   /* creation of the environment */
42   platform_file = argv[1];
43   SD_create_environment(platform_file);
44
45   /* Change the access mode of the workstations */
46   workstations = SD_workstation_get_list();
47   w1 = workstations[0];
48   w2 = workstations[1];
49   for(i=0;i<2; i++){
50     SD_workstation_set_access_mode(workstations[i], 
51                                    SD_WORKSTATION_SEQUENTIAL_ACCESS);
52     INFO2("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");
56   }
57
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
63   /* if everything is ok, no exception is forwarded or rethrown by main() */
64
65   /* watch points */
66   SD_task_watch(taskA, SD_RUNNING);
67   SD_task_watch(taskB, SD_RUNNING);
68   SD_task_watch(taskC, SD_RUNNING);
69   SD_task_watch(taskC, SD_DONE);
70
71
72   /* scheduling parameters */
73   workstation_list[0] = w1;
74   workstation_list[1] = w2;
75   computation_amount[0] = SD_task_get_amount(taskA);
76   computation_amount[1] = SD_task_get_amount(taskB);
77
78   communication_amount[1] = SD_task_get_amount(taskC);
79   communication_amount[2] = 0.0;
80
81   SD_task_schedule(taskA, 1, &w1,
82                    &(computation_amount[0]), SD_SCHED_NO_COST, rate);
83   SD_task_schedule(taskB, 2, workstation_list,
84                    SD_SCHED_NO_COST, communication_amount, rate);
85   SD_task_schedule(taskC, 1, &w1,
86                    &(computation_amount[1]), SD_SCHED_NO_COST, rate);
87
88   /* let's launch the simulation! */
89   while(xbt_dynar_length(changed_tasks = SD_simulate(-1.0))>0){
90     for(i=0;i<2; i++){
91       task = SD_workstation_get_current_task(workstations[i]);
92       if (task)
93         kind = SD_task_get_kind(task);
94       else{
95         INFO1("There is no task running on %s",
96               SD_workstation_get_name(workstations[i]));
97         continue;
98       }
99
100       switch (kind){
101       case SD_TASK_COMP_SEQ:
102         INFO2("%s is currently running on %s (SD_TASK_COMP_SEQ)",
103               SD_task_get_name(task),
104               SD_workstation_get_name(workstations[i]));
105         break;
106       case SD_TASK_COMM_E2E:
107         INFO2("%s is currently running on %s (SD_TASK_COMM_E2E)",
108               SD_task_get_name(task),
109               SD_workstation_get_name(workstations[i]));
110         break;
111       case SD_TASK_NOT_TYPED:
112         INFO1("Task running on %s has no type",
113               SD_workstation_get_name(workstations[i]));
114         break;
115       default:
116         ERROR0("Shouldn't be here");
117       }
118     }
119     xbt_dynar_free_container(&changed_tasks);
120   }
121
122   DEBUG0("Destroying tasks...");
123
124   SD_task_destroy(taskA);
125   SD_task_destroy(taskB);
126   SD_task_destroy(taskC);
127
128   DEBUG0("Tasks destroyed. Exiting SimDag...");
129
130   SD_exit();
131   return 0;
132 }