optional in this tutorial, it is not installed to reduce the image
size.
+The docker does not run as root, so that the files can easily be exchanged between within the container and the outer world.
+If you need to run a command as root within the container, simply type the following in another terminal to join the same container as root:
+
+.. code-block:: console
+
+ $ docker container ls
+ # This lists all containers running on your machine. For example:
+ # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+ # 7e921b1b18a7 simgrid/stable "bash" 7 minutes ago Up 7 minutes simgrid
+
+ $ docker exec --user root -it simgrid bash
+
The code template is available under ``/source/simgrid-template-s4u.git``
in the image. You should copy it to your working directory and
recompile it when you first log in:
.. code-block:: console
- $ cp -r /source/simgrid-template-s4u.git/* /source/tutorial
- $ cd /source/tutorial
- $ cmake .
- $ make
+ $ # Make sure the simgrid-tutorial directory can be read and written by the non-root user
+ $ sudo chown $UID:$GID ~/simgrid-tutorial
+ $ # Connect to the running container if needed
+ $ docker exec --user $UID:$GID -ti simgrid bash
+ $container) cp -r /source/simgrid-template-s4u.git/* /source/tutorial
+ $container) cd /source/tutorial
+ $container) cmake .
+ $container) make
Using your Computer Natively
............................
your :ref:`SimGrid installation <install>`. On need, please refer to
the :ref:`Troubleshooting your Project Setup <install_yours_troubleshooting>` section.
+.. warning::
+
+ If you use the stable version of Debian 11, Ubuntu 21.04 or Ubuntu 21.10, then you need the right version of this tutorial
+ (add ``--branch simgrid-v3.25`` as below). These distributions only contain SimGrid v3.25 while the latest version of this
+ tutorial needs at least SimGrid v3.27.
+
+ .. code-block:: console
+
+ $ git clone --branch simgrid-v3.25 https://framagit.org/simgrid/simgrid-template-s4u.git
For R analysis of the produced traces, you may want to install R
and the `pajengr <https://github.com/schnorr/pajengr#installation/>`_ package.
$ make master-workers
$ ./master-workers small_platform.xml master-workers_d.xml
+ If you get an error message complaining that ``simgrid::s4u::Mailbox::get()`` does not exist,
+ then your version of SimGrid is too old for the version of the tutorial that you got. Check again previous section.
+
.. group-tab:: Python
Please execute the provided simulator as follows:
$ python master-workers.py small_platform.xml master-workers_d.xml
-For a more "fancy" output, you can use simgrid-colorizer.
-
-.. code-block:: console
-
- # Run C++ code
- $ ./master-workers small_platform.xml master-workers_d.xml 2>&1 | simgrid-colorizer
-
- # Run Python code
- $ python master-workers.py small_platform.xml master-workers_d.xml 2>&1 | simgrid-colorizer
-
-If you installed SimGrid to a non-standard path, you may have to
-specify the full path to simgrid-colorizer on the above line, such as
-``/opt/simgrid/bin/simgrid-colorizer``. If you did not install it at all,
-you can find it in <simgrid_root_directory>/bin/colorize.
+ If you get an error stating that the simgrid module does not exist, you need to get a newer version of SimGrid.
+ You may want to take the tutorial from the docker to get the newest version.
For a classical Gantt-Chart visualization, you can use `Vite
<http://vite.gforge.inria.fr/>`_ if you have it installed, as
.. note::
- If you use an older version of SimGrid (before v3.26), you should use
- ``--cfg=tracing/msg/process:yes`` instead of ``--cfg=tracing/actor:yes``.
-
If you want the full power to visualize SimGrid traces, you need
to use R. As a start, you can download this `starter script
<https://framagit.org/simgrid/simgrid/raw/master/docs/source/tuto_s4u/draw_gantt.R>`_
.. code-block:: cpp
for (int i = 0; i < tasks_count; i++) {
- std::string worker_rank = std::to_string(i % workers_count);
- std::string mailbox_name = std::string("worker-") + worker_rank;
+ std::string worker_rank = std::to_string(i % workers_count);
+ std::string mailbox_name = "worker-" + worker_rank;
simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(mailbox_name);
mailbox->put(...);
* Change the platform characteristics during the simulation.
* Explore other communication patterns.
-.. todo::
-
- Some of the required functions are not implemented in Python yet. You can detect that if the method name is not a link to the documentation.
-
Computational speed
...................
Attach a profile to your hosts, so that their computational speed automatically vary over time, modeling an external load on these machines.
-This can be done with :cpp:func:`simgrid::s4u::Host::set_speed_profile` (C++) or :py:func:`simgrid.Host.set_speed_profile` (python).
+This can be done with :cpp:func:`simgrid::s4u::Host::set_speed_profile` (C++) or :py:func:`simgrid.Host.set_speed_profile` (Python).
Make it so that one of the hosts get really really slow, and observe how your whole application performance decreases.
This is because one slow host slows down the whole process. Instead of a round-robin dispatch push,
Retrieve the list of links from one host to another with :cpp:func:`simgrid::s4u::Host::route_to` (C++) or :py:func:`simgrid.Host.route_to` (python).
Modify the bandwidth of a given link with :cpp:func:`simgrid::s4u::Link::set_bandwidth` (C++) or :py:func:`simgrid.Link.set_bandwidth` (python).
-You can even have the bandwidth automatically vary over time with :cpp:func:`simgrid::s4u::Link::set_bandwidth_profile` (C++) or :py:func:`simgrid.Link.set_bandwidth_profile` (python).
+You can even have the bandwidth automatically vary over time with :cpp:func:`simgrid::s4u::Link::set_bandwidth_profile` (C++) or :py:func:`simgrid.Link.set_bandwidth_profile` (python).
Once implemented, you will notice that slow communications may still result in situations
where one worker only works at a given point of time. To overcome that, your master needs
exec = simgrid:.this_actor.exec_init(compute_cost)
exec.set_tracing_category(category)
- // exec.start() is optional here as wait() starts the activity on need
+ # exec.start() is optional here as wait() starts the activity on need
exec->wait()
You can shorten this code as follows:
This tutorial is now terminated. You could keep reading the online documentation and
tutorials, or you could head up to the :ref:`example section <s4u_examples>` to read some code.
-.. todo::
-
- Things to improve in the future:
-
- - Propose equivalent exercises and skeleton in Java once we fix the Java binding.
-
.. |br| raw:: html
<br />