Describing your Application
***************************
Every SimGrid simulation entails a distributed application, that
virtually executes on the simulated platform. This application can
be either an existing MPI program (if you use the SMPI interface), or
a program specifically written to execute within SimGrid, using one of
the dedicated APIs.
.. raw:: html
.. _S4U_doc:
The S4U Interface
=================
The S4U interface (SimGrid for you) mixes the full power of SimGrid
with the full power of C++. This is the prefered interface to describe
abstract algorithms in the domains of Cloud, P2P, HPC, IoT and similar
settings.
Main Concepts
-------------
A typical SimGrid simulation is composed of several |Actors|_, that
execute user-provided functions. The actors have to explicitly use the
S4U interface to express their
:ref:`computation `,
:ref:`communication `,
:ref:`disk usage `,
and other |Activities|_, so that they get reflected within the
simulator. These activities take place on resources such as |Hosts|_,
|Links|_ and |Storages|_. SimGrid predicts the time taken by each
activity and orchestrates accordingly the actors waiting for the
completion of these activities.
When **communicating**, data is not directly sent to other actors but
posted onto a |Mailbox|_ that serve as rendez-vous point between
communicating actors. This means that you don't need to know who you
are talking to, you just put your communication `Send` request in a
mailbox, and it will be matched with a complementary `Receive`
request. Alternatively, actors can interact through **classical
synchronization mechanisms** such as |Barrier|_, |Semaphore|_,
|Mutex|_ and |ConditionVariable|_.
Each actor is located on a simulated |Host|_. Each host is located
itself in a |NetZone|_, that knows the networking path between one
resource to another. Each NetZone is included in another one, forming
a tree of NetZones which root zone contains the whole platform.
The :ref:`simgrid::s4u::this_actor
` namespace provides many helper
functions to simplify the code of actors.
- **Global Classes**
- :ref:`class s4u::Actor `:
Active entities executing your application.
- :ref:`class s4u::Engine `
Simulation engine (singleton).
- :ref:`class s4u::Mailbox `
Communication rendez-vous.
- **Platform Elements**
- :ref:`class s4u::Host `:
Actor location, providing computational power.
- :ref:`class s4u::Link `
Interconnecting hosts.
- :ref:`class s4u::NetZone `:
Sub-region of the platform, containing resources (Hosts, Link, etc).
- :ref:`class s4u::Storage `
Resource on which actors can write and read data.
- :ref:`class s4u::VirtualMachine `:
Execution containers that can be moved between Hosts.
- **Activities** (:ref:`class s4u::Activity `):
The things that actors can do on resources
- :ref:`class s4u::Comm `
Communication activity, started on Mailboxes and consuming links.
- :ref:`class s4u::Exec `
Computation activity, started on Host and consuming CPU resources.
- :ref:`class s4u::Io `
I/O activity, started on and consumming Storages.
- **Synchronization Mechanisms**: Classical IPC that actors can use
- :ref:`class s4u::Barrier `
- :ref:`class s4u::ConditionVariable `
- :ref:`class s4u::Mutex `
- :ref:`class s4u::Semaphore `
.. |Actors| replace:: **Actors**
.. _Actors: api/classsimgrid_1_1s4u_1_1Actor.html
.. |Activities| replace:: **Activities**
.. _Activities: api/classsimgrid_1_1s4u_1_1Activity.html
.. |Hosts| replace:: **Hosts**
.. _Hosts: api/classsimgrid_1_1s4u_1_1Host.html
.. |Links| replace:: **Links**
.. _Links: api/classsimgrid_1_1s4u_1_1Link.html
.. |Storages| replace:: **Storages**
.. _Storages: api/classsimgrid_1_1s4u_1_1Storage.html
.. |VirtualMachines| replace:: **VirtualMachines**
.. _VirtualMachines: api/classsimgrid_1_1s4u_1_1VirtualMachine.html
.. |Host| replace:: **Host**
.. _Host: api/classsimgrid_1_1s4u_1_1Host.html
.. |Mailbox| replace:: **Mailbox**
.. _Mailbox: api/classsimgrid_1_1s4u_1_1Mailbox.html
.. |NetZone| replace:: **NetZone**
.. _NetZone: api/classsimgrid_1_1s4u_1_1NetZone.html
.. |Barrier| replace:: **Barrier**
.. _Barrier: api/classsimgrid_1_1s4u_1_1Barrier.html
.. |ConditionVariable| replace:: **ConditionVariable**
.. _ConditionVariable: api/classsimgrid_1_1s4u_1_1ConditionVariable.html
.. |Mutex| replace:: **Mutex**
.. _Mutex: api/classsimgrid_1_1s4u_1_1Mutex.html
.. include:: app_smpi.rst
.. include:: app_legacy.rst