Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use isend instead of send to set the simdata->comm so that get_remaining can work.
[simgrid.git] / examples / msg / gtnets / gtnets.c
1 /* Copyright (c) 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 "msg/msg.h"
10 #include "xbt/log.h"
11 #include "xbt/asserts.h"
12
13 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
14                              "Messages specific for this msg example");
15
16 int master(int argc, char *argv[]);
17 int slave(int argc, char *argv[]);
18 int timer(int argc, char *argv[]);
19 MSG_error_t test_all(const char *platform_file,
20                      const char *application_file);
21
22 int timer_start = 1;
23
24 typedef enum {
25   PORT_22 = 0,
26   MAX_CHANNEL
27 } channel_t;
28
29 //keep a pointer to all surf running tasks.
30 #define NTASKS 1500
31 int bool_printed = 0;
32 double start_time, end_time, elapsed_time;
33 double gl_data_size[NTASKS];
34 m_task_t gl_task_array[NTASKS];
35 const char *slavenames[NTASKS];
36 const char *masternames[NTASKS];
37 int gl_task_array_id = 0;
38 int count_finished = 0;
39
40 #define FINALIZE ((void*)221297)        /* a magic number to tell people to stop working */
41
42 /** master */
43 int master(int argc, char *argv[])
44 {
45   char *slavename = NULL;
46   double task_comm_size = 0;
47   m_task_t todo;
48   char id_alias[10];
49   //unique id to control statistics
50   int id = -1;
51
52   if (argc != 4) {
53     XBT_INFO("Strange number of arguments expected 3 got %d", argc - 1);
54   }
55
56   /* data size */
57   int read;
58   read = sscanf(argv[1], "%lg", &task_comm_size);
59   xbt_assert(read, "Invalid argument %s\n", argv[1]);
60
61   /* slave name */
62   slavename = argv[2];
63   id = atoi(argv[3]);
64   sprintf(id_alias, "flow_%d", id);
65   slavenames[id] = slavename;
66   TRACE_category(id_alias);
67
68   masternames[id] = MSG_host_get_name(MSG_host_self());
69
70   {                             /*  Task creation.  */
71     char sprintf_buffer[64] = "Task_0";
72     todo = MSG_task_create(sprintf_buffer, 0, task_comm_size, NULL);
73     TRACE_msg_set_task_category(todo, id_alias);
74     //keep track of running tasks
75     gl_task_array[id] = todo;
76     gl_data_size[id] = task_comm_size;
77   }
78
79   count_finished++;
80
81   /* time measurement */
82   sprintf(id_alias, "%d", id);
83   start_time = MSG_get_clock();
84   MSG_task_send(todo, id_alias);
85   end_time = MSG_get_clock();
86
87
88   return 0;
89 }                               /* end_of_master */
90
91
92 /** Timer function  */
93 int timer(int argc, char *argv[])
94 {
95   int sleep_time;
96   int first_sleep;
97
98   if (argc != 3) {
99     XBT_INFO("Strange number of arguments expected 2 got %d", argc - 1);
100   }
101
102   sscanf(argv[1], "%d", &first_sleep);
103   sscanf(argv[2], "%d", &sleep_time);
104
105   if(first_sleep){
106       MSG_process_sleep(first_sleep);
107   }
108
109   while(timer_start){
110       MSG_process_sleep(sleep_time);
111   }
112
113   return 0;
114 }
115
116 /** Receiver function  */
117 int slave(int argc, char *argv[])
118 {
119
120   m_task_t task = NULL;
121   int a;
122   int id = 0;
123 #ifdef HAVE_LATENCY_BOUND_TRACKING
124   int limited_latency = 0;
125 #endif
126   double remaining = 0;
127   char id_alias[10];
128
129   if (argc != 2) {
130     XBT_INFO("Strange number of arguments expected 1 got %d", argc - 1);
131   }
132
133   id = atoi(argv[1]);
134   sprintf(id_alias, "%d", id);
135   int trace_id = id;
136
137   a = MSG_task_receive(&(task), id_alias);
138
139   count_finished--;
140   if(count_finished == 0){
141       timer_start = 0;
142   }
143
144
145
146   if (a != MSG_OK) {
147     XBT_INFO("Hey?! What's up?");
148     xbt_die("Unexpected behavior.");
149   }
150
151   elapsed_time = MSG_get_clock() - start_time;
152   
153   
154   if (!bool_printed) {
155     bool_printed = 1;
156     
157     for (id = 0; id < NTASKS; id++) {
158       if (gl_task_array[id] == NULL) {
159       } else if (gl_task_array[id] == task) {
160 #ifdef HAVE_LATENCY_BOUND_TRACKING
161         limited_latency = MSG_task_is_latency_bounded(gl_task_array[id]);
162         if (limited_latency) {
163           XBT_INFO("WARNING FLOW[%d] is limited by latency!!", id);
164         }
165 #endif
166         XBT_INFO
167             ("===> Estimated Bw of FLOW[%d] : %f ;  message from %s to %s  with remaining : %f",
168              id, gl_data_size[id] / elapsed_time, masternames[id],
169              slavenames[id], 0.0);
170       } else {
171         remaining =
172             MSG_task_get_remaining_communication(gl_task_array[id]);
173 #ifdef HAVE_LATENCY_BOUND_TRACKING
174         limited_latency = MSG_task_is_latency_bounded(gl_task_array[id]);
175
176         if (limited_latency) {
177           XBT_INFO("WARNING FLOW[%d] is limited by latency!!", id);
178         }
179 #endif
180         XBT_INFO
181             ("===> Estimated Bw of FLOW[%d] : %f ;  message from %s to %s  with remaining : %f",
182              id, (gl_data_size[id] - remaining) / elapsed_time,
183              masternames[id], slavenames[id], remaining);
184       }
185
186     }
187   }
188   char mark[100];
189   snprintf(mark, 100, "flow_%d_finished", trace_id);
190   TRACE_mark("endmark", mark);
191
192   MSG_task_destroy(task);
193
194   return 0;
195 }                               /* end_of_slave */
196
197 /** Test function */
198 MSG_error_t test_all(const char *platform_file,
199                      const char *application_file)
200 {
201   MSG_error_t res = MSG_OK;
202
203   /* MSG_config("workstation/model", "GTNETS"); */
204   /* MSG_config("workstation/model","KCCFLN05"); */
205   {                             /*  Simulation setting */
206     MSG_set_channel_number(MAX_CHANNEL);
207     MSG_create_environment(platform_file);
208   }
209
210   TRACE_declare_mark("endmark");
211
212   {                             /*   Application deployment */
213     MSG_function_register("master", master);
214     MSG_function_register("slave", slave);
215     MSG_function_register("timer", timer);
216
217     MSG_launch_application(application_file);
218   }
219   res = MSG_main();
220   return res;
221 }                               /* end_of_test_all */
222
223 /** Main function */
224 int main(int argc, char *argv[])
225 {
226   MSG_error_t res = MSG_OK;
227   bool_printed = 0;
228
229   MSG_global_init(&argc, argv);
230   if (argc < 3) {
231     printf("Usage: %s platform_file deployment_file\n", argv[0]);
232     exit(1);
233   }
234
235   res = test_all(argv[1], argv[2]);
236
237   MSG_clean();
238
239   if (res == MSG_OK)
240     return 0;
241   else
242     return 1;
243 }                               /* end_of_main */