.. documentation, but it should remain readable directly.
-------------
S4U Examples
-------------
+************
SimGrid comes with an extensive set of examples, documented on this
page. Most of them only demonstrate one single feature, with some
larger examplars listed below.
-Each of these examples can be found in a subdirectory under
-examples/s4u in the archive. It contains the source code (also listed
+The C++ examples can be found under examples/s4u while python examples
+are in examples/python. Each such directory contains the source code (also listed
from this page), and the so-called tesh file containing how to call
the binary obtained by compiling this example and also the expected
output. Tesh files are used to turn each of our examples into an
of the provided examples to constitute the skeleton of what you plan
to simulate.
-...........................
+===========================
Actors: the Active Entities
-...........................
+===========================
Starting and Stoping Actors
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+---------------------------
- **Creating actors:**
Most actors are started from the deployment XML file, but there is other methods.
This example show them all.
- |br| `examples/s4u/actor-create/s4u-actor-create.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-create/s4u-actor-create.cpp>`_
+ `examples/python/actor-create/actor-create_d.xml <https://framagit.org/simgrid/simgrid/tree/master/examples/python/actor-create/actor-create_d.xml>`_
+ - |cpp| `examples/s4u/actor-create/s4u-actor-create.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-create/s4u-actor-create.cpp>`_
+ - |py| `examples/python/actor-create/actor-create.py <https://framagit.org/simgrid/simgrid/tree/master/examples/python/actor-create/actor-create.py>`_
+
+ - **React to the end of actors:**
+ You can attach a callback to the end of actors. There is two ways
+ of doing so, depending of whether you want your callback to be
+ executed when a specific actor ends (with ```this_actor::on_exit()```)
+ or whether it should be executed when any actor ends (with
+ ```Actor::on_destruction()```)
+
+ - |cpp| `examples/s4u/actor-exiting/s4u-actor-exiting.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-exiting/s4u-actor-exiting.cpp>`_
+
- **Kill actors:**
- Actors can forcefully stop other actors with the
- :cpp:func:`void simgrid::s4u::Actor::kill(void)` or the
- :cpp:func:`void simgrid::s4u::Actor::kill(aid_t)` methods.
- |br| `examples/s4u/actor-kill/s4u-actor-kill.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-kill/s4u-actor-kill.cpp>`_
+ Actors can forcefully stop other actors.
+
+ - |cpp| `examples/s4u/actor-kill/s4u-actor-kill.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-kill/s4u-actor-kill.cpp>`_
+ :cpp:func:`void simgrid::s4u::Actor::kill(void)`,
+ :cpp:func:`void simgrid::s4u::Actor::kill_all()`,
+ :cpp:func:`simgrid::s4u::this_actor::exit`.
+ - |py| `examples/python/actor-kill/actor-kill.py <https://framagit.org/simgrid/simgrid/tree/master/examples/python/actor-kill/actor-kill.py>`_
+ :py:func:`simgrid.Actor.kill`,
+ :py:func:`simgrid.Actor.kill_all`,
+ :py:func:`simgrid.this_actor.exit`.
- **Controling the actor life cycle from the XML:**
You can specify a start time and a kill time in the deployment
- **Daemonize actors:**
Some actors may be intended to simulate daemons that run in background. This example show how to transform a regular
actor into a daemon that will be automatically killed once the simulation is over.
- |br| `examples/s4u/actor-daemon/s4u-actor-daemon.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-daemon/s4u-actor-daemon.cpp>`_
+
+ - |cpp| `examples/s4u/actor-daemon/s4u-actor-daemon.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-daemon/s4u-actor-daemon.cpp>`_
+ - |py| `examples/python/actor-daemon/actor-daemon.py <https://framagit.org/simgrid/simgrid/tree/master/examples/python/actor-daemon/actor-daemon.py>`_
Inter-Actors Interactions
-^^^^^^^^^^^^^^^^^^^^^^^^^
+-------------------------
- **Suspend and Resume actors:**
- Actors can be suspended and resumed during their executions thanks
- to :cpp:func:`simgrid::s4u::Actor::suspend()` and
- :cpp:func:`simgrid::s4u::Actor::resume()`.
- |br| `examples/s4u/actor-suspend/s4u-actor-suspend.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-suspend/s4u-actor-suspend.cpp>`_
+ Actors can be suspended and resumed during their executions.
+
+ - |cpp| `examples/s4u/actor-suspend/s4u-actor-suspend.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-suspend/s4u-actor-suspend.cpp>`_
+ :cpp:func:`simgrid::s4u::this_actor::suspend()`,
+ :cpp:func:`simgrid::s4u::Actor::suspend()`, :cpp:func:`simgrid::s4u::Actor::resume()`, :cpp:func:`simgrid::s4u::Actor::is_suspended()`.
+ - |py| `examples/python/actor-suspend/actor-suspend.py <https://framagit.org/simgrid/simgrid/tree/master/examples/python/actor-suspend/actor-suspend.py>`_
+ :py:func:`simgrid.this_actor.suspend()`,
+ :py:func:`simgrid.Actor.suspend()`, :py:func:`simgrid.Actor.resume()`, :py:func:`simgrid.Actor.is_suspended()`.
- **Migrating Actors:**
- Actors can move or be moved from a host to another with
- :cpp:func:`simgrid::s4u::this_actor::migrate()`.
- |br| `examples/s4u/actor-migration/s4u-actor-migration.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-migration/s4u-actor-migration.cpp>`_
+ Actors can move or be moved from a host to another very easily.
+
+ - |cpp| `examples/s4u/actor-migrate/s4u-actor-migrate.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-migrate/s4u-actor-migrate.cpp>`_
+ :cpp:func:`simgrid::s4u::this_actor::migrate()`
+ - |py| `examples/python/actor-migrate/actor-migrate.py <https://framagit.org/simgrid/simgrid/tree/master/examples/python/actor-migrate/actor-migrate.py>`_
+ :py:func:`simgrid.this_actor.migrate()`
- **Waiting for the termination of an actor:** (joining on it)
- :cpp:func:`simgrid::s4u::Actor::join()` allows to block the current
- actor until the end of the receiving actor.
- |br| `examples/s4u/actor-join/s4u-actor-join.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-join/s4u-actor-join.cpp>`_
-
- - **Yielding to other actor**.
- The :cpp:func:`simgrid::s4u::this_actor::yield()` function interrupts the
- execution of the current actor, leaving a chance to the other actors
- that are ready to run at this timestamp.
- |br| `examples/s4u/actor-yield/s4u-actor-yield.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-yield/s4u-actor-yield.cpp>`_
+ You can block the current actor until the end of another actor.
+
+ - |cpp| `examples/s4u/actor-join/s4u-actor-join.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-join/s4u-actor-join.cpp>`_
+ :cpp:func:`simgrid::s4u::Actor::join()`
+ - |py| `examples/python/actor-join/actor-join.py <https://framagit.org/simgrid/simgrid/tree/master/examples/python/actor-join/actor-join.py>`_
+ :py:func:`simgrid.Actor.join()`
+
+ - **Yielding to other actors**.
+ The ```yield()``` function interrupts the execution of the current
+ actor, leaving a chance to the other actors that are ready to run
+ at this timestamp.
+
+ - |cpp| `examples/s4u/actor-yield/s4u-actor-yield.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/actor-yield/s4u-actor-yield.cpp>`_
+ :cpp:func:`simgrid::s4u::this_actor::yield()`
+ - |py| `examples/python/actor-yield/actor-yield.py <https://framagit.org/simgrid/simgrid/tree/master/examples/python/actor-yield/actor-yield.py>`_
+ :py:func:`simgrid.this_actor.yield_()`
Traces Replay as a Workload
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+---------------------------
This section details how to run trace-driven simulations. It is very
handy when you want to test an algorithm or protocol that only react
primitives (open, read, close).
|br| `examples/s4u/replay-storage/s4u-replay-storage.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/replay-storage/s4u-replay-storage.cpp>`_
-..........................
+==========================
Activities: what Actors do
-..........................
+==========================
Communications on the Network
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+-----------------------------
- **Basic asynchronous communications:**
Illustrates how to have non-blocking communications, that are
.. todo:: add the `ready` example here
+.. _s4u_ex_execution:
+
Executions on the CPU
-^^^^^^^^^^^^^^^^^^^^^
+---------------------
- **Basic execution:**
The computations done in your program are not reported to the
the actor until a given amount of flops gets computed on its simulated
host. Some executions can be given an higher priority so that they
get more resources.
- |br| `examples/s4u/exec-basic/s4u-exec-basic.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/exec-basic/s4u-exec-basic.cpp>`_
+
+ - |cpp| `examples/s4u/exec-basic/s4u-exec-basic.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/exec-basic/s4u-exec-basic.cpp>`_
+ - |py| `examples/python/exec-basic/exec-basic.py <https://framagit.org/simgrid/simgrid/tree/master/examples/python/exec-basic/exec-basic.py>`_
- **Asynchronous execution:**
You can start asynchronous executions, just like you would fire
|br| `examples/s4u/exec-dvfs/s4u-exec-dvfs.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/exec-dvfs/s4u-exec-dvfs.cpp>`_
|br| `examples/platforms/energy_platform.xml <https://framagit.org/simgrid/simgrid/tree/master/examples/platforms/energy_platform.xml>`_
- - **Parallel tasks:**
+ - **Parallel executions:**
These objects are convenient abstractions of parallel
- computational kernels that span over several machines.
+ computational kernels that span over several machines, such as a
+ PDGEM and the other ScaLAPACK routines.
|br| `examples/s4u/exec-ptask/s4u-exec-ptask.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/exec-ptask/s4u-exec-ptask.cpp>`_
I/O on Disks and Files
-^^^^^^^^^^^^^^^^^^^^^^
+----------------------
SimGrid provides two levels of abstraction to interact with the
simulated storages. At the simplest level, you simply create read and
|br| `examples/s4u/io-file-remote/s4u-io-file-remote.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/io-file-remote/s4u-io-file-remote.cpp>`_
Classical synchronization objects
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+---------------------------------
- **Mutex:**
Shows how to use simgrid::s4u::Mutex synchronization objects.
- |br| `examples/s4u/mutex/s4u-mutex.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/mutex/s4u-mutex.cpp>`_
+ |br| `examples/s4u/synchro-mutex/s4u-synchro-mutex.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/synchro-mutex/s4u-synchro-mutex.cpp>`_
-.............................
-Interacting with the platform
-.............................
+ - **Barrier:**
+ Shows how to use simgrid::s4u::Barrier synchronization objects.
+ |br| `examples/s4u/synchro-barrier/s4u-synchro-barrier.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/synchro-barrier/s4u-synchro-barrier.cpp>`_
+
+ - **Semaphore:**
+ Shows how to use simgrid::s4u::Semaphore synchronization objects.
+ |br| `examples/s4u/synchro-semaphore/s4u-synchro-semaphore.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/synchro-semaphore/s4u-synchro-semaphore.cpp>`_
+
+=============================
+Interacting with the Platform
+=============================
- **Retrieving the list of hosts matching a given criteria:**
Shows how to filter the actors that match a given criteria.
|br| `examples/s4u/platform-properties/s4u-platform-properties_d.xml <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/platform-properties/s4u-platform-properties_d.xml>`_
|br| `examples/platforms/prop.xml <https://framagit.org/simgrid/simgrid/tree/master/examples/platforms/prop.xml>`_
-.................
+=================
Energy Simulation
-.................
+=================
- **Describing the energy profiles in the platform:**
This platform file contains the energy profile of each links and
|br| `examples/s4u/energy-boot/platform_boot.xml <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/energy-boot/platform_boot.xml>`_
|br| `examples/s4u/energy-boot/s4u-energy-boot.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/energy-boot/s4u-energy-boot.cpp>`_
-.......................
+=======================
Tracing and Visualizing
-.......................
+=======================
Tracing can be activated by various configuration options which
are illustrated in these example. See also the
``--cfg=tracing:yes --cfg=tracing/categorized:yes``
|br| `examples/s4u/trace-platform/s4u-trace-platform.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/trace-platform/s4u-trace-platform.cpp>`_
-........................
+========================
Larger SimGrid Examplars
-........................
+========================
This section contains application examples that are somewhat larger
than the previous examples.
|br| `examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp>`_
Data diffusion
-^^^^^^^^^^^^^^
+--------------
- **Bit Torrent:**
Classical protocol for Peer-to-Peer data diffusion.
|br| `examples/s4u/app-chainsend/s4u-app-chainsend.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/s4u/app-chainsend/s4u-app-chainsend.cpp>`_
Distributed Hash Tables (DHT)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+-----------------------------
- **Chord Protocol**
One of the most famous DHT protocol.
.. |br| raw:: html
<br />
+
+.. |cpp| image:: /img/lang_cpp.png
+ :align: middle
+ :width: 12
+
+.. |py| image:: /img/lang_python.png
+ :align: middle
+ :width: 12