Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
a couple more C examples
[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
7 Examples
8 ********
9
10 SimGrid comes with an extensive set of examples, documented on this
11 page. Most of them only demonstrate one single feature, with some
12 larger examplars listed below. 
13
14 The C++ examples can be found under examples/s4u while python examples
15 are in examples/python. Each such directory contains the source code (also listed
16 from this page), and the so-called tesh file containing how to call
17 the binary obtained by compiling this example and also the expected
18 output. Tesh files are used to turn each of our examples into an
19 integration test. Some examples also contain other files, on need.
20
21 A good way to bootstrap your own project is to copy and combine some
22 of the provided examples to constitute the skeleton of what you plan
23 to simulate.
24
25 .. _s4u_ex_actors:
26
27 ===========================
28 Actors: the Active Entities
29 ===========================
30
31 Starting and Stoping Actors
32 ---------------------------
33
34   - **Creating actors:**
35     Most actors are started from the deployment XML file, because this
36     is a :ref:`better scientific habbit <howto_science>`, but you can
37     also create them directly from your code.
38
39     .. tabs::
40     
41        .. example-tab:: examples/s4u/actor-create/s4u-actor-create.cpp
42        
43           You create actors either:
44              
45           - Directly with :cpp:func:`simgrid::s4u::Actor::create`
46           - From XML with :cpp:func:`simgrid::s4u::Engine::register_actor` (if your actor is a class)
47             or :cpp:func:`simgrid::s4u::Engine::register_function` (if your actor is a function)
48             and then :cpp:func:`simgrid::s4u::Engine::load_deployment`
49              
50        .. example-tab:: examples/python/actor-create/actor-create.py
51        
52           You create actors either:
53             
54           - Directly with :py:func:`simgrid.Actor.create()`
55           - From XML with :py:func:`simgrid.Engine.register_actor()` and then :py:func:`simgrid.Engine.load_deployment()`
56              
57        .. example-tab:: examples/c/actor-create/actor-create.c
58        
59           You create actors either:
60             
61           - Directly with :cpp:func:`sg_actor_create()` followed by :cpp:func:`sg_actor_start`.
62           - From XML with :cpp:func:`simgrid_register_function` and then :cpp:func:`simgrid_load_deployment`.
63              
64        .. example-tab:: examples/python/actor-create/actor-create_d.xml
65        
66           The following file is used in both C++ and Python.
67
68   - **React to the end of actors:** You can attach callbacks to the end of
69     actors. There is several ways of doing so, depending on whether you want to
70     attach your callback to a given actor and on how you define the end of a
71     given actor. User code probably want to react to the termination of an actor
72     while some plugins want to react to the destruction (memory collection) of
73     actors.
74
75     .. tabs::
76     
77        .. example-tab:: examples/s4u/actor-exiting/s4u-actor-exiting.cpp
78
79           This example shows how to attach a callback to:
80
81           - the end of a specific actor: :cpp:func:`simgrid::s4u::this_actor::on_exit()`
82           - the end of any actor: :cpp:member:`simgrid::s4u::Actor::on_termination()`
83           - the destruction of any actor: :cpp:member:`simgrid::s4u::Actor::on_destruction()`
84
85        .. example-tab:: examples/c/actor-exiting/actor-exiting.c
86
87           This example shows how to attach a callback to the end of a specific actor with 
88           :cpp:func:`sg_actor_on_exit()`.
89
90   - **Kill actors:**
91     Actors can forcefully stop other actors.
92
93     .. tabs::
94
95        .. example-tab:: examples/s4u/actor-kill/s4u-actor-kill.cpp
96
97           See also :cpp:func:`void simgrid::s4u::Actor::kill(void)`, :cpp:func:`void simgrid::s4u::Actor::kill_all()`,
98           :cpp:func:`simgrid::s4u::this_actor::exit`, :cpp:func:`simgrid::s4u::this_actor::on_exit`.
99
100        .. example-tab:: examples/python/actor-kill/actor-kill.py
101
102           See also :py:func:`simgrid.Actor.kill`, :py:func:`simgrid.Actor.kill_all`, :py:func:`simgrid.this_actor.exit`,
103           :py:func:`simgrid.this_actor.on_exit`.
104
105        .. example-tab:: examples/c/actor-kill/actor-kill.c
106
107           See also :cpp:func:`sg_actor_kill`, :cpp:func:`sg_actor_kill_all`, :cpp:func:`sg_actor_exit`, :cpp:func:`sg_actor_on_exit`.
108
109   - **Controling the actor life cycle from the XML:**
110     You can specify a start time and a kill time in the deployment file.
111
112     .. tabs::
113
114        .. example-tab:: examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp
115
116           This file is not really interesting: the important matter is in the XML file.
117
118        .. example-tab:: examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml
119
120           This demonstrates the ``start_time`` and ``kill_time`` attribute of the :ref:`pf_tag_actor` tag.
121
122   - **Daemonize actors:**
123     Some actors may be intended to simulate daemons that run in background. This example show how to transform a regular
124     actor into a daemon that will be automatically killed once the simulation is over.
125     
126     .. tabs::
127
128        .. example-tab:: examples/s4u/actor-daemon/s4u-actor-daemon.cpp
129
130           See also :cpp:func:`simgrid::s4u::Actor::daemonize()` and :cpp:func:`simgrid::s4u::Actor::is_daemon()`.
131
132        .. example-tab:: examples/python/actor-daemon/actor-daemon.py
133
134           See also :py:func:`simgrid.Actor.daemonize()` and :py:func:`simgrid.Actor.is_daemon()`.
135
136        .. example-tab:: examples/c/actor-daemon/actor-daemon.c
137
138           See also :cpp:func:`sg_actor_daemonize` and :cpp:func:`sg_actor_is_daemon`.
139
140 Inter-Actors Interactions
141 -------------------------
142
143 See also the examples on :ref:`inter-actors communications
144 <s4u_ex_communication>` and the ones on :ref:`classical
145 synchronization objects <s4u_ex_IPC>`.
146
147   - **Suspend and Resume actors:**    
148     Actors can be suspended and resumed during their executions.
149
150     .. tabs::
151
152        .. example-tab:: examples/s4u/actor-suspend/s4u-actor-suspend.cpp
153
154           See also :cpp:func:`simgrid::s4u::this_actor::suspend()`,
155           :cpp:func:`simgrid::s4u::Actor::suspend()`, :cpp:func:`simgrid::s4u::Actor::resume()`, and
156           :cpp:func:`simgrid::s4u::Actor::is_suspended()`.
157
158        .. example-tab:: examples/python/actor-suspend/actor-suspend.py
159
160           See also :py:func:`simgrid.this_actor.suspend()`,
161           :py:func:`simgrid.Actor.suspend()`, :py:func:`simgrid.Actor.resume()`, and
162           :py:func:`simgrid.Actor.is_suspended()`.
163
164        .. example-tab:: examples/c/actor-suspend/actor-suspend.c
165
166           See also :cpp:func:`sg_actor_suspend()`, :cpp:func:`sg_actor_resume()`, and 
167           :cpp:func:`sg_actor_is_suspended()`.
168
169   - **Migrating Actors:**
170     Actors can move or be moved from a host to another very easily. It amount to setting them on a new host.
171
172     .. tabs::
173
174        .. example-tab:: examples/s4u/actor-migrate/s4u-actor-migrate.cpp
175
176           See also :cpp:func:`simgrid::s4u::this_actor::set_host()` and :cpp:func:`simgrid::s4u::Actor::set_host()`.
177
178        .. example-tab:: examples/python/actor-migrate/actor-migrate.py
179
180           See also :py:func:`simgrid.this_actor.set_host()` and :py:func:`simgrid.Actor.set_host()`.
181
182        .. example-tab:: examples/c/actor-migrate/actor-migrate.c
183
184           See also :cpp:func:`sg_actor_set_host()`.
185
186   - **Waiting for the termination of an actor:** (joining on it)
187     You can block the current actor until the end of another actor.
188
189     .. tabs::
190
191        .. example-tab:: examples/s4u/actor-join/s4u-actor-join.cpp
192
193           See also :cpp:func:`simgrid::s4u::Actor::join()`.
194
195        .. example-tab:: examples/python/actor-join/actor-join.py
196
197           See also :py:func:`simgrid.Actor.join()`.
198
199        .. example-tab:: examples/c/actor-join/actor-join.c
200
201           See also :cpp:func:`sg_actor_join`.
202
203   - **Yielding to other actors**.
204     The ```yield()``` function interrupts the execution of the current
205     actor, leaving a chance to the other actors that are ready to run
206     at this timestamp.
207
208     .. tabs::
209
210        .. example-tab:: examples/s4u/actor-yield/s4u-actor-yield.cpp
211
212           See also :cpp:func:`simgrid::s4u::this_actor::yield()`.
213
214        .. example-tab:: examples/python/actor-yield/actor-yield.py
215
216           See also :py:func:`simgrid.this_actor.yield_()`.
217
218        .. example-tab:: examples/c/actor-yield/actor-yield.c
219
220           See also :cpp:func:`sg_actor_yield()`.
221
222 Traces Replay as a Workload
223 ---------------------------
224
225 This section details how to run trace-driven simulations. It is very
226 handy when you want to test an algorithm or protocol that only react
227 to external events. For example, many P2P protocols react to user
228 requests, but do nothing if there is no such event.
229
230 In such situations, you should write your protocol in C++, and separate
231 the workload that you want to play onto your protocol in a separate
232 text file. Declare a function handling each type of the events in your
233 trace, register them using :cpp:func:`xbt_replay_action_register()` in
234 your main, and then run the simulation.
235
236 Then, you can either have one trace file containing all your events,
237 or a file per simulated process: the former may be easier to work
238 with, but the second is more efficient on very large traces. Check
239 also the tesh files in the example directories for details.
240
241   - **Communication replay:**
242     Presents a set of event handlers reproducing classical communication
243     primitives (asynchronous send/receive at the moment).
244
245     .. tabs::
246
247        .. example-tab:: examples/s4u/replay-comm/s4u-replay-comm.cpp
248
249   - **I/O replay:**
250     Presents a set of event handlers reproducing classical I/O
251     primitives (open, read, close).
252
253     .. tabs::
254
255        .. example-tab:: examples/s4u/replay-io/s4u-replay-io.cpp
256
257 ==========================
258 Activities: what Actors do
259 ==========================
260
261 .. _s4u_ex_communication:
262
263 Communications on the Network
264 -----------------------------
265
266  - **Basic asynchronous communications:**
267    Illustrates how to have non-blocking communications, that are
268    communications running in the background leaving the process free
269    to do something else during their completion. 
270
271    .. tabs::
272
273       .. example-tab:: examples/s4u/async-wait/s4u-async-wait.cpp
274
275          See also :cpp:func:`simgrid::s4u::Mailbox::put_async()` and :cpp:func:`simgrid::s4u::Comm::wait()`.
276
277       .. example-tab:: examples/python/async-wait/async-wait.py
278
279          See also :py:func:`simgrid.Mailbox.put_async()` and :py:func:`simgrid.Comm.wait()`.
280
281  - **Waiting for all communications in a set:**
282    The ``wait_all()`` function is useful when you want to block until
283    all activities in a given set have completed. 
284    
285    .. tabs::
286
287       .. example-tab:: examples/s4u/async-waitall/s4u-async-waitall.cpp
288
289          See also :cpp:func:`simgrid::s4u::Comm::wait_all()`.
290
291       .. example-tab:: examples/python/async-waitall/async-waitall.py
292
293          See also :py:func:`simgrid.Comm.wait_all()`.
294
295  - **Waiting for the first completed communication in a set:**
296    The ``wait_any()`` function is useful
297    when you want to block until one activity of the set completes, no
298    matter which terminates first.
299    
300    .. tabs::
301
302       .. example-tab:: examples/s4u/async-waitany/s4u-async-waitany.cpp
303
304          See also :cpp:func:`simgrid::s4u::Comm::wait_any()`.
305
306       .. example-tab:: examples/python/async-waitany/async-waitany.py
307
308          See also :py:func:`simgrid.Comm.wait_any()`.
309          
310       .. example-tab:: examples/c/async-waitany/async-waitany.c
311
312          See also :cpp:func:`sg_comm_wait_any`.
313      
314 .. _s4u_ex_execution:
315
316 Executions on the CPU
317 ---------------------
318
319   - **Basic execution:**
320     The computations done in your program are not reported to the
321     simulated world, unless you explicitly request the simulator to pause
322     the actor until a given amount of flops gets computed on its simulated
323     host. Some executions can be given an higher priority so that they
324     get more resources.
325
326     .. tabs::
327
328        .. example-tab:: examples/s4u/exec-basic/s4u-exec-basic.cpp
329
330           See also :cpp:func:`void simgrid::s4u::this_actor::execute(double)`
331           and :cpp:func:`void simgrid::s4u::this_actor::execute(double, double)`.
332
333        .. example-tab:: examples/python/exec-basic/exec-basic.py
334
335           See also :py:func:`simgrid.this_actor.execute()`.
336
337   - **Asynchronous execution:**
338     You can start asynchronous executions, just like you would fire
339     background threads.
340
341     .. tabs::
342
343        .. example-tab:: examples/s4u/exec-async/s4u-exec-async.cpp
344
345           See also :cpp:func:`simgrid::s4u::this_actor::exec_init()`,
346           :cpp:func:`simgrid::s4u::Activity::start()`,
347           :cpp:func:`simgrid::s4u::Activity::wait()`,
348           :cpp:func:`simgrid::s4u::Activity::get_remaining()`,
349           :cpp:func:`simgrid::s4u::Exec::get_remaining_ratio()`,
350           :cpp:func:`simgrid::s4u::this_actor::exec_async()` and
351           :cpp:func:`simgrid::s4u::Activity::cancel()`.
352
353        .. example-tab:: examples/python/exec-async/exec-async.py
354     
355           See also :py:func:`simgrid.this_actor::exec_init()`,
356           :py:func:`simgrid.Activity::start()`,
357           :py:func:`simgrid.Activity.wait()`,
358           :py:func:`simgrid.Activity.get_remaining()`,
359           :py:func:`simgrid.Exec.get_remaining_ratio()`,
360           :py:func:`simgrid.this_actor.exec_async()` and
361           :py:func:`simgrid.Activity.cancel()`.
362
363   - **Remote execution:**
364     You can start executions on remote hosts, or even change the host
365     on which they occur during their execution.
366
367     .. tabs::
368
369        .. example-tab:: examples/s4u/exec-remote/s4u-exec-remote.cpp
370
371           See also :cpp:func:`simgrid::s4u::Exec::set_host()`.
372
373        .. example-tab:: examples/python/exec-remote/exec-remote.py
374
375           See also :py:func:`simgrid.Exec.set_host()`.
376
377   - **Parallel executions:**
378     These objects are convenient abstractions of parallel
379     computational kernels that span over several machines, such as a
380     PDGEM and the other ScaLAPACK routines. Note that this only works
381     with the "ptask_L07" host model (``--cfg=host/model:ptask_L07``).
382
383     .. tabs::
384
385        .. example-tab:: examples/s4u/exec-ptask/s4u-exec-ptask.cpp
386     
387           See also :cpp:func:`simgrid::s4u::this_actor::parallel_execute()`.
388
389   - **Using Pstates on a host:**
390     This example shows how define a set of pstates in the XML. The current pstate
391     of an host can then be accessed and changed from the program.
392
393     .. tabs::
394
395        .. example-tab:: examples/s4u/exec-dvfs/s4u-exec-dvfs.cpp
396
397           See also :cpp:func:`simgrid::s4u::Host::get_pstate_speed` and :cpp:func:`simgrid::s4u::Host::set_pstate`.
398
399        .. example-tab:: examples/python/exec-dvfs/exec-dvfs.py
400
401           See also :py:func:`Host.get_pstate_speed` and :py:func:`Host.set_pstate`.
402
403        .. example-tab:: examples/platforms/energy_platform.xml
404
405 .. _s4u_ex_disk_io:
406
407 I/O on Disks and Files
408 ----------------------
409
410 SimGrid provides two levels of abstraction to interact with the
411 simulated disks. At the simplest level, you simply create read and
412 write actions on the disk resources.
413
414   - **Access to raw disk devices:**
415     This example illustrates how to simply read and write data on a
416     simulated disk resource.
417
418     .. tabs::
419
420        .. example-tab:: examples/s4u/io-disk-raw/s4u-io-disk-raw.cpp
421
422        .. example-tab:: examples/c/io-disk-raw/io-disk-raw.c
423
424        .. example-tab:: examples/platforms/hosts_with_disks.xml
425
426           This shows how to declare disks in XML.
427
428 The FileSystem plugin provides a more detailed view, with the
429 classical operations over files: open, move, unlink, and of course
430 read and write. The file and disk sizes are also dealt with and can
431 result in short reads and short write, as in reality.
432
433   - **File Management:**
434     This example illustrates the use of operations on files
435     (read, write, seek, tell, unlink, etc).
436
437     .. tabs::
438
439        .. example-tab:: examples/s4u/io-file-system/s4u-io-file-system.cpp
440
441   - **Remote I/O:**
442     I/O operations on files can also be done in a remote fashion, 
443     i.e. when the accessed disk is not mounted on the caller's host.
444
445     .. tabs::
446
447        .. example-tab:: examples/s4u/io-file-remote/s4u-io-file-remote.cpp
448
449 .. _s4u_ex_IPC:
450
451 Classical synchronization objects
452 ---------------------------------
453
454  - **Barrier:**
455    Shows how to use :cpp:type:`simgrid::s4u::Barrier` synchronization objects.
456
457    .. tabs::
458
459       .. example-tab:: examples/s4u/synchro-barrier/s4u-synchro-barrier.cpp
460
461  - **Condition variable:**
462    Shows how to use :cpp:type:`simgrid::s4u::ConditionVariable` synchronization objects.
463
464    .. tabs::
465
466       .. example-tab:: examples/s4u/synchro-condition-variable/s4u-synchro-condition-variable.cpp
467
468  - **Mutex:**
469    Shows how to use :cpp:type:`simgrid::s4u::Mutex` synchronization objects.
470
471    .. tabs::
472
473       .. example-tab:: examples/s4u/synchro-mutex/s4u-synchro-mutex.cpp
474
475  - **Semaphore:**
476    Shows how to use :cpp:type:`simgrid::s4u::Semaphore` synchronization objects.
477
478    .. tabs::
479
480       .. example-tab:: examples/s4u/synchro-semaphore/s4u-synchro-semaphore.cpp
481
482 =============================
483 Interacting with the Platform
484 =============================
485
486  - **User-defined properties:**
487    You can attach arbitrary information to most platform elements from
488    the XML file, and then interact with these values from your
489    program. Note that the changes are not written permanently on disk,
490    in the XML file nor anywhere else. They only last until the end of
491    your simulation.
492
493    .. tabs::
494
495       .. example-tab:: examples/s4u/platform-properties/s4u-platform-properties.cpp
496
497          - :cpp:func:`simgrid::s4u::Actor::get_property()` and :cpp:func:`simgrid::s4u::Actor::set_property()`
498          - :cpp:func:`simgrid::s4u::Host::get_property()` and :cpp:func:`simgrid::s4u::Host::set_property()`
499          - :cpp:func:`simgrid::s4u::Link::get_property()` and :cpp:func:`simgrid::s4u::Link::set_property()`
500          - :cpp:func:`simgrid::s4u::NetZone::get_property()` and :cpp:func:`simgrid::s4u::NetZone::set_property()`
501
502       .. group-tab:: XML
503
504          **Deployment file:**
505
506          .. showfile:: examples/s4u/platform-properties/s4u-platform-properties_d.xml
507             :language: xml
508
509          |br|
510          **Platform file:**
511
512          .. showfile:: examples/platforms/prop.xml
513             :language: xml
514
515  - **Retrieving the netzones matching a given criteria:**
516    Shows how to filter the cluster netzones.
517
518    .. tabs::
519
520       .. example-tab:: examples/s4u/routing-get-clusters/s4u-routing-get-clusters.cpp
521
522  - **Retrieving the list of hosts matching a given criteria:**
523    Shows how to filter the actors that match a given criteria.
524
525    .. tabs::
526
527       .. example-tab:: examples/s4u/engine-filtering/s4u-engine-filtering.cpp
528
529  - **Specifying state profiles:** shows how to specify when the
530    resources must be turned off and on again, and how to react to such
531    failures in your code. See also :ref:`howto_churn`.
532
533    .. tabs::
534
535       .. example-tab:: examples/s4u/platform-failures/s4u-platform-failures.cpp
536
537       .. group-tab:: XML
538
539          .. showfile:: examples/platforms/small_platform_failures.xml
540             :language: xml
541
542          .. showfile:: examples/platforms/profiles/jupiter_state.profile
543
544          .. showfile:: examples/platforms/profiles/bourassa_state.profile
545
546          .. showfile:: examples/platforms/profiles/fafard_state.profile
547
548  - **Specifying speed profiles:** shows how to specify an external
549    load to resources, variating their peak speed over time.
550
551    .. tabs::
552
553       .. example-tab:: examples/s4u/platform-profile/s4u-platform-profile.cpp
554
555       .. group-tab:: XML  
556
557          .. showfile:: examples/platforms/small_platform_profile.xml
558             :language: xml
559
560          .. showfile:: examples/platforms/profiles/jupiter_speed.profile
561
562          .. showfile:: examples/platforms/profiles/link1_bandwidth.profile
563
564          .. showfile:: examples/platforms/profiles/link1_latency.profile
565
566 =================
567 Energy Simulation
568 =================
569
570   - **Describing the energy profiles in the platform:**
571     This platform file contains the energy profile of each links and
572     hosts, which is necessary to get energy consumption predictions.
573     As usual, you should not trust our example, and you should strive
574     to double-check that your instantiation matches your target platform.
575
576     .. tabs::
577
578        .. example-tab:: examples/platforms/energy_platform.xml
579
580   - **Consumption due to the CPU:** 
581     This example shows how to retrieve the amount of energy consumed
582     by the CPU during computations, and the impact of the pstate.
583
584     .. tabs::
585
586        .. example-tab:: examples/s4u/energy-exec/s4u-energy-exec.cpp
587
588        .. example-tab:: examples/c/energy-exec/energy-exec.c
589
590   - **Consumption due to the network:**
591     This example shows how to retrieve and display the energy consumed
592     by the network during communications.
593
594     .. tabs::
595
596        .. example-tab:: examples/s4u/energy-link/s4u-energy-link.cpp
597
598   - **Modeling the shutdown and boot of hosts:**
599     Simple example of model of model for the energy consumption during
600     the host boot and shutdown periods.
601
602     .. tabs::
603
604        .. example-tab:: examples/s4u/energy-boot/platform_boot.xml
605
606        .. example-tab:: examples/s4u/energy-boot/s4u-energy-boot.cpp
607
608 =======================
609 Tracing and Visualizing
610 =======================
611
612 Tracing can be activated by various configuration options which
613 are illustrated in these example. See also the 
614 :ref:`full list of options related to tracing <tracing_tracing_options>`.
615
616 It is interesting to run the process-create example with the following
617 options to see the task executions:
618
619   - **Platform Tracing:**
620     This program is a toy example just loading the platform, so that
621     you can play with the platform visualization. Recommanded options:
622     ``--cfg=tracing:yes --cfg=tracing/categorized:yes``
623
624     .. tabs::
625
626        .. example-tab:: examples/s4u/trace-platform/s4u-trace-platform.cpp
627
628 ========================
629 Larger SimGrid Examplars
630 ========================
631
632 This section contains application examples that are somewhat larger
633 than the previous examples.
634
635   - **Ping Pong:**
636     This simple example just sends one message back and forth.
637     The tesh file laying in the directory show how to start the simulator binary, highlighting how to pass options to 
638     the simulators (as detailed in Section :ref:`options`).
639
640     .. tabs::
641
642        .. example-tab:: examples/s4u/app-pingpong/s4u-app-pingpong.cpp
643
644        .. example-tab:: examples/c/app-pingpong/app-pingpong.c
645
646   - **Token ring:**
647     Shows how to implement a classical communication pattern, where a
648     token is exchanged along a ring to reach every participant.
649
650     .. tabs::
651
652        .. example-tab:: examples/s4u/app-token-ring/s4u-app-token-ring.cpp
653
654        .. example-tab:: examples/c/app-token-ring/app-token-ring.c
655
656   - **Master Workers:**
657     Another good old example, where one Master process has a bunch of task to dispatch to a set of several Worker 
658     processes.
659
660     .. tabs::
661
662        .. group-tab:: C++
663
664           This example comes in two equivalent variants, one where the actors
665           are specified as simple functions (which is easier to understand for
666           newcomers) and one where the actors are specified as classes (which is
667           more powerful for the users wanting to build their own projects upon
668           the example).
669
670           .. showfile:: examples/s4u/app-masterworkers/s4u-app-masterworkers-class.cpp
671              :language: cpp
672
673           .. showfile:: examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
674              :language: cpp
675     
676 Data diffusion
677 --------------
678
679   - **Bit Torrent:** 
680     Classical protocol for Peer-to-Peer data diffusion.
681
682     .. tabs::
683
684        .. group-tab:: C++
685
686           .. showfile:: examples/s4u/app-bittorrent/s4u-bittorrent.cpp
687              :language: cpp
688
689           .. showfile:: examples/s4u/app-bittorrent/s4u-peer.cpp
690              :language: cpp
691
692           .. showfile:: examples/s4u/app-bittorrent/s4u-tracker.cpp
693              :language: cpp
694
695   - **Chained Send:** 
696     Data broadcast over a ring of processes.
697
698     .. tabs::
699
700        .. example-tab:: examples/s4u/app-chainsend/s4u-app-chainsend.cpp
701
702 Distributed Hash Tables (DHT)
703 -----------------------------
704
705   - **Chord Protocol** 
706     One of the most famous DHT protocol.
707
708     .. tabs::
709
710        .. group-tab:: C++
711
712           .. showfile:: examples/s4u/dht-chord/s4u-dht-chord.cpp
713              :language: cpp
714
715           .. showfile:: examples/s4u/dht-chord/s4u-dht-chord-node.cpp
716              :language: cpp
717
718   - **Kademlia**
719     Another well-known DHT protocol.
720
721     .. tabs::
722
723        .. group-tab:: C++
724
725           .. showfile:: examples/s4u/dht-kademlia/s4u-dht-kademlia.cpp
726              :language: cpp
727
728           .. showfile:: examples/s4u/dht-kademlia/routing_table.cpp
729              :language: cpp
730
731           .. showfile:: examples/s4u/dht-kademlia/answer.cpp
732              :language: cpp
733
734           .. showfile:: examples/s4u/dht-kademlia/node.cpp
735              :language: cpp
736
737 .. _s4u_ex_clouds:
738
739 Simulating Clouds
740 -----------------
741
742   - **Cloud basics**
743     This example starts some computations both on PMs and VMs, and
744     migrates some VMs around.
745
746     .. tabs::
747
748        .. example-tab:: examples/s4u/cloud-simple/s4u-cloud-simple.cpp
749
750   - **Migrating VMs**
751     This example shows how to migrate VMs between PMs.
752
753     .. tabs::
754
755        .. example-tab:: examples/s4u/cloud-migration/s4u-cloud-migration.cpp
756
757 =======================
758 Model-Checking Examples
759 =======================
760
761 The model-checker can be used to exhaustively search for issues in the
762 tested application. It must be activated at compile time, but this
763 mode is rather experimental in SimGrid (as of v3.22). You should not
764 enable it unless you really want to formally verify your applications:
765 SimGrid is slower and maybe less robust when MC is enabled.
766
767   - **Failing assert**
768     In this example, two actors send some data to a central server,
769     which asserts that the messages are always received in the same order.
770     This is obviously wrong, and the model-checker correctly finds a
771     counter-example to that assertion.
772
773     .. tabs::
774
775        .. example-tab:: examples/s4u/mc-failing-assert/s4u-mc-failing-assert.cpp
776
777 .. |br| raw:: html
778
779    <br />
780
781 .. |cpp| image:: /img/lang_cpp.png
782    :align: middle
783    :width: 12
784
785 .. |py| image:: /img/lang_python.png
786    :align: middle
787    :width: 12