Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
The Debian package is actually libsimgrid-dev.
[simgrid.git] / doc / doxygen / introduction.doc
1 /*! @page introduction Introduction to SimGrid 
2
3 [SimGrid](http://simgrid.gforge.inria.fr/) is a toolkit
4 that provides core functionalities for the simulation of distributed
5 applications in heterogeneous distributed environments.
6
7 The specific goal of the project is to facilitate research in the area of
8 distributed and parallel application scheduling on distributed computing
9 platforms ranging from simple network of workstations to Computational
10 Grids.
11
12 # Scenario 
13 The goal of this practical session is to illustrate various usage of
14 the MSG interface. To this end we will use the following simple setting:
15
16 > Assume we have a (possibly large) bunch of (possibly large) data to
17 > process and which originally reside on a server (a.k.a. master). For
18 > sake of simplicity, we assume all input file require the same amount
19 > of computation. We assume the server can be helped by a (possibly
20 > large) set of worker machines. What is the best way to organize the
21 > computations ?
22
23 Although this looks like a very simple setting it raises several
24 interesting questions:
25
26 - Which algorithm should the master use to send workload?
27
28     The most obvious algorithm would be to send tasks to workers in a
29     round-robin fashion. This is the initial code we provide you.
30
31     A less obvious one but probably more efficient would be to set up
32     a request mechanism where client first ask for tasks, which allows
33     the server to decide which request to answer and possibly to send
34     the tasks to the fastest machines. Maybe you can think of a
35     smarter mechanism...
36
37 - How much tasks should the client ask for?
38     
39     Indeed, if we set up a request mechanism and that workers only
40     send request whenever they have no more task to process, they are
41     likely to be poorly exploited since they will have to wait for the
42     master to consider their request and for the input data to be
43     transferred. A client should thus probably request a pool of tasks
44     but if it requests too much task, it is likely to lead to a poor
45     load-balancing...
46     
47 - How is the quality of such algorithm dependent on the platform
48     characteristics? on the task characteristics?
49     
50     Whenever the input communication time is very small compared to
51     processing time and workers are homogeneous, it is likely that the
52     round-robin algorithm performs very well. Would it still hold true
53     when transfer time is not negligible and the platform is, say,
54     a volunteer computing system ?
55
56 - The network topology interconnecting the master and the workers
57   may be quite complicated. How does such topology impact the
58   previous result?
59
60     When data transfers are the bottleneck, it is likely that a good
61     modeling of the platform becomes essential, in which case, you may
62     want to be able to account for complex platform topologies.
63
64 - Do the algorithms depend on a perfect knowledge of this
65   topology?
66
67     Should we still use a flat master worker deployment or should we
68     use a 
69
70 - How is such algorithm sensitive to external workload variation?
71
72     What if bandwidth, latency and power can vary with no warning?
73     Shouldn't you study whether your algorithm is sensitive to such
74     load variations?
75
76 - Although an algorithm may be more efficient than another, how
77   does it interfere with other applications?
78
79     As you can see, this very simple setting may need to evolve way
80     beyond what you initially imagined. 
81
82     <blockquote> Premature optimization is  the root of all evil. -- D.E.Knuth</blockquote>
83
84     Furthermore, writing your own simulator is much harder that what you
85     may imagine. This is why should rely on an established and flexible
86     one.
87
88 The following figure is a screenshot of [triva][fn:1] visualizing a [SimGrid
89 simulation][fn:2] of two master worker applications (one in light gray and
90 the other in dark gray) running in concurrence and showing resource
91 usage over a long period of time.
92
93 ![Test](./sc3-description.png)
94
95 # Prerequisites
96
97 ## Tutorials
98
99 A lot of information on how to install and use Simgrid are
100 available on the [online documentation][fn:4] and in the tutorials:
101
102 - http://simgrid.gforge.inria.fr/tutorials/simgrid-use-101.pdf
103 - http://simgrid.gforge.inria.fr/tutorials/simgrid-tracing-101.pdf
104 - http://simgrid.gforge.inria.fr/tutorials/simgrid-platf-101.pdf
105
106 ## Installing SimGrid
107
108     sudo apt-get install libsimgrid-dev
109
110 This tutorial requires simgrid 3.8 at least so you may need to get
111 the [debian packages](http://packages.debian.org/libsimgrid-dev).
112
113 # Recommended Steps
114
115 ## Installing Viva 
116    
117 This [software][fn:1] will be useful to make fancy graph or treemap
118 visualizations and get a better understanding of simulations. You
119 will first need to install pajeng:
120
121 ~~~~{.sh}
122 sudo apt-get install git cmake build-essential libqt4-dev  libboost-dev freeglut3-dev ;
123 git clone https://github.com/schnorr/pajeng.git
124 cd pajeng && mkdir -p build &&  cd build && cmake ../ -DCMAKE_INSTALL_PREFIX=$HOME &&  make -j install 
125 cd ../../
126 ~~~~
127
128 Then you can install viva.
129
130 ~~~~{.sh}
131 sudo apt-get install libboost-dev libconfig++-dev libconfig8-dev libgtk2.0-dev freeglut3-dev
132 git clone https://github.com/schnorr/viva.git
133 cd viva && mkdir -p build_graph &&  cd build_graph && cmake ../ -DTUPI_LIBRARY=ON -DVIVA=ON -DCMAKE_INSTALL_PREFIX=$HOME &&  make -j install 
134 cd ../../
135 ~~~~
136
137 ## Installing Paje 
138
139 This [software][fn:5] provides a Gantt-chart visualization.
140
141 ~~~~{.sh}
142 sudo apt-get install paje.app
143 ~~~~
144
145 ## Installing Vite 
146
147 This software provides a [Gantt-chart visualization][fn:6].
148
149 ~~~~{.sh}
150 sudo apt-get install vite
151 ~~~~
152
153 # Let's get Started
154 ## Setting up and Compiling
155    
156 The corresponding archive with all source files and platform files
157 can be obtained [here](http://simgrid.gforge.inria.fr/tutorials/msg-tuto/msg-tuto.tgz).
158
159 ~~~~{.sh}
160 tar zxf msg-tuto.tgz
161 cd msg-tuto/src
162 make
163 ~~~~
164
165 As you can see, there is already a nice Makefile that compiles
166 everything for you. Now the tiny example has been compiled and it
167 can be easily run as follows:
168
169 ~~~~{.sh}
170 ./masterworker0 platforms/platform.xml deployment0.xml 2>&1
171 ~~~~
172
173 If you create a single self-content C-file named foo.c, the
174 corresponding program will be simply compiled and linked with
175 SimGrid by typing:
176
177 ~~~~{.sh}
178 make foo
179 ~~~~
180
181 For a more "fancy" output, you can try:
182
183 ~~~~{.sh}
184 ./masterworker0 platforms/platform.xml deployment0.xml 2>&1 | simgrid-colorizer
185 ~~~~
186
187 For a really fancy output, you should use [viva/triva][fn:1]:
188
189 ~~~~{.sh}
190 ./masterworker0 platforms/platform.xml deployment0.xml --cfg=tracing:yes \
191     --cfg=tracing/uncategorized:yes --cfg=viva/uncategorized:uncat.plist
192 LANG=C ; viva simgrid.trace uncat.plist
193 ~~~~
194  
195 For a more classical Gantt-Chart visualization, you can produce a
196 [Paje][fn:5] trace:
197
198 ~~~~{.sh}
199 ./masterworker0 platforms/platform.xml deployment0.xml --cfg=tracing:yes \
200     --cfg=tracing/msg/process:yes
201 LANG=C ; Paje simgrid.trace
202 ~~~~
203
204 Alternatively, you can use [vite][fn:6].
205
206 ~~~~{.sh}
207 ./masterworker0 platforms/platform.xml deployment0.xml --cfg=tracing:yes \
208     --cfg=tracing/msg/process:yes --cfg=tracing/basic:yes
209 vite simgrid.trace
210 ~~~~
211
212 ## Getting Rid of Workers in the Deployment File
213
214 In the previous example, the deployment file `deployment0.xml`
215 is tightly connected to the platform file `platform.xml` and a
216 worker process is launched on each host:
217
218 ~~~~{.xml}
219 <?xml version='1.0'?>
220 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
221 <platform version="3">
222   <!-- The master process (with some arguments) -->
223   <process host="Tremblay" function="master">
224      <argument value="20"/>       <!-- Number of tasks -->
225      <argument value="50000000"/>  <!-- Computation size of tasks -->
226      <argument value="1000000"/>   <!-- Communication size of tasks -->
227      <argument value="Jupiter"/>  <!-- First worker -->
228      <argument value="Fafard"/>   <!-- Second worker -->
229      <argument value="Ginette"/>  <!-- Third worker -->
230      <argument value="Bourassa"/> <!-- Last worker -->
231      <argument value="Tremblay"/> <!-- Me! I can work too! -->
232   </process>
233   <!-- The worker process (with no argument) -->
234   <process host="Tremblay" function="worker" on_failure="RESTART"/>
235   <process host="Jupiter" function="worker" on_failure="RESTART"/>
236   <process host="Fafard" function="worker" on_failure="RESTART"/>
237   <process host="Ginette" function="worker" on_failure="RESTART"/>
238   <process host="Bourassa" function="worker" on_failure="RESTART"/>
239 </platform>
240 ~~~~
241
242 This is ok as the platform is rather small but will be painful when
243 using larger platforms. Instead, modify the simulator
244 `masterworker0.c` into `masterworker1.c` so that the master
245 launches a worker process on all the other machines at startup. The
246 new deployment file `deployment1.xml` should thus now simply be:
247
248 ~~~~{.xml}
249 <?xml version='1.0'?>
250 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
251 <platform version="3">
252   <!-- The master process (with some arguments) -->
253   <process host="Tremblay" function="master">
254      <argument value="20"/>       <!-- Number of tasks -->
255      <argument value="50000000"/>  <!-- Computation size of tasks -->
256      <argument value="1000000"/>   <!-- Communication size of tasks -->
257   </process>
258 </platform>
259 ~~~~
260
261 To this end you may need the following MSG functions, whose
262 behavior is described in the [online documentation](http://simgrid.gforge.inria.fr/simgrid/3.8.1/ref_guide/html/index.html) (hint: use the
263 search field to access directly the function you are looking for):
264
265 ~~~~{.c}
266 int MSG_get_host_number (void)
267 xbt_dynar_t MSG_hosts_as_dynar(void);
268 void * xbt_dynar_to_array (xbt_dynar_t dynar);
269 msg_process_t MSG_process_create(const char *name, xbt_main_func_t code,
270                                  void *data, msg_host_t host);
271 ~~~~
272
273 Note that it may avoid bugs later to avoid launching a worker on
274 the master host so you probably want to remove it from the host
275 list.
276
277 The `data` field of the `MSG_process_create` can be used to pass
278 a channel name that will be private between master
279 and workers (e.g., `master_name:worker_name`). Adding the
280 `master_name` in the channel name will allow to easily have several
281 masters and a worker per master on each machine. To this end, you
282 may need to use the following functions:
283
284 ~~~~{.c}
285 msg_host_t MSG_host_self(void);
286 const char * MSG_host_get_name(msg_host_t host);
287 msg_process_t MSG_process_self(void);
288 void * MSG_process_get_data(msg_process_t process);
289 ~~~~
290    
291 Again, you should check the [online documentation](http://simgrid.gforge.inria.fr/simgrid/3.8.1/ref_guide/html/index.html)
292 for more information.  If you are not too much familiar with string
293 manipulation in C, you may want to use the following functions
294
295 ~~~~{.c}
296 char *strcpy(char *dest, const char *src);
297 char *strcat(char *dest, const char *src);
298 ~~~~
299
300 ## Setting up a Time Limit Mechanism
301
302 In the current version, the number of tasks is defined in the
303 worker arguments. Hence, tasks are created at the very beginning of
304 the simulation. Instead, create tasks as needed and provide a time
305 limit indicating when it stops sending tasks. To this end, you will
306 obviously need to know what time it is ([reference manual][fn:7]):
307
308 ~~~~{.c}
309 double MSG_get_clock(void);
310 ~~~~
311
312 Otherwise, a quite effective way of terminating the simulation
313 would be to use some of the following [function][fn:7]:
314
315 ~~~~{.c}
316 void MSG_process_kill(msg_process_t process);
317 int MSG_process_killall(int reset_PIDs);
318 ~~~~
319
320 Anyway, the new deployment `deployment2.xml` file should thus look
321 like this:
322
323 ~~~~{.xml}
324 <?xml version='1.0'?>
325 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
326 <platform version="3">
327   <process host="Tremblay" function="master">
328      <argument value="3600"/>      <!-- Simulation timeout -->
329      <argument value="50000000"/>  <!-- Computation size of tasks -->
330      <argument value="1000000"/>   <!-- Communication size of tasks -->
331   </process>
332 </platform>
333 ~~~~
334
335 It may also be a good idea to transform most of the `XBT_INFO` into
336 `XBT_DEBUG` (e.g., keep the information on the total number of
337 tasks processed). These debug messages can be activated as follows:
338
339 ~~~~{.sh}
340 ./masterworker2 platforms/platform.xml deployment2.xml --log=msg_test.thres:debug
341 ~~~~
342
343 ## Using the Tracing Mechanism
344
345 SimGrid can trace all resource consumption and the outcome can be
346 displayed with viva as illustrated in the section "Setting up and Compiling". However, when several
347 masters are deployed, it is hard to understand what happens. 
348
349 ~~~~{.xml}
350 <?xml version='1.0'?>
351 <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
352 <platform version="3">
353   <process host="Tremblay" function="master">
354      <argument value="3600"/>      <!-- Simulation timeout -->
355      <argument value="50000000"/>  <!-- Computation size of tasks -->
356      <argument value="10"/>   <!-- Communication size of tasks -->
357   </process>
358   <process host="Fafard" function="master">
359      <argument value="3600"/>      <!-- Simulation timeout -->
360      <argument value="50000000"/>  <!-- Computation size of tasks -->
361      <argument value="10"/>   <!-- Communication size of tasks -->
362   </process>
363   <process host="Jupiter" function="master">
364      <argument value="3600"/>      <!-- Simulation timeout -->
365      <argument value="50000000"/>  <!-- Computation size of tasks -->
366      <argument value="10"/>   <!-- Communication size of tasks -->
367   </process>
368 </platform>
369 ~~~~
370
371 So let's use categories to track more precisely who does what and
372 [when][fn:7].
373
374 ~~~~{.c}
375 void TRACE_category(const char *category);
376 void MSG_task_set_category (msg_task_t task, const char *category);
377 ~~~~
378    
379 The outcome can then be visualized as follows:
380
381 ~~~~{.sh}
382 ./masterworker3 platforms/platform.xml deployment3.xml --cfg=tracing:yes\
383     --cfg=tracing/categorized:yes --cfg=viva/categorized:viva_cat.plist
384 LANG=C; viva simgrid.trace viva_cat.plist
385 ~~~~
386
387 Right now, you should realize that nothing is behaving like you
388 expect. Most workers are idle even though input data are ridiculous
389 and there are several masters deployed on the platform. Using a
390 Gantt-chart visualization may help:
391
392 ~~~~{.sh}
393 ./masterworker3 platforms/platform.xml deployment3.xml --cfg=tracing:yes \
394     --cfg=tracing/msg/process:yes
395 LANG=C; Paje simgrid.trace
396 ~~~~
397
398 OK, so it should now be obvious that round robin is actually
399 very bad.
400
401 ## Improving the Scheduling
402
403 Instead of a round-robin scheduling, let's implement a first-come
404 first-served mechanism. To this end, workers need to send a tiny
405 request first. A possible way to implement such a request with MSG
406 is to send on a specific channel (e.g., the name of the master
407 name) a task with payload 0 and whose attached data is the worker
408 name. This way, the master can keep track of which workers are idle
409 and willing to work.
410
411 To know whether it has pending requests, the master can use the
412 following [function][fn:7]:
413
414 ~~~~{.c}
415 int MSG_task_listen(const char *alias);
416 ~~~~
417
418 If so, it should get the request and push the corresponding host
419 into a dynar so that they can later be retrieved when sending a
420 real [task][fn:7].
421
422 ~~~~{.c}
423 xbt_dynar_t xbt_dynar_new(const unsigned long elm_size,
424                           void_f_pvoid_t const free_f);
425 void xbt_dynar_push(xbt_dynar_t const dynar, const void *src);
426 void xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst);
427 unsigned long xbt_dynar_length(const xbt_dynar_t dynar);
428 ~~~~
429
430 As you will soon realize, with such simple mechanisms, simple
431 deadlocks will soon appear. They can easily be removed with a
432 simple polling mechanism, hence the need for the following
433 [function][fn:7]:
434
435 ~~~~{.c}
436 msg_error_t MSG_process_sleep(double nb_sec);
437 ~~~~
438
439 As you should quickly realize, on the simple previous example, it
440 will double the throughput of the platform but will be quite
441 ineffective when input size of the tasks is not negligible anymore.
442
443 From this, many things can easily be added. For example, you could:
444 - add a performance measurement mechanism;
445 - enable the master to make smart scheduling choices using
446   measurement information;
447 - allow workers to have several pending requests so as to overlap
448   communication and computations as much as possible;
449 - ...
450
451 ## Using More Elaborate Platforms
452
453 SimGrid offers a rather powerful platform modeling mechanism. The
454 `src/platform/` repository comprises a variety of platform ranging
455 from simple ones to quite elaborated ones. Associated to a good
456 visualization tool to ensure your simulation is meaningful, they
457 can allow you to study to which extent your algorithm scales...
458
459 What is the largest number of tasks requiring 50e6 flops and 1e5
460 bytes that you manage to distribute and process in one hour on
461 `g5k.xml` (you should use `deployment_general.xml`)?
462
463 # Points to improve for the next time
464
465 - Propose equivalent exercises and skeleton in java.
466 - Propose a virtualbox image with everything (simgrid, paje, viva,
467   ...) already set up.
468 - Ease the installation on mac OS X (binary installer) and
469   windows.
470 - Explain that programming in C or java and having a working
471   development environment is a prerequisite.
472
473 [fn:1]: http://triva.gforge.inria.fr/index.html
474 [fn:2]: http://hal.inria.fr/inria-00529569
475 [fn:3]: http://hal.inria.fr/hal-00738321
476 [fn:4]: http://simgrid.gforge.inria.fr/documentation.html
477 [fn:5]: http://paje.sourceforge.net/
478 [fn:6]: http://vite.gforge.inria.fr/
479 [fn:7]: http://simgrid.gforge.inria.fr/simgrid/3.8.1/ref_guide/html/index.html
480
481
482
483
484
485 */