Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
8b453937f6706f60e3b372c68661439235af0d0b
[simgrid.git] / examples / README.rst
1 .. S4U (Simgrid for you) is the modern interface of SimGrid, which new project should use.
2 ..
3 .. This file follows the ReStructured syntax to be included in the
4 .. documentation, but it should remain readable directly.
5
6 .. _s4u_examples:
7
8 Examples
9 ********
10
11 SimGrid comes with an extensive set of examples, documented on this
12 page. Most of them only demonstrate one single feature, with some
13 larger exemplars listed below.
14
15 The C++ examples can be found under examples/cpp while python examples
16 are in examples/python. Each such directory contains the source code (also listed
17 from this page), and the so-called tesh file containing how to call
18 the binary obtained by compiling this example and also the expected
19 output. Tesh files are used to turn each of our examples into an
20 integration test. Some examples also contain other files, on need.
21
22 A good way to bootstrap your own project is to copy and combine some
23 of the provided examples to constitute the skeleton of what you plan
24 to simulate.
25
26 .. _s4u_ex_actors:
27
28 ===========================
29 Actors: the Active Entities
30 ===========================
31
32 Starting and Stopping Actors
33 ----------------------------
34
35 Creating actors
36 ^^^^^^^^^^^^^^^
37
38 Most actors are started from the deployment XML file because this
39 is a :ref:`better scientific habit <howto_science>`, but you can
40 also create them directly from your code.
41
42 .. tabs::
43
44    .. example-tab:: examples/cpp/actor-create/s4u-actor-create.cpp
45
46       You create actors either:
47
48       - Directly with :cpp:func:`simgrid::s4u::Actor::create`
49       - From XML with :cpp:func:`simgrid::s4u::Engine::register_actor` (if your actor is a class)
50         or :cpp:func:`simgrid::s4u::Engine::register_function` (if your actor is a function)
51         and then :cpp:func:`simgrid::s4u::Engine::load_deployment`
52
53    .. example-tab:: examples/python/actor-create/actor-create.py
54
55       You create actors either:
56
57       - Directly with :py:func:`simgrid.Actor.create()`
58       - From XML with :py:func:`simgrid.Engine.register_actor()` and then :py:func:`simgrid.Engine.load_deployment()`
59
60    .. example-tab:: examples/c/actor-create/actor-create.c
61
62       You create actors either:
63
64       - Directly with :cpp:func:`sg_actor_create` followed by :cpp:func:`sg_actor_start`.
65       - From XML with :cpp:func:`simgrid_register_function` and then :cpp:func:`simgrid_load_deployment`.
66
67    .. example-tab:: examples/python/actor-create/actor-create_d.xml
68
69       The following file is used in both C++ and Python.
70
71 Reacting to actors' end
72 ^^^^^^^^^^^^^^^^^^^^^^^
73
74 You can attach callbacks to the end of actors. There are several ways of doing so, depending on whether you want to
75 attach your callback to a given actor and on how you define the end of a
76 given actor. User code probably wants to react to the termination of an actor
77 while some plugins want to react to the destruction (memory collection) of
78 actors.
79
80 .. tabs::
81
82    .. example-tab:: examples/cpp/actor-exiting/s4u-actor-exiting.cpp
83
84       This example shows how to attach a callback to:
85
86       - the end of a specific actor: :cpp:func:`simgrid::s4u::Actor::on_exit()`
87       - the end of any actor: :cpp:member:`simgrid::s4u::Actor::on_termination()`
88       - the destruction of any actor: :cpp:member:`simgrid::s4u::Actor::on_destruction()`
89
90    .. example-tab:: examples/c/actor-exiting/actor-exiting.c
91
92       This example shows how to attach a callback to the end of a specific actor with
93       :cpp:func:`sg_actor_on_exit()`.
94
95 Killing actors
96 ^^^^^^^^^^^^^^
97
98 Actors can forcefully stop other actors.
99
100 .. tabs::
101
102    .. example-tab:: examples/cpp/actor-kill/s4u-actor-kill.cpp
103
104       See also :cpp:func:`void simgrid::s4u::Actor::kill(void)`, :cpp:func:`void simgrid::s4u::Actor::kill_all()`,
105       :cpp:func:`simgrid::s4u::this_actor::exit`, :cpp:func:`simgrid::s4u::Actor::on_exit`.
106
107    .. example-tab:: examples/python/actor-kill/actor-kill.py
108
109       See also :py:func:`simgrid.Actor.kill`, :py:func:`simgrid.Actor.kill_all`, :py:func:`simgrid.this_actor.exit`,
110       :py:func:`simgrid.this_actor.on_exit`.
111
112    .. example-tab:: examples/c/actor-kill/actor-kill.c
113
114       See also :cpp:func:`sg_actor_kill`, :cpp:func:`sg_actor_kill_all`, :cpp:func:`sg_actor_exit`, :cpp:func:`sg_actor_on_exit`.
115
116 Actors' life cycle from XML_reference
117 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
118
119 You can specify a start time and a kill time in the deployment file.
120
121 .. tabs::
122
123    .. example-tab:: examples/cpp/actor-lifetime/s4u-actor-lifetime.cpp
124
125       This file is not really interesting: the important matter is in the XML file.
126
127    .. example-tab:: examples/cpp/actor-lifetime/s4u-actor-lifetime_d.xml
128
129       This demonstrates the ``start_time`` and ``kill_time`` attribute of the :ref:`pf_tag_actor` tag.
130
131    .. example-tab:: examples/python/actor-lifetime/actor-lifetime.py
132
133       This file is not really interesting: the important matter is in the XML file.
134
135    .. example-tab:: examples/c/actor-lifetime/actor-lifetime.c
136
137       This file is not really interesting: the important matter is in the XML file.
138
139 Daemon actors
140 ^^^^^^^^^^^^^
141
142 Some actors may be intended to simulate daemons that run in the background.
143 This example shows how to transform a regular
144 actor into a daemon that will be automatically killed once the simulation is over.
145
146 .. tabs::
147
148    .. example-tab:: examples/cpp/actor-daemon/s4u-actor-daemon.cpp
149
150       See also :cpp:func:`simgrid::s4u::Actor::daemonize()` and :cpp:func:`simgrid::s4u::Actor::is_daemon()`.
151
152    .. example-tab:: examples/python/actor-daemon/actor-daemon.py
153
154       See also :py:func:`simgrid.Actor.daemonize()` and :py:func:`simgrid.Actor.is_daemon()`.
155
156    .. example-tab:: examples/c/actor-daemon/actor-daemon.c
157
158       See also :cpp:func:`sg_actor_daemonize` and :cpp:func:`sg_actor_is_daemon`.
159
160 Specifying the stack size
161 ^^^^^^^^^^^^^^^^^^^^^^^^^
162
163 The stack size can be specified by default on the command line,
164 globally by changing the configuration with :cpp:func:`simgrid::s4u::Engine::set_config`,
165 or for a specific actor using :cpp:func:`simgrid::s4u::Actor::set_stacksize` before its start.
166
167 .. tabs::
168
169    .. example-tab:: examples/cpp/actor-stacksize/s4u-actor-stacksize.cpp
170
171    .. example-tab:: examples/c/actor-stacksize/actor-stacksize.c
172
173 Inter-Actors Interactions
174 -------------------------
175
176 See also the examples on :ref:`inter-actors communications
177 <s4u_ex_communication>` and the ones on :ref:`classical
178 synchronization objects <s4u_ex_IPC>`.
179
180 Suspending/resuming Actors
181 ^^^^^^^^^^^^^^^^^^^^^^^^^^
182
183 Actors can be suspended and resumed during their executions.
184
185 .. tabs::
186
187    .. example-tab:: examples/cpp/actor-suspend/s4u-actor-suspend.cpp
188
189       See also :cpp:func:`simgrid::s4u::this_actor::suspend()`,
190       :cpp:func:`simgrid::s4u::Actor::suspend()`, :cpp:func:`simgrid::s4u::Actor::resume()`, and
191       :cpp:func:`simgrid::s4u::Actor::is_suspended()`.
192
193    .. example-tab:: examples/python/actor-suspend/actor-suspend.py
194
195       See also :py:func:`simgrid.this_actor.suspend()`,
196       :py:func:`simgrid.Actor.suspend()`, :py:func:`simgrid.Actor.resume()`, and
197       :py:func:`simgrid.Actor.is_suspended()`.
198
199    .. example-tab:: examples/c/actor-suspend/actor-suspend.c
200
201       See also :cpp:func:`sg_actor_suspend()`, :cpp:func:`sg_actor_resume()`, and
202       :cpp:func:`sg_actor_is_suspended()`.
203
204 Migrating Actors
205 ^^^^^^^^^^^^^^^^
206
207 Actors can move or be moved from a host to another very easily. It amounts to setting them on a new host.
208
209 .. tabs::
210
211    .. example-tab:: examples/cpp/actor-migrate/s4u-actor-migrate.cpp
212
213       See also :cpp:func:`simgrid::s4u::this_actor::set_host()` and :cpp:func:`simgrid::s4u::Actor::set_host()`.
214
215    .. example-tab:: examples/python/actor-migrate/actor-migrate.py
216
217       See also :py:func:`simgrid.this_actor.set_host()` and :py:func:`simgrid.Actor.set_host()`.
218
219    .. example-tab:: examples/c/actor-migrate/actor-migrate.c
220
221       See also :cpp:func:`sg_actor_set_host()`.
222
223 Waiting for the termination of an actor (joining on it)
224 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
225
226 You can block the current actor until the end of another actor.
227
228 .. tabs::
229
230    .. example-tab:: examples/cpp/actor-join/s4u-actor-join.cpp
231
232       See also :cpp:func:`simgrid::s4u::Actor::join()`.
233
234    .. example-tab:: examples/python/actor-join/actor-join.py
235
236       See also :py:func:`simgrid.Actor.join()`.
237
238    .. example-tab:: examples/c/actor-join/actor-join.c
239
240       See also :cpp:func:`sg_actor_join`.
241
242 Yielding to other actors
243 ^^^^^^^^^^^^^^^^^^^^^^^^
244
245 The ```yield()``` function interrupts the execution of the current
246 actor, leaving a chance to the other actors that are ready to run
247 at this timestamp.
248
249 .. tabs::
250
251    .. example-tab:: examples/cpp/actor-yield/s4u-actor-yield.cpp
252
253       See also :cpp:func:`simgrid::s4u::this_actor::yield()`.
254
255    .. example-tab:: examples/python/actor-yield/actor-yield.py
256
257       See also :py:func:`simgrid.this_actor.yield_()`.
258
259    .. example-tab:: examples/c/actor-yield/actor-yield.c
260
261       See also :cpp:func:`sg_actor_yield()`.
262
263 Traces Replay as a Workload
264 ---------------------------
265
266 This section details how to run trace-driven simulations. It is very
267 handy when you want to test an algorithm or protocol that only reacts
268 to external events. For example, many P2P protocols react to user
269 requests, but do nothing if there is no such event.
270
271 In such situations, you should write your protocol in C++, and separate
272 the workload that you want to play onto your protocol in a separate
273 text file. Declare a function handling each type of the events in your
274 trace, register them using :cpp:func:`xbt_replay_action_register()` in
275 your main, and then run the simulation.
276
277 Then, you can either have one trace file containing all your events,
278 or a file per simulated process: the former may be easier to work
279 with, but the second is more efficient on very large traces. Check
280 also the tesh files in the example directories for details.
281
282 Communication replay
283 ^^^^^^^^^^^^^^^^^^^^
284
285 Presents a set of event handlers reproducing classical communication primitives (asynchronous send/receive at the moment).
286
287 .. tabs::
288
289    .. example-tab:: examples/cpp/replay-comm/s4u-replay-comm.cpp
290
291 I/O replay
292 ^^^^^^^^^^
293
294 Presents a set of event handlers reproducing classical I/O primitives (open, read, close).
295
296 .. tabs::
297
298    .. example-tab:: examples/cpp/replay-io/s4u-replay-io.cpp
299
300 ==========================
301 Activities: what Actors do
302 ==========================
303
304 .. _s4u_ex_communication:
305
306 Communications on the Network
307 -----------------------------
308
309 Basic communications
310 ^^^^^^^^^^^^^^^^^^^^
311
312 This simple example just sends one message back and forth.
313 The tesh file laying in the directory shows how to start the simulator binary, highlighting how to pass options to
314 the simulators (as detailed in Section :ref:`options`).
315
316 .. tabs::
317
318    .. example-tab:: examples/cpp/comm-pingpong/s4u-comm-pingpong.cpp
319
320    .. example-tab:: examples/c/comm-pingpong/comm-pingpong.c
321
322
323 Basic asynchronous communications
324 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
325
326 Illustrates how to have non-blocking communications, that are communications running in the background leaving the process 
327 free to do something else during their completion.
328
329 .. tabs::
330
331    .. example-tab:: examples/cpp/comm-wait/s4u-comm-wait.cpp
332
333       See also :cpp:func:`simgrid::s4u::Mailbox::put_async()` and :cpp:func:`simgrid::s4u::Comm::wait()`.
334
335    .. example-tab:: examples/python/comm-wait/comm-wait.py
336
337       See also :py:func:`simgrid.Mailbox.put_async()` and :py:func:`simgrid.Comm.wait()`.
338
339    .. example-tab:: examples/c/comm-wait/comm-wait.c
340
341       See also :cpp:func:`sg_mailbox_put_async()` and :cpp:func:`sg_comm_wait()`.
342
343 Waiting for communications with timeouts
344 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
345
346 This example is very similar to the previous one, simply adding how to declare timeouts when waiting on asynchronous communication.
347
348 .. tabs::
349
350    .. example-tab:: examples/cpp/comm-waituntil/s4u-comm-waituntil.cpp
351
352       See also :cpp:func:`simgrid::s4u::Activity::wait_until()` and :cpp:func:`simgrid::s4u::Comm::wait_for()`.
353
354 Suspending communications
355 ^^^^^^^^^^^^^^^^^^^^^^^^^
356
357 The ``suspend()`` and ``resume()`` functions block the progression of a given communication for a while and then unblock it.
358 ``is_suspended()`` returns whether that activity is currently blocked or not.
359
360 .. tabs::
361
362    .. example-tab:: examples/cpp/comm-suspend/s4u-comm-suspend.cpp
363
364       See also :cpp:func:`simgrid::s4u::Activity::suspend()`
365       :cpp:func:`simgrid::s4u::Activity::resume()` and
366       :cpp:func:`simgrid::s4u::Activity::is_suspended()`.
367
368 Waiting for all communications in a set
369 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
370
371 The ``wait_all()`` function is useful when you want to block until all activities in a given set have been completed.
372
373 .. tabs::
374
375    .. example-tab:: examples/cpp/comm-waitall/s4u-comm-waitall.cpp
376
377       See also :cpp:func:`simgrid::s4u::Comm::wait_all()`.
378
379    .. example-tab:: examples/python/comm-waitall/comm-waitall.py
380
381       See also :py:func:`simgrid.Comm.wait_all()`.
382
383    .. example-tab:: examples/c/comm-waitall/comm-waitall.c
384
385       See also :cpp:func:`sg_comm_wait_all()`.
386
387 Waiting for the first completed communication in a set
388 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
389
390 The ``wait_any()`` function is useful when you want to block until one activity of the set completes, no matter which terminates first.
391
392 .. tabs::
393
394    .. example-tab:: examples/cpp/comm-waitany/s4u-comm-waitany.cpp
395
396       See also :cpp:func:`simgrid::s4u::Comm::wait_any()`.
397
398    .. example-tab:: examples/python/comm-waitany/comm-waitany.py
399
400       See also :py:func:`simgrid.Comm.wait_any()`.
401
402    .. example-tab:: examples/c/comm-waitany/comm-waitany.c
403
404       See also :cpp:func:`sg_comm_wait_any`.
405
406 .. _s4u_ex_execution:
407
408 Executions on the CPU
409 ---------------------
410
411 Basic execution
412 ^^^^^^^^^^^^^^^
413
414 The computations done in your program are not reported to the
415 simulated world unless you explicitly request the simulator to pause
416 the actor until a given amount of flops gets computed on its simulated
417 host. Some executions can be given a higher priority so that they
418 get more resources.
419
420 .. tabs::
421
422    .. example-tab:: examples/cpp/exec-basic/s4u-exec-basic.cpp
423
424       See also :cpp:func:`void simgrid::s4u::this_actor::execute(double)`
425       and :cpp:func:`void simgrid::s4u::this_actor::execute(double, double)`.
426
427    .. example-tab:: examples/python/exec-basic/exec-basic.py
428
429       See also :py:func:`simgrid.this_actor.execute()`.
430
431    .. example-tab:: examples/c/exec-basic/exec-basic.c
432
433       See also :cpp:func:`void sg_actor_execute(double)`
434       and :cpp:func:`void sg_actor_execute_with_priority(double, double)`.
435
436 Asynchronous execution
437 ^^^^^^^^^^^^^^^^^^^^^^
438
439 You can start asynchronous executions, just like you would fire background threads.
440
441 .. tabs::
442
443    .. example-tab:: examples/cpp/exec-async/s4u-exec-async.cpp
444
445       See also :cpp:func:`simgrid::s4u::this_actor::exec_init()`,
446       :cpp:func:`simgrid::s4u::Activity::start()`,
447       :cpp:func:`simgrid::s4u::Activity::wait()`,
448       :cpp:func:`simgrid::s4u::Activity::get_remaining()`,
449       :cpp:func:`simgrid::s4u::Exec::get_remaining_ratio()`,
450       :cpp:func:`simgrid::s4u::this_actor::exec_async()` and
451       :cpp:func:`simgrid::s4u::Activity::cancel()`.
452
453    .. example-tab:: examples/python/exec-async/exec-async.py
454
455       See also :py:func:`simgrid.this_actor.exec_init()`,
456       :py:func:`simgrid.Activity.start()`,
457       :py:func:`simgrid.Activity.wait()`,
458       :py:func:`simgrid.Activity.get_remaining()`,
459       :py:func:`simgrid.Exec.get_remaining_ratio()`,
460       :py:func:`simgrid.this_actor.exec_async()` and
461       :py:func:`simgrid.Activity.cancel()`.
462
463    .. example-tab:: examples/c/exec-async/exec-async.c
464
465       See also :cpp:func:`sg_actor_exec_init()`,
466       :cpp:func:`sg_exec_start()`,
467       :cpp:func:`sg_exec_wait()`,
468       :cpp:func:`sg_exec_get_remaining()`,
469       :cpp:func:`sg_exec_get_remaining_ratio()`,
470       :cpp:func:`sg_actor_exec_async()` and
471       :cpp:func:`sg_exec_cancel()`,
472
473 Remote execution
474 ^^^^^^^^^^^^^^^^
475
476 You can start executions on remote hosts, or even change the host on which they occur during their execution.
477
478 .. tabs::
479
480    .. example-tab:: examples/cpp/exec-remote/s4u-exec-remote.cpp
481
482       See also :cpp:func:`simgrid::s4u::Exec::set_host()`.
483
484    .. example-tab:: examples/python/exec-remote/exec-remote.py
485
486       See also :py:func:`simgrid.Exec.set_host()`.
487
488    .. example-tab:: examples/c/exec-remote/exec-remote.c
489
490       See also :cpp:func:`sg_exec_set_host()`.
491
492 Parallel executions
493 ^^^^^^^^^^^^^^^^^^^
494
495 These objects are convenient abstractions of parallel
496 computational kernels that span over several machines, such as a
497 PDGEM and the other ScaLAPACK routines. Note that this only works
498 with the "ptask_L07" host model (``--cfg=host/model:ptask_L07``).
499
500 This example demonstrates several kinds of parallel tasks: regular
501 ones, communication-only (without computation), computation-only
502 (without communication), synchronization-only (neither
503 communication nor computation). It also shows how to reconfigure a
504 task after its start, to change the number of hosts it runs onto.
505 This allows simulating malleable tasks.
506
507 .. tabs::
508
509    .. example-tab:: examples/cpp/exec-ptask/s4u-exec-ptask.cpp
510
511       See also :cpp:func:`simgrid::s4u::this_actor::parallel_execute()`.
512
513 DVFS and pstates
514 ^^^^^^^^^^^^^^^^
515
516 This example shows how to define a set of pstates in the XML. The current pstate
517 of a host can then be accessed and changed from the program.
518
519 .. tabs::
520
521    .. example-tab:: examples/cpp/exec-dvfs/s4u-exec-dvfs.cpp
522
523       See also :cpp:func:`simgrid::s4u::Host::get_pstate_speed` and :cpp:func:`simgrid::s4u::Host::set_pstate`.
524
525    .. example-tab:: examples/c/exec-dvfs/exec-dvfs.c
526
527       See also :cpp:func:`sg_host_get_pstate_speed` and :cpp:func:`sg_host_set_pstate`.
528
529    .. example-tab:: examples/python/exec-dvfs/exec-dvfs.py
530
531       See also :py:func:`Host.get_pstate_speed` and :py:func:`Host.set_pstate`.
532
533    .. example-tab:: examples/platforms/energy_platform.xml
534
535 .. _s4u_ex_disk_io:
536
537 I/O on Disks and Files
538 ----------------------
539
540 SimGrid provides two levels of abstraction to interact with the
541 simulated disks. At the simplest level, you simply create read and
542 write actions on the disk resources.
543
544 Access to raw disk devices
545 ^^^^^^^^^^^^^^^^^^^^^^^^^^
546
547 This example illustrates how to simply read and write data on a simulated disk resource.
548
549 .. tabs::
550
551    .. example-tab:: examples/cpp/io-disk-raw/s4u-io-disk-raw.cpp
552
553    .. example-tab:: examples/c/io-disk-raw/io-disk-raw.c
554
555    .. example-tab:: examples/platforms/hosts_with_disks.xml
556
557       This shows how to declare disks in XML.
558
559 Filesystem plugin
560 ^^^^^^^^^^^^^^^^^
561
562 The FileSystem plugin provides a more detailed view, with the
563 classical operations over files: open, move, unlink, and of course,
564 read and write. The file and disk sizes are also dealt with and can
565 result in short reads and short writes, as in reality.
566
567   - **File Management:**
568     This example illustrates the use of operations on files
569     (read, write, seek, tell, unlink, etc).
570
571     .. tabs::
572
573        .. example-tab:: examples/cpp/io-file-system/s4u-io-file-system.cpp
574
575   - **Remote I/O:**
576     I/O operations on files can also be done remotely,
577     i.e. when the accessed disk is not mounted on the caller's host.
578
579     .. tabs::
580
581        .. example-tab:: examples/cpp/io-file-remote/s4u-io-file-remote.cpp
582
583        .. example-tab:: examples/c/io-file-remote/io-file-remote.c
584
585 .. _s4u_ex_IPC:
586
587 Classical synchronization objects
588 ---------------------------------
589
590 Barrier
591 ^^^^^^^
592
593 Shows how to use :cpp:type:`simgrid::s4u::Barrier` synchronization objects.
594
595 .. tabs::
596
597    .. example-tab:: examples/cpp/synchro-barrier/s4u-synchro-barrier.cpp
598
599 Condition variable: basic usage
600 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
601
602 Shows how to use :cpp:type:`simgrid::s4u::ConditionVariable` synchronization objects.
603
604 .. tabs::
605
606    .. example-tab:: examples/cpp/synchro-condition-variable/s4u-synchro-condition-variable.cpp
607
608 Condition variable: timeouts
609 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
610
611 Shows how to specify timeouts when blocking on condition variables.
612
613 .. tabs::
614
615    .. example-tab:: examples/cpp/synchro-condition-variable-waituntil/s4u-synchro-condition-variable-waituntil.cpp
616
617 Mutex
618 ^^^^^
619
620 Shows how to use :cpp:type:`simgrid::s4u::Mutex` synchronization objects.
621
622 .. tabs::
623
624    .. example-tab:: examples/cpp/synchro-mutex/s4u-synchro-mutex.cpp
625
626 Semaphore
627 ^^^^^^^^^
628
629 Shows how to use :cpp:type:`simgrid::s4u::Semaphore` synchronization objects.
630
631 .. tabs::
632
633    .. example-tab:: examples/cpp/synchro-semaphore/s4u-synchro-semaphore.cpp
634
635    .. example-tab:: examples/c/synchro-semaphore/synchro-semaphore.c
636
637 =============================
638 Interacting with the Platform
639 =============================
640
641 User-defined properties
642 -----------------------
643
644 You can attach arbitrary information to most platform elements from the XML file, and then interact with these values from your
645 program. Note that the changes are not written permanently on disk, in the XML file nor anywhere else. They only last until the end of
646 your simulation.
647
648 .. tabs::
649
650    .. example-tab:: examples/cpp/platform-properties/s4u-platform-properties.cpp
651
652       - :cpp:func:`simgrid::s4u::Actor::get_property()` and :cpp:func:`simgrid::s4u::Actor::set_property()`
653       - :cpp:func:`simgrid::s4u::Host::get_property()` and :cpp:func:`simgrid::s4u::Host::set_property()`
654       - :cpp:func:`simgrid::s4u::Link::get_property()` and :cpp:func:`simgrid::s4u::Link::set_property()`
655       - :cpp:func:`simgrid::s4u::NetZone::get_property()` and :cpp:func:`simgrid::s4u::NetZone::set_property()`
656
657    .. example-tab:: examples/c/platform-properties/platform-properties.c
658
659       - :cpp:func:`sg_actor_get_property_value()`
660       - :cpp:func:`sg_host_get_property_value()` and :cpp:func:sg_host_set_property_value()`
661       - :cpp:func:`sg_zone_get_property_value()` and :cpp:func:`sg_zone_set_property_value()`
662
663    .. group-tab:: XML
664
665       **Platform file:**
666
667       .. showfile:: examples/platforms/prop.xml
668          :language: xml
669
670 Element filtering
671 -----------------
672
673 Retrieving the netzones matching given criteria
674 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
675
676 Shows how to filter the cluster netzones.
677
678 .. tabs::
679
680    .. example-tab:: examples/cpp/routing-get-clusters/s4u-routing-get-clusters.cpp
681
682 Retrieving the list of hosts matching given criteria
683 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
684
685 Shows how to filter the actors that match given criteria.
686
687 .. tabs::
688
689    .. example-tab:: examples/cpp/engine-filtering/s4u-engine-filtering.cpp
690
691 Profiles
692 --------
693
694 Specifying state profiles
695 ^^^^^^^^^^^^^^^^^^^^^^^^^
696
697 Shows how to specify when the resources must be turned off and on again, and how to react to such
698 failures in your code. See also :ref:`howto_churn`.
699
700 .. tabs::
701
702    .. example-tab:: examples/cpp/platform-failures/s4u-platform-failures.cpp
703
704    .. example-tab:: examples/c/platform-failures/platform-failures.c
705
706    .. group-tab:: XML
707
708       .. showfile:: examples/platforms/small_platform_failures.xml
709          :language: xml
710
711       .. showfile:: examples/platforms/profiles/jupiter_state.profile
712
713       .. showfile:: examples/platforms/profiles/fafard_state.profile
714
715 Specifying speed profiles
716 ^^^^^^^^^^^^^^^^^^^^^^^^^
717
718 Shows how to specify an external load to resources, variating their peak speed over time.
719
720    .. tabs::
721
722       .. example-tab:: examples/cpp/platform-profile/s4u-platform-profile.cpp
723
724       .. group-tab:: XML
725
726          .. showfile:: examples/platforms/small_platform_profile.xml
727             :language: xml
728
729          .. showfile:: examples/platforms/profiles/jupiter_speed.profile
730
731          .. showfile:: examples/platforms/profiles/link1_bandwidth.profile
732
733          .. showfile:: examples/platforms/profiles/link1_latency.profile
734
735 =================
736 Energy Simulation
737 =================
738
739 Setup
740 -----
741
742 Describing the energy profiles in the platform
743 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
744
745 The first platform file contains the energy profile of each link and host for a wired network, which is necessary to get energy consumption
746 predictions. The second platform file is the equivalent for a wireless network. As usual, you should not trust our example, and you should
747 strive to double-check that your instantiation matches your target platform.
748
749 .. tabs::
750
751    .. group-tab:: XML
752
753 .. showfile:: examples/platforms/energy_platform.xml
754    :language: xml
755
756 .. showfile:: examples/platforms/wifi_energy.xml
757    :language: xml
758
759 Usage
760 -----
761
762 CPU energy consumption
763 ^^^^^^^^^^^^^^^^^^^^^^
764
765 This example shows how to retrieve the amount of energy consumed by the CPU during computations, and the impact of the pstate.
766
767 .. tabs::
768
769    .. example-tab:: examples/cpp/energy-exec/s4u-energy-exec.cpp
770
771    .. example-tab:: examples/c/energy-exec/energy-exec.c
772
773 Wired network energy consumption
774 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
775
776 This example shows how to retrieve and display the energy consumed by the wired network during communications.
777
778 .. tabs::
779
780    .. example-tab:: examples/cpp/energy-link/s4u-energy-link.cpp
781
782 WiFi network energy consumption
783 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
784
785 This example shows how to retrieve and display the energy consumed by the wireless network during communications.
786
787 .. tabs::
788
789    .. example-tab:: examples/cpp/energy-wifi/s4u-energy-wifi.cpp
790
791 Modeling the shutdown and boot of hosts
792 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
793
794 Simple example of a model for the energy consumption during the host boot and shutdown periods.
795
796 .. tabs::
797
798    .. example-tab:: examples/platforms/energy_boot.xml
799
800    .. example-tab:: examples/cpp/energy-boot/s4u-energy-boot.cpp
801
802 =======================
803 Tracing and Visualizing
804 =======================
805
806 Tracing can be activated by various configuration options which are illustrated in these examples. See also the
807 :ref:`full list of options related to tracing <tracing_tracing_options>`.
808 The following introduces  some option sets of interest that you may want to pass to your simulators.
809
810 .. todo::
811    These tracing examples should be integrated in the examples to not duplicate the C++ files.
812    A full command line to see the result in the right tool (vite/FrameSoc) should be given along with some screenshots.
813
814 Platform Tracing
815 ----------------
816
817 Basic example
818 ^^^^^^^^^^^^^
819
820 This program is a toy example just loading the platform so that you can play with the platform visualization. Recommended options:
821 ``--cfg=tracing:yes --cfg=tracing/categorized:yes``
822
823 .. tabs::
824
825    .. example-tab:: examples/cpp/trace-platform/s4u-trace-platform.cpp
826
827 Setting Categories
828 ^^^^^^^^^^^^^^^^^^
829
830 This example declares several tracing categories that are used to
831 classify its tasks. When the program is executed, the tracing mechanism
832 registers the resource utilization of hosts and links according to these
833 categories. Recommended options:
834 ``--cfg=tracing:yes --cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes``
835
836 .. tabs::
837
838    .. example-tab:: examples/cpp/trace-categories/s4u-trace-categories.cpp
839
840 Master Workers tracing
841 ^^^^^^^^^^^^^^^^^^^^^^
842
843 This is an augmented version of our basic master/worker example using
844 several tracing features. It traces resource usage, sorted out in several
845 categories; Trace marks and user variables are also used. Recommended
846 options: ``--cfg=tracing/categorized:yes --cfg=tracing/uncategorized:yes``
847
848 .. tabs::
849
850    .. example-tab:: examples/cpp/trace-masterworkers/s4u-trace-masterworkers.cpp
851
852    .. example-tab:: examples/python/app-masterworkers/app-masterworkers.py
853
854 Process migration tracing
855 ^^^^^^^^^^^^^^^^^^^^^^^^^
856
857 This version is enhanced so that the process migrations can be displayed
858 as arrows in a Gantt-chart visualization. Recommended options to that
859 extend: ``--cfg=tracing:yes --cfg=tracing/actor:yes``
860
861 .. tabs::
862
863    .. example-tab:: examples/cpp/trace-process-migration/s4u-trace-process-migration.cpp
864
865 Tracing user variables
866 ----------------------
867
868 You can also attach your own variables to any resource described in the platform
869 file. The following examples illustrate this feature.  They have to be run with
870 the following options: ``--cfg=tracing:yes --cfg=tracing/platform:yes``
871
872 Attaching variables to Hosts
873 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
874
875 .. tabs::
876
877    .. example-tab:: examples/cpp/trace-host-user-variables/s4u-trace-host-user-variables.cpp
878
879 Attaching variables to Links
880 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
881
882 The tricky part is that you have to know the name of the link you want to enhance with a variable.
883
884 .. tabs::
885
886    .. example-tab:: examples/cpp/trace-link-user-variables/s4u-trace-link-user-variables.cpp
887
888 Attaching variables to network routes
889 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
890
891 It is often easier to update a given variable for all links of a given network path (identified by its source and destination hosts) instead of
892 knowing the name of each specific link.
893
894 .. tabs::
895
896    .. example-tab::  examples/cpp/trace-route-user-variables/s4u-trace-route-user-variables.cpp
897
898 ========================
899 Larger SimGrid Exemplars
900 ========================
901
902 This section contains application examples that are somewhat larger than the previous examples.
903
904 Classical examples
905 ------------------
906
907 Token ring
908 ^^^^^^^^^^
909
910 Shows how to implement a classical communication pattern, where a token is exchanged along a ring to reach every participant.
911
912 .. tabs::
913
914    .. example-tab:: examples/cpp/app-token-ring/s4u-app-token-ring.cpp
915
916    .. example-tab:: examples/c/app-token-ring/app-token-ring.c
917
918 Master Workers
919 ^^^^^^^^^^^^^^
920
921 Another good old example, where one Master acto$ has a bunch of tasks to dispatch to a set of several Worker actors. 
922 This example is used in the :ref:`SimGrid tutorial <usecase_simalgo>`.
923
924 .. tabs::
925
926    .. group-tab:: C++
927
928       This example comes in two equivalent variants, one where the actors
929       are specified as simple functions (which is easier to understand for
930       newcomers) and one where the actors are specified as classes (which is
931       more powerful for the users wanting to build their own projects upon
932       the example).
933
934       .. showfile:: examples/cpp/app-masterworkers/s4u-app-masterworkers-class.cpp
935          :language: cpp
936
937       .. showfile:: examples/cpp/app-masterworkers/s4u-app-masterworkers-fun.cpp
938          :language: cpp
939
940    .. group-tab:: C
941
942       .. showfile:: examples/c/app-masterworker/app-masterworker.c
943          :language: cpp
944
945 Data diffusion
946 --------------
947
948 Bit Torrent
949 ^^^^^^^^^^^
950
951 Classical protocol for Peer-to-Peer data diffusion.
952
953 .. tabs::
954
955    .. group-tab:: C++
956
957       .. showfile:: examples/cpp/app-bittorrent/s4u-bittorrent.cpp
958          :language: cpp
959
960       .. showfile:: examples/cpp/app-bittorrent/s4u-peer.cpp
961          :language: cpp
962
963       .. showfile:: examples/cpp/app-bittorrent/s4u-tracker.cpp
964          :language: cpp
965
966    .. group-tab:: C
967
968       .. showfile:: examples/c/app-bittorrent/app-bittorrent.c
969          :language: cpp
970
971       .. showfile:: examples/c/app-bittorrent/bittorrent-peer.c
972          :language: cpp
973
974       .. showfile:: examples/c/app-bittorrent/tracker.c
975          :language: cpp
976
977 Chained Send
978 ^^^^^^^^^^^^
979
980 Data broadcast over a ring of processes.
981
982 .. tabs::
983
984    .. example-tab:: examples/cpp/app-chainsend/s4u-app-chainsend.cpp
985
986    .. group-tab:: C
987
988       .. showfile:: examples/c/app-chainsend/chainsend.c
989          :language: c
990
991       .. showfile:: examples/c/app-chainsend/broadcaster.c
992          :language: c
993
994       .. showfile:: examples/c/app-chainsend/peer.c
995          :language: c
996
997 Distributed Hash Tables (DHT)
998 -----------------------------
999
1000 Chord Protocol
1001 ^^^^^^^^^^^^^^
1002
1003 One of the most famous DHT protocol.
1004
1005 .. tabs::
1006
1007    .. group-tab:: C++
1008
1009       .. showfile:: examples/cpp/dht-chord/s4u-dht-chord.cpp
1010          :language: cpp
1011
1012       .. showfile:: examples/cpp/dht-chord/s4u-dht-chord-node.cpp
1013          :language: cpp
1014
1015 Kademlia
1016 ^^^^^^^^
1017
1018 Another well-known DHT protocol.
1019
1020 .. tabs::
1021
1022    .. group-tab:: C++
1023
1024       .. showfile:: examples/cpp/dht-kademlia/s4u-dht-kademlia.cpp
1025          :language: cpp
1026
1027       .. showfile:: examples/cpp/dht-kademlia/routing_table.cpp
1028          :language: cpp
1029
1030       .. showfile:: examples/cpp/dht-kademlia/answer.cpp
1031          :language: cpp
1032
1033       .. showfile:: examples/cpp/dht-kademlia/node.cpp
1034          :language: cpp
1035
1036    .. group-tab:: C
1037
1038       .. showfile:: examples/c/dht-kademlia/dht-kademlia.c
1039          :language: cpp
1040
1041       .. showfile:: examples/c/dht-kademlia/routing_table.c
1042          :language: cpp
1043
1044       .. showfile:: examples/c/dht-kademlia/answer.c
1045          :language: cpp
1046
1047       .. showfile:: examples/c/dht-kademlia/message.c
1048          :language: cpp
1049
1050       .. showfile:: examples/c/dht-kademlia/node.c
1051          :language: cpp
1052
1053 .. _s4u_ex_clouds:
1054
1055 Simulating Clouds
1056 -----------------
1057
1058 Cloud basics
1059 ^^^^^^^^^^^^
1060
1061 This example starts some computations both on PMs and VMs and migrates some VMs around.
1062
1063 .. tabs::
1064
1065    .. example-tab:: examples/cpp/cloud-simple/s4u-cloud-simple.cpp
1066
1067    .. example-tab:: examples/c/cloud-simple/cloud-simple.c
1068
1069 Migrating VMs
1070 ^^^^^^^^^^^^^
1071
1072 This example shows how to migrate VMs between PMs.
1073
1074 .. tabs::
1075
1076    .. example-tab:: examples/cpp/cloud-migration/s4u-cloud-migration.cpp
1077
1078    .. example-tab:: examples/c/cloud-migration/cloud-migration.c
1079
1080 =======================
1081 Model-Related Examples
1082 =======================
1083
1084 ns-3 as a model
1085 ---------------
1086
1087 This simple ping-pong example demonstrates how to use the bindings to the Network
1088 Simulator. The most interesting is probably not the C++ files since
1089 they are unchanged from the other simulations, but the associated files,
1090 such as the platform file to see how to declare a platform to be used
1091 with the ns-3 bindings of SimGrid and the tesh file to see how to
1092 start a simulation in these settings.
1093
1094 .. tabs::
1095
1096    .. example-tab:: examples/cpp/network-ns3/s4u-network-ns3.cpp
1097
1098    .. group-tab:: XML
1099
1100       **Platform files:**
1101
1102       .. showfile:: examples/platforms/small_platform_one_link_routes.xml
1103          :language: xml
1104
1105 WiFi links
1106 ----------
1107
1108 This demonstrates how to declare a wifi zone in your platform and
1109 how to use it in your simulation. For that, you should have a link
1110 whose sharing policy is set to `WIFI`. Such links can have more
1111 than one bandwidth value (separated by commas), corresponding to
1112 the several SNR level of your wifi link.
1113
1114 In this case, SimGrid automatically switches to validated
1115 performance models of wifi networks, where the time is shared
1116 between users instead of the bandwidth for wired links (the
1117 corresponding publication is currently being written).
1118
1119 If your wifi link provides more than one SNR level, you can switch
1120 the level of a given host using
1121 :cpp:func:`simgrid::s4u::Link::set_host_wifi_rate`. By default,
1122 the first level is used.
1123
1124 .. tabs::
1125
1126    .. example-tab:: examples/cpp/network-wifi/s4u-network-wifi.cpp
1127
1128    .. group-tab:: XML
1129
1130       **Platform files:**
1131
1132       .. showfile:: examples/platforms/wifi.xml
1133          :language: xml
1134
1135 ===============
1136 Plugin Examples
1137 ===============
1138
1139 It is possible to extend SimGrid without modifying its internals by
1140 attaching code to the existing signals and by adding extra data to the
1141 simulation objects through extensions. How to do that is not exactly
1142 documented yet, and you should look for examples in the src/plugins
1143 directory.
1144
1145 This section documents how the existing plugins can be used. Remember
1146 that you are very welcome to modify the plugins to fit your needs. It
1147 should be much easier than modifying the SimGrid kernel.
1148
1149 Monitoring the host load
1150 ------------------------
1151
1152 .. tabs::
1153
1154    .. example-tab:: examples/cpp/plugin-host-load/s4u-plugin-host-load.cpp
1155
1156    .. example-tab:: examples/c/plugin-host-load/plugin-host-load.c
1157
1158 Monitoring the link load
1159 ------------------------
1160
1161 .. tabs::
1162
1163    .. example-tab:: examples/cpp/plugin-link-load/s4u-plugin-link-load.cpp
1164
1165 =======================
1166 Model-Checking Examples
1167 =======================
1168
1169 The model-checker can be used to exhaustively search for issues in the tested application. It must be activated at compile-time, but this
1170 mode is rather experimental in SimGrid (as of v3.25). We are working on it :)
1171
1172 Failing assert
1173 ^^^^^^^^^^^^^^
1174
1175 In this example, two actors send some data to a central server, which asserts that the messages are always received in the same order.
1176 This is wrong, and the model-checker correctly finds a counter-example to that assertion.
1177
1178 .. tabs::
1179
1180    .. example-tab:: examples/cpp/mc-failing-assert/s4u-mc-failing-assert.cpp
1181
1182 .. |br| raw:: html
1183
1184    <br />