Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of https://framagit.org/simgrid/simgrid into no_simix_global
authorSUTER Frederic <frederic.suter@cc.in2p3.fr>
Tue, 14 Sep 2021 11:31:02 +0000 (13:31 +0200)
committerSUTER Frederic <frederic.suter@cc.in2p3.fr>
Tue, 14 Sep 2021 11:39:51 +0000 (13:39 +0200)
549 files changed:
.appveyor.yml
.codacy.yml [deleted file]
.github/workflows/ci-batsim.yml [new file with mode: 0644]
.github/workflows/ci-bigdft.yml [new file with mode: 0644]
.github/workflows/ci-starpu.yml [new file with mode: 0644]
.github/workflows/ci-wrench.yml [new file with mode: 0644]
.github/workflows/docker.yml [new file with mode: 0644]
.github/workflows/jarfile.yml
.gitignore
.lgtm.yml [new file with mode: 0644]
.mailmap
.travis.yml [deleted file]
CMakeLists.txt
ChangeLog
MANIFEST.in
NEWS
README.md
doc/doxygen/inside_release.doc
doc/doxygen/inside_tests.doc
doc/doxygen/module-xbt.doc [deleted file]
doc/doxygen/platform_lua.doc [deleted file]
docs/Build.sh
docs/find-missing.ignore
docs/find-missing.py
docs/ignored_symbols [deleted file]
docs/requirements.txt
docs/source/Configuring_SimGrid.rst
docs/source/Doxyfile
docs/source/Installing_SimGrid.rst
docs/source/Models.rst
docs/source/Platform.rst
docs/source/Platform_cpp.rst [new file with mode: 0644]
docs/source/Platform_examples.rst
docs/source/Platform_howtos.rst
docs/source/Platform_routing.rst
docs/source/Plugins.rst
docs/source/Release_Notes.rst [new file with mode: 0644]
docs/source/Start_your_own_project.rst
docs/source/Tutorial_Algorithms.rst
docs/source/Tutorial_MPI_Applications.rst
docs/source/Tutorial_Model-checking.rst
docs/source/XML_reference.rst
docs/source/app_msg.rst
docs/source/app_s4u.rst
docs/source/app_smpi.rst
docs/source/community.rst
docs/source/conf.py
docs/source/img/graphical-toc.svg
docs/source/img/starzone.drawio [new file with mode: 0644]
docs/source/img/starzone.svg [new file with mode: 0644]
docs/source/img/zone_tree.drawio [new file with mode: 0644]
docs/source/img/zone_tree.svg [new file with mode: 0644]
docs/source/img/zoom_comm.drawio [new file with mode: 0644]
docs/source/img/zoom_comm.svg [new file with mode: 0644]
docs/source/index.rst
docs/source/tuto_disk/CMakeLists.txt [new file with mode: 0644]
docs/source/tuto_disk/Dockerfile [new file with mode: 0644]
docs/source/tuto_disk/analysis.org [new file with mode: 0644]
docs/source/tuto_disk/analysis.rst [new file with mode: 0644]
docs/source/tuto_disk/fig/edel_read_dhist.png [new file with mode: 0644]
docs/source/tuto_disk/fig/edel_write_dhist.png [new file with mode: 0644]
docs/source/tuto_disk/fig/griffon_deg.png [new file with mode: 0644]
docs/source/tuto_disk/fig/griffon_read_dhist.png [new file with mode: 0644]
docs/source/tuto_disk/fig/griffon_write_dhist.png [new file with mode: 0644]
docs/source/tuto_disk/fig/simgrid_results.png [new file with mode: 0644]
docs/source/tuto_disk/init.el [new file with mode: 0644]
docs/source/tuto_disk/tuto_disk.cpp [new file with mode: 0644]
docs/source/tuto_s4u/draw_gantt.R
docs/source/tuto_smpi/gemm_mpi.cpp
docs/source/tuto_smpi/img/lu.S.4.png
docs/source/tuto_smpi/roundtrip.c
examples/README.rst
examples/c/actor-create/.gitignore [deleted file]
examples/c/actor-yield/actor-yield.c
examples/c/app-bittorrent/bittorrent-peer.c
examples/c/app-bittorrent/tracker.c
examples/c/app-chainsend/broadcaster.c
examples/c/app-chainsend/peer.c
examples/c/app-masterworker/app-masterworker.c
examples/c/app-token-ring/app-token-ring.c
examples/c/app-token-ring/app-token-ring.tesh
examples/c/cloud-capping/cloud-capping.c
examples/c/comm-wait/comm-wait.c
examples/c/comm-waitall/comm-waitall.c
examples/c/comm-waitany/comm-waitany.c
examples/c/dht-pastry/dht-pastry.c
examples/c/energy-vm/.gitignore [deleted file]
examples/c/exec-basic/exec-basic.c
examples/c/exec-dvfs/exec-dvfs.c
examples/c/exec-waitany/exec-waitany.c
examples/c/platform-failures/platform-failures.c
examples/c/synchro-semaphore/synchro-semaphore.c
examples/cpp/CMakeLists.txt
examples/cpp/actor-create/.gitignore [deleted file]
examples/cpp/app-chainsend/s4u-app-chainsend.cpp
examples/cpp/app-token-ring/s4u-app-token-ring.tesh
examples/cpp/clusters-multicpu/s4u-clusters-multicpu.cpp
examples/cpp/comm-failure/s4u-comm-failure.cpp [new file with mode: 0644]
examples/cpp/comm-failure/s4u-comm-failure.tesh [new file with mode: 0644]
examples/cpp/comm-ready/s4u-comm-ready.cpp
examples/cpp/comm-serialize/s4u-comm-serialize.cpp [new file with mode: 0644]
examples/cpp/comm-serialize/s4u-comm-serialize.tesh [new file with mode: 0644]
examples/cpp/comm-waitall/s4u-comm-waitall.cpp
examples/cpp/comm-waitany/s4u-comm-waitany.cpp
examples/cpp/dht-chord/s4u-dht-chord.cpp
examples/cpp/energy-boot/s4u-energy-boot.cpp
examples/cpp/energy-link/s4u-energy-link.cpp
examples/cpp/energy-wifi/s4u-energy-wifi.cpp
examples/cpp/engine-filtering/s4u-engine-filtering.cpp
examples/cpp/exec-cpu-factors/s4u-exec-cpu-factors.cpp [new file with mode: 0644]
examples/cpp/exec-cpu-factors/s4u-exec-cpu-factors.tesh [new file with mode: 0644]
examples/cpp/exec-cpu-nonlinear/s4u-exec-cpu-nonlinear.cpp [new file with mode: 0644]
examples/cpp/exec-cpu-nonlinear/s4u-exec-cpu-nonlinear.tesh [new file with mode: 0644]
examples/cpp/exec-dependent/s4u-exec-dependent.cpp
examples/cpp/exec-dvfs/s4u-exec-dvfs.cpp
examples/cpp/exec-failure/s4u-exec-failure.cpp [new file with mode: 0644]
examples/cpp/exec-failure/s4u-exec-failure.tesh [new file with mode: 0644]
examples/cpp/exec-ptask/s4u-exec-ptask.tesh
examples/cpp/exec-remote/s4u-exec-remote.cpp
examples/cpp/exec-remote/s4u-exec-remote.tesh
examples/cpp/exec-waitany/s4u-exec-waitany.cpp
examples/cpp/io-degradation/s4u-io-degradation.cpp [new file with mode: 0644]
examples/cpp/io-degradation/s4u-io-degradation.tesh [new file with mode: 0644]
examples/cpp/io-dependent/s4u-io-dependent.cpp
examples/cpp/io-file-system/.gitignore [deleted file]
examples/cpp/network-factors/s4u-network-factors.cpp
examples/cpp/network-factors/s4u-network-factors.tesh
examples/cpp/network-nonlinear/s4u-network-nonlinear.cpp [new file with mode: 0644]
examples/cpp/network-nonlinear/s4u-network-nonlinear.tesh [new file with mode: 0644]
examples/cpp/network-wifi/s4u-network-wifi.tesh
examples/cpp/platform-properties/s4u-platform-properties.cpp
examples/cpp/plugin-link-load/s4u-plugin-link-load.tesh
examples/cpp/plugin-prodcons/s4u-plugin-prodcons.cpp
examples/cpp/routing-get-clusters/s4u-routing-get-clusters.cpp
examples/cpp/synchro-mutex/.gitignore [deleted file]
examples/cpp/synchro-semaphore/s4u-synchro-semaphore.cpp
examples/deprecated/java/app/bittorrent/Peer.java
examples/deprecated/java/app/tokenring/app-tokenring.tesh
examples/deprecated/simdag/schedule-dotload/.gitignore [deleted file]
examples/platforms/CMakeLists.txt [new file with mode: 0644]
examples/platforms/griffon.cpp [new file with mode: 0644]
examples/platforms/routing_cluster.cpp [new file with mode: 0644]
examples/python/CMakeLists.txt
examples/python/clusters-multicpu/clusters-multicpu.py [new file with mode: 0644]
examples/python/clusters-multicpu/clusters-multicpu.tesh [new file with mode: 0644]
examples/python/exec-cpu-nonlinear/exec-cpu-nonlinear.py [new file with mode: 0644]
examples/python/exec-cpu-nonlinear/exec-cpu-nonlinear.tesh [new file with mode: 0644]
examples/python/io-degradation/io-degradation.py [new file with mode: 0644]
examples/python/io-degradation/io-degradation.tesh [new file with mode: 0644]
examples/python/network-nonlinear/network-nonlinear.py [new file with mode: 0644]
examples/python/network-nonlinear/network-nonlinear.tesh [new file with mode: 0644]
examples/smpi/CMakeLists.txt
examples/smpi/energy/energy.c
examples/smpi/gemm/gemm.c
examples/smpi/gemm/gemm.tesh
examples/smpi/mc/.gitignore [deleted file]
examples/smpi/mc/non_deterministic.tesh [deleted file]
examples/smpi/mc/non_termination1.c
examples/smpi/mc/non_termination2.c
examples/smpi/mc/non_termination3.c
examples/smpi/mc/non_termination4.c
examples/smpi/replay/replay-override-replayer.tesh
examples/smpi/replay/replay.tesh
examples/smpi/replay_multiple/replay_multiple.cpp
examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.cpp
examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual_coll2_st_sr_noise.tesh
examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual_mixed2.tesh
examples/smpi/simple-execute/hostfile_griffon [new file with mode: 0644]
examples/smpi/simple-execute/simple-execute-cpp-platf.tesh [new file with mode: 0644]
examples/smpi/simple-execute/simple-execute.tesh
examples/smpi/trace/trace.tesh
include/simgrid/Exception.hpp
include/simgrid/actor.h
include/simgrid/comm.h
include/simgrid/disk.h
include/simgrid/exec.h
include/simgrid/forward.h
include/simgrid/host.h
include/simgrid/jedule/jedule_platform.hpp
include/simgrid/kernel/ProfileBuilder.hpp [new file with mode: 0644]
include/simgrid/kernel/resource/Action.hpp
include/simgrid/kernel/resource/Model.hpp
include/simgrid/kernel/routing/ClusterZone.hpp
include/simgrid/kernel/routing/DijkstraZone.hpp
include/simgrid/kernel/routing/DragonflyZone.hpp
include/simgrid/kernel/routing/EmptyZone.hpp
include/simgrid/kernel/routing/FatTreeZone.hpp
include/simgrid/kernel/routing/FloydZone.hpp
include/simgrid/kernel/routing/FullZone.hpp
include/simgrid/kernel/routing/NetPoint.hpp
include/simgrid/kernel/routing/NetZoneImpl.hpp
include/simgrid/kernel/routing/RoutedZone.hpp
include/simgrid/kernel/routing/StarZone.hpp
include/simgrid/kernel/routing/TorusZone.hpp
include/simgrid/kernel/routing/VivaldiZone.hpp
include/simgrid/kernel/routing/WifiZone.hpp
include/simgrid/link.h
include/simgrid/mailbox.h
include/simgrid/msg.h
include/simgrid/plugins/ProducerConsumer.hpp
include/simgrid/plugins/file_system.h
include/simgrid/s4u/Activity.hpp
include/simgrid/s4u/Actor.hpp
include/simgrid/s4u/Comm.hpp
include/simgrid/s4u/ConditionVariable.hpp
include/simgrid/s4u/Disk.hpp
include/simgrid/s4u/Engine.hpp
include/simgrid/s4u/Exec.hpp
include/simgrid/s4u/Host.hpp
include/simgrid/s4u/Io.hpp
include/simgrid/s4u/Link.hpp
include/simgrid/s4u/Mailbox.hpp
include/simgrid/s4u/Mutex.hpp
include/simgrid/s4u/NetZone.hpp
include/simgrid/s4u/Semaphore.hpp
include/simgrid/s4u/VirtualMachine.hpp
include/simgrid/simix.h
include/simgrid/smpi/smpi_replay.hpp
include/smpi/mpif.h.in
include/smpi/sampi.h
include/smpi/smpi.h
include/smpi/smpi_extended_traces.h
include/smpi/smpi_extended_traces_fortran.h
include/smpi/smpi_helpers.h
include/smpi/smpi_helpers_internal.h
include/xbt/base.h
include/xbt/functional.hpp
include/xbt/log.h
include/xbt/misc.h
include/xbt/parse_units.hpp
include/xbt/string.hpp
setup.py
sonar-project.properties
src/bindings/java/org/simgrid/msg/Process.java
src/bindings/lua/lua_platf.cpp
src/bindings/python/simgrid_python.cpp
src/include/xbt/mmalloc.h
src/instr/instr_config.cpp
src/instr/instr_interface.cpp
src/instr/instr_paje_containers.cpp
src/instr/instr_paje_containers.hpp
src/instr/instr_paje_types.cpp
src/instr/instr_paje_types.hpp
src/instr/instr_paje_values.hpp
src/instr/instr_platform.cpp
src/instr/instr_private.hpp
src/instr/jedule/jedule_platform.cpp
src/kernel/EngineImpl.cpp
src/kernel/EngineImpl.hpp
src/kernel/activity/CommImpl.cpp
src/kernel/activity/CommImpl.hpp
src/kernel/activity/ExecImpl.cpp
src/kernel/activity/IoImpl.cpp
src/kernel/activity/MailboxImpl.hpp
src/kernel/activity/SleepImpl.cpp
src/kernel/activity/SynchroRaw.cpp
src/kernel/actor/ActorImpl.cpp
src/kernel/actor/ActorImpl.hpp
src/kernel/actor/SimcallObserver.hpp
src/kernel/context/ContextSwapped.cpp
src/kernel/lmm/fair_bottleneck.cpp
src/kernel/lmm/maxmin.cpp
src/kernel/lmm/maxmin.hpp
src/kernel/lmm/maxmin_test.cpp
src/kernel/resource/Action.cpp
src/kernel/resource/DiskImpl.cpp
src/kernel/resource/DiskImpl.hpp
src/kernel/resource/Model.cpp
src/kernel/resource/NetworkModelIntf_test.cpp
src/kernel/resource/profile/Profile.cpp
src/kernel/resource/profile/ProfileBuilder.cpp [new file with mode: 0644]
src/kernel/routing/ClusterZone.cpp
src/kernel/routing/DijkstraZone.cpp
src/kernel/routing/DijkstraZone_test.cpp
src/kernel/routing/DragonflyZone.cpp
src/kernel/routing/DragonflyZone_test.cpp
src/kernel/routing/EmptyZone.cpp
src/kernel/routing/FatTreeZone.cpp
src/kernel/routing/FatTreeZone_test.cpp
src/kernel/routing/FloydZone.cpp
src/kernel/routing/FloydZone_test.cpp
src/kernel/routing/FullZone.cpp
src/kernel/routing/FullZone_test.cpp
src/kernel/routing/NetZoneImpl.cpp
src/kernel/routing/NetZone_test.hpp [new file with mode: 0644]
src/kernel/routing/RoutedZone.cpp
src/kernel/routing/StarZone.cpp
src/kernel/routing/StarZone_test.cpp
src/kernel/routing/TorusZone.cpp
src/kernel/routing/TorusZone_test.cpp
src/kernel/routing/VivaldiZone.cpp
src/kernel/routing/WifiZone.cpp
src/mc/ModelChecker.cpp
src/mc/api.cpp
src/mc/api.hpp
src/mc/checker/LivenessChecker.cpp
src/mc/checker/SafetyChecker.cpp
src/mc/compare.cpp
src/mc/inspect/DwarfExpression.cpp
src/mc/inspect/mc_member.cpp
src/mc/mc_pattern.hpp
src/mc/mc_smx.cpp
src/mc/remote/AppSide.cpp
src/mc/remote/CheckerSide.cpp
src/mc/remote/CheckerSide.hpp
src/mc/remote/RemoteProcess.cpp
src/mc/remote/RemoteProcess.hpp
src/mc/sosp/ChunkedData.hpp
src/mc/sosp/Region.cpp
src/msg/msg_comm.cpp
src/msg/msg_global.cpp
src/msg/msg_task.cpp
src/plugins/file_system/s4u_FileSystem.cpp
src/plugins/host_dvfs.cpp
src/plugins/host_energy.cpp
src/plugins/link_energy_wifi.cpp
src/plugins/vm/VirtualMachineImpl.cpp
src/plugins/vm/VirtualMachineImpl.hpp
src/plugins/vm/s4u_VirtualMachine.cpp
src/s4u/s4u_Activity.cpp
src/s4u/s4u_Actor.cpp
src/s4u/s4u_Barrier.cpp
src/s4u/s4u_Comm.cpp
src/s4u/s4u_Disk.cpp
src/s4u/s4u_Engine.cpp
src/s4u/s4u_Exec.cpp
src/s4u/s4u_Host.cpp
src/s4u/s4u_Io.cpp
src/s4u/s4u_Link.cpp
src/s4u/s4u_Mailbox.cpp
src/s4u/s4u_Netzone.cpp
src/simdag/sd_task.cpp
src/simix/libsmx.cpp
src/simix/popping_accessors.hpp
src/simix/popping_bodies.cpp
src/simix/popping_generated.cpp
src/simix/simcalls.in
src/simix/simix_network.tla
src/simix/smx_context.cpp
src/simix/smx_deployment.cpp [deleted file]
src/simix/smx_global.cpp
src/simix/smx_private.hpp
src/smpi/bindings/smpi_f77.cpp
src/smpi/bindings/smpi_pmpi.cpp
src/smpi/bindings/smpi_pmpi_coll.cpp
src/smpi/bindings/smpi_pmpi_comm.cpp
src/smpi/bindings/smpi_pmpi_file.cpp
src/smpi/bindings/smpi_pmpi_group.cpp
src/smpi/bindings/smpi_pmpi_request.cpp
src/smpi/bindings/smpi_pmpi_topo.cpp
src/smpi/bindings/smpi_pmpi_type.cpp
src/smpi/bindings/smpi_pmpi_win.cpp
src/smpi/colls/reduce/reduce-rab.cpp
src/smpi/colls/reduce_scatter/reduce_scatter-mpich.cpp
src/smpi/colls/smpi_automatic_selector.cpp
src/smpi/include/private.hpp
src/smpi/include/smpi_comm.hpp
src/smpi/include/smpi_config.hpp
src/smpi/include/smpi_datatype.hpp
src/smpi/include/smpi_info.hpp
src/smpi/include/smpi_win.hpp
src/smpi/internals/instr_smpi.cpp
src/smpi/internals/smpi_actor.cpp
src/smpi/internals/smpi_bench.cpp
src/smpi/internals/smpi_config.cpp
src/smpi/internals/smpi_deployment.cpp
src/smpi/internals/smpi_global.cpp
src/smpi/internals/smpi_memory.cpp
src/smpi/internals/smpi_replay.cpp
src/smpi/internals/smpi_shared.cpp
src/smpi/internals/smpi_utils.cpp
src/smpi/mpi/smpi_comm.cpp
src/smpi/mpi/smpi_datatype.cpp
src/smpi/mpi/smpi_datatype_derived.cpp
src/smpi/mpi/smpi_file.cpp
src/smpi/mpi/smpi_info.cpp
src/smpi/mpi/smpi_op.cpp
src/smpi/mpi/smpi_request.cpp
src/smpi/mpi/smpi_win.cpp
src/smpi/plugins/ampi/ampi.cpp
src/smpi/plugins/ampi/instr_ampi.cpp
src/smpi/smpi_replay_main.cpp
src/smpi/smpirun.in
src/surf/HostImpl.cpp
src/surf/LinkImpl.cpp [new file with mode: 0644]
src/surf/LinkImpl.hpp [new file with mode: 0644]
src/surf/LinkImplIntf.hpp [new file with mode: 0644]
src/surf/SplitDuplexLinkImpl.cpp [new file with mode: 0644]
src/surf/SplitDuplexLinkImpl.hpp [new file with mode: 0644]
src/surf/SplitDuplexLinkImpl_test.cpp [new file with mode: 0644]
src/surf/cpu_cas01.cpp
src/surf/cpu_cas01.hpp
src/surf/cpu_interface.cpp
src/surf/cpu_interface.hpp
src/surf/cpu_ti.cpp
src/surf/cpu_ti.hpp
src/surf/disk_s19.cpp
src/surf/disk_s19.hpp
src/surf/host_clm03.cpp
src/surf/network_cm02.cpp
src/surf/network_cm02.hpp
src/surf/network_interface.cpp
src/surf/network_interface.hpp
src/surf/network_ns3.cpp
src/surf/network_ns3.hpp
src/surf/network_wifi.cpp
src/surf/network_wifi.hpp
src/surf/ptask_L07.cpp
src/surf/ptask_L07.hpp
src/surf/sg_platf.cpp
src/surf/surf_interface.hpp
src/surf/xml/platf_private.hpp
src/surf/xml/surfxml_sax_cb.cpp
src/xbt/dynar.cpp
src/xbt/log.cpp
src/xbt/memory_map.cpp
src/xbt/mmalloc/mm_module.c
src/xbt/mmalloc/mmorecore.c
src/xbt/mmalloc/mmprivate.h
src/xbt/mmalloc/swag.c
src/xbt/snprintf.c
src/xbt/xbt_log_appender_file.cpp
src/xbt/xbt_log_layout_format.cpp
src/xbt/xbt_log_layout_simple.cpp
src/xbt/xbt_parse_units.cpp
src/xbt/xbt_replay.cpp
src/xbt/xbt_str.cpp
src/xbt/xbt_str_test.cpp
teshsuite/kernel/stack-overflow/stack-overflow.tesh
teshsuite/mc/dwarf/dwarf.cpp
teshsuite/models/CMakeLists.txt
teshsuite/models/cm02-set-lat-bw/cm02-set-lat-bw.cpp [new file with mode: 0644]
teshsuite/models/cm02-set-lat-bw/cm02-set-lat-bw.tesh [new file with mode: 0644]
teshsuite/models/wifi_usage/wifi_usage.tesh
teshsuite/models/wifi_usage_decay/wifi_usage_decay.tesh
teshsuite/python/CMakeLists.txt
teshsuite/python/platform-mix/platform-mix.py [new file with mode: 0644]
teshsuite/python/platform-mix/platform-mix.tesh [new file with mode: 0644]
teshsuite/s4u/CMakeLists.txt
teshsuite/s4u/activity-lifecycle/testing_comm.cpp
teshsuite/s4u/activity-lifecycle/testing_test-wait.cpp
teshsuite/s4u/host-multicore-speed-file/host-multicore-speed-file.cpp [new file with mode: 0644]
teshsuite/s4u/host-multicore-speed-file/host-multicore-speed-file.tesh [new file with mode: 0644]
teshsuite/s4u/io-set-bw/io-set-bw.cpp [new file with mode: 0644]
teshsuite/s4u/io-set-bw/io-set-bw.tesh [new file with mode: 0644]
teshsuite/s4u/issue71/issue71.cpp [new file with mode: 0644]
teshsuite/s4u/issue71/issue71.tesh [new file with mode: 0644]
teshsuite/s4u/issue71/platform_bad.xml [new file with mode: 0644]
teshsuite/s4u/seal-platform/seal-platform.cpp
teshsuite/s4u/wait-all-for/wait-all-for.cpp [new file with mode: 0644]
teshsuite/s4u/wait-all-for/wait-all-for.tesh [new file with mode: 0644]
teshsuite/s4u/wait-any-for/wait-any-for.cpp
teshsuite/simdag/flatifier/flatifier.cpp
teshsuite/simdag/flatifier/flatifier.tesh
teshsuite/simdag/platforms/two_hosts_one_link_splitduplex.xml
teshsuite/smpi/CMakeLists.txt
teshsuite/smpi/auto-shared/auto-shared.c
teshsuite/smpi/bug-17132/bug-17132.tesh
teshsuite/smpi/coll-allgather/coll-allgather.c
teshsuite/smpi/coll-allgather/coll-allgather.tesh
teshsuite/smpi/coll-allgatherv/coll-allgatherv.c
teshsuite/smpi/coll-allgatherv/coll-allgatherv.tesh
teshsuite/smpi/coll-allreduce-with-leaks/coll-allreduce-with-leaks.c
teshsuite/smpi/coll-allreduce-with-leaks/coll-allreduce-with-leaks.tesh
teshsuite/smpi/coll-allreduce-with-leaks/mc-coll-allreduce-with-leaks.tesh
teshsuite/smpi/coll-allreduce/coll-allreduce-automatic.tesh
teshsuite/smpi/coll-allreduce/coll-allreduce-large.tesh
teshsuite/smpi/coll-allreduce/coll-allreduce-papi.tesh
teshsuite/smpi/coll-allreduce/coll-allreduce.c
teshsuite/smpi/coll-allreduce/coll-allreduce.tesh
teshsuite/smpi/coll-alltoall/clusters.tesh
teshsuite/smpi/coll-alltoall/coll-alltoall.c
teshsuite/smpi/coll-alltoall/coll-alltoall.tesh
teshsuite/smpi/coll-alltoall/griffon.tesh [new file with mode: 0644]
teshsuite/smpi/coll-alltoallv/coll-alltoallv.tesh
teshsuite/smpi/coll-barrier/coll-barrier.tesh
teshsuite/smpi/coll-bcast/coll-bcast.tesh
teshsuite/smpi/coll-gather/coll-gather.c
teshsuite/smpi/coll-gather/coll-gather.tesh
teshsuite/smpi/coll-reduce-scatter/coll-reduce-scatter.tesh
teshsuite/smpi/coll-reduce/coll-reduce.c
teshsuite/smpi/coll-reduce/coll-reduce.tesh
teshsuite/smpi/coll-scatter/coll-scatter.tesh
teshsuite/smpi/fort_args/fort_args.f90
teshsuite/smpi/fort_args/fort_args.tesh
teshsuite/smpi/gh-139/gh-139.tesh
teshsuite/smpi/hostfile_griffon [new file with mode: 0644]
teshsuite/smpi/io-all-at/io-all-at.c
teshsuite/smpi/io-all-at/io-all-at.tesh
teshsuite/smpi/io-all/io-all.c
teshsuite/smpi/io-all/io-all.tesh
teshsuite/smpi/io-ordered/io-ordered.c
teshsuite/smpi/io-ordered/io-ordered.tesh
teshsuite/smpi/io-shared/io-shared.c
teshsuite/smpi/io-shared/io-shared.tesh
teshsuite/smpi/io-simple-at/io-simple-at.c
teshsuite/smpi/io-simple-at/io-simple-at.tesh
teshsuite/smpi/io-simple/io-simple.c
teshsuite/smpi/io-simple/io-simple.tesh
teshsuite/smpi/isp/umpire/.gitignore [deleted file]
teshsuite/smpi/isp/umpire/CMakeLists.txt
teshsuite/smpi/macro-sample/macro-sample.c
teshsuite/smpi/macro-sample/macro-sample.tesh
teshsuite/smpi/mpich3-test/perf/twovec.c
teshsuite/smpi/mpich3-test/rma/CMakeLists.txt
teshsuite/smpi/mpich3-test/rma/atomic_get.c
teshsuite/smpi/mpich3-test/rma/linked_list_bench_lock_all.c
teshsuite/smpi/mpich3-test/rma/linked_list_bench_lock_excl.c
teshsuite/smpi/mpich3-test/rma/testlist
teshsuite/smpi/privatization/privatization.c
teshsuite/smpi/privatization/privatization.tesh
teshsuite/smpi/pt2pt-dsend/pt2pt-dsend.tesh
teshsuite/smpi/pt2pt-pingpong/TI_output.tesh
teshsuite/smpi/pt2pt-pingpong/broken_hostfiles.tesh
teshsuite/smpi/pt2pt-pingpong/pt2pt-pingpong.tesh
teshsuite/smpi/replay-ti-colls/replay-ti-colls.c [new file with mode: 0644]
teshsuite/smpi/replay-ti-colls/replay-ti-colls.tesh [new file with mode: 0644]
teshsuite/smpi/timers/timers.c
teshsuite/smpi/timers/timers.tesh
teshsuite/smpi/topo-cart-sub/topo-cart-sub.tesh
teshsuite/smpi/type-hvector/type-hvector.tesh
teshsuite/smpi/type-indexed/type-indexed.tesh
teshsuite/smpi/type-struct/type-struct.tesh
teshsuite/smpi/type-vector/type-vector.tesh
teshsuite/surf/surf_usage/surf_usage.cpp
teshsuite/surf/surf_usage2/surf_usage2.cpp
teshsuite/xbt/mmalloc/mmalloc_test.cpp
tools/cmake/DefinePackages.cmake
tools/cmake/Flags.cmake
tools/cmake/MakeLib.cmake
tools/cmake/Modules/FindNS3.cmake
tools/cmake/Tests.cmake
tools/docker/.gitignore [deleted file]
tools/docker/Dockerfile.stable
tools/docker/Dockerfile.tuto-s4u
tools/docker/Dockerfile.tuto-smpi
tools/docker/Makefile
tools/internal/check_dist_archive.exclude
tools/internal/travis-sonarqube.sh [deleted file]
tools/jenkins/Coverage.sh
tools/jenkins/ci-batsim.sh [new file with mode: 0755]
tools/jenkins/ci-bigdft.sh [new file with mode: 0755]
tools/jenkins/ci-starpu.sh [new file with mode: 0755]
tools/jenkins/ci-wrench.sh [new file with mode: 0755]
tools/jenkins/gfortran-simgrid.rc [new file with mode: 0644]
tools/jenkins/project_description.sh
tools/simgrid_convert_TI_traces.py
tools/smpi/generate_smpi_defines.pl
tools/tesh/tesh.py

index 8713022..003c875 100644 (file)
@@ -24,7 +24,7 @@ branches:
 
 environment:
   global:
-    BOOST_ROOT: C:\Libraries\boost_1_71_0
+    BOOST_ROOT: C:\Libraries\boost_1_77_0
 
 install:
 # Strawberry perl is the one to work with gcc; AppVeyor provides ActiveState perl, which is the one to work with visual.
diff --git a/.codacy.yml b/.codacy.yml
deleted file mode 100644 (file)
index a73af5d..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
----
-engines:
- coverage:
-   enabled: true
-   exclude_paths:
-     - 'teshsuite/**'
-exclude_paths:
-  - 'doc/**.css'
-  - '**/*_dtd.c'
-  - '**/*_dtd.h'
-  - '**/*yy.c'
-  - 'docs/**.py'
-  - 'tools/**.py'
-  - 'examples/smpi/NAS/*'
-  - 'src/include/catch.hpp'
-  - 'src/include/xxhash.hpp'
-  - 'src/smpi/colls/**/*'
-  - 'src/xbt/automaton/parserPromela.tab.*'
-  - 'teshsuite/smpi/isp/**'
-  - 'teshsuite/smpi/mpich3-test/**'
diff --git a/.github/workflows/ci-batsim.yml b/.github/workflows/ci-batsim.yml
new file mode 100644 (file)
index 0000000..78ac347
--- /dev/null
@@ -0,0 +1,34 @@
+name: CI BatSim
+
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: '0 20 * * 0'
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+    container: simgrid/unstable
+
+    steps:
+      - uses: actions/checkout@v2
+      - name: Build and test BatSim
+        run: |
+          set -e
+          ./tools/jenkins/ci-batsim.sh
+
+      - name: Create the failure Message
+        if: ${{ failure() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#FF0000\", \"text\":\"@millian: BatSim failed to build on simgrid/unstable docker image! See ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - name: Create the success Message
+        if: ${{ success() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#00FF00\", \"text\":\"BatSim successfully built on simgrid/unstable docker image. ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - uses: mattermost/action-mattermost-notify@master
+        if: ${{ always() }}
+        env:
+          MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
+          MATTERMOST_CHANNEL: ${{ secrets.MATTERMOST_CHANNEL}}
+
diff --git a/.github/workflows/ci-bigdft.yml b/.github/workflows/ci-bigdft.yml
new file mode 100644 (file)
index 0000000..3b6c0f0
--- /dev/null
@@ -0,0 +1,34 @@
+name: CI BigDFT
+
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: '0 20 * * 0'
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+    container: simgrid/unstable
+
+    steps:
+      - uses: actions/checkout@v2
+      - name: Build and test BigDFT
+        run: |
+          set -e
+          ./tools/jenkins/ci-bigdft.sh
+
+      - name: Create the failure Message
+        if: ${{ failure() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#FF0000\", \"text\":\"@adegomme: BigDFT failed to build on simgrid/unstable docker image! See ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - name: Create the success Message
+        if: ${{ success() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#00FF00\", \"text\":\"BigDFT successfully built on simgrid/unstable docker image. ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - uses: mattermost/action-mattermost-notify@master
+        if: ${{ always() }}
+        env:
+          MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
+          MATTERMOST_CHANNEL: ${{ secrets.MATTERMOST_CHANNEL}}
+
diff --git a/.github/workflows/ci-starpu.yml b/.github/workflows/ci-starpu.yml
new file mode 100644 (file)
index 0000000..6b63238
--- /dev/null
@@ -0,0 +1,34 @@
+name: CI StarPU
+
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: '0 20 * * 0'
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+    container: simgrid/unstable
+
+    steps:
+      - uses: actions/checkout@v2
+      - name: Build and test StarPU
+        run: |
+          set -e
+          ./tools/jenkins/ci-starpu.sh
+
+      - name: Create the failure Message
+        if: ${{ failure() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#FF0000\", \"text\":\"@sthibaul: StarPU failed to build on simgrid/unstable docker image! See ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - name: Create the success Message
+        if: ${{ success() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#00FF00\", \"text\":\"StarPU successfully built on simgrid/unstable docker image. ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - uses: mattermost/action-mattermost-notify@master
+        if: ${{ always() }}
+        env:
+          MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
+          MATTERMOST_CHANNEL: ${{ secrets.MATTERMOST_CHANNEL}}
+
diff --git a/.github/workflows/ci-wrench.yml b/.github/workflows/ci-wrench.yml
new file mode 100644 (file)
index 0000000..224b03e
--- /dev/null
@@ -0,0 +1,34 @@
+name: CI Wrench
+
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: '0 20 * * 0'
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+    container: simgrid/unstable
+
+    steps:
+      - uses: actions/checkout@v2
+      - name: Build and test WRENCH
+        run: |
+          set -e
+          ./tools/jenkins/ci-wrench.sh
+
+      - name: Create the failure Message
+        if: ${{ failure() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#FF0000\", \"text\":\"@henricasanova: Wrench's git failed to build on simgrid/unstable docker image! See ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - name: Create the success Message
+        if: ${{ success() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#00FF00\", \"text\":\"Wrench's git successfully built on simgrid/unstable docker image. ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - uses: mattermost/action-mattermost-notify@master
+        if: ${{ always() }}
+        env:
+          MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
+          MATTERMOST_CHANNEL: ${{ secrets.MATTERMOST_CHANNEL}}
+
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
new file mode 100644 (file)
index 0000000..db99185
--- /dev/null
@@ -0,0 +1,51 @@
+name: Docker
+
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+on:
+  workflow_dispatch:
+  schedule:
+    - cron: '42 18 * * 0'
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+    permissions:
+      contents: read
+      packages: write
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v2
+
+      # Login against a Docker registry except on PR
+      # https://github.com/docker/login-action
+      - name: Log into registry ${{ env.REGISTRY }}
+        uses: docker/login-action@v1
+        with:
+          username: ${{ secrets.DOCKERHUB_USERNAME }}
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+      - name: build
+        run: |
+          cd tools/docker
+          make stable
+          make all
+          make push
+      - name: Create the failure Message
+        if: ${{ failure() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#FF0000\", \"text\":\"Failure when building docker images ! See ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - name: Create the success Message
+        if: ${{ success() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#00FF00\", \"text\":\"Docker images built and pushed successfully ! ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - uses: mattermost/action-mattermost-notify@master
+        env:
+          MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
+          MATTERMOST_CHANNEL: ${{ secrets.MATTERMOST_CHANNEL}}
+
index da24263..0043320 100644 (file)
@@ -1,4 +1,4 @@
-name: Jar file creation
+name: Jar build
 
 on:
   workflow_dispatch:
@@ -56,7 +56,15 @@ jobs:
       with:
           name: jar-${{ matrix.config.os }}
           path: build/simgrid.jar
-
+    - name: Create the failure Message
+      if: ${{ failure() }}
+      run: |
+        echo "{\"attachments\": [{\"color\": \"#FF0000\", \"text\":\"Failure when building JAR file on ${{ matrix.config.name }}! See ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+    - uses: mattermost/action-mattermost-notify@master
+      if: ${{ failure() }}
+      env:
+        MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
+        MATTERMOST_CHANNEL: ${{ secrets.MATTERMOST_CHANNEL}}
   create_jar:
     needs: build
     runs-on: ubuntu-latest
@@ -92,3 +100,15 @@ jobs:
             jar-ubuntu
             jar-windows
             jar-macos
+      - name: Create the failure Message
+        if: ${{ failure() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#FF0000\", \"text\":\"Failure when assembling JAR file ! See ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - name: Create the success Message
+        if: ${{ success() }}
+        run: |
+          echo "{\"attachments\": [{\"color\": \"#00FF00\", \"text\":\"JAR file built successfully ! You can get it on: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}]}" > mattermost.json
+      - uses: mattermost/action-mattermost-notify@master
+        env:
+          MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
+          MATTERMOST_CHANNEL: ${{ secrets.MATTERMOST_CHANNEL}}
index d57fe08..83b2d12 100644 (file)
@@ -251,6 +251,11 @@ examples/smpi/mc/smpi_bugged1
 examples/smpi/mc/smpi_bugged1_liveness
 examples/smpi/mc/smpi_bugged2
 examples/smpi/mc/smpi_mutual_exclusion
+examples/smpi/mc/smpi_non_termination1
+examples/smpi/mc/smpi_non_termination2
+examples/smpi/mc/smpi_non_termination3
+examples/smpi/mc/smpi_non_termination4
+examples/smpi/mc/smpi_only_send_deterministic
 examples/smpi/mc/smpi_sendsend
 examples/smpi/NAS/dt
 examples/smpi/NAS/ep
@@ -334,6 +339,7 @@ teshsuite/smpi/io-ordered/io-ordered
 teshsuite/smpi/io-shared/io-shared
 teshsuite/smpi/io-simple-at/io-simple-at
 teshsuite/smpi/io-simple/io-simple
+teshsuite/smpi/isp/umpire/**/*.tesh
 teshsuite/smpi/isp/umpire/abort
 teshsuite/smpi/isp/umpire/abort1
 teshsuite/smpi/isp/umpire/abort2
diff --git a/.lgtm.yml b/.lgtm.yml
new file mode 100644 (file)
index 0000000..38efb28
--- /dev/null
+++ b/.lgtm.yml
@@ -0,0 +1,14 @@
+##########################################################################################
+# Customize file classifications.                                                        #
+# Results from files under any classifier will be excluded from LGTM                     #
+# statistics.                                                                            #
+##########################################################################################
+
+##########################################################################################
+# Use the `path_classifiers` block to define changes to the default classification of    #
+# files.                                                                                 #
+##########################################################################################
+
+path_classifiers:
+  smpi_colls:
+    - src/smpi/colls/
index e8a876e..6255a1f 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -49,6 +49,7 @@ Jean-Emile Dartois <jean-emile.dartois@b-com.com>
 Jean-Emile Dartois <jean-emile.dartois@b-com.com> <jedartois@gmail.com>
 Darina Dimitrova <dimitrov@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
 Bruno Donassolo <bruno.donassolo@inria.fr> <donassbr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
+Bruno Donassolo <bruno.donassolo@inria.fr> <donassolo@Brunos-MBP.home>
 Yann Duplouy <yann.duplouy@inria.fr> <duplouy@crans.org>
 Pierre-François Dutot <dutot@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
 Julien Emmanuel <julien.emmanuel@inria.fr>
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644 (file)
index 8f1a2bd..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-# NS3 is disabled because the version in ubuntu precise does not lead
-# to the same timings (precision error?)
-# Reenable with
-#   cmake -Denable_ns3
-#   apt-get libns3-dev ns3
-#
-#
-dist: bionic
-language: cpp
-compiler:
-   - gcc
-#  - clang
-jdk:
-   - openjdk11
-addons:
-  apt:
-    packages:
-    - cmake
-    - valgrind
-    - gfortran
-    - libboost-dev
-    - libboost-all-dev
-    - libdw-dev
-    - libevent-dev
-    - libunwind8-dev
-    - pybind11-dev
-  homebrew:
-    packages:
-    - python
-  coverity_scan:
-    project:
-      name: "simgrid/simgrid"
-      description: "Build submitted via Travis CI"
-    notification_email: martin.quinson@ens-rennes.fr
-    build_command_prepend: "cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=OFF -Denable_model-checking=OFF -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=OFF ."
-    build_command:   "make VERBOSE=1"
-    branch_pattern: coverity
-
-jobs:
-  include:
-    - os: linux
-      script:
-      - sudo apt-get update -qq
-      - sudo apt-get install cmake valgrind gfortran libboost-dev libboost-all-dev libdw-dev libevent-dev libunwind8-dev pybind11-dev
-      - (cmake -Denable_model-checking=ON  -Denable_documentation=OFF -Denable_coverage=ON -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=ON -Denable_compile_warnings=ON -DLTO_EXTRA_FLAG="auto" . || (echo XXX CMakeOutput.log; cat /home/travis/build/simgrid/simgrid/CMakeFiles/CMakeOutput.log; echo XXX CMakeError.log;cat /home/travis/build/simgrid/simgrid/CMakeFiles/CMakeError.log; exit 1))
-      - make -j$(nproc) VERBOSE=1 all && make -j$(nproc) tests && ctest -j$(nproc) --output-on-failure
-    - os: windows
-      script:
-      - mv "C:/Program Files/Git/usr/bin/sh.exe" "sh-ignored.exe"
-      - df -h
-      - du -hs /tmp || true
-      - choco install boost-msvc-12 python jdk8
-      - export CC=gcc
-      - export CXX=g++
-      - export PATH='C:\Python39':'C:\local\boost_1_58_0':$PATH
-      - export BOOST_LIBRARYDIR='C:/local/boost_1_58_0/lib64-msvc-12.0'
-      - export BOOST_INCLUDEDIR='C:/local/boost_1_58_0/include'
-      - export JAVA_HOME='C:/Program Files/Java/jdk1.8.0_211'
-      # We need pybind11. SimGrid will pick it automatically if the subdir is here
-      # - git clone --depth=1 https://github.com/pybind/pybind11.git
-      - cmake -G "MinGW Makefiles" -Denable_java=ON -Denable_msg=ON -Denable_lua=OFF -Denable_documentation=OFF -Denable_smpi=OFF -Denable_mallocators=OFF -Denable_lto=OFF .
-      - df -h
-      - du -hs /tmp || true
-      - mingw32-make.exe VERBOSE=1 java-all && ctest --output-on-failure -R java
-      # - mingw32-make.exe VERBOSE=1 python-bindings && ctest --output-on-failure -R python
-      - df -h
-      - du -hc /tmp || true
-    - os: osx
-      osx_image: xcode11.4
-      script:
-      - export LIBRARY_PATH=/usr/local/lib/gcc/9
-      - cmake -Denable_model-checking=OFF -Denable_documentation=OFF -Denable_coverage=ON -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON -Denable_lto=OFF .
-      - make -j2 VERBOSE=1 all && make -j2 tests && ctest -j2 --output-on-failure
-notifications:
-  recipients:
-    - martin.quinson@ens-rennes.fr
-  email:
-    on_success: change
-    on_failure: always
-  irc:
-    on_success: change
-    on_failure: always
-    channels:
-      - "irc.debian.org#simgrid"
-  template:
-    - "%{repository}/%{branch} (%{commit} - %{author}): %{message}"
index 2d001ad..df9907e 100644 (file)
@@ -1,7 +1,7 @@
 # Build the version number
 
 set(SIMGRID_VERSION_MAJOR "3")
-set(SIMGRID_VERSION_MINOR "27")
+set(SIMGRID_VERSION_MINOR "28")
 set(SIMGRID_VERSION_PATCH "1") # odd => git branch; even => stable release or released snapshot
 
 if(${SIMGRID_VERSION_PATCH} EQUAL "0")
@@ -548,8 +548,8 @@ file(READ ${CMAKE_HOME_DIRECTORY}/src/smpi/smpitools.sh SMPITOOLS_SH) # Definiti
 
 ### SMPI script used when simgrid is installed
 set(exec_prefix ${CMAKE_INSTALL_PREFIX})
-set(includedir "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
-set(libdir "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
+set(includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
+set(libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
 set(includeflag "-I${includedir} -I${includedir}/smpi")
 set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=\"${libdir}")
 if(NS3_LIBRARY_PATH)
@@ -635,6 +635,7 @@ if(NOT "${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}")
   configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/actions_allgatherv.txt ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_allgatherv.txt COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_cluster ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_cluster COPYONLY)
+  configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_griffon ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_griffon COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_coll ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_coll COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_io ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_io COPYONLY)
   configure_file(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hostfile_empty ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile_empty COPYONLY)
index 44d6cd4..10bc26e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 ----------------------------------------------------------------------------
 
-SimGrid (3.27.1) NOT RELEASED YET (v3.28 expected June 21. 2021, 03:32 UTC)
+SimGrid (3.28.1) NOT RELEASED YET (v3.29 expected September 22. 2021, 19:21 UTC)
 
 New features:
+ - Non-linear resource sharing: allows to dynamically change the resource
+   capacity. Users can change this capacity by setting a callback which will
+   be called when SimGrid is sharing the resource between the active
+   activities. An activity can be a task running, a read/write IO operation or a
+   communication flow.
+   - Callback signature: double (double capacity, int n_activities): given the
+     current resource's capacity and number of activities running on it,
+     returns the new capacity.
+   - Note that this callback is in the critical path of the system solve and
+   should not take long to execute.
+   - Examples:
+     - Disk: examples/cpp/io-degradation
+     - Link: examples/cpp/network-nonlinear
+     - CPU: examples/cpp/exec-cpu-nonlinear
+ - Dynamic factors for CPU and disk: similarly to dynamic network factors,
+   allows the user to set a callback which can affect the progress of activities
+   (multiplicative factor applied when updating the amount of work remaining).
+   - Example: examples/cpp/exec-cpu-factors
+
+Python:
+ - Added support to programmatic platform creation in Python.
+ - Several new methods were added to Python interface. For more details, see
+ the corresponding documentation.
+ - New python examples:
+   - Clusters: examples/python/clusters-multicpu
+   - Disk: examples/python/io-degradation
+   - CPU: examples/python/exec-cpu-nonlienar
+   - Link: examples/python/network-nonlinear
+
+S4U:
+ - New: s4u::Disk::set_sharing_policy() and s4u::Host::set_sharing_policy().
+   Allows the configuration of non-linear resource sharing for hosts and
+   disks.
+
+SMPI:
+ - TI Tracing/Replay:
+     - Multiple fixes to ensure reproducibility of tracing
+     - scan/excan can now be replayed
+     - wait action now uses ranks and not pid, as the other ones.
+     - smpi/init and smpi/finalization-barrier are now valid for replays.
+
+Documentation:
+  * New section "Release Notes" documenting recent and current developments.
+  * New section "Modeling I/O: the realistic way" presenting how to properly
+  model disks in SimGrid.
+  * Improvements in API Reference for C++ and Python interfaces.
+
+ns-3 model:
+ - Make wifi creation compatible with ns-3 version 3.34 too.
+
+Fixed bugs (FG#.. -> FramaGit bugs; FG!.. -> FG merge requests)
+ (FG: issues on Framagit; GF: issues on GForge; GH: issues on GitHub)
+ - FG#78: Multiple fixes for SMPI replay:
+    - TI tracing of allotallv/w was outputting wrong values
+    - MPI_LOGICAL in fortran is actually 32 bits wide, and not 8.
+ - FG#77: Search feature of doc is broken (update sphinx theme version)
+----------------------------------------------------------------------------
+
+SimGrid (3.28) July 14. 2021
+
+The Victoriadagarna Release.
+
+New features:
+ - C++ platform interface: Users can now describe their platform directly in C++.
+   This provides greatly flexibility and performance improvement for complex
+   platforms. Main features:
+     - Fat-Tree/DragonFly/Torus composing: allows you to create clusters of
+       "zones", instead of single hosts. This feature enables the description
+       of clusters with complex hosts, composed of several CPUs, GPUs, etc.
+     - StarZone: new zone with a Star-like topology. The routes are defined
+       as a set of links used to communicate from node to everybody (node<->ALL).
+     - Split-Duplex links: auxiliary method to create split-duplex links in
+       the platform, easing its utilisation. It automatically creates both UP
+       and DOWN links (similarly as done in XML).
+     - Please refer to the documentation and the examples included:
+       e.g. examples/cpp/clusters-multicpu/ and examples/platforms/*.cpp.
  - New plugin: Producer-Consumer with monitor. Just requires to include the
    include/simgrid/plugins/ProducerConsumer.hpp header to be used. See the
    associated example (examples/cpp/plugin-prodcons).
 
 S4U:
+ - New: s4u::Comm::wait_all_for() (like s4u::Comm::wait_all, but with a timeout),
+        s4u::Io::wait_any(), s4u::Io::wait_any_for().
+ - Methods test_all/test_any/wait_all/wait_any in s4u now take their vector
+   parameter by reference, instead of a pointer.
  - Fixed a bug where Activity::wait_for() killed the activity on timeout.
    Explicitly cancel the activity to get back to previous behavior.
+ - New: Link::set_concurrency_limit() to limit the amount of concurrent flows.
 
 SMPI:
  - The default SMPI compiler flags are no more taken from the environment.
    They can be explicitly set through cmake parameters SMPI_C_FLAGS,
    SMPI_CXX_FLAGS, or SMPI_Fortran_FLAGS.
+ - New options:
+    --cfg=smpi/finalization-barrier: which can be used to add
+      a barrier inside MPI_Finalize. This can help for some codes which cleanup
+      data attached to a process, but still used in other SMPI processes.
+    --cfg=smpi/errors-are-fatal: True by default, behaves like if MPI_ERRORS_RETURN
+      is active when set to false, to keep going after a small error
+    --cfg=smpi/pedantic: True by default. Do not report some harmless MPI errors
+      which may or may not be problematic in the end.
+ - Sampling:
+    - fix behaviour, as maximum iteration count could be ignored
+    - add SMPI_SAMPLE_LOCAL_TAG and SMPI_SAMPLE_GLOBAL_TAG macros, to allow user to
+      use sampling when the same kernel is called with a different set of parameters
+      which have an impact on the timing.
+ - realloc is now intercepted, to be coherent, as malloc/calloc/free were already.
+   It should now work with smpi/auto-shared-malloc-thresh.
+ - Improve error handling and reporting in multiple places
+ - Improve correctness checks on the MPI code.(MPI_Op and MPI_Datatype
+   validity checks, truncated messages are now an error, return errors
+   when explicitely deleted handles are reused, ...)
+ - RMA: multiple fixes and stability improvements.
+ - analysis (-analyze flag in smpirun):
+    - SMPI can now report buffer leaks as well as MPI handles leaks,
+      if code was compiled without SMPI_NO_OVERRIDE_MALLOC.
+    - if -trace-call-location is used when compiling, SMPI can report
+      origin of leaked handles/buffers
+    - group leaks by type/origin in output message if possible
+ - New implemented MPI calls: MPI_Comm_test_inter
 
-LUA:
- - Lua platform files are deprecated. Their support will be dropped after v3.31.
-
-Simix:
- - Legacy functions deprecated in this release: SIMIX_get_clock(), SIMIX_run().
+Models:
+ - Changed internal implementation of bandwidth factors in network models.
+   Models affected: CM02, LV08 (default), SMPI, IB.
+   Configuration affected: "network/bandwidth-factors" and "smpi/bw-factors".
+   Bandwidth factors are applied to communications to describe that users
+   cannot use 100% of the available bandwidth. For example, the default network model,
+   LV08, applies a factor of 0.97 to the bandwidth. In older versions, this
+   behavior was implemented by limiting the bandwidth available in the LMM
+   system for this flow. This may give the false impression that there is
+   bandwidth available for other flows due to its underutilization, especially
+   for the dynamic bandwidth factors used in SMPI models.
+   To avoid this, we have modified the implementation so that each flow uses the
+   maximum physical bandwidth according to the LMM system.
+   However, the actual throughput of the flow seen by the user is defined by
+   the physical bandwidth multiplied by the bandwidth factor.
+   This change impacts on the simulation results for all network models on
+   which we have bandwidth factors configured.
+   *****************************************
+   *DO NOT MIX 3.28 RESULTS WITH OLDER ONES*
+   *****************************************
+   This change may impact on the timing of your simulation results.
+   Take care when comparing simulations from different SimGrid's
+   versions. Sorry for the inconvenience.
+ - Dynamic network factors: users can configure a callback to define
+   the network factors dynamically. This API is available at
+   simgrid::kernel::resource::NetworkModelIntf.
+   - Users have access to complete information about the current communication
+     to decide which factor to apply. This includes: message size, source and
+     destination hosts, links and zones traversed.
+   - Dynamic factors for both latency and bandwidth.
+   - For more details, see the example in (examples/cpp/network-factors).
+ - Plugin host_energy: the "watt_off" and "watt_per_state" host properties,
+   deprecated since version 3.24, are no longer supported. Instead, use
+   "wattage_off" and "wattage_per_state".
 
 XBT:
  - xbt_assert is not disabled anymore, even when built with enable_debug=off.
 
 Documentation:
  - New tutorial: Model-checking and formal assessment
+ - New sections: "Demystifying the routing" and "C++ platforms"
+ - Update and improve the part on visualization in MPI and Algo tutorials.
+ - Improve the section on routing: how to define it, how it's used internally
+ - Fix many issues, broken links and missing references in doxygen and Sphinx
+
+LUA:
+ - Lua platform files are deprecated. Their support will be dropped after v3.31.
+
+Simix:
+ - Legacy functions deprecated in this release: SIMIX_get_clock(), SIMIX_run().
 
 Fixed bugs (FG#.. -> FramaGit bugs; FG!.. -> FG merge requests)
  (FG: issues on Framagit; GF: issues on GForge; GH: issues on GitHub)
@@ -34,6 +181,7 @@ Fixed bugs (FG#.. -> FramaGit bugs; FG!.. -> FG merge requests)
  - FG#64: Configuring smpi/IB-penalty-factors
  - FG#67: Running computation concurrently with MPI_Iallreduce
  - FG#69: Tutorial misleading users of pre-v3.26 versions of SimGrid
+ - FG#71: Segmentation fault on invalid gw_src/gw_dst
  - GH#322: Issue when an actor kills his host vm
 
 ----------------------------------------------------------------------------
index 3d7703f..6fe2661 100644 (file)
@@ -173,6 +173,8 @@ include examples/cpp/clusters-multicpu/s4u-clusters-multicpu.cpp
 include examples/cpp/clusters-multicpu/s4u-clusters-multicpu.tesh
 include examples/cpp/comm-dependent/s4u-comm-dependent.cpp
 include examples/cpp/comm-dependent/s4u-comm-dependent.tesh
+include examples/cpp/comm-failure/s4u-comm-failure.cpp
+include examples/cpp/comm-failure/s4u-comm-failure.tesh
 include examples/cpp/comm-host2host/s4u-comm-host2host.cpp
 include examples/cpp/comm-host2host/s4u-comm-host2host.tesh
 include examples/cpp/comm-pingpong/s4u-comm-pingpong.cpp
@@ -181,6 +183,8 @@ include examples/cpp/comm-pingpong/simix-breakpoint.tesh
 include examples/cpp/comm-ready/s4u-comm-ready.cpp
 include examples/cpp/comm-ready/s4u-comm-ready.tesh
 include examples/cpp/comm-ready/s4u-comm-ready_d.xml
+include examples/cpp/comm-serialize/s4u-comm-serialize.cpp
+include examples/cpp/comm-serialize/s4u-comm-serialize.tesh
 include examples/cpp/comm-suspend/s4u-comm-suspend.cpp
 include examples/cpp/comm-suspend/s4u-comm-suspend.tesh
 include examples/cpp/comm-suspend/s4u-comm-suspend_d.xml
@@ -232,10 +236,16 @@ include examples/cpp/exec-async/s4u-exec-async.cpp
 include examples/cpp/exec-async/s4u-exec-async.tesh
 include examples/cpp/exec-basic/s4u-exec-basic.cpp
 include examples/cpp/exec-basic/s4u-exec-basic.tesh
+include examples/cpp/exec-cpu-factors/s4u-exec-cpu-factors.cpp
+include examples/cpp/exec-cpu-factors/s4u-exec-cpu-factors.tesh
+include examples/cpp/exec-cpu-nonlinear/s4u-exec-cpu-nonlinear.cpp
+include examples/cpp/exec-cpu-nonlinear/s4u-exec-cpu-nonlinear.tesh
 include examples/cpp/exec-dependent/s4u-exec-dependent.cpp
 include examples/cpp/exec-dependent/s4u-exec-dependent.tesh
 include examples/cpp/exec-dvfs/s4u-exec-dvfs.cpp
 include examples/cpp/exec-dvfs/s4u-exec-dvfs.tesh
+include examples/cpp/exec-failure/s4u-exec-failure.cpp
+include examples/cpp/exec-failure/s4u-exec-failure.tesh
 include examples/cpp/exec-ptask-multicore/s4u-exec-ptask-multicore.cpp
 include examples/cpp/exec-ptask-multicore/s4u-exec-ptask-multicore.tesh
 include examples/cpp/exec-ptask/s4u-exec-ptask.cpp
@@ -250,6 +260,8 @@ include examples/cpp/exec-waitfor/s4u-exec-waitfor.cpp
 include examples/cpp/exec-waitfor/s4u-exec-waitfor.tesh
 include examples/cpp/io-async/s4u-io-async.cpp
 include examples/cpp/io-async/s4u-io-async.tesh
+include examples/cpp/io-degradation/s4u-io-degradation.cpp
+include examples/cpp/io-degradation/s4u-io-degradation.tesh
 include examples/cpp/io-dependent/s4u-io-dependent.cpp
 include examples/cpp/io-dependent/s4u-io-dependent.tesh
 include examples/cpp/io-disk-raw/s4u-io-disk-raw.cpp
@@ -276,6 +288,8 @@ include examples/cpp/mc-failing-assert/s4u-mc-failing-assert.cpp
 include examples/cpp/mc-failing-assert/s4u-mc-failing-assert.tesh
 include examples/cpp/network-factors/s4u-network-factors.cpp
 include examples/cpp/network-factors/s4u-network-factors.tesh
+include examples/cpp/network-nonlinear/s4u-network-nonlinear.cpp
+include examples/cpp/network-nonlinear/s4u-network-nonlinear.tesh
 include examples/cpp/network-ns3-wifi/s4u-network-ns3-wifi.cpp
 include examples/cpp/network-ns3-wifi/s4u-network-ns3-wifi.tesh
 include examples/cpp/network-ns3/3hosts_2links_d.xml
@@ -503,6 +517,8 @@ include examples/python/actor-suspend/actor-suspend.py
 include examples/python/actor-suspend/actor-suspend.tesh
 include examples/python/actor-yield/actor-yield.py
 include examples/python/actor-yield/actor-yield.tesh
+include examples/python/clusters-multicpu/clusters-multicpu.py
+include examples/python/clusters-multicpu/clusters-multicpu.tesh
 include examples/python/comm-wait/comm-wait.py
 include examples/python/comm-wait/comm-wait.tesh
 include examples/python/comm-waitall/comm-waitall.py
@@ -513,10 +529,16 @@ include examples/python/exec-async/exec-async.py
 include examples/python/exec-async/exec-async.tesh
 include examples/python/exec-basic/exec-basic.py
 include examples/python/exec-basic/exec-basic.tesh
+include examples/python/exec-cpu-nonlinear/exec-cpu-nonlinear.py
+include examples/python/exec-cpu-nonlinear/exec-cpu-nonlinear.tesh
 include examples/python/exec-dvfs/exec-dvfs.py
 include examples/python/exec-dvfs/exec-dvfs.tesh
 include examples/python/exec-remote/exec-remote.py
 include examples/python/exec-remote/exec-remote.tesh
+include examples/python/io-degradation/io-degradation.py
+include examples/python/io-degradation/io-degradation.tesh
+include examples/python/network-nonlinear/network-nonlinear.py
+include examples/python/network-nonlinear/network-nonlinear.tesh
 include examples/smpi/NAS/DGraph.c
 include examples/smpi/NAS/DGraph.h
 include examples/smpi/NAS/README.install
@@ -636,6 +658,8 @@ include examples/smpi/replay_multiple_manual_deploy/workload_compute_consecutive
 include examples/smpi/replay_multiple_manual_deploy/workload_compute_simple
 include examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time
 include examples/smpi/replay_multiple_manual_deploy/workload_mixed2_same_time_and_resources
+include examples/smpi/simple-execute/hostfile_griffon
+include examples/smpi/simple-execute/simple-execute-cpp-platf.tesh
 include examples/smpi/simple-execute/simple-execute.c
 include examples/smpi/simple-execute/simple-execute.tesh
 include examples/smpi/smpi_s4u_masterworker/deployment_masterworker_mailbox_smpi.xml
@@ -675,6 +699,8 @@ include teshsuite/mc/random-bug/random-bug.cpp
 include teshsuite/mc/random-bug/random-bug.tesh
 include teshsuite/models/cloud-sharing/cloud-sharing.cpp
 include teshsuite/models/cloud-sharing/cloud-sharing.tesh
+include teshsuite/models/cm02-set-lat-bw/cm02-set-lat-bw.cpp
+include teshsuite/models/cm02-set-lat-bw/cm02-set-lat-bw.tesh
 include teshsuite/models/ptask_L07_usage/ptask_L07_usage.cpp
 include teshsuite/models/ptask_L07_usage/ptask_L07_usage.tesh
 include teshsuite/models/wifi_usage/wifi_usage.cpp
@@ -689,6 +715,8 @@ include teshsuite/python/borken-context/borken-context_d.xml
 include teshsuite/python/corrupt-stack/corrupt-stack.py
 include teshsuite/python/corrupt-stack/corrupt-stack.tesh
 include teshsuite/python/corrupt-stack/corrupt-stack_d.xml
+include teshsuite/python/platform-mix/platform-mix.py
+include teshsuite/python/platform-mix/platform-mix.tesh
 include teshsuite/s4u/activity-lifecycle/activity-lifecycle.cpp
 include teshsuite/s4u/activity-lifecycle/activity-lifecycle.hpp
 include teshsuite/s4u/activity-lifecycle/activity-lifecycle.tesh
@@ -721,14 +749,21 @@ include teshsuite/s4u/concurrent_rw/concurrent_rw.cpp
 include teshsuite/s4u/concurrent_rw/concurrent_rw.tesh
 include teshsuite/s4u/evaluate-get-route-time/evaluate-get-route-time.cpp
 include teshsuite/s4u/evaluate-parse-time/evaluate-parse-time.cpp
+include teshsuite/s4u/host-multicore-speed-file/host-multicore-speed-file.cpp
+include teshsuite/s4u/host-multicore-speed-file/host-multicore-speed-file.tesh
 include teshsuite/s4u/host-on-off-actors/host-on-off-actors.cpp
 include teshsuite/s4u/host-on-off-actors/host-on-off-actors.tesh
 include teshsuite/s4u/host-on-off-recv/host-on-off-recv.cpp
 include teshsuite/s4u/host-on-off-recv/host-on-off-recv.tesh
 include teshsuite/s4u/host-on-off/host-on-off.cpp
 include teshsuite/s4u/host-on-off/host-on-off.tesh
+include teshsuite/s4u/io-set-bw/io-set-bw.cpp
+include teshsuite/s4u/io-set-bw/io-set-bw.tesh
 include teshsuite/s4u/is-router/is-router.cpp
 include teshsuite/s4u/is-router/is-router.tesh
+include teshsuite/s4u/issue71/issue71.cpp
+include teshsuite/s4u/issue71/issue71.tesh
+include teshsuite/s4u/issue71/platform_bad.xml
 include teshsuite/s4u/listen_async/listen_async.cpp
 include teshsuite/s4u/listen_async/listen_async.tesh
 include teshsuite/s4u/ns3-from-src-to-itself/ns3-from-src-to-itself.cpp
@@ -760,6 +795,8 @@ include teshsuite/s4u/vm-live-migration/vm-live-migration.cpp
 include teshsuite/s4u/vm-live-migration/vm-live-migration.tesh
 include teshsuite/s4u/vm-suicide/vm-suicide.cpp
 include teshsuite/s4u/vm-suicide/vm-suicide.tesh
+include teshsuite/s4u/wait-all-for/wait-all-for.cpp
+include teshsuite/s4u/wait-all-for/wait-all-for.tesh
 include teshsuite/s4u/wait-any-for/wait-any-for.cpp
 include teshsuite/s4u/wait-any-for/wait-any-for.tesh
 include teshsuite/simdag/availability/availability.c
@@ -818,6 +855,7 @@ include teshsuite/smpi/coll-allreduce/coll-allreduce.tesh
 include teshsuite/smpi/coll-alltoall/clusters.tesh
 include teshsuite/smpi/coll-alltoall/coll-alltoall.c
 include teshsuite/smpi/coll-alltoall/coll-alltoall.tesh
+include teshsuite/smpi/coll-alltoall/griffon.tesh
 include teshsuite/smpi/coll-alltoallv/coll-alltoallv.c
 include teshsuite/smpi/coll-alltoallv/coll-alltoallv.tesh
 include teshsuite/smpi/coll-barrier/coll-barrier.c
@@ -840,6 +878,7 @@ include teshsuite/smpi/hostfile
 include teshsuite/smpi/hostfile_cluster
 include teshsuite/smpi/hostfile_coll
 include teshsuite/smpi/hostfile_empty
+include teshsuite/smpi/hostfile_griffon
 include teshsuite/smpi/hostfile_io
 include teshsuite/smpi/hostfile_mpich
 include teshsuite/smpi/io-all-at/io-all-at.c
@@ -1669,6 +1708,8 @@ include teshsuite/smpi/pt2pt-pingpong/TI_output.tesh
 include teshsuite/smpi/pt2pt-pingpong/broken_hostfiles.tesh
 include teshsuite/smpi/pt2pt-pingpong/pt2pt-pingpong.c
 include teshsuite/smpi/pt2pt-pingpong/pt2pt-pingpong.tesh
+include teshsuite/smpi/replay-ti-colls/replay-ti-colls.c
+include teshsuite/smpi/replay-ti-colls/replay-ti-colls.tesh
 include teshsuite/smpi/timers/timers.c
 include teshsuite/smpi/timers/timers.tesh
 include teshsuite/smpi/topo-cart-sub/topo-cart-sub.c
@@ -1768,10 +1809,8 @@ include doc/doxygen/module-index.doc
 include doc/doxygen/module-sd.doc
 include doc/doxygen/module-surf.doc
 include doc/doxygen/module-trace.doc
-include doc/doxygen/module-xbt.doc
 include doc/doxygen/outcomes_vizu.doc
 include doc/doxygen/platform.doc
-include doc/doxygen/platform_lua.doc
 include doc/doxygen/uhood.doc
 include doc/doxygen/uhood_arch.doc
 include doc/doxygen/uhood_switch.doc
@@ -1780,7 +1819,6 @@ include docs/README.md
 include docs/bin/extract_logs_hierarchy.pl
 include docs/find-missing.ignore
 include docs/find-missing.py
-include docs/ignored_symbols
 include docs/manpages/smpicc.1
 include docs/manpages/smpicxx.1
 include docs/manpages/smpif90.1
@@ -1798,10 +1836,12 @@ include docs/source/Introduction.rst
 include docs/source/Models.rst
 include docs/source/Outcomes.rst
 include docs/source/Platform.rst
+include docs/source/Platform_cpp.rst
 include docs/source/Platform_examples.rst
 include docs/source/Platform_howtos.rst
 include docs/source/Platform_routing.rst
 include docs/source/Plugins.rst
+include docs/source/Release_Notes.rst
 include docs/source/Start_your_own_project.rst
 include docs/source/The_XBT_toolbox.rst
 include docs/source/Tutorial_Algorithms.rst
@@ -1839,9 +1879,27 @@ include docs/source/img/extlink.svg
 include docs/source/img/graphical-toc.svg
 include docs/source/img/smpi_simgrid_alltoall_pair_16.png
 include docs/source/img/smpi_simgrid_alltoall_ring_16.png
+include docs/source/img/starzone.drawio
+include docs/source/img/starzone.svg
 include docs/source/img/zone_hierarchy.png
+include docs/source/img/zone_tree.drawio
+include docs/source/img/zone_tree.svg
+include docs/source/img/zoom_comm.drawio
+include docs/source/img/zoom_comm.svg
 include docs/source/index.rst
 include docs/source/intl.rst
+include docs/source/tuto_disk/CMakeLists.txt
+include docs/source/tuto_disk/Dockerfile
+include docs/source/tuto_disk/analysis.org
+include docs/source/tuto_disk/analysis.rst
+include docs/source/tuto_disk/fig/edel_read_dhist.png
+include docs/source/tuto_disk/fig/edel_write_dhist.png
+include docs/source/tuto_disk/fig/griffon_deg.png
+include docs/source/tuto_disk/fig/griffon_read_dhist.png
+include docs/source/tuto_disk/fig/griffon_write_dhist.png
+include docs/source/tuto_disk/fig/simgrid_results.png
+include docs/source/tuto_disk/init.el
+include docs/source/tuto_disk/tuto_disk.cpp
 include docs/source/tuto_s4u/deployment1.xml
 include docs/source/tuto_s4u/deployment2.xml
 include docs/source/tuto_s4u/deployment3.xml
@@ -1868,6 +1926,7 @@ include examples/cpp/CMakeLists.txt
 include examples/deprecated/java/CMakeLists.txt
 include examples/deprecated/msg/mc/CMakeLists.txt
 include examples/deprecated/simdag/CMakeLists.txt
+include examples/platforms/CMakeLists.txt
 include examples/platforms/bypassRoute.xml
 include examples/platforms/bypassZoneRoute.xml
 include examples/platforms/cloud.xml
@@ -1891,6 +1950,7 @@ include examples/platforms/energy_cluster.xml
 include examples/platforms/energy_platform.xml
 include examples/platforms/faulty_host.xml
 include examples/platforms/g5k.xml
+include examples/platforms/griffon.cpp
 include examples/platforms/griffon.xml
 include examples/platforms/hosts_with_disks.xml
 include examples/platforms/meta_cluster.xml
@@ -1916,6 +1976,7 @@ include examples/platforms/profiles/trace_A_failure.txt
 include examples/platforms/profiles/trace_B.txt
 include examples/platforms/prop.xml
 include examples/platforms/ptask_L07.xml
+include examples/platforms/routing_cluster.cpp
 include examples/platforms/routing_cluster.lua
 include examples/platforms/routing_cluster.xml
 include examples/platforms/routing_none.xml
@@ -1952,7 +2013,6 @@ include examples/python/comm-waitall/comm-waitall_d.xml
 include examples/python/comm-waitany/comm-waitany_d.xml
 include examples/smpi/CMakeLists.txt
 include examples/smpi/NAS/CMakeLists.txt
-include examples/smpi/mc/non_deterministic.tesh
 include examples/smpi/mc/only_send_deterministic.tesh
 include examples/smpi/replay_multiple/CMakeLists.txt
 include examples/smpi/replay_multiple_manual_deploy/CMakeLists.txt
@@ -1974,6 +2034,7 @@ include include/simgrid/jedule/jedule.hpp
 include include/simgrid/jedule/jedule_events.hpp
 include include/simgrid/jedule/jedule_platform.hpp
 include include/simgrid/jedule/jedule_sd_binding.h
+include include/simgrid/kernel/ProfileBuilder.hpp
 include include/simgrid/kernel/Timer.hpp
 include include/simgrid/kernel/future.hpp
 include include/simgrid/kernel/resource/Action.hpp
@@ -2213,6 +2274,7 @@ include src/kernel/resource/profile/FutureEvtSet.cpp
 include src/kernel/resource/profile/FutureEvtSet.hpp
 include src/kernel/resource/profile/Profile.cpp
 include src/kernel/resource/profile/Profile.hpp
+include src/kernel/resource/profile/ProfileBuilder.cpp
 include src/kernel/resource/profile/Profile_test.cpp
 include src/kernel/resource/profile/StochasticDatedValue.cpp
 include src/kernel/resource/profile/StochasticDatedValue.hpp
@@ -2230,6 +2292,7 @@ include src/kernel/routing/FullZone.cpp
 include src/kernel/routing/FullZone_test.cpp
 include src/kernel/routing/NetPoint.cpp
 include src/kernel/routing/NetZoneImpl.cpp
+include src/kernel/routing/NetZone_test.hpp
 include src/kernel/routing/RoutedZone.cpp
 include src/kernel/routing/StarZone.cpp
 include src/kernel/routing/StarZone_test.cpp
@@ -2380,7 +2443,6 @@ include src/simix/popping_private.hpp
 include src/simix/simcalls.in
 include src/simix/simcalls.py
 include src/simix/smx_context.cpp
-include src/simix/smx_deployment.cpp
 include src/simix/smx_global.cpp
 include src/simix/smx_private.hpp
 include src/smpi/bindings/smpi_f77.cpp
@@ -2570,6 +2632,12 @@ include src/smpi/smpirun.in
 include src/smpi/smpitools.sh
 include src/surf/HostImpl.cpp
 include src/surf/HostImpl.hpp
+include src/surf/LinkImpl.cpp
+include src/surf/LinkImpl.hpp
+include src/surf/LinkImplIntf.hpp
+include src/surf/SplitDuplexLinkImpl.cpp
+include src/surf/SplitDuplexLinkImpl.hpp
+include src/surf/SplitDuplexLinkImpl_test.cpp
 include src/surf/cpu_cas01.cpp
 include src/surf/cpu_cas01.hpp
 include src/surf/cpu_interface.cpp
diff --git a/NEWS b/NEWS
index 11e6a16..cd4f2d4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,24 @@
+                    _               _____  ____   ___
+__   _____ _ __ ___(_) ___  _ __   |___ / |___ \ / _ \
+\ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \   __) | (_) |
+ \ V /  __/ |  \__ \ | (_) | | | |  ___) | / __/ \__, |
+  \_/ \___|_|  |___/_|\___/|_| |_| |____(_)_____|  /_/
+               (unreleased)
+
                     _               _____  ____  ___
 __   _____ _ __ ___(_) ___  _ __   |___ / |___ \( _ )
 \ \ / / _ \ '__/ __| |/ _ \| '_ \    |_ \   __) / _ \
  \ V /  __/ |  \__ \ | (_) | | | |  ___) | / __/ (_) |
   \_/ \___|_|  |___/_|\___/|_| |_| |____(_)_____\___/
-               (unreleased)
+               July 14. 2021
+
+The Victoriadagarna Release (birthday of Crown Princess Victoria)
+  
+  * Programmatic platform description (only C++ for now).
+  * New plugin to simplify producer/consumer applications.
+  * MC: new tutorial and associated docker image.
+  * SMPI: improve error handling for incorrect advanced usages.
+  * Many internal cleanups and refactoring to prepare the future.
 
                     _               _____  ____ _____
 __   _____ _ __ ___(_) ___  _ __   |___ / |___ \___  |
@@ -12,12 +27,12 @@ __   _____ _ __ ___(_) ___  _ __   |___ / |___ \___  |
   \_/ \___|_|  |___/_|\___/|_| |_| |____(_)_____/_/
                March 29. 2021
 
-  The Ragnar Release (anniversary of the siege of Paris by Vikings in 845)
+The Ragnar Release (anniversary of the siege of Paris by Vikings in 845)
 
-    * SMPI: can now report leaks and hint about the mallocs and kernels hindering simulation scalability
-    * Doc: Several new sections in the user manual, and start documenting the internals.
-    * S4U: Direct comms from host to host, without mailboxes.
-    * Many internal cleanups and refactoring to prepare the future.
+  * SMPI: can now report leaks and hint about the mallocs and kernels hindering simulation scalability
+  * Doc: Several new sections in the user manual, and start documenting the internals.
+  * S4U: Direct comms from host to host, without mailboxes.
+  * Many internal cleanups and refactoring to prepare the future.
 
                     _               _____  ____   __
 __   _____ _ __ ___(_) ___  _ __   |___ / |___ \ / /_
index 1a9091e..b37f2f5 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,6 +1,5 @@
 [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)
 [![Build Status](https://ci.inria.fr/simgrid/buildStatus/icon?job=SimGrid)](https://ci.inria.fr/simgrid/job/SimGrid/)
-[![Travis Status](https://img.shields.io/travis/simgrid/simgrid/master.svg?logo=travis)](https://travis-ci.org/simgrid/simgrid)
 [![AppVeyor Status](https://ci.appveyor.com/api/projects/status/gvcssh340fwtoc35?svg=true)](https://ci.appveyor.com/project/mquinson/simgrid)
 [![SonarCloud Status](https://sonarcloud.io/api/project_badges/measure?project=simgrid_simgrid&metric=alert_status)](https://sonarcloud.io/dashboard/?id=simgrid_simgrid)
 [![Doc](https://readthedocs.org/projects/pip/badge/?version=stable)](https://simgrid.org/doc/latest/)
@@ -29,9 +28,11 @@ make install
 [local version](docs/source).
 
 You can also ask your questions, or simply discuss with other users on 
-to the [user mailing list](http://lists.gforge.inria.fr/mailman/listinfo/simgrid-user)
+to the [SimGrid mattermost](https://framateam.org/simgrid/channels/town-square)
 or on the #simgrid IRC channel of the oftc network.
 
+Last, the main development of SimGrid is done on [Framagit](https://framagit.org/simgrid/simgrid/),
+but we also maintain a [GitHub mirror](https://github.com/simgrid/simgrid/) and an [Inria GitLab mirror](https://gitlab.inria.fr/simgrid/simgrid), 
 
 Thanks for using our software. Please do great things with it and tell
 the world about it. Tell us, too, because we love to have positive
index db98d17..00ee2d3 100644 (file)
@@ -22,7 +22,7 @@ Please apply the following checklist before releasing.
   - The release dub name matches the one given in ChangeLog file
 - Tests
   - The "make distcheck" target works (tested by jenkins)
-  - All tests pass on everything on ci + travis/macOS + AppVeyor
+  - All tests pass on everything on ci + AppVeyor
   - Tutorials and derivative projects build correctly
     https://framagit.org/simgrid/simgrid-template-s4u/pipelines
     https://framagit.org/simgrid/external-projects-ci/pipelines
index e7aba36..43617ab 100644 (file)
@@ -138,9 +138,7 @@ We use <a href="https://ci.inria.fr/simgrid/">Jenkins on Inria
 servers</a> as a workhorse: it runs all of our tests for many
 configurations. It takes a long time to answer, and it often reports
 issues but when it's green, then you know that SimGrid is very fit!
-We use <a href="https://travis-ci.org/simgrid/simgrid">Travis</a> to
-quickly run some tests on Linux and Mac. It answers quickly but may
-miss issues. And we use <a href="https://ci.appveyor.com/project/mquinson/simgrid">AppVeyor</a>
+We use <a href="https://ci.appveyor.com/project/mquinson/simgrid">AppVeyor</a>
 to build and somehow test SimGrid on windows. 
 
 @subsection inside_tests_jenkins Jenkins on the Inria CI servers
@@ -205,23 +203,9 @@ pkg install boost-libs cmake openjdk8 automake libxslt libxml2 libunwind git hto
 brew install cmake boost libunwind-headers libxslt git python3 
 @endverbatim
 
-@subsection inside_tests_travis Travis
-
-Travis is a free (as in free beer) Continuous Integration system that
-open-sourced project can use freely. It is very well integrated in the
-GitHub ecosystem. There is a plenty of documentation out there. Our
-configuration is in the file .travis.yml as it should be, and the
-result is here: https://travis-ci.org/simgrid/simgrid
-
-The .travis.yml configuration file can be useful if you fail to get
-SimGrid to compile on modern mac systems. We use the @c brew package
-manager there, and it works like a charm.
-
 @subsection inside_tests_appveyor AppVeyor
 
-AppVeyor aims at becoming the Travis of Windows. It is maybe less
-mature than Travis, or maybe it is just that I'm less trained in
-Windows. Our configuration is in the file appveyor.yml as it should
+Our configuration is in the file appveyor.yml as it should
 be, and the result is here: https://ci.appveyor.com/project/mquinson/simgrid
 
 We use @c Choco as a package manager on AppVeyor, and it is sufficient
@@ -252,7 +236,4 @@ open-source project can use it at no cost. That is what we are doing.
 Don't miss the great looking dashboard here: 
 https://sonarcloud.io/dashboard?id=simgrid_simgrid
 
-This tool is enriched by the script @c tools/internal/travis-sonarqube.sh 
-that is run from @c .travis.yml
-
 */
diff --git a/doc/doxygen/module-xbt.doc b/doc/doxygen/module-xbt.doc
deleted file mode 100644 (file)
index d3dc154..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/** @addtogroup XBT_API
-
-   The XBT functionalities fall into several categories:
-    - Portability support
-      - @ref XBT_syscall
-      - @ref XBT_str
-    - Grounding features
-      - @ref XBT_ex
-      - @ref XBT_ex_c
-      - @ref XBT_log
-      - @ref XBT_error
-      - @ref XBT_config
-      - @ref XBT_mallocator
-    - Data structures
-      - @ref XBT_dynar
-      - @ref XBT_dict
-    - @ref XBT_misc
-      - @ref XBT_graph
-
-  @{ */
-   /** @defgroup XBT_grounding   Grounding features */
-   /** @defgroup XBT_adt         Usual data structures */
-   /** @defgroup XBT_misc        Miscellaneous */
-/** @} */
-
-
-########################################################################
-
-
-/** @addtogroup XBT_grounding
-
-  Grounding features are the basement of SimGrid. You'll find portable (and
-  secure) wrappers to the malloc-like functions, logging support, error
-  reporting features, etc.
-
-  @{ */
-
-     /** @defgroup XBT_syscall Malloc and friends */
-     /** @defgroup XBT_str     String related functions */
-     /** @defgroup XBT_ex     Exception support (C++) */
-     /** @defgroup XBT_ex_c   Exception support (C)   */
-     /** @defgroup XBT_log    Logging support */
-     /** @defgroup XBT_error  Assert macro family */
-     /** @defgroup XBT_config Configuration support */
-     /** @defgroup XBT_mallocator Mallocators */
-/** @} */
-
-
-
-
-########################################################################
-
-/** @addtogroup XBT_adt
-
-  Here are the basic data containers that every C programmer rewrites one day.
-  You won't need to do so yourself, you lucky one, because we did it for you.
-  However, if you are programming in C++ you might want to use C++ containers
-  instead.
-
-  @{ */
-     /** @defgroup XBT_dynar  Dynar: generic dynamic array */
-     /** @defgroup XBT_dict   Dict: generic dictionary */
-/** @} */
-
-
-########################################################################
-
-/** @addtogroup XBT_misc
-
-  Here are several general purposes library components designed specially
-  for you, you lucky one.
-
-
-  @{ */
-     /** @defgroup XBT_graph General purpose graph library */
-     /** @defgroup XBT_parmap Parallel map */    
-     /** @defgroup XBT_synchro Simulated Synchronization */    
-     /** @defgroup XBT_context Portable context implementation */              
-     /** @defgroup XBT_replay Replay */
-/** @} */ 
-
diff --git a/doc/doxygen/platform_lua.doc b/doc/doxygen/platform_lua.doc
deleted file mode 100644 (file)
index a844a79..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*! \page platform_lua Describing the platform with lua
-
-@tableofcontents
-
-
-To describe your virtual platform, you can provide a lua script
-instead of an XML file. This is really easy: just pass the script file
-where an XML file was expected (eg in @ref MSG_create_environment()),
-and you are done. 
-
-In the near future, it should become possible to change the platform
-from in C++ and Java thanks to the the S4U interface. When this
-happens, the lua interface will be changed to match the S4U one.
-
-That is why the current lua API is not documented. It is very close to
-the XML interface, and you have some examples that you can use to
-understand this module. If you use the current API, just drop us a
-mail so that we keep it working once S4U is out, to give you the time
-to switch at your pace.
-
-
-@section pf_lua_why Why lua ?
-
-Lua is a fast and portable scripting language. Its main goal is to
-make the internal mechanics of C/C++ programs easily recombinable from
-a script. It is for example heavily used in the gaming industry: C++
-programmers do fast 3D game engines, that game designers reuse easily to
-tell stories. 
-
-Similarly, our goal is to decouple the internals of the simulation
-engine from the usage of that engine. It should give our users the
-full power of reconfiguring the tool without digging into our
-implementation. Admittedly, we are not there yet...
-
-*/
index 632ecd9..7da20b4 100755 (executable)
@@ -1,5 +1,10 @@
 #! /bin/bash
 #
+# Copyright (c) 2018-2021. The SimGrid Team. All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
 # Simplistic script to rebuild our documentation with sphinx-build
 
 # If you are missing some dependencies, try: pip3 install --requirement docs/requirements.txt
@@ -15,7 +20,7 @@ if [ "x$1" != 'xdoxy' ] && [ -e build/xml ] ; then
 else
   set -x
   rm -rf build/xml source/api/
-  (cd source; doxygen 2>&1; cd ..) | grep -v "is not documented." #   XXXXX Reduce the verbosity for now
+  (cd source; doxygen 2>&1; cd ..) | (grep -v "is not documented." || true) # XXXXX Reduce the verbosity for now
   set +x
 fi
 
index e2ec4ed..49e55af 100644 (file)
@@ -2,233 +2,37 @@ This file lists the symbols ignored in the documentation.
 It follows the RST syntax but is completely ignored by sphinx. 
 It is only used by find-missing, that will not report any definition linked here as missing.
 
-# These ones trigger a bug in autodoxy, that get confused with the const in the function parameter
-# So I document them manually in the rst for now. Shame, weak.
-.. autodoxyvar:: simgrid::s4u::Link::on_communicate
-.. autodoxyvar:: simgrid::s4u::Actor::on_host_change
-.. autodoxyvar:: simgrid::s4u::Exec::on_completion
-.. autodoxyvar:: simgrid::s4u::Exec::on_start
-
 # This is a bug in find-missing, as these symbols are actually documented
-.. autodoxymethod:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< Link * > &links, double *latency)
-.. autodoxymethod:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< kernel::resource::LinkImpl * > &links, double *latency)
+.. doxygenTODOfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< Link * > &links, double *latency)
+.. doxygenTODOfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< kernel::resource::LinkImpl * > &links, double *latency)
 
 # The fact that actors can return an int is a legacy behavior for MSG
-.. autodoxymethod:: simgrid::s4u::Engine::register_default(const kernel::actor::ActorCodeFactory &factory)
-.. autodoxymethod:: simgrid::s4u::Engine::register_default(int(*code)(int, char **))
-.. autodoxymethod:: simgrid::s4u::Engine::register_function(const std::string &name, const kernel::actor::ActorCodeFactory &factory)
-.. autodoxymethod:: simgrid::s4u::Engine::register_function(const std::string &name, int(*code)(int, char **))
-
-
-# These could be hidden as private things, eg in s4u_Exec.cpp
-.. autodoxymethod:: simgrid::s4u::ExecPar::get_remaining()
-.. autodoxymethod:: simgrid::s4u::ExecPar::get_remaining_ratio()
-.. autodoxymethod:: simgrid::s4u::ExecPar::start()
-.. autodoxymethod:: simgrid::s4u::ExecSeq::get_remaining()
-.. autodoxymethod:: simgrid::s4u::ExecSeq::get_remaining_ratio()
-.. autodoxymethod:: simgrid::s4u::ExecSeq::set_host(Host *host)
-.. autodoxymethod:: simgrid::s4u::ExecSeq::start()
-
-# I don't plan to document MSG in the new way.
-.. autodoxymethod:: ::MSG_barrier_destroy(const_sg_bar_t bar)
-.. autodoxymethod:: ::MSG_barrier_init(unsigned int count)
-.. autodoxymethod:: ::MSG_barrier_wait(msg_bar_t bar)
-.. autodoxymethod:: ::MSG_comm_destroy(const_msg_comm_t comm)
-.. autodoxymethod:: ::MSG_comm_get_status(const_msg_comm_t comm)
-.. autodoxymethod:: ::MSG_comm_get_task(const_msg_comm_t comm)
-.. autodoxymethod:: ::MSG_comm_test(msg_comm_t comm)
-.. autodoxymethod:: ::MSG_comm_testany(const_xbt_dynar_t comms)
-.. autodoxymethod:: ::MSG_comm_wait(msg_comm_t comm, double timeout)
-.. autodoxymethod:: ::MSG_comm_waitall(msg_comm_t *comm, int nb_elem, double timeout)
-.. autodoxymethod:: ::MSG_comm_waitany(const_xbt_dynar_t comms)
-.. autodoxymethod:: ::MSG_config(const char *key, const char *value)
-.. autodoxymethod:: ::MSG_create_environment(const char *file)
-.. autodoxymethod:: ::MSG_function_register(const char *name, xbt_main_func_t code)
-.. autodoxymethod:: ::MSG_function_register_default(xbt_main_func_t code)
-.. autodoxymethod:: ::MSG_get_clock()
-.. autodoxymethod:: ::MSG_get_host_by_name(const char *name)
-.. autodoxymethod:: ::MSG_get_host_number()
-.. autodoxymethod:: ::MSG_get_sent_msg()
-.. autodoxymethod:: ::MSG_host_by_name(const char *name)
-.. autodoxymethod:: ::MSG_host_get_attached_storage_lists(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_core_number(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_data(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_load(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_mounted_storage_list(sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_name(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_nb_pstates(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_power_peak_at(const_sg_host_t host, int pstate_index)
-.. autodoxymethod:: ::MSG_host_get_process_list(const_sg_host_t host, xbt_dynar_t whereto)
-.. autodoxymethod:: ::MSG_host_get_properties(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_property_value(const_sg_host_t host, const char *name)
-.. autodoxymethod:: ::MSG_host_get_pstate(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_get_speed(const_sg_host_t host)
-.. autodoxymethod:: ::MSG_host_is_on(const_sg_host_t h)
-.. autodoxymethod:: ::MSG_host_off(sg_host_t h)
-.. autodoxymethod:: ::MSG_host_on(sg_host_t h)
-.. autodoxymethod:: ::MSG_host_self()
-.. autodoxymethod:: ::MSG_host_set_data(sg_host_t host, void *data)
-.. autodoxymethod:: ::MSG_host_set_property_value(sg_host_t host, const char *name, const char *value)
-.. autodoxymethod:: ::MSG_host_set_pstate(sg_host_t host, int pstate)
-.. autodoxymethod:: ::MSG_hosts_as_dynar()
-.. autodoxymethod:: ::MSG_init_nocheck(int *argc, char **argv)
-.. autodoxymethod:: ::MSG_launch_application(const char *file)
-.. autodoxymethod:: ::MSG_mailbox_set_async(const char *alias)
-.. autodoxymethod:: ::MSG_main()
-.. autodoxymethod:: ::MSG_parallel_task_create(const char *name, int host_nb, const msg_host_t *host_list, double *flops_amount, double *bytes_amount, void *data)
-.. autodoxymethod:: ::MSG_parallel_task_execute(msg_task_t task)
-.. autodoxymethod:: ::MSG_parallel_task_execute_with_timeout(msg_task_t task, double timeout)
-.. autodoxymethod:: ::MSG_process_attach(const char *name, void *data, msg_host_t host, xbt_dict_t properties)
-.. autodoxymethod:: ::MSG_process_auto_restart_set(msg_process_t process, int auto_restart)
-.. autodoxymethod:: ::MSG_process_create(const char *name, xbt_main_func_t code, void *data, msg_host_t host)
-.. autodoxymethod:: ::MSG_process_create_with_arguments(const char *name, xbt_main_func_t code, void *data, msg_host_t host, int argc, char **argv)
-.. autodoxymethod:: ::MSG_process_create_with_environment(const char *name, xbt_main_func_t code, void *data, msg_host_t host, int argc, char **argv, xbt_dict_t properties)
-.. autodoxymethod:: ::MSG_process_daemonize(msg_process_t process)
-.. autodoxymethod:: ::MSG_process_detach()
-.. autodoxymethod:: ::MSG_process_from_PID(int pid)
-.. autodoxymethod:: ::MSG_process_get_PID(const_sg_actor_t process)
-.. autodoxymethod:: ::MSG_process_get_PPID(const_sg_actor_t process)
-.. autodoxymethod:: ::MSG_process_get_data(const_sg_actor_t process)
-.. autodoxymethod:: ::MSG_process_get_host(const_sg_actor_t process)
-.. autodoxymethod:: ::MSG_process_get_name(const_sg_actor_t process)
-.. autodoxymethod:: ::MSG_process_get_number()
-.. autodoxymethod:: ::MSG_process_get_properties(const_sg_actor_t process)
-.. autodoxymethod:: ::MSG_process_get_property_value(const_sg_actor_t process, const char *name)
-.. autodoxymethod:: ::MSG_process_is_suspended(msg_process_t process)
-.. autodoxymethod:: ::MSG_process_join(msg_process_t process, double timeout)
-.. autodoxymethod:: ::MSG_process_kill(msg_process_t process)
-.. autodoxymethod:: ::MSG_process_killall()
-.. autodoxymethod:: ::MSG_process_migrate(msg_process_t process, msg_host_t host)
-.. autodoxymethod:: ::MSG_process_on_exit(int_f_int_pvoid_t fun, void *data)
-.. autodoxymethod:: ::MSG_process_ref(const_sg_actor_t process)
-.. autodoxymethod:: ::MSG_process_restart(msg_process_t process)
-.. autodoxymethod:: ::MSG_process_resume(msg_process_t process)
-.. autodoxymethod:: ::MSG_process_self()
-.. autodoxymethod:: ::MSG_process_self_PID()
-.. autodoxymethod:: ::MSG_process_self_PPID()
-.. autodoxymethod:: ::MSG_process_self_name()
-.. autodoxymethod:: ::MSG_process_set_data(msg_process_t process, void *data)
-.. autodoxymethod:: ::MSG_process_set_data_cleanup(void_f_pvoid_t data_cleanup)
-.. autodoxymethod:: ::MSG_process_set_kill_time(msg_process_t process, double kill_time)
-.. autodoxymethod:: ::MSG_process_sleep(double nb_sec)
-.. autodoxymethod:: ::MSG_process_suspend(msg_process_t process)
-.. autodoxymethod:: ::MSG_process_unref(const_sg_actor_t process)
-.. autodoxymethod:: ::MSG_process_yield()
-.. autodoxymethod:: ::MSG_processes_as_dynar()
-.. autodoxymethod:: ::MSG_sem_acquire(msg_sem_t sem)
-.. autodoxymethod:: ::MSG_sem_acquire_timeout(msg_sem_t sem, double timeout)
-.. autodoxymethod:: ::MSG_sem_destroy(const_sg_sem_t sem)
-.. autodoxymethod:: ::MSG_sem_get_capacity(msg_sem_t sem)
-.. autodoxymethod:: ::MSG_sem_init(int initial_value)
-.. autodoxymethod:: ::MSG_sem_release(msg_sem_t sem)
-.. autodoxymethod:: ::MSG_sem_would_block(msg_sem_t sem)
-.. autodoxymethod:: ::MSG_storage_get_by_name(const char *name)
-.. autodoxymethod:: ::MSG_storage_get_data(const_sg_storage_t storage)
-.. autodoxymethod:: ::MSG_storage_get_host(const_sg_storage_t storage)
-.. autodoxymethod:: ::MSG_storage_get_name(const_sg_storage_t storage)
-.. autodoxymethod:: ::MSG_storage_get_properties(const_sg_storage_t storage)
-.. autodoxymethod:: ::MSG_storage_get_property_value(const_sg_storage_t storage, const char *name)
-.. autodoxymethod:: ::MSG_storage_read(msg_storage_t storage, sg_size_t size)
-.. autodoxymethod:: ::MSG_storage_set_data(msg_storage_t storage, void *data)
-.. autodoxymethod:: ::MSG_storage_set_property_value(msg_storage_t storage, const char *name, const char *value)
-.. autodoxymethod:: ::MSG_storage_write(msg_storage_t storage, sg_size_t size)
-.. autodoxymethod:: ::MSG_storages_as_dynar()
-.. autodoxymethod:: ::MSG_task_cancel(msg_task_t task)
-.. autodoxymethod:: ::MSG_task_create(const char *name, double flops_amount, double bytes_amount, void *data)
-.. autodoxymethod:: ::MSG_task_destroy(msg_task_t task)
-.. autodoxymethod:: ::MSG_task_dsend(msg_task_t task, const char *alias, void_f_pvoid_t cleanup)
-.. autodoxymethod:: ::MSG_task_dsend_bounded(msg_task_t task, const char *alias, void_f_pvoid_t cleanup, double maxrate)
-.. autodoxymethod:: ::MSG_task_execute(msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_bytes_amount(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_category(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_data(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_flops_amount(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_name(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_remaining_communication(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_remaining_work_ratio(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_sender(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_get_source(const_msg_task_t task)
-.. autodoxymethod:: ::MSG_task_irecv(msg_task_t *task, const char *alias)
-.. autodoxymethod:: ::MSG_task_irecv_bounded(msg_task_t *task, const char *alias, double rate)
-.. autodoxymethod:: ::MSG_task_isend(msg_task_t task, const char *alias)
-.. autodoxymethod:: ::MSG_task_isend_bounded(msg_task_t task, const char *alias, double maxrate)
-.. autodoxymethod:: ::MSG_task_listen(const char *alias)
-.. autodoxymethod:: ::MSG_task_listen_from(const char *alias)
-.. autodoxymethod:: ::MSG_task_receive(msg_task_t *task, const char *alias)
-.. autodoxymethod:: ::MSG_task_receive_bounded(msg_task_t *task, const char *alias, double rate)
-.. autodoxymethod:: ::MSG_task_receive_with_timeout(msg_task_t *task, const char *alias, double timeout)
-.. autodoxymethod:: ::MSG_task_receive_with_timeout_bounded(msg_task_t *task, const char *alias, double timeout, double rate)
-.. autodoxymethod:: ::MSG_task_send(msg_task_t task, const char *alias)
-.. autodoxymethod:: ::MSG_task_send_bounded(msg_task_t task, const char *alias, double rate)
-.. autodoxymethod:: ::MSG_task_send_with_timeout(msg_task_t task, const char *alias, double timeout)
-.. autodoxymethod:: ::MSG_task_send_with_timeout_bounded(msg_task_t task, const char *alias, double timeout, double maxrate)
-.. autodoxymethod:: ::MSG_task_set_bound(msg_task_t task, double bound)
-.. autodoxymethod:: ::MSG_task_set_bytes_amount(msg_task_t task, double bytes_amount)
-.. autodoxymethod:: ::MSG_task_set_category(msg_task_t task, const char *category)
-.. autodoxymethod:: ::MSG_task_set_data(msg_task_t task, void *data)
-.. autodoxymethod:: ::MSG_task_set_flops_amount(msg_task_t task, double flops_amount)
-.. autodoxymethod:: ::MSG_task_set_name(msg_task_t task, const char *name)
-.. autodoxymethod:: ::MSG_task_set_priority(msg_task_t task, double priority)
-.. autodoxymethod:: ::MSG_vm_create_core(msg_host_t pm, const char *name)
-.. autodoxymethod:: ::MSG_vm_create_multicore(msg_host_t pm, const char *name, int coreAmount)
-.. autodoxymethod:: ::MSG_vm_destroy(msg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_get_name(const_sg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_get_pm(const_sg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_get_ramsize(const_sg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_is_created(msg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_is_running(msg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_is_suspended(msg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_resume(msg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_set_bound(msg_vm_t vm, double bound)
-.. autodoxymethod:: ::MSG_vm_set_ramsize(msg_vm_t vm, size_t size)
-.. autodoxymethod:: ::MSG_vm_shutdown(msg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_start(msg_vm_t vm)
-.. autodoxymethod:: ::MSG_vm_suspend(msg_vm_t vm)
-.. autodoxymethod:: ::MSG_zone_get_by_name(const char *name)
-.. autodoxymethod:: ::MSG_zone_get_hosts(const_sg_netzone_t zone, xbt_dynar_t whereto)
-.. autodoxymethod:: ::MSG_zone_get_name(const_sg_netzone_t zone)
-.. autodoxymethod:: ::MSG_zone_get_property_value(const_sg_netzone_t zone, const char *name)
-.. autodoxymethod:: ::MSG_zone_get_root()
-.. autodoxymethod:: ::MSG_zone_get_sons(const_sg_netzone_t zone, xbt_dict_t whereto)
-.. autodoxymethod:: ::MSG_zone_set_property_value(msg_netzone_t zone, const char *name, const char *value)
-member ::MIN is of kind define
-member ::MAX is of kind define
-member ::MSG_TASK_UNINITIALIZED is of kind define
-member ::MSG_init is of kind define
-member ::MSG_task_recv is of kind define
-member ::MSG_task_recv_bounded is of kind define
-member ::msg_error_t is of kind enum
-
-# Storage must die
-.. autodoxymethod:: sg_host_get_attached_storage_list(const_sg_host_t host)
-.. autodoxymethod:: sg_host_get_mounted_storage_list(sg_host_t host)
-.. autodoxymethod:: simgrid::s4u::Host::get_attached_storages()
-.. autodoxymethod:: simgrid::s4u::Host::get_mounted_storages()
+.. doxygenTODOfunction:: simgrid::s4u::Engine::register_default(const kernel::actor::ActorCodeFactory &factory)
+.. doxygenTODOfunction:: simgrid::s4u::Engine::register_default(int(*code)(int, char **))
+.. doxygenTODOfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const kernel::actor::ActorCodeFactory &factory)
+.. doxygenTODOfunction:: simgrid::s4u::Engine::register_function(const std::string &name, int(*code)(int, char **))
 
 # These should not be public
-.. autodoxymethod:: simgrid::s4u::Link::get_impl()
-.. autodoxymethod:: simgrid::s4u::NetZone::get_impl()
-.. autodoxymethod:: simgrid::s4u::VirtualMachine::get_impl()
-.. autodoxymethod:: simgrid::s4u::Activity::get_impl()
-.. autodoxymethod:: simgrid::s4u::Comm::~Comm()
-.. autodoxymethod:: simgrid::s4u::Exec::~Exec()
-.. autodoxymethod:: simgrid::s4u::ExecPar::~ExecPar()
-.. autodoxymethod:: simgrid::s4u::ExecSeq::~ExecSeq()
-.. autodoxymethod:: simgrid::s4u::Io::~Io()
-
-# These ones are a bug of Doxygen, that parse them as variables instead of types.
-# So we don't use this bogus parse result, but go directly for cpp:type directives in app_s4u.rst
-.. autodoxyvar:: ::const_sg_actor_t
-.. autodoxyvar:: ::const_sg_bar_t
-.. autodoxyvar:: ::const_sg_mutex_t
-.. autodoxyvar:: ::const_sg_sem_t
-.. autodoxyvar:: ::const_sg_host_t
-.. autodoxyvar:: ::const_sg_storage_t
-.. autodoxyvar:: ::const_msg_comm_t
-.. autodoxyvar:: ::const_msg_task_t
-.. autodoxyvar:: ::const_sg_cond_t
-.. autodoxyvar:: ::const_sg_disk_t
-.. autodoxyvar:: ::const_sg_file_t
-.. autodoxyvar:: ::const_sg_link_t
-.. autodoxyvar:: ::const_sg_netzone_t
-.. autodoxyvar:: ::const_sg_vm_t
+.. doxygenfunction:: simgrid::s4u::Link::get_impl()
+.. doxygenfunction:: simgrid::s4u::NetZone::get_impl()
+.. doxygenfunction:: simgrid::s4u::VirtualMachine::get_vm_impl()
+.. doxygenfunction:: simgrid::s4u::Activity::get_impl()
+.. doxygenfunction:: simgrid::s4u::Comm::~Comm()
+.. doxygenfunction:: simgrid::s4u::Exec::~Exec()
+.. doxygenfunction:: simgrid::s4u::Io::~Io()
+
+# These are used to make the C++ objects visible from the C world
+.. doxygentypedef:: s4u_Actor
+.. doxygentypedef:: s4u_Barrier
+.. doxygentypedef:: s4u_Comm
+.. doxygentypedef:: s4u_ConditionVariable
+.. doxygentypedef:: s4u_Disk
+.. doxygentypedef:: s4u_Exec
+.. doxygentypedef:: s4u_File
+.. doxygentypedef:: s4u_Host
+.. doxygentypedef:: s4u_Link
+.. doxygentypedef:: s4u_Mailbox
+.. doxygentypedef:: s4u_Mutex
+.. doxygentypedef:: s4u_NetZone
+.. doxygentypedef:: s4u_Semaphore
+.. doxygentypedef:: s4u_VM
index c491e38..145e441 100755 (executable)
@@ -8,9 +8,9 @@
 
 """
 Search for symbols documented in both the XML files produced by Doxygen and the python modules,
-but not documented with autodoxy in the RST files.
+but not documented with breathe in the RST files.
 
-This script is tailored to SimGrid own needs and should be made more generic for autodoxy.
+This script is tailored to SimGrid own needs.
 
 If you are missing some dependencies, try:  pip3 install --requirement docs/requirements.txt
 """
@@ -144,6 +144,7 @@ for kind in python_decl:
 
 doxy_funs = {} # {classname: {func_name: [args]} }
 doxy_vars = {} # {classname: [names]}
+doxy_type = {} # {classname: [names]}
 
 # find the declarations in the XML files
 for arg in xml_files:
@@ -186,13 +187,17 @@ for arg in xml_files:
                 if name not in doxy_funs[compoundname]:
                     doxy_funs[compoundname][name] = []
                 doxy_funs[compoundname][name].append(args)
+            elif kind == "typedef":
+                if compoundname not in doxy_type:
+                    doxy_type[compoundname] = []
+                doxy_type[compoundname].append(name)                
             elif kind == "friend":
                 pass # Ignore friendship
             else:
                 print ("member {}::{} is of kind {}".format(compoundname, name, kind))
 
 # Forget about the declarations that are done in the RST
-with os.popen('grep doxygenfunction:: find-missing.ignore source/*rst|sed \'s/^.*doxygenfunction:: //\'') as pse:
+with os.popen('grep doxygenfunction:: find-missing.ignore source/*rst|sed \'s/^.*doxygenfunction:: //\'|sed \'s/ *const//\'') as pse:
     for line in (l.strip() for l in pse):
         (klass, obj, args) = (None, None, None)
         if "(" in line:
@@ -219,7 +224,7 @@ with os.popen('grep doxygenfunction:: find-missing.ignore source/*rst|sed \'s/^.
             doxy_funs[klass][obj].remove(args)
             if len(doxy_funs[klass][obj]) == 0:
                 del doxy_funs[klass][obj]
-with os.popen('grep autodoxyvar:: find-missing.ignore source/*rst|sed \'s/^.*autodoxyvar:: //\'') as pse:
+with os.popen('grep doxygenvariable:: find-missing.ignore source/*rst|sed \'s/^.*doxygenvariable:: //\'') as pse:
     for line in (l.strip() for l in pse):
         (klass, var) = line.rsplit('::', 1)
 
@@ -227,19 +232,46 @@ with os.popen('grep autodoxyvar:: find-missing.ignore source/*rst|sed \'s/^.*aut
             print("Warning: {} documented, but class {} not found in doxygen.".format(line, klass))
             continue
         if var not in doxy_vars[klass]:
-            print("Warning: Object {} documented but not found in {}".format(line, klass))
+            print("Warning: Object {} documented but not found in '{}'".format(line, klass))
         else:
 #            print("Found {} in {}".format(line, klass))
             doxy_vars[klass].remove(var)
             if len(doxy_vars[klass]) == 0:
                 del doxy_vars[klass]
+with os.popen('grep doxygentypedef:: find-missing.ignore source/*rst|sed \'s/^.*doxygentypedef:: //\'') as pse:
+    for line in (l.strip() for l in pse):
+        if '::' in line:
+            (klass, typ) = line.rsplit('::', 1)
+        else:
+            (klass, typ) = ('', line)
+
+        if klass not in doxy_type:
+            print("Warning: {} documented, but class {} not found in doxygen.".format(line, klass))
+            continue
+        if typ not in doxy_type[klass]:
+            print("Warning: Type {} documented but not found in '{}'".format(line, klass))
+        else:
+#            print("Found {} in {}".format(line, klass))
+            doxy_type[klass].remove(typ)
+            if len(doxy_type[klass]) == 0:
+                del doxy_type[klass]
 
 # Dump the undocumented Doxygen declarations 
 for obj in sorted(doxy_funs):
     for meth in sorted(doxy_funs[obj]):
         for args in sorted(doxy_funs[obj][meth]):
-            print(".. doxygenfunction:: {}::{}{}".format(obj, meth, args))
+            if obj == '':
+                print(".. doxygenfunction:: {}{}".format(meth, args))
+            else:
+                print(".. doxygenfunction:: {}::{}{}".format(obj, meth, args))
 
 for obj in doxy_vars:
     for meth in sorted(doxy_vars[obj]):
-        print(".. autodoxyvar:: {}::{}".format(obj, meth))
+        print(".. doxygenvariable:: {}::{}".format(obj, meth))
+
+for obj in doxy_type:
+    for meth in sorted(doxy_type[obj]):
+        if obj == '':
+            print(".. doxygentypedef:: {}".format(meth))
+        else:
+            print(".. doxygentypedef:: {}::{}".format(obj, meth))
diff --git a/docs/ignored_symbols b/docs/ignored_symbols
deleted file mode 100644 (file)
index 599ae43..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# Used by Build.sh
-MIN
-MAX
-SG_BEGIN_DECL
-msg_as_t
-MSG_OK
-MSG_HOST_FAILURE
-MSG_TASK_CANCELED
-MSG_TIMEOUT
-MSG_TRANSFER_FAILURE
-sg_msg_Comm
-simdata_task_t
-s_msg_task_t
-MSG_init_nocheck
-intrusive_ptr_release
-intrusive_ptr_add_ref
-get_filtered_netzones_recursive
-simgrid::s4u::Storage
-simgrid::s4u::Activity_T
-simgrid::s4u::Engine::get_storage_count
-simgrid::s4u::Engine::storage_by_name
-simgrid::s4u::Engine::storage_by_name_or_null
\ No newline at end of file
index f357a3b..d00e05a 100644 (file)
@@ -1,5 +1,8 @@
-breathe
-sphinx>=3.2.1
-sphinx_rtd_theme
+breathe>=4.26
+sphinx>=3.4.3,<4.0
+sphinx_rtd_theme>=0.5.2
 # sphinx_tabs v1.2.1 is required for Sphinx 2
 sphinx_tabs>=1.2.1
+javalang
+beautifulsoup4
+lxml
index a5497a8..936857d 100644 (file)
@@ -32,9 +32,9 @@ The most common way is to use the ``--cfg`` command line argument. For
 example, to set the item ``Item`` to the value ``Value``, simply
 type the following on the command-line:
 
-.. code-block:: shell
+.. code-block:: console
 
-   my_simulator --cfg=Item:Value (other arguments)
+   my_simulator --cfg=Item:Value (other arguments)
 
 Several ``--cfg`` command line arguments can naturally be used. If you
 need to include spaces in the argument, don't forget to quote the
@@ -150,6 +150,8 @@ Existing Configuration Items
 - **smpi/cpu-threshold:** :ref:`cfg=smpi/cpu-threshold`
 - **smpi/display-allocs:** :ref:`cfg=smpi/display-allocs`
 - **smpi/display-timing:** :ref:`cfg=smpi/display-timing`
+- **smpi/errors-are-fatal:** :ref:`cfg=smpi/errors-are-fatal`
+- **smpi/finalization-barrier:** :ref:`cfg=smpi/finalization-barrier`
 - **smpi/grow-injected-times:** :ref:`cfg=smpi/grow-injected-times`
 - **smpi/host-speed:** :ref:`cfg=smpi/host-speed`
 - **smpi/IB-penalty-factors:** :ref:`cfg=smpi/IB-penalty-factors`
@@ -162,6 +164,7 @@ Existing Configuration Items
 - **smpi/or:** :ref:`cfg=smpi/or`
 - **smpi/os:** :ref:`cfg=smpi/os`
 - **smpi/papi-events:** :ref:`cfg=smpi/papi-events`
+- **smpi/pedantic:** :ref:`cfg=smpi/pedantic`
 - **smpi/privatization:** :ref:`cfg=smpi/privatization`
 - **smpi/privatize-libs:** :ref:`cfg=smpi/privatize-libs`
 - **smpi/send-is-detached-thresh:** :ref:`cfg=smpi/send-is-detached-thresh`
@@ -342,10 +345,10 @@ the TCP congestion mechanism into account.  On Linux, this value can
 be retrieved using the following commands. Both give a set of values,
 and you should use the last one, which is the maximal size.
 
-.. code-block:: shell
+.. code-block:: console
 
-   cat /proc/sys/net/ipv4/tcp_rmem # gives the sender window
-   cat /proc/sys/net/ipv4/tcp_wmem # gives the receiver window
+   cat /proc/sys/net/ipv4/tcp_rmem # gives the sender window
+   cat /proc/sys/net/ipv4/tcp_wmem # gives the receiver window
 
 .. _cfg=network/bandwidth-factor:
 .. _cfg=network/latency-factor:
@@ -362,18 +365,30 @@ one the timings of packet-level simulators, as described in `Accuracy
 Study and Improvement of Network Simulation in the SimGrid Framework
 <http://mescal.imag.fr/membres/arnaud.legrand/articles/simutools09.pdf>`_.
 
+- **network/latency-factor**: apply a multiplier to latency.
+  Models the TCP slow-start mechanism.
+- **network/bandwidth-factor**: actual bandwidth perceived by the
+  user.
+- **network/weight-S**: bottleneck sharing constant parameter. Used
+  to calculate RTT.
+
+These parameters are the same for all communications in your simulation,
+independently of message size or source/destination hosts. A more flexible
+mechanism based on callbacks was introduced in SimGrid. It provides the user
+a callback that will be called for each communication, allowing the user
+to set different latency and bandwidth factors, based on the message size, links used
+or zones traversed. To more details of how to use it, please look at the
+`examples/cpp/network-factors/s4u-network-factors.cpp <https://framagit.org/simgrid/simgrid/tree/master/examples/cpp/network-factors/s4u-network-factors.cpp>`_.
+
 
 If you are using the SMPI model, these correction coefficients are
 themselves corrected by constant values depending on the size of the
 exchange.  By default SMPI uses factors computed on the Stampede
 Supercomputer at TACC, with optimal deployment of processes on
 nodes. Again, only hardcore experts should bother about this fact.
+For more details, see SMPI sections about :ref:`cfg=smpi/bw-factor` and :ref:`cfg=smpi/lat-factor`.
 
 
-.. todo:: This section should be rewritten, and actually explain the
-         options network/bandwidth-factor, network/latency-factor,
-         network/weight-S.
-
 .. _cfg=smpi/IB-penalty-factors:
 
 Infiniband model
@@ -547,9 +562,9 @@ Configuring the Model-Checking
 To enable SimGrid's model-checking support, the program should
 be executed using the simgrid-mc wrapper:
 
-.. code-block:: shell
+.. code-block:: console
 
-   simgrid-mc ./my_program
+   simgrid-mc ./my_program
 
 Safety properties are expressed as assertions using the function
 :cpp:func:`void MC_assert(int prop)`.
@@ -592,9 +607,9 @@ the command line, specifying the name of the file containing the
 property, as formatted by the `ltl2ba <https://github.com/utwente-fmt/ltl2ba>`_ program.
 Note that ltl2ba is not part of SimGrid and must be installed separately.
 
-.. code-block:: shell
+.. code-block:: console
 
-   simgrid-mc ./my_program --cfg=model-check/property:<filename>
+   simgrid-mc ./my_program --cfg=model-check/property:<filename>
 
 .. _cfg=model-check/checkpoint:
 
@@ -754,7 +769,7 @@ When the model checker finds an interesting path in the application
 execution graph (where a safety or liveness property is violated), it
 generates an identifier for this path. Here is an example of the output:
 
-.. code-block:: shell
+.. code-block:: console
 
    [  0.000000] (0:@) Check a safety property
    [  0.000000] (0:@) **************************
@@ -927,7 +942,7 @@ which value is either:
 Configuring the Tracing
 -----------------------
 
-The :ref:`tracing subsystem <outcomes_vizu>` can be configured in
+The :ref:`tracing subsystem <outcome_vizu>` can be configured in
 several different ways depending on the used interface (S4U, SMPI, SimDag)
 and the kind of traces that needs to be obtained. See the
 :ref:`Tracing Configuration Options subsection
@@ -940,7 +955,7 @@ you never used the tracing API.
 
 - Any SimGrid-based simulator (MSG, SimDag, SMPI, ...) and raw traces:
 
-  .. code-block:: shell
+  .. code-block:: none
 
      --cfg=tracing:yes --cfg=tracing/uncategorized:yes
 
@@ -951,7 +966,7 @@ you never used the tracing API.
 - MSG or SimDag-based simulator and categorized traces (you need to
   declare categories and classify your tasks according to them) 
 
-  .. code-block:: shell
+  .. code-block:: none
 
      --cfg=tracing:yes --cfg=tracing/categorized:yes
 
@@ -960,9 +975,9 @@ you never used the tracing API.
 
 - SMPI simulator and traces for a space/time view:
 
-  .. code-block:: shell
+  .. code-block:: console
 
-     smpirun -trace ...
+     smpirun -trace ...
 
   The `-trace` parameter for the smpirun script runs the simulation
   with ``--cfg=tracing:yes --cfg=tracing/smpi:yes``. Check the
@@ -974,13 +989,13 @@ reproduce an experiment. You have two ways to do that:
 
 - Add a string on top of the trace file as comment:
 
-  .. code-block:: shell
+  .. code-block:: none
 
      --cfg=tracing/comment:my_simulation_identifier
 
 - Add the contents of a textual file on top of the trace file as comment:
 
-  .. code-block:: shell
+  .. code-block:: none
 
      --cfg=tracing/comment-file:my_file_with_additional_information.txt
 
@@ -1087,7 +1102,7 @@ This option allows you to pass a file that contains two columns: The
 first column defines the section that will be subject to a speedup;
 the second column is the speedup. For instance:
 
-.. code-block:: shell
+.. code-block:: none
 
   "start:stop","ratio"
   "exchange_1.f:30:exchange_1.f:130",1.18244559422142
@@ -1212,7 +1227,7 @@ It is planned to make this feature available on a per-process (or per-thread?) b
 The first draft, however, just implements a "global" (i.e., for all processes) set
 of counters, the "default" set.
 
-.. code-block:: shell
+.. code-block:: none
 
    --cfg=smpi/papi-events:"default:PAPI_L3_LDM:PAPI_L2_LDM"
 
@@ -1263,9 +1278,9 @@ This configuration option can only use either full paths to libraries,
 or full names.  Check with ldd the name of the library you want to
 use.  For example:
 
-.. code-block:: shell
+.. code-block:: console
 
-   ldd allpairf90
+   ldd allpairf90
       ...
       libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007fbb4d91b000)
       ...
@@ -1308,6 +1323,49 @@ Each collective operation can be manually selected with a
 .. TODO:: All available collective algorithms will be made available
           via the ``smpirun --help-coll`` command.
 
+.. _cfg=smpi/finalization-barrier:
+
+Add a barrier in MPI_Finalize
+.............................
+
+**Option** ``smpi/finalization-barrier`` **default:** off
+
+By default, SMPI processes are destroyed as soon as soon as their code ends,
+so after a successful MPI_Finalize call returns. In some rare cases, some data
+might have been attached to MPI objects still active in the remaining processes,
+and can be destroyed eagerly by the finished process.
+If your code shows issues at finalization, such as segmentation fault, triggering
+this option will add an explicit MPI_Barrier(MPI_COMM_WORLD) call inside the
+MPI_Finalize, so that all processes will terminate at almost the same point.
+It might affect the total timing by the cost of a barrier.
+
+.. _cfg=smpi/errors-are-fatal:
+
+Disable MPI fatal errors
+........................
+
+**Option** ``smpi/errors-are-fatal`` **default:** on
+
+By default, SMPI processes will crash if a MPI error code is returned. MPI allows
+to explicitely set MPI_ERRORS_RETURN errhandler to avoid this behaviour. This flag
+will turn on this behaviour by default (for all concerned types and errhandlers).
+This can ease debugging by going after the first reported error.
+
+.. _cfg=smpi/pedantic:
+
+Disable pedantic MPI errors
+...........................
+
+**Option** ``smpi/pedantic`` **default:** on
+
+By default, SMPI will report all errors it finds in MPI codes. Some of these errors
+may not be considered as errors by all developers. This flag can be turned off to
+avoid reporting some usually harmless mistakes.
+Concerned errors list (will be expanded in the future):
+
+ - Calling MPI_Win_fence only once in a program, hence just opening an epoch without
+   ever closing it.
+
 .. _cfg=smpi/iprobe:
 
 Inject constant times for MPI_Iprobe
@@ -1495,11 +1553,11 @@ entry per MB of malloced data instead of one entry per 4 kB.
 To activate this, you must mount a hugetlbfs on your system and allocate
 at least one huge page:
 
-.. code-block:: shell
+.. code-block:: console
 
-    mkdir /home/huge
-    sudo mount none /home/huge -t hugetlbfs -o rw,mode=0777
-    sudo sh -c 'echo 1 > /proc/sys/vm/nr_hugepages' # echo more if you need more
+    mkdir /home/huge
+    sudo mount none /home/huge -t hugetlbfs -o rw,mode=0777
+    sudo sh -c 'echo 1 > /proc/sys/vm/nr_hugepages' # echo more if you need more
 
 Then, you can pass the option
 ``--cfg=smpi/shared-malloc-hugepage:/home/huge`` to smpirun to
@@ -1606,7 +1664,7 @@ It is also possible to set the breakpoint from inside the debugger, by
 writing in global variable simgrid::simix::breakpoint. For example,
 with gdb:
 
-.. code-block:: shell
+.. code-block:: none
 
    set variable simgrid::simix::breakpoint = 3.1416
 
index a6fe764..3f66286 100644 (file)
@@ -1,14 +1,17 @@
 # What to read
 INPUT                  = ../../include/simgrid/forward.h
-INPUT                 += ../../include/simgrid/s4u
+INPUT                 += ../../include/simgrid/plugins/
+INPUT                 += ../../include/simgrid/s4u/
 INPUT                 += ../../include/simgrid/msg.h
 INPUT                 += ../../include/simgrid/actor.h
 INPUT                 += ../../src/s4u/s4u_Actor.cpp
 INPUT                 += ../../include/simgrid/barrier.h
+INPUT                 += ../../include/simgrid/comm.h
 INPUT                 += ../../include/simgrid/cond.h
 INPUT                 += ../../include/simgrid/engine.h
 INPUT                 += ../../include/simgrid/exec.h
 INPUT                 += ../../include/simgrid/host.h
+INPUT                 += ../../src/s4u/s4u_Host.cpp
 #INPUT                 += ../../include/simgrid/instr.h
 INPUT                 += ../../include/simgrid/link.h
 INPUT                 += ../../include/simgrid/mailbox.h
@@ -52,6 +55,7 @@ PREDEFINED             += \
     DOXYGEN \
     SG_BEGIN_DECL= \
     SG_END_DECL= \
+    SIMGRID_REGISTER_PLUGIN(id,desc,init)= \
     XBT_PUBLIC= \
     XBT_EXPORT_NO_IMPORT= \
     XBT_IMPORT_NO_EXPORT= \
@@ -62,8 +66,8 @@ PREDEFINED             += \
     XBT_PRIVATE= \
     XBT_ATTRIB_NORETURN= \
     XBT_ATTRIB_UNUSED= \
-    XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s,c,l)= \
-    XBT_ATTRIB_DEPRECATED_v329(m)= \
-    XBT_ATTRIB_DEPRECATED_v330(m)= \
-    XBT_ATTRIB_DEPRECATED_v331(m)= \
-    XBT_ATTRIB_DEPRECATED_v332(m)=
+    XBT_LOG_NEW_DEFAULT_SUBCATEGORY(cname,parent,desc)= \
+    XBT_ATTRIB_DEPRECATED_v330(mesg)= \
+    XBT_ATTRIB_DEPRECATED_v331(mesg)= \
+    XBT_ATTRIB_DEPRECATED_v332(mesg)= \
+    XBT_ATTRIB_DEPRECATED_v333(mesg)=
index 0db6065..766946f 100644 (file)
@@ -19,11 +19,11 @@ Binaries for Linux
 To get all of SimGrid on Debian or Ubuntu, simply type one of the
 following lines, or several lines if you need several languages.
 
-.. code-block:: shell
+.. code-block:: console
 
-   apt install libsimgrid-dev  # if you want to develop in C or C++
-   apt install simgrid-java    # if you want to develop in Java
-   apt install python3-simgrid # if you want to develop in Python
+   apt install libsimgrid-dev  # if you want to develop in C or C++
+   apt install simgrid-java    # if you want to develop in Java
+   apt install python3-simgrid # if you want to develop in Python
 
 If you build pre-compiled packages for other distributions, drop us an
 email.
@@ -34,7 +34,7 @@ Stable Java Package
 ^^^^^^^^^^^^^^^^^^^
 
 The jar file can be retrieved from the `Release page
-<https://framagit.org/simgrid/simgrid/releases>`_. This file is
+<https://framagit.org/simgrid/simgrid/-/releases>`_. This file is
 self-contained, including the native components for Linux, macOS and
 Windows. Copy it to your project's classpath and you're set.
 
@@ -130,27 +130,27 @@ Getting the Sources
 ^^^^^^^^^^^^^^^^^^^
 
 Grab the last **stable release** from `FramaGit
-<https://framagit.org/simgrid/simgrid/releases>`_, and compile it as follows:
+<https://framagit.org/simgrid/simgrid/-/releases>`_, and compile it as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
-   tar xf simgrid-3-XX.tar.gz
-   cd simgrid-*
-   cmake -DCMAKE_INSTALL_PREFIX=/opt/simgrid .
-   make
-   make install
+   tar xf simgrid-3-XX.tar.gz
+   cd simgrid-*
+   cmake -DCMAKE_INSTALL_PREFIX=/opt/simgrid .
+   make
+   make install
 
 If you want to stay on the **bleeding edge**, get the current git version,
 and recompile it as with stable archives. You may need some extra
 dependencies.
 
-.. code-block:: shell
+.. code-block:: console
 
-   git clone https://framagit.org/simgrid/simgrid.git
-   cd simgrid
-   cmake -DCMAKE_INSTALL_PREFIX=/opt/simgrid .
-   make
-   make install
+   git clone https://framagit.org/simgrid/simgrid.git
+   cd simgrid
+   cmake -DCMAKE_INSTALL_PREFIX=/opt/simgrid .
+   make
+   make install
 
 .. _install_src_config:
    
@@ -199,17 +199,17 @@ prefer the ``-D`` flag of ``cmake``.
 For example, you can change the compilers by issuing these commands to set some
 environment variables before launching cmake:
 
-.. code-block:: shell
+.. code-block:: console
 
-   export CC=gcc-5.1
-   export CXX=g++-5.1
+   export CC=gcc-5.1
+   export CXX=g++-5.1
 
 The same can be done by passing ``-D`` parameters to cmake, as follows.
 Note that the dot at the end is mandatory (see :ref:`install_cmake_outsrc`).
 
-.. code-block:: shell
+.. code-block:: console
 
-   cmake -DCC=clang -DCXX=clang++ .
+   cmake -DCC=clang -DCXX=clang++ .
 
 SimGrid compilation options
 """""""""""""""""""""""""""
@@ -319,22 +319,22 @@ For that, go to the directory where the files should be produced, and
 invoke cmake (or ccmake) with the full path to the SimGrid source as
 last argument.
 
-.. code-block:: shell
+.. code-block:: console
 
-  mkdir build
-  cd build
-  cmake [options] ..
-  make
+  mkdir build
+  cd build
+  cmake [options] ..
+  make
 
 Existing Compilation Targets
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 In most cases, compiling and installing SimGrid is enough:
 
-.. code-block:: shell
+.. code-block:: console
 
-  make
-  make install # try "sudo make install" if you don't have the permission to write
+  make
+  make install # try "sudo make install" if you don't have the permission to write
 
 In addition, several compilation targets are provided in SimGrid. If
 your system is well configured, the full list of targets is available
@@ -357,9 +357,9 @@ if some do not work for you.
 If you want to see what is really happening, try adding ``VERBOSE=1`` to
 your compilation requests:
 
-.. code-block:: shell
+.. code-block:: console
 
-  make VERBOSE=1
+  make VERBOSE=1
 
 .. _install_src_test:
 
@@ -373,17 +373,18 @@ default, so you first have to build them with ``make tests``. You can
 then run them with ``ctest``, that comes with CMake.  We run them
 every commit and the results are on `our Jenkins <https://ci.inria.fr/simgrid/>`_.
 
-.. code-block:: shell
+.. code-block:: console
 
-  make tests                # Build the tests
-  ctest                            # Launch all tests
-  ctest -R s4u              # Launch only the tests whose names match the string "s4u"
-  ctest -j4                 # Launch all tests in parallel, at most 4 concurrent jobs
-  ctest --verbose           # Display all details on what's going on
-  ctest --output-on-failure # Only get verbose for the tests that fail
+  make tests                # Build the tests
+  $ ctest                     # Launch all tests
+  ctest -R s4u              # Launch only the tests whose names match the string "s4u"
+  ctest -j4                 # Launch all tests in parallel, at most 4 concurrent jobs
+  ctest --verbose           # Display all details on what's going on
+  ctest --output-on-failure # Only get verbose for the tests that fail
 
-  ctest -R s4u -j4 --output-on-failure # You changed S4U and want to check that you didn't break anything, huh?
-                                       # That's fine, I do so all the time myself.
+  $ ctest -R s4u -j4 --output-on-failure # You changed S4U and want to check that you  \
+                                         # didn't break anything, huh?                 \
+                                         # That's fine, I do so all the time myself.
 
 .. _install_cmake_mac:
 
@@ -392,10 +393,10 @@ macOS-specific instructions
 
 SimGrid compiles like a charm with clang (version 3.0 or higher) on macOS:
 
-.. code-block:: shell
+.. code-block:: console
 
-  cmake -DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++ .
-  make
+  cmake -DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++ .
+  make
 
 
 Troubleshooting your macOS build.
@@ -441,17 +442,17 @@ recent version of the `pybind11 <https://pybind11.readthedocs.io/en/stable/>`
 module (version at least 2.4), recompiling the Python bindings from
 the source should be as easy as: 
 
-.. code-block:: shell
+.. code-block:: console
 
   # cd simgrid-source-tree
-  python setup.py build install
+  python setup.py build install
   
 Starting with SimGrid 3.13, it should even be possible to install
 simgrid without downloading the source with pip:
 
-.. code-block:: shell
+.. code-block:: console
 
-  pip install simgrid
+  pip install simgrid
 
 Java-specific instructions
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -459,10 +460,10 @@ Java-specific instructions
 Once you have the `full JDK <http://www.oracle.com/technetwork/java/javase/downloads>`_ installed,
 things should be as simple as:
 
-.. code-block:: shell
+.. code-block:: console
 
-   cmake -Denable_java=ON -Dminimal-bindings=ON .
-   make  simgrid-java_jar # Only build the jarfile
+   cmake -Denable_java=ON -Dminimal-bindings=ON .
+   make  simgrid-java_jar # Only build the jarfile
 
 After the compilation, the file ```simgrid.jar``` is produced in the
 root directory.
@@ -471,7 +472,7 @@ root directory.
 
 Sometimes, the build system fails to find the JNI headers. First locate them as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
   $ locate jni.h
   /usr/lib/jvm/java-8-openjdk-amd64/include/jni.h
@@ -484,11 +485,11 @@ path, and relaunch cmake. If you have several versions of JNI installed
 (as above), pick the one corresponding to the report of
 ``javac -version``
 
-.. code-block:: shell
+.. code-block:: console
 
-  export JAVA_INCLUDE_PATH=/usr/lib/jvm/java-8-openjdk-amd64/include/
-  cmake -Denable_java=ON .
-  make
+  export JAVA_INCLUDE_PATH=/usr/lib/jvm/java-8-openjdk-amd64/include/
+  cmake -Denable_java=ON .
+  make
 
 Note that the filename ```jni.h``` was removed from the path.
 
@@ -498,19 +499,19 @@ Linux Multi-Arch specific instructions
 On a multiarch x86_64 Linux, it should be possible to compile a 32-bit
 version of SimGrid with something like:
 
-.. code-block:: shell
-
-  CFLAGS=-m32 \
-  CXXFLAGS=-m32 \
-  FFLAGS=-m32 \
-  PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu/pkgconfig/ \
-  cmake . \
-  -DCMAKE_SYSTEM_PROCESSOR=i386 \
-  -DCMAKE_Fortran_COMPILER=/some/path/to/i686-linux-gnu-gfortran \
-  -DGFORTRAN_EXE=/some/path/to/i686-linux-gnu-gfortran \
-  -DSMPI_C_FLAGS=-m32 \
-  -DSMPI_CXX_FLAGS=-m32 \
-  -DSMPI_Fortran_FLAGS=-m32
+.. code-block:: console
+
+  $ CFLAGS=-m32                                                      \
+    CXXFLAGS=-m32                                                    \
+    FFLAGS=-m32                                                      \
+    PKG_CONFIG_LIBDIR=/usr/lib/i386-linux-gnu/pkgconfig/             \
+    cmake .                                                          \
+      -DCMAKE_SYSTEM_PROCESSOR=i386                                  \
+      -DCMAKE_Fortran_COMPILER=/some/path/to/i686-linux-gnu-gfortran \
+      -DGFORTRAN_EXE=/some/path/to/i686-linux-gnu-gfortran           \
+      -DSMPI_C_FLAGS=-m32                                            \
+      -DSMPI_CXX_FLAGS=-m32                                          \
+      -DSMPI_Fortran_FLAGS=-m32
 
 If needed, implement ``i686-linux-gnu-gfortran`` as a script:
 
index 4a8bf70..6635a27 100644 (file)
@@ -107,9 +107,9 @@ SimGrid must be recompiled with the ``enable_ns3`` option activated in cmake.
 Optionally, use ``NS3_HINT`` to tell cmake where ns3 is installed on
 your disk.
 
-.. code-block:: shell
+.. code-block:: console
 
-   cmake . -Denable_ns3=ON -DNS3_HINT=/opt/ns3 # or change the path if needed
+   cmake . -Denable_ns3=ON -DNS3_HINT=/opt/ns3 # or change the path if needed
 
 By the end of the configuration, cmake reports whether ns-3 was found,
 and this information is also available in ``include/simgrid/config.h``
@@ -121,9 +121,9 @@ Test that ns-3 was successfully integrated with the following (from your SimGrid
 build directory). It will run all SimGrid tests that are related to the ns-3
 integration. If no test is run at all, you probably forgot to enable ns-3 in cmake.
 
-.. code-block:: shell
+.. code-block:: console
 
-   ctest -R ns3
+   ctest -R ns3
 
 Troubleshooting
 ---------------
@@ -133,6 +133,16 @@ If you use a version of ns-3 that is not known to SimGrid yet, edit
 comments on top of this file. Conversely, if something goes wrong with an old
 version of either SimGrid or ns-3, try upgrading everything.
 
+Note that there is a known bug with version 3.31 of ns3, when it's build with
+MPI support, like it is with the package libns3-dev in Debian 11 Â«Â Bullseye ».
+A simple workaround is to edit the file
+``/usr/include/ns3.31/ns3/point-to-point-helper.h`` to remove the ``#ifdef NS3_MPI``
+include guard.  This can be achieved with the following command (as root):
+
+.. code-block:: console
+
+   # sed -i '/^#ifdef NS3_MPI/,+2s,^#,//&,' /usr/include/ns3.31/ns3/point-to-point-helper.h
+
 .. _ns3_use:
 
 Using ns-3 from SimGrid
@@ -198,9 +208,9 @@ Once your platform is OK, just change the :ref:`network/model
 <options_model_select>` configuration option to `ns-3` as follows. The other
 options can be used as usual.
 
-.. code-block:: shell
+.. code-block:: console
 
-   ./network-ns3 --cfg=network/model:ns-3 (other parameters)
+   ./network-ns3 --cfg=network/model:ns-3 (other parameters)
 
 Many other files from the ``examples/platform`` directory are usable with the
 ns-3 model, such as `examples/platforms/dogbone.xml <https://framagit.org/simgrid/simgrid/tree/master/examples/platforms/dogbone.xml>`_.
index b8779f5..836e48a 100644 (file)
@@ -20,8 +20,7 @@ some drawbacks, but using a specific format ensures that the platform
 is not mixed with the tested application. This separation of concern
 :ref:`is a must <howto_science>` for your Modeling and Simulation (M&S)
 work. When XML is too limiting, you may describe your platforms using
-the :ref:`lua bindings <platform_lua>` (it is not yet possible to do so in
-python or directly in C++).
+directly :ref:`C++ code <platform_cpp>` 
 
 Any simulated platform must contain **basic elements**, such as
 :ref:`pf_tag_host`, :ref:`pf_tag_link`, :ref:`pf_tag_disk`, and similar.
diff --git a/docs/source/Platform_cpp.rst b/docs/source/Platform_cpp.rst
new file mode 100644 (file)
index 0000000..a7b8e93
--- /dev/null
@@ -0,0 +1,183 @@
+.. raw:: html
+
+   <object id="TOC" data="graphical-toc.svg" type="image/svg+xml"></object>
+   <script>
+   window.onload=function() { // Wait for the SVG to be loaded before changing it
+     var elem=document.querySelector("#TOC").contentDocument.getElementById("ExamplesBox")
+     elem.style="opacity:0.93999999;fill:#ff0000;fill-opacity:0.1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1";
+   }
+   </script>
+   <br/>
+   <br/>
+
+.. _platform_cpp:
+   
+C++ Platforms
+#############
+
+Using XML to describe the platforms is very convenient. It provides a
+human-readable, quick way to start your experiments. Although, XML format brings
+several drawbacks as your platforms get larger and more complex (see :ref:`platform_cpp_beyond`).
+
+In this case, it may be more interesting to write your platform directly
+in C++ code. It allows you to programmatically describe your platform and
+remove the intermediate XML parser during simulations. Take care to follow
+the recommendations in :ref:`Modeling Hints <howto>` to keep a clear separation
+of concerns between your platform and your application.
+
+Describing Resources
+********************
+
+A platform in SimGrid is composed of several resources organized in different
+Netzones. The different resources, such as hosts, disks and links, follow the same
+idiom: create()->set()->set()->seal().
+
+.. code-block:: c++
+
+    NetZone* zone      = s4u::create_star_zone("zone0");
+    Link* l_up   = zone->create_link("link_up", "125MBps")->set_latency("24us")->seal();
+    Host* host   = zone->create_host("host0", "1Gf")->seal();
+    zone->seal();
+
+The first NetZone created will be the root zone of your platform. You're allowed to modified
+an object as long as you did not seal it.
+
+For more details about how to describe the platforms, please give a look at :ref:`examples<platform_cpp_example>`
+or directly at the S4U API.
+
+Links
+=====
+
+In the XML, you are allowed to do the following description:
+
+.. code-block:: xml
+
+    <link id="1" bandwidth="10kBps" latency="10ms" sharing_policy="SPLITDUPLEX"/>
+
+    <route src="S1" dst="C1" symmetrical="NO">
+      <link_ctn id="1" direction="DOWN"/>
+    </route>
+
+It is important to notice that this is a syntactic sugar provided by the XML to ease
+the link utilization. A split-duplex link means that upgoing communications do not
+share the bandwidth with downgoing communications. To emulate this behavior,
+under the hood, SimGrid creates 2 links in this case: the *1_UP*
+link and the *1_DOWN* link. As you can see, the selection of link to use
+in the <route> tag is done by the ``direction=`` parameter.
+
+Using the C++ interface, you can use the specific function to create these 2 links. Note
+that you need to define the direction in the add_route function when adding a route containing
+a split-duplex link. Otherwise, SimGrid cannot know which link (UP/DOWN) to use.
+
+.. code-block:: cpp
+
+    auto* link = zone->create_split_duplex_link("1", "125MBps")->set_latency("24us")->seal();
+    
+    zone->add_route(S1, C1, nullptr, nullptr, {{link, LinkInRoute::Direction::UP}});
+
+.. note::
+    Do not use set_sharing_policy(SharingPolicy::SPLITDUPLEX).
+    SimGrid will complain since set_sharing_policy should be used only with (SHARED and FATPIPE)
+
+
+Loading the platform
+====================
+
+The C++ interface to build the platforms give you freedom to organize your code
+as you wish, separating (or unifying) your application from your platform code.
+However, we provide a small hack if you want to keep the same structure of the
+old code with XML platforms. You can pass a library (.so) file to ``Engine::load_platform``
+function, having a predefined function implemented. When loading the platform, the
+Engine will look for a function with this signature: "**void load_platform(const sg4::Engine& e)**", and
+execute it. It could be an easy way to make the transition between XML and C++ if necessary.
+
+For more details, please refer to the cpp and CMakeLists.txt files in 
+`examples/platform <https://framagit.org/simgrid/simgrid/tree/master/examples/platforms>`_.
+
+
+.. _platform_cpp_example:
+
+Example
+*******
+
+The best way to build your C++ platform is starting from some examples.
+Give a look in the examples folder in `examples/ <https://framagit.org/simgrid/simgrid/tree/master/examples/>`_.
+For instance, the file `examples/cpp/clusters-multicpu/s4u-clusters-multicpu.cpp <https://framagit.org/simgrid/simgrid/-/blob/master/examples/cpp/clusters-multicpu/s4u-clusters-multicpu.cpp>`_ shows how to build complex platforms composed of
+clusters of clusters.
+
+Here, we present a complete example showing how to create 3 regulars clusters
+connected through a shared link.
+
+.. literalinclude:: ../../examples/platforms/griffon.cpp
+   :language: cpp
+
+
+.. _platform_cpp_beyond:
+
+Beyond the XML: the power of C++ platforms
+******************************************
+
+This section describes one of the advantages of using C++ code to write your platforms.
+
+Let's see an example of the description of a Fat-Tree in XML (:ref:`platform_examples_fattree`)
+
+.. literalinclude:: ../../examples/platforms/cluster_fat_tree.xml
+   :language: xml
+   :lines: 1-3,10-
+
+Our cluster *bob* is composed of 16 hosts with the same 1Gf CPU power.
+
+Imagine now that you want to simulate the same **Fat-Tree topology with** more complex **hosts**,
+composed of **1 CPU, 1 GPU and some interconnecting bus**.
+
+Unfortunately, this is not possible with the XML description since its syntax obliges
+that the leaves in your Fat-Tree to be single Hosts. However, with the C++ API, your
+leaves can be composed of other zones, creating a **Fat-Tree of FullZones** for example.
+
+Consequently, you can describe the desired platform as follows:
+
+.. code-block:: c++
+
+    sg4::Engine e(&argc, argv);
+    sg4::create_fatTree_zone("bob", e.get_netzone_root(), {2, {4, 4}, {1, 2}, {1, 2}}, {create_hostzone, create_loopback, {}}, 125e6,
+                           50e-6, sg4::Link::SharingPolicy::SPLITDUPLEX)->seal();
+
+Note that the leaves and loopback links are defined through callbacks, as follows:
+
+.. code-block:: c++
+
+    /* create the loopback link for each leaf in the Fat-Tree */
+    static sg4::Link* create_loopback(sg4::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
+    {
+        // note that you could set different loopback links for each leaf
+        return zone->create_link("limiter-" + std::to_string(id), 1e6)->seal();
+    }
+
+    /* create each leaf in the Fat-Tree, return a pair composed of: <object (host, zone), gateway> */
+    static std::pair<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*>
+    create_hostzone(const sg4::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
+    {
+      /* creating zone */
+      std::string hostname = "host" + std::to_string(id);
+      auto* host_zone = sg4::create_full_zone(hostname);
+      /* setting my parent zone */
+      host_zone->set_parent(zone);
+
+      /* creating CPU */
+      std::string cpu_name  = hostname + "-cpu" + std::to_string(i);
+      const sg4::Host* cpu = host_zone->create_host(cpu_name, 1e9)->seal();
+      /* creating GPU */
+      std::string gpu_name  = hostname + "-gpu" + std::to_string(i);
+      const sg4::Host* gpu = host_zone->create_host(gpu_name, 1e12)->seal();
+      /* connecting them */
+      sg4::Link* link   = host_zone->create_link("link-" + cpu_name, 10e9)->set_latency(10e-9)->seal();
+      host_zone->add_route(cpu->get_netpoint(), gpu->get_netpoint(), nullptr, nullptr, {sg4::LinkInRoute(link)});
+
+      host_zone->seal();
+      /* cpu is the gateway for this host */
+      return std::make_pair(host_zone->get_netpoint(), cpu->get_netpoint());
+    }
+
+The code is straightforward and can be easily adapted to more complex environments thanks to the flexibility
+provided by the C++ API.
+
index 36592f7..1e2e971 100644 (file)
@@ -12,8 +12,8 @@
 
 .. _platform_examples:
    
-Platform Examples
-=================
+Network Topology Examples
+=========================
 
 Simple Example with 3 hosts
 ---------------------------
@@ -120,6 +120,8 @@ loopback is given, the communication from a node to itself is handled
 as if it were two distinct nodes: it goes twice through the private
 link and through the backbone (if any).
 
+.. _platform_examples_fattree:
+
 Fat-Tree Cluster
 ----------------
 
@@ -186,6 +188,54 @@ For example, ``3,4 ; 3,2 ; 3,1 ; 2``:
    :language: xml
 
 
+Star Zone
+---------
+
+In a Star topology, as the name says, nodes are organized following a star.
+It's similar to a cluster topology but you have the flexibility to set
+different route for every component in the star.
+Unfortunately, it's only available in the C++ interface.
+
+.. image:: img/starzone.svg
+    :scale: 80%
+    :align: center
+
+The particularity of this zone is how routes are declared. Instead of declaring the
+source and destination, routes are described from a node to everybody else or from
+everybody else to the node. In the example, the node *A* uses the *Link1* and *Backbone*
+to communicate with other nodes (note that this is valid for both nodes inside or outside
+the zone). More precisely, a communication from node *A* to *B* would use links: *Link1, Backbone,
+Link3_down*. Note that duplicated links are removed from the route, i.e. in this example we'll use *Backbone*
+only once.
+
+Also, note that the nodes (A, B and C) can be either hosts or other zones. In case of using zones,
+set the gateway parameter properly when adding the route.
+
+The following code illustrates how to create this Star Zone and add the appropriates routes.
+
+.. code-block:: cpp
+
+    auto* zone = sg4::create_star_zone("star");
+    /* create hosts */
+    const sg4::Host* hostA = zone->create_host("A", 1e9)->seal();
+    const sg4::Host* hostB = zone->create_host("B", 1e9)->seal();
+
+    /* create links */
+    sg4::Link* link1      = zone->create_link("link1", 1e6)->seal();
+    sg4::Link* link3_up   = zone->create_link("link3_up", 1e6)->seal();
+    sg4::Link* link3_down = zone->create_link("link3_down", 1e6)->seal();
+    sg4::Link* backbone   = zone->create_link("backbone", 1e9)->seal();
+
+    /* symmetric route route: A->ALL and ALL->A, shared link1 */
+    zone->add_route(hostA->get_netpoint(), nullptr, nullptr, nullptr,
+                    std::vector<sg4::Link*>{link1, backbone}, true);
+    /* route host B -> ALL, split-duplex link3, direction UP */
+    zone->add_route(hostB->get_netpoint(), nullptr, nullptr, nullptr,
+                    std::vector<sg4::Link*>{link3_up, backbone}, false);
+    /* route host ALL -> B, split-duplex link3, direction DOWN */
+    zone->add_route(nullptr, hostB->get_netpoint(), nullptr, nullptr,
+                    std::vector<sg4::Link*>{backbone, link3_down}, false);
+
 .. todo:: Complete this page of the manual.
 
    SimGrid comes with an extensive set of platforms in the
index 64e594d..4ff8021 100644 (file)
@@ -288,3 +288,8 @@ So the final platform for our example becomes :
         <link_ctn id="link2"/>
     </route>
 
+
+:ref:`Modeling I/O: the realistic way<howto_disk>`
+*****************
+
+Tutorial available at: :ref:`howto_disk`.
index 8aa5354..6a25bfd 100644 (file)
 
 .. _platform_routing:
 
-Defining a Routing
-##################
+Demystifying the routing
+########################
 
-Networking zones (:ref:`pf_tag_zone`) are an advanced concept used to factorize the description
-to reduce the size of your platform on disk and in memory. Then, when
-a host wants to communicate with another host belonging to the same
-zone, it is the zone's duty to find the list of links that are
-involved in the communication. In the above examples, since we use
-``routing="Full"``, all routes must be explicitly given using the
-:ref:`pf_tag_route` and :ref:`pf_tag_link_ctn` tags (this :ref:`routing
-model <pf_rm>` is both simple and inefficient :) It is OK to not
-specify each and every route between hosts, as long as you do not try
-to start a communication on any of the missing routes during your
-simulation.
+When describing a platform, routing is certainly the most complex
+and error-prone part. This section explains the basics of SimGrid's
+routing mechanism which allows you to easily compose and scale your
+platform.
+
+|flat_img| |tree_img|
 
+.. |flat_img| image:: img/zone_hierarchy.png
+   :width: 45%
+
+.. |tree_img| image:: img/zone_tree.svg
+   :width: 45%
+
+Circles represent processing units and squares represent network
+routers. Bold lines represent communication links. The zone "AS2" models the core of a national network interconnecting a
+small flat cluster (AS4) and a larger hierarchical cluster (AS5), a
+subset of a LAN (AS6), and a set of peers scattered around the world
+(AS7).
+
+Networking zones (:ref:`pf_tag_zone`) are an advanced concept used to factorize the description
+to reduce the size of your platform on disk and in memory.
 Any zone may contain sub-zones, allowing for a hierarchical
-decomposition of the platform. Routing can be made more efficient (as the
-inter-zone routing gets factored with :ref:`pf_tag_zoneroute`), and
+decomposition of the platform (as you can see in the tree representation on the left).
+Routing can be made more efficient (as the
+inter-zone routing gets factored with :ref:`pf_tag_zoneroute`) and
 allows you to have more than one routing model in your platform. For
 example, you can have a coordinate-based routing for the WAN parts
 of your platforms, a full routing within each datacenter, and a highly
 optimized routing within each cluster of the datacenter.  In this
-case, determining the route between two given hosts gets :ref:`routing_basics`
+case, determining the route between two given hosts gets 
 "somewhat more complex" but SimGrid still computes
 these routes for you in a time- and space-efficient manner.
-Here is an illustration of these concepts:
 
-.. image:: img/zone_hierarchy.png
 
-Circles represent processing units and squares represent network
-routers. Bold lines represent communication links. The zone "AS2" models the core of a national network interconnecting a
-small flat cluster (AS4) and a larger hierarchical cluster (AS5), a
-subset of a LAN (AS6), and a set of peers scattered around the world
-(AS7).
+Routing basic elements: hosts and links
+***************************************
+
+A platform is composed of a set of resources, namely hosts, links and disks.
+On these resources you may run activities that will require some capacity and
+will make the time advance.
+
+Given a look at this example of some hosts and links being declared
+
+.. code-block:: xml
+
+  <zone id="AS5-4" routing="Full">
+    <host id="host0" speed="1Gf"/>
+    <host id="host1" speed="2Gf"/>
+    <link id="link0" bandwidth="125MBps" latency="100us"/>
+  </zone>
+
+It describes a simple FullZone with 2 hosts inside connected through
+a link. Note that the ``link0`` just represents a resource with a
+certain bandwidth capacity and latency. It's only when you add
+a route between ``host0`` and ``host1`` that this link will be used by
+SimGrid in the communications.
+
+.. code-block:: xml
+
+  <zone id="AS5-4" routing="Full">
+    ...
+    <route src="host0" dst="host1"><link_ctn id="link0"/></route>
+  </zone>
+
+Note that no verification is performed concerning the links you use in a route.
+This is quite flexible and enables interesting features. However, it also allows you
+to do some strange topologies, such as having a single link used by a pair
+of hosts from different zone:
+
+.. code-block:: xml
+
+  <zone id="Nonsense" routing="Full">
+    <host id="host3" speed="1Gf"/>
+    <host id="host4" speed="2Gf"/>
+    <route src="host3" dst="host4"><link_ctn id="link0"/></route>
+  </zone>
+
+Probably you do not want to do this, but it's your responsibility to write
+your platform file properly. SimGrid will not try to be smarter than you!
+
+Describing routes: intra vs inter
+*********************************
+
+Intra zone
+==========
+
+TLDR: use :ref:`pf_tag_route`
+
+The routing mechanism inside a given zone is defined by ``routing=`` parameter
+in the :ref:`pf_tag_zone` (see options in :ref:`intra-zone section <intra_zone>`). For example, in a *Full* zone, the user must declare
+a :ref:`pf_tag_route` for each pair of hosts inside the zone. Other zones, such as *Floyd*
+or *Dijkstra* will calculate the shortest path, while *DragonFly* and *Fat-Tree* uses
+specialized routing algorithms to improve performance.
+
+When adding a route inside a zone, keep in mind that you need 3 main parameters:
+  - src: Host (or router) source
+  - dst: Host (or router) destination
+  - links: list of resources (links in this case) used in the communication
+
+Inter zone
+==========
+
+TLDR: use :ref:`pf_tag_zoneroute`
+
+When describing complex topologies, such as the one depicted in the beginning
+of this page, you will need to connected not only hosts but zones too. The rationale
+behind a route between zone is exactly the same as for hosts. The only difference is
+the 2 new gateway parameters in the syntax of :ref:`pf_tag_zoneroute`.
+
+A zone is not a physical resource, just a collection of resources (including other zones).
+Consequently, you need to describe the gateway, i.e. the physical resource inside the zone used for the route.
+It gives you 4 parameters to describe a zoneRoute:
+
+  - src: The object of source zone
+  - dst: The object of destination zone
+  - gw_src: Gateway inside src zone. A Host (or router) belonging to src zone.
+  - gw_dst: Gateway inside dst zone. A Host (or router) belonging to dst zone.
+  - links: Links that connect gw_src to gw_dst.
+
+.. note:: The gateways must be a component of the zone (either directly or member of some child sub-zone). SimGrid will verify these parameters when adding a route.
+
+.. warning:: SimGrid does not have the concept of default gateway/router. Each zoneRoute must describe the appropriate gateways which may be different for each route.
+
+Calculating the routes
+**********************
+
+This section is not mandatory for a normal SimGrid user. However, if you want
+to know a little more of we calculate the route
+between nodes inside SimGrid, keep reading it.
+
+
+.. _intra_zone:
+
+Intra-zone communications
+=========================
+
+This is the easy, happy case. When
+a host wants to communicate with another host belonging to the same
+zone, it is the zone's duty to find the list of links that are
+involved in the communication.
+
+As we stated earlier, each zone implements a different strategy, defined
+through the ``routing=`` parameter.
+
+  - **Full**: all routes must be explicitly given using the
+    :ref:`pf_tag_route` and :ref:`pf_tag_link_ctn` tags (this :ref:`routing
+    model <pf_rm>` is both simple and inefficient :). It is OK to not
+    specify each and every route between hosts, as long as you do not try
+    to start a communication on any of the missing routes during your
+    simulation.
+  - **Dijkstra/Floyd**: calculates the shortest path between each pair
+    of nodes using the routes described by the user (:ref:`pf_tag_route`).
+    As long as you graph is connected, no problems.
+
+    - Dijkstra: shortest-path calculated considering the path's latency. As
+      the latency of links can change during simulation, it's recomputed each
+      time a route is necessary.
+
+    - Floyd: use the number of hops to build shortest path. It's calculated only
+      once at the beginning of the simulation (as the platform is fixed).
+
+  - **Cluster/Fat-Tree/DragonFly/Torus**: routing is defined by the topology, automatically created.
+    These zones must be defined through the :ref:`pf_tag_cluster` tag in the XML.
+  - **Star**: star-like topology. Users describe routes from/to every host in the zone.
+  - **Vivaldi/Wi-Fi**: "fully-connected" zones with special characteristics.
+
+.. _inter_zone:
+    
+Inter-zone communications
+=========================
+
+.. image:: ./img/zoom_comm.svg
+   :scale: 70%
+
+Inter-zone communications are a little more complicated since you need to pass
+through several zones. Let's have a look in more details in a communication
+within our initial topology.
+
+In this case, *Host1* within *AS2* wants to communicate with *Host2* from *AS5-4*.
+As we can see, they're not part of the same zone nor have direct links connecting
+them. The routing procedure is as follows:
+
+1. **Find common root and ancestors**: As a SimGrid's platform is a tree of zones,
+   it is assured that we have a common zone that includes both hosts. Also, we need
+   the zone within the root zone that contains the hosts. In our case, we have:
+
+   - **Common root**: *AS1*, it is the root zone that contains all hosts in our example
+
+   - **Src ancestor**: *AS2*, it is the own *Host1's* zone.
+
+   - **Dst ancestor**: *AS5*, it's the *AS5* that contains *AS5-4*.
+
+2. **Adding route from src to dst ancestor**: Ask *AS1* for the route between *AS2* and *AS5*.
+
+   This route is defined by the following configuration
+
+   .. code-block:: xml
+
+        <zoneRoute> src="AS2" dst="AS5" gw_src="Host1" gw_dst"="gw1">
+            <link_ctn id="Link1">
+        </zoneRoute>
+
+   Add *Link1* to our list of links.
+
+   Also, we can see in this route that the gateway for *AS2* is *Host1* and for *AS5* is *gw1*.
+
+   Consequently, we need to go from *Host1* to *AS2*'s gateway (*Host1*) and from *Host2* to *AS5*'s
+   gateway (*gw1*).
+
+3. **Recursively search for route between hosts (Host1/Host2) and ancestors (AS2, AS5)**
+
+   3.1. **Route from Host1 to AS2's gateway (Host1)**: nothing to do, same zone.
+
+   3.2. **Route from Host2 to AS5's gateway (gw1)**: start step 1 again, searching
+   for a common root (*AS5* in this case) and the common ancestors (*AS5-4* and *AS5-3*).
+
+   This route is defined as follows.
+
+   .. code-block:: xml
+
+        <zoneRoute> src="AS5-4" dst="AS5-3" gw_src="gw2" gw_dst"="gw1">
+            <link_ctn id="Link3">
+        </zoneRoute>
+
+   Add *Link3* to list of links.
+
+4. **Add local links in src and dst zones**
+
+   4.1. **Route from Host1 to AS2's gateway**: same node, no link to add.
+
+   4.2. **Route from Host2 to AS5-4's gateway**: follow intra-zone and add *Link2*.
+
+   The last route, as it is an internal route in *AS5-4*, is defined using the :ref:`pf_tag_route` tag.
+
+   .. code-block:: xml
+
+        <route> src="Host2" dst="gw2">
+            <link_ctn id="Link2">
+        </route>
+
+
+In the end, our communication from *Host1/AS2* to *Host2/AS5-4* will pass through
+the links: *Link1, Link3* and *Link2*.
+
+Note that a communication between *Host3/AS2* and *Host2/AS5-4* follow the same procedure, except
+for step 4.1 where we would add the link between *Host3* and *Host1* inside *AS2* zone.
+
+
+The Loopback
+************
+
+The link used of loopback communications has a special treatment in SimGrid. As it can be
+quite tedious to describe each a loopback link for each host in the platform, SimGrid provides
+a global **FATPIPE** link which is used by all hosts by default.
+
+By default, this link has the following characteristics:
+
+- **Bandwidth**: 10GBps. It can be changed through configuration, see :ref:`cfg=network/loopback`.
+
+- **Latency**: 0ms. See :ref:`cfg=network/loopback` for more details.
+
+.. warning::
+
+    These default values are arbitrary chosen and must be carefully configured to reflect
+    your environment if needed.
+
+In addition, you can add :ref:`pf_tag_route` from a node to itself to modify the loopback link
+for a specific node. In this case, SimGrid will get this link (instead of the global one) for
+the local communications.
+
+.. code-block:: xml
+
+    <link id="loopback" bandwidth="100MBps" latency="0"/>
+    <route src="Tremblay" dst="Tremblay">
+      <link_ctn id="loopback"/>
+    </route>
+
+Finally, some zones (e.g. :ref:`pf_tag_cluster`) allow you to describe the characteristics of
+the loopback nodes inside the zone. These links are equivalent to adding specific routes and
+have higher priority than the global loopback link.
+
+.. note::
 
-.. todo:: Add more examples, such as the cloud example described in
-          previous paragraph
+    **Loopback links are used only for local communications**.
 
+    You may have noticed that we didn't include them at step 3.1 in :ref:`inter_zone`.
+    Loopback links will be used only when src and dst are the same, not in the recursive search
+    described above.
index 44e4b31..1ef1475 100644 (file)
@@ -96,9 +96,8 @@ Partial list of existing signals in s4u:
   :cpp:member:`Link::on_speed_change <simgrid::s4u::Link::on_bandwidth_change>`
   :cpp:member:`Link::on_communicate <simgrid::s4u::Link::on_communicate>`
   :cpp:member:`Link::on_communication_state_change <simgrid::s4u::Link::on_communication_state_change>`
-- :cpp:member:`Netzone::on_creation <simgrid::s4u::Netzone::on_creation>`
-  :cpp:member:`Netzone::on_seal <simgrid::s4u::Netzone::on_seal>`
-  :cpp:member:`Netzone::on_route_creation <simgrid::s4u::Netzone::on_route_creation>`
+- :cpp:member:`NetZone::on_creation <simgrid::s4u::NetZone::on_creation>`
+  :cpp:member:`NetZone::on_seal <simgrid::s4u::NetZone::on_seal>`
 - :cpp:member:`VirtualMachine::on_start <simgrid::s4u::VirtualMachine::on_start>`
   :cpp:member:`VirtualMachine::on_started <simgrid::s4u::VirtualMachine::on_started>`
   :cpp:member:`VirtualMachine::on_suspend <simgrid::s4u::VirtualMachine::on_suspend>`
@@ -153,8 +152,5 @@ File System
 
 .. doxygengroup:: plugin_filesystem
 
-.. doxygentypedef:: sg_file_t
-.. doxygentypedef:: const_sg_file_t
 
 ..  LocalWords:  SimGrid
-
diff --git a/docs/source/Release_Notes.rst b/docs/source/Release_Notes.rst
new file mode 100644 (file)
index 0000000..c28231f
--- /dev/null
@@ -0,0 +1,396 @@
+.. release_notes:
+
+Release Notes
+=============
+
+This page gathers some release notes, to shed light on the recent and current development of SimGrid.
+Ancient versions are not documented here (the project started in 1998), but in the ChangeLog file only.
+
+Version 3.13 (Apr 27. 2016)
+---------------------------
+
+The Half Release, a.k.a. the Zealous Easter Trim:
+
+ * Half of the lines of code are gone.
+
+   * v3.12: 286k lines; v3.13: 142k lines (+ comments)
+   * Experimental untested unused "features" removed
+   * We rewrote several parts in C++ instead of C
+
+ * Introducing v4 of the XML platform format (many long-due cleanups)
+ * MSG examples fully reorganized (in C and Java)
+ * The S4U interface is rising, toward SimGrid 4
+
+   * All host manipulations now done in S4U
+   * SimDag was mostly rewritten on top of S4U
+   * MSG & SimDag interfaces mostly unchanged
+
+Version 3.14 (Dec 25. 2016)
+---------------------------
+
+This version (aka, the Christmas Pi) mainly introduces internal reorganization on the way to the future SimGrid 4 version. 
+These changes should be transparent to the users of the MSG, SMPI and SimDag interfaces, even if some buggy features were reworked 
+while some new features were added.
+
+Users are expected to switch to this new version at their own pace, as we do not have the manpower to do any bugfixing on the old releases.
+This version was tested on several Linux distributions, Mac OSX, Windows (restricted to the Java bindings when not using the Ubuntu
+subsystem of Win10), FreeBSD and NetBSD.
+
+Main changes:
+
+ * Documentation reorganized and improved
+ * S4U interface further rising, toward SimGrid 4
+
+   - Routing code rewritten for readability
+   - Virtual Machines almost turned into a plugin
+   - MSG, SimDag, MPI interfaces mostly unchanged
+
+ * The model-checker now works on NetBSD too.
+
+Version 3.14.159 (Dec 29. 2016)
+-------------------------------
+
+The "Christmas Pi (better approximation)" release fixes various small glitches from the 3.14 version.
+
+Version 3.15 (March 22 2017)
+----------------------------
+
+The Spring Release: continuous integration servers become green.
+
+ * S4U: progress, integrating more parts of SimDag; New examples.
+ * SMPI: Support MPI 2.2; Convert internals to C++ (TBC).
+ * Java: Massive memleaks and performance issues fixed.
+ * Plus the usual bug fixes, cleanups and documentation improvements.
+
+Users are expected to switch to this new version at their own pace, as we do not have the manpower to do any bugfixing on the old releases.
+This version was tested on several Linux distributions, Mac OSX, Windows (restricted to our Java bindings), FreeBSD and NetBSD.
+None of our 600+ integration tests is known to fail on any of these.
+
+Version 3.16 (June 22 2017)
+---------------------------
+
+The Blooming Spring Release: developments are budding.
+
+ * S4U: Progress; Activity refcounting is now automatic.
+ * XML: <AS> can now be named <zone> as they should.
+ * SMPI: Further performance improvements; RMA support.
+ * Cloud: Multi-core VMs (do not overcommit them yet)
+ * (+ bug fixes, cleanups and documentation improvements)
+
+SMPI performance was further improved, using various OS-level magic to speed up our virtualization of the MPI code to be run. This allowed
+Tom to run a simulation of HPL involving 10^6 processes... Wow. The dlopen privatization schema should even allows to run your ranks
+in parallel (even if it's not well tested yet).
+
+On the Cloud side, we implemented multi-core VMs, which naturally acts as containers of processes; 
+S4U, the future interface of SimGrid 4.0 also progressed quite a bit.
+
+The Storage is currently cleaned up by Fred, and some API changes are to be expected. We are sorry but the exisiting API is so crappy that
+nobody ever used it, I guess. If you need it, please speak up soon!
+
+We renamed AS into NetZone in the XML files (but the old one still work so no rush to update your platform). Since our platforms are
+hierarchical, it makes no sense to name our zones "Autonomous Systems". Some other documentation pages got updated and modified. If
+you see a particularly old, misleading or otherwise ugly doc page, please tell us and we'll fix it. Even typo reports are welcome.
+
+But most of the work on S4U is not directly visible from the user. We rewamped the whole code of activities (comms, execs, mutex, etc) to
+not mix the applicative logic (calling test() or wait()) with the object refcounting. Now, you can test your comm object as many time as
+you want. This change was really intrusive in our internals, and we're not done with restabilizing every bits, but we're on it.
+
+Still on the S4U front, we managed to remove a few more XBT modules. We prefer to use the std or boost libraries nowadays, and switching
+away from the XBT module enable to reduce our maintainance burden. Be warned that XBT will not always remain included in SimGrid.
+
+On the infrastructure side, we are trying to setup a regular build task for the main projects using SimGrid, to check that our changes
+don't break them. The one of StarPU is close to be working (even if not completely). If you want to have your own code tested regularly
+against the SimGrid git to warn us about breakage that we introduce, please come to us. We can grant you the right to do the needed config
+in our Jenkins instance.
+
+v3.16 also contains the usual bug fixes, such as the jarfile that should now work on Mac OSX (this time for real :) or the Java bindings
+that should now be clear of any memory leak.
+
+In addition, the future already started. We have ongoing changesets that were not ready for 3.16 but should be part of 3.17:
+
+ - Energy modeling for the network too
+ - New reduction algorithm for the model-checker, based on event folding structures
+ - Multi-model simulations, to specify a differing networking model for each netzone.
+
+Version 3.17 (Oct 8. 2017)
+--------------------------
+
+This version is dubbed the "The Drained Leaks release", because almost no known memleak remains, despite testing.
+
+ * Many many internal cleanups (almost 700 commits since 3.16).
+ * The coverage of our tests is above 80%.
+ * All memleaks but one plugged; A dozen of bugs fixed.
+ * XBT: Further replace XBT with std::* constructs.
+
+Version 3.18 (Dec. 24 2017)
+---------------------------
+
+This is an important version for SimGrid: MSG is now deprecated, and new projects should use S4U instead. 
+There is still some work to do before SimGrid 4: S4U is not ready for SimDag users yet unfortunately. This will come for sure.
+
+Main changes in the "Ho Ho Ho! SimGrid 4 beta is coming to town" release:
+
+ * Convert almost all interesting MSG examples to S4U.
+ * New model: energy consumption due to the network.
+ * Major cleanups in the disk and storage subsystems.
+ * (+ further deprecate XBT, bug fixes and doc improvement) 
+
+SimGrid 4 *may* be there by the next solstice.
+
+Version 3.19 (March 21. 2018)
+-----------------------------
+
+In total, this "Moscovitly-cold Spring" release brings more than 500 commits made by 7 individuals over the last 3 months.
+
+ * SMPI: Allow to start new actors and ranks after simulation start.
+ * SMPI: Support ICC, better testing on classical proxy apps.
+ * Some kernel headers are now installed, allowing external plugins.
+ * (+ the classical bug fixes and doc improvement)
+
+Version 3.19.1 (March 22. 2018)
+-------------------------------
+
+As you may know, we are currently refactoring SimGrid in deep. 
+Upcoming SimGrid4 will be really different from SimGrid3: modular, standard and extensible vs. layered, homegrown and rigid. C++ vs. C.
+
+Our goal is to smooth this transition, with backward compatibility and automatic update paths, while still progressing toward SimGrid4.
+
+SimGrid remains open during works: The last pure SimGrid3 release was v3.12 while all subsequent versions are usable alpha versions of
+SimGrid4: Existing interfaces remain unchanged, but the new S4U interface is budding and the internals are deeply reorganized.
+
+Since 2015, we work hard to reduce the changes to public APIs. When we need to rename a public library symbol in S4U, we let your compiler
+issue an explicative warning when you use the deprecated function. These messages remain for four releases, i.e. for one full year,
+before turning into an error. Starting with v3.15, your can also adapt to API changes with the SIMGRID_VERSION macro, that is defined to
+31500 for v3.15, to 31901 for v3.19.1 and so on.
+
+Starting with this v3.19.1, our commitment to reduce the changes to the public interfaces is extended from the API to the ABI: a program
+using only MSG or SimDag and compiled against a given version of simgrid can probably be used with a later version of SimGrid without
+recompilation. We will do our best... but don't expect too much of it, that's a really difficult goal during such profund refactoring.
+
+The difference between v3.19 and v3.19.1 is that the former was accidentally breaking the ABI of MSG, while the later is restoring the
+previous ABI.
+
+S4U and kernel APIs will still evolve until SimGrid4, with one-year deprecation warnings as currently. In fact, cleaning up these
+interfaces and converting them to snake_case() is one release goal of v3.20. But don't worry, we are working to smooth this upgrade path.
+
+Once the S4U interface stabilizes, we will provide C bindings on top of it, along with Java and Python ones. Maybe in 3.21 or 3.22.
+
+All this is not contradictory with the fact that MSG as a whole is deprecated, because this deprecation only means that new projects
+should go for MSG but for S4U (to benefit of the future). Despite this deprecation, old MSG projects should still be usable with no change,
+if we manage to. This is a matter of scientific reproducibility to us.
+
+Version 3.20 (June 25 2018)
+---------------------------
+
+We were rather productive this season, with a total of 837 commits made by 8 individuals over the last 3 months.
+
+The most visible change is the S4U API sanitizing. We were using an awful mix of snake_case and CamelCase, and we now use snake_case
+everywhere. We apologize for the inconvenience, but it's for sake of sanity. Plus, we put portability wrappers in place: you don't have to
+change your code until v3.24 if you can live with warnings. The MSG API was not changed, of course.
+
+The robustness of SMPI continues to improve. It was rock stable, and you can now use it to move the world (if your lever is long enough).
+We now use several full-scale projects as nightly integration tests: StarPU, BigDFT and also 45 Proxy Apps from various collections.
+https://github.com/simgrid/SMPI-proxy-apps/
+
+Main changes in the "proxy snake_case()" release are:
+
+ * Sanitize the public API. Compatibility wrappers in place for one year.
+ * More CI: ~45 Proxy Apps + BigDFT + StarPU now tested nightly
+ * MPI: Port the trace replay engine to C++, fix visualization
+ * (+ the classical bug fixes and doc improvement)
+
+Version 3.21 (October 5. 2018)
+------------------------------
+
+This release introduces a few nice features, but the most visible is certainly the new documentation. We started to completely overhaul it.
+The result is still somewhat in progress, but we feel that it's much better already. We added a complete tutorial on S4U, we started a
+tutorial on SMPI (still incomplete), we slightly improved the MSG and Java doc, and greatly improved the S4U doc. The section on writing
+platform files is not converted in the new doc and you'll have to refer to the 3.20 documentation for that (sorry -- time went out).
+
+Please give us feedback on this new doc. We want to make it as useful to you as possible, but it's very hard without (constructive) feedback
+from your side ;)
+
+Another big change is that we are currently moving our development from github to framagit. We thought that framagit is a better place to
+develop an Open Source project as ours. Head now to https://simgrid.org You can still use github if you prefer to use closed source code ;)
+
+Main changes of The Restarting Documentation (TRD) release:
+
+ * Start to overhaul the documentation, and move to Sphinx + RTD.
+ * Allow dynamic replay of MPI apps, controlled by S4U actors
+ * Rewrite the support for auto-restarted actors (was utterly broken)
+ * (+ the classical bug fixes and doc improvement)
+
+Version 3.22 (April 2. 2019)
+----------------------------
+
+The Easter Christmas Release. It was expected from Chrismas, but I was so late that I even managed to miss the spring deadline.
+This started to be a running joke, so I decided to release it for April 1. But I'm even late for this... Sorry :)
+
+ * Introducing the Python bindings (still beta)
+ * Doc: SMPI tutorial and platform description ported to RTD
+ * Many internal cleanups leading to some user-level speedups
+ * (+ the classical bug fixes and internal refactorings)
+
+The most visible change is certainly the new Python bindings. They are rather experimental yet, and their API may change a bit in future
+release, but you are already welcome to test them. Many examples are now also available in Python, and the missing ones are on their way.
+
+This new bindings further deprecates the old MSG and Java interfaces, which are still provided (and will remain so for a few years at least
+for the existing users). Their examples are now hidden in deprecated/ Please switch to S4U if you like C++ or to Python if not.
+
+This new version also introduce a heavy load of internal cleanups. Fred converted more internals to real C++, with more classes and less
+procedural cruft. Henri and the other Wrench developpers reported many bugs around activity canceling and resource failures, and we fixed
+quite a bit of them, but many dark snakes remain in that lake. Fred and Martin converted more doc to the new system (the platform chapter
+is not finished, but it's not worse than the old one either) while Augustin completed the tutorial for MPI applications. Augustin also
+added several non-blocking collectives to SMPI, even if Martin finally decided to release right before he could complete the last ones
+(sorry). We continued cutting on XBT, replacing many functions and modules by their standard counterparts in C++11 or in Boost. We are
+now using Catch2 for our unit testing. These cleanups may speedup your simulations by something like 10%. 
+
+Version 3.23 (June 25. 2019)
+----------------------------
+
+Main change in the "Exotic Solstice" Release:
+
+ * Support for Solaris and Haiku OSes. Just for fun :)
+ * SMPI: more of MPI3.1; some MPI/IO and async collectives.
+ * Python bindings can now be installed from pip.
+ * (+ many many bug fixes and internal refactorings)
+
+Version 3.24 (October 10. 2019)
+-------------------------------
+
+This is the Clean Disk Release:
+
+ * Introduce an experimental Wifi network model.
+ * Introduce <disk> (cleaner logic than <storage>).
+ * SMPI: Implement Errhandlers and some more MPI3.1 calls.
+ * (+ many bug fixes and internal refactorings)
+
+Since June, we continued our new release schema: v3.23.2 got released at some point as an interim release for people wanting something
+between stable releases (tested on many systems but coming at most once per quarter) and git version (almost always working but you never
+know). We plan to do so more often in the future, maybe with one interim version per month. Between interim versions, we use an odd
+version number: v3.23.1 then 3.23.3 until yesterday, and soon 3.24.1.
+
+As a user, there is no urgency to upgrade, even if you should not wait more than 9 months to upgrade to another stable version: our policy is
+to keep backward compatibility and nice upgrading pathes for 3 stable versions.  v3.24 removes symbols that got deprecated in v3.20, last
+year. It deprecates things that will continue to work until v3.27.
+
+Speaking of deprecation, we would like to hear from you if you are using the Java bindings under Windows without the WSL installed.
+Maintaining these native bindings are rather tedious, and we are wondering whether having Java+WSL would be sufficient.
+
+In any case, please remember that we like to hear success stories, i.e. reports of the nice things you did with SimGrid. Not only bug
+reports are welcome :)
+
+Version 3.25 (Feb 2. 2020)
+--------------------------
+
+This is the "Palindrom Day" release (today is 02 02 2020).
+
+* Improve the Python usability (stability and documentation).
+
+  - A nasty synchronization bug was ironed out, see full changelog.
+  - Python's doc now integrated with C++ (was organized as a separate tree).
+  - C bindings of S4U were not even part of the doc.
+  - The C++ doc was also improved as methods are now split by theme.
+  - See https://simgrid.org/doc/latest/app_s4u.html#api-reference
+
+* Further deprecate MSG: you now have to pass -Denable_msg=ON to cmake.
+
+  - This is mandatory to use the Java bindings.
+  - OFF by default; The plan is to completely remove MSG by 2020Q4 or 2021Q1.
+
+* SimDAG++: Automatic dependencies on S4U activities (experimental)
+
+  - Some features are already implemented but not all of them
+  - Cannot block an activity until it's scheduled on a resource
+  - No heterogeneous wait_any() that would mix Exec/Comm/Io activities.
+  - See examples/s4u/{io,exec,comm}-dependent for what's already there.
+
+Since last fall, we continued to push toward the future SimGrid4 release. This requires to remove MSG and SimDAG once all users have
+migrated to S4U. The two old interfaces are still here, but this release gives another gentle incitative toward the migration. You now
+have to explicitly ask for MSG to be compiled in (and it may be removed by Q42020 or Q12021 along with the current Java bindings), and
+this release proposes a nice S4U replacement for some parts of SimDAG.
+
+Since last release also, we had no answer of potential users of the Java bindings on Windows without the WSL installed. We will probably
+drop this architecture in the near future, then. Simplifying our settings is mandatory to continue to push SimGrid forward.
+
+Version 3.26 (Dec 16. 2020)
+---------------------------
+
+To celebrate the ease of the lockdown in France, we decided to bring another version of SimGrid to the world.
+This is the "Release" release. Indeed a small contribution to the event, but this release was long overdue anyway.
+
+ * SMPI: improved support of the proxy apps (including those using petsc)
+ * WiFi: easier description in XML; energy plugin; more examples.
+ * ns-3: Many bug fixes, can use the wifi models too.
+ * (+ many bug fixes, documentation improvement and internal refactoring)
+
+Version 3.27 (March 29. 2021)
+-----------------------------
+
+To celebrate the 1176th anniversary of the siege of Paris by Vikings in 845, we just released another version of SimGrid, the Ragnar Release. 
+Yeah, that's a stupid release name, but we already had 4 "spring release" in the past, so we needed another name.
+
+ * SMPI: can now report leaks and hint about the mallocs and kernels hindering simulation scalability
+ * Doc: Several new sections in the user manual, and start documenting the internals.
+ * S4U: Direct comms from host to host, without mailboxes.
+
+In some sense, these changes are just the tip of the iceberg, as we had many refactoring and internal cleanups in this release cycle too. Actually, we have 3
+main ongoing refactoring that should bring us closer to SimGrid4, that will eventually occur.
+
+The first change is dubbed SimDAG++. We want to make it possible to use S4U in the same spirit as SimDAG: centralized scheduling of tasks with dependencies. We
+need to allow the maestro thread (the one that currently only call engine->run() in the main) to create asynchronous activities, chain them by declaring
+dependencies, and run the simulation until some event of interest occurs.
+
+Previous release introduced inter-activity dependency in s4u, this release introduces direct host-to-host communications (bypassing the mailboxes), but we
+are not there yet: maestro cannot create asynchronous activities, and there is no way to run the simulation up to a certain point only.
+
+The second ongoing refactoring is about the platform creation. Our goal is to provide a C++ API to create your platform from your code, without relying on
+XML. There is a real possibility that this one will be part of the 3.28 release, in three months. Will see.
+
+And the third front is about modernizing the model checker implementation. The current state is very difficult to work with, and we hope that once it's
+simplified, we will be able to implement more efficient state space reduction techniques, and also allow more synchronization mechanism to be used in the
+model checker (for now, our dpor algorithm cannot cope with mutexes). 
+
+In parallel to these refactoring, the work on SMPI stability and robustness peacefully continued. The list of MPI applications that can now work with
+absolutely no change on top of SMPI really gets impressive... Check it yourself: https://framagit.org/simgrid/SMPI-proxy-apps
+
+If you want to speak about it (or other SimGrid-related matter), please join us on Mattermost: https://framateam.org/simgrid/channels/town-square
+Come! You don't even have to accept the cookies for that!
+
+Version 3.28 (July 14. 2021)
+----------------------------
+
+To celebrate the birthday of Crown Princess Victoria, we just released another version of SimGrid, the "Victoriadagarna" release.
+
+ * Programmatic platform description (only C++ for now).
+ * New plugin to simplify producer/consumer applications.
+ * MC: new tutorial and associated docker image.
+ * SMPI: improve error handling for incorrect advanced usages.
+ * Many internal cleanups and refactoring to prepare the future.
+
+As usual, even the full changelog is only the tip of the iceberg, given the amount of changes in the backstage. 
+
+This release is the big one for the programmatic platform descriptions, that are now fully usable from C++. XML will not
+disappear anytime soon, but it is unlikely that we continue developing it in the future. When starting a new project, you should
+probably go for the programmatic platforms. Or you could wait for the next release, where we hope to introduce the Python bindings of the
+programmatic platforms. A platform in Python and an application in C++ may provide a better separation of concern (when it will be possible).
+
+On the Model-Checking front, the code base did not evolve a lot, but we now provide a brand new tutorial and docker image for those wanting
+to start using this feature. We are still not done with the refactoring required to unlock the future of Mc SimGrid and still
+consider that it's less robust than the rest of SimGrid. We're working on it, and you may even find it useful as is anyway.
+
+On the SimDag++ front (integrating the SimDAG interface to S4U), some work occurred in the backstage, but we were too busy with the
+programmatic platforms to make this happen in this release. Maybe next season?
+
+On the SMPI front, the work was on improving the usability. SMPI is now better at hinting the problem in buggy and almost-correct
+applications, and it can assist the user in abstracting parts of the application to improve the simulation performance. Check the SMPI
+tutorial for details.
+
+Finally, we pursued our quest for a better codebase by following the hints of SonarCloud and other static analyzers. This is what it takes
+to fight the technical debt and ensure that you'll still enjoy SimGrid in a decade. Along the same line, we removed the symbols that were
+deprecated since 3 releases, as usual.
+
+Version 3.29 (not released yet)
+-------------------------------
+
+Release target: September 22. 2021
index 308d039..cb70ef0 100644 (file)
@@ -61,9 +61,9 @@ MPI projects should include ``find_package (MPI)`` in CMakeLists.txt. Then, the
 variables ``MPI_C_COMPILER``, ``MPI_CXX_COMPILER``, and ``MPI_Fortran_COMPILER`` should
 point to the full path of smpicc, smpicxx, and smpiff respectively. Example:
 
-.. code-block:: shell
+.. code-block:: console
 
-   cmake -DMPI_C_COMPILER=/opt/simgrid/bin/smpicc -DMPI_CXX_COMPILER=/opt/simgrid/bin/smpicxx -DMPI_Fortran_COMPILER=/opt/simgrid/bin/smpiff .
+   cmake -DMPI_C_COMPILER=/opt/simgrid/bin/smpicc -DMPI_CXX_COMPILER=/opt/simgrid/bin/smpicxx -DMPI_Fortran_COMPILER=/opt/simgrid/bin/smpiff .
 
 
 Building your project with Makefile
@@ -158,9 +158,9 @@ Library not found
 
 When the library cannot be found, you will get such an error message similar to:
 
-.. code-block:: shell
+.. code-block:: console
 
-  ./masterworker1: error while loading shared libraries: libsimgrid.so: cannot open shared object file: No such file or directory
+  ./masterworker1: error while loading shared libraries: libsimgrid.so: cannot open shared object file: No such file or directory
 
 To fix this, add the path to where you installed the library to the
 ``LD_LIBRARY_PATH`` variable. You can add the following line to your
@@ -175,7 +175,7 @@ computer.
 Many undefined references
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
-.. code-block:: shell
+.. code-block:: console
 
   masterworker.c:209: undefined reference to `sg_version_check'
   masterworker.c:209: undefined reference to `MSG_init_nocheck'
index 1b3f38b..2f4b202 100644 (file)
@@ -201,7 +201,7 @@ This time, we have all parts: once the program is compiled, we can
 execute it as follows. Note how the XBT_INFO() requests turned into
 informative messages.
 
-.. "WARNING: Over dedent has detected" is expected here as we remove the $ marker this way
+.. "WARNING: non-whitespace stripped by dedent" is expected here as we remove the $ marker this way
 
 .. literalinclude:: ../../examples/cpp/app-masterworkers/s4u-app-masterworkers.tesh
    :language: shell
@@ -308,10 +308,10 @@ The easiest way to take the tutorial is to use the dedicated Docker
 image. Once you `installed Docker itself
 <https://docs.docker.com/install/>`_, simply do the following:
 
-.. code-block:: shell
+.. code-block:: console
 
-   docker pull simgrid/tuto-s4u
-   docker run -it --rm --name simgrid --volume ~/simgrid-tutorial:/source/tutorial simgrid/tuto-s4u bash
+   docker pull simgrid/tuto-s4u
+   docker run -it --rm --name simgrid --volume ~/simgrid-tutorial:/source/tutorial simgrid/tuto-s4u bash
 
 This will start a new container with all you need to take this
 tutorial, and create a ``simgrid-tutorial`` directory in your home on
@@ -334,12 +334,12 @@ 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:: shell
+.. code-block:: console
 
-   cp -r /source/simgrid-template-s4u.git/* /source/tutorial
-   cd /source/tutorial
-   cmake .
-   make
+   cp -r /source/simgrid-template-s4u.git/* /source/tutorial
+   cd /source/tutorial
+   cmake .
+   make
 
 Using your Computer Natively
 ............................
@@ -351,17 +351,21 @@ a recent version of SimGrid <install>`, a C++ compiler, and also
 The provided code template requires CMake to compile. On Debian and
 Ubuntu for example, you can get them as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
-   sudo apt install simgrid pajeng cmake g++ vite
+   sudo apt install simgrid pajeng cmake g++ vite
 
 For R analysis of the produced traces, you may want to install R
 and the `pajengr <https://github.com/schnorr/pajengr#installation/>`_ package.
 
-.. code-block:: shell
+.. code-block:: console
 
-   sudo apt install r-base r-cran-devtools cmake flex bison
-   Rscript -e "library(devtools); install_github('schnorr/pajengr');"
+   # install R and necessary packages
+   $ sudo apt install r-base r-cran-devtools r-cran-tidyverse
+   # install pajengr dependencies
+   $ sudo apt install git cmake flex bison
+   # install the pajengr R package
+   $ Rscript -e "library(devtools); install_github('schnorr/pajengr');"
 
 An initial version of the source code is provided on framagit. This
 template compiles with CMake. If SimGrid is correctly installed, you
@@ -369,15 +373,15 @@ should be able to clone the `repository
 <https://framagit.org/simgrid/simgrid-template-s4u>`_ and recompile
 everything as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
    # (exporting SimGrid_PATH is only needed if SimGrid is installed in a non-standard path)
-   export SimGrid_PATH=/where/to/simgrid
+   export SimGrid_PATH=/where/to/simgrid
 
-   git clone https://framagit.org/simgrid/simgrid-template-s4u.git
-   cd simgrid-template-s4u/
-   cmake .
-   make
+   git clone https://framagit.org/simgrid/simgrid-template-s4u.git
+   cd simgrid-template-s4u/
+   cmake .
+   make
 
 If you struggle with the compilation, then you should double-check
 your :ref:`SimGrid installation <install>`.  On need, please refer to
@@ -389,16 +393,16 @@ Discovering the Provided Code
 
 Please compile and execute the provided simulator as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
-   make master-workers
-   ./master-workers small_platform.xml master-workers_d.xml
+   make master-workers
+   ./master-workers small_platform.xml master-workers_d.xml
 
 For a more "fancy" output, you can use simgrid-colorizer.
 
-.. code-block:: shell
+.. code-block:: console
 
-   ./master-workers small_platform.xml master-workers_d.xml 2>&1 | simgrid-colorizer
+   ./master-workers 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
@@ -410,10 +414,10 @@ For a classical Gantt-Chart visualization, you can use `Vite
 follows. But do not spend too much time installing Vite, because there
 is a better way to visualize SimGrid traces (see below).
 
-.. code-block:: shell
+.. code-block:: console
 
-   ./master-workers small_platform.xml master-workers_d.xml --cfg=tracing:yes --cfg=tracing/actor:yes
-   vite simgrid.trace
+   ./master-workers small_platform.xml master-workers_d.xml --cfg=tracing:yes --cfg=tracing/actor:yes
+   vite simgrid.trace
 
 .. image:: /tuto_s4u/img/vite-screenshot.png
    :align: center
@@ -428,10 +432,10 @@ 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>`_
 and use it as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
-   ./master-workers small_platform.xml master-workers_d.xml --cfg=tracing:yes --cfg=tracing/actor:yes
-   Rscript draw_gantt.R simgrid.trace
+   ./master-workers small_platform.xml master-workers_d.xml --cfg=tracing:yes --cfg=tracing/actor:yes
+   Rscript draw_gantt.R simgrid.trace
 
 It produces a ``Rplots.pdf`` with the following content:
 
@@ -601,11 +605,7 @@ simulation. Instead, retrieve the time in the simulated world with
 :cpp:func:`simgrid::s4u::Engine::get_clock`.
 
 You can still stop your workers with a specific task as previously,
-or you may kill them forcefully with
-:cpp:func:`simgrid::s4u::Actor::kill` (if you already have a reference
-to the actor you want to kill) or
-:cpp:func:`void simgrid::s4u::Actor::kill(aid_t)` (if you only have its ID).
-
+or you may kill them forcefully with :cpp:func:`simgrid::s4u::Actor::kill`.
 
 Anyway, the new deployment `deployment3.xml` file should thus look
 like this:
@@ -623,9 +623,9 @@ every 100 tasks and ``XBT_DEBUG`` when sending all the other tasks. Or
 you could show only the total number of tasks processed by
 default. You can still see the debug messages as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
-   ./master-workers-lab3 small_platform.xml deployment3.xml --log=s4u_app_masterworker.thres:debug
+   ./master-workers-lab3 small_platform.xml deployment3.xml --log=s4u_app_masterworker.thres:debug
 
 
 Lab 4: Competing Applications
index aee0a67..310389d 100644 (file)
@@ -265,10 +265,10 @@ The easiest way to take the tutorial is to use the dedicated Docker
 image. Once you `installed Docker itself
 <https://docs.docker.com/install/>`_, simply do the following:
 
-.. code-block:: shell
+.. code-block:: console
 
-   docker pull simgrid/tuto-smpi
-   docker run -it --rm --name simgrid --volume ~/smpi-tutorial:/source/tutorial simgrid/tuto-smpi bash
+   docker pull simgrid/tuto-smpi
+   docker run -it --rm --name simgrid --volume ~/smpi-tutorial:/source/tutorial simgrid/tuto-smpi bash
 
 This will start a new container with all you need to take this
 tutorial, and create a ``smpi-tutorial`` directory in your home on
@@ -293,10 +293,10 @@ Benchmarks. These files are available under
 ``/source/simgrid-template-smpi`` in the image. You should copy it to
 your working directory when you first log in:
 
-.. code-block:: shell
+.. code-block:: console
 
-   cp -r /source/simgrid-template-smpi/* /source/tutorial
-   cd /source/tutorial
+   cp -r /source/simgrid-template-smpi/* /source/tutorial
+   cd /source/tutorial
 
 Using your Computer Natively
 ............................
@@ -308,27 +308,31 @@ visualize the traces. You may want to install `Vite
 traces. The provided code template requires ``make`` to compile. On
 Debian and Ubuntu, you can get them as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
-   sudo apt install simgrid pajeng make gcc g++ gfortran python3 vite
+   sudo apt install simgrid pajeng make gcc g++ gfortran python3 vite
 
 For R analysis of the produced traces, you may want to install R
 and the `pajengr <https://github.com/schnorr/pajengr#installation/>`_ package.
 
-.. code-block:: shell
+.. code-block:: console
 
-   sudo apt install r-base r-cran-devtools cmake flex bison
-   Rscript -e "library(devtools); install_github('schnorr/pajengr');"
+   # install R and necessary packages
+   $ sudo apt install r-base r-cran-devtools r-cran-tidyverse
+   # install pajengr dependencies
+   $ sudo apt install git cmake flex bison
+   # install the pajengr R package
+   $ Rscript -e "library(devtools); install_github('schnorr/pajengr');"
 
 To take this tutorial, you will also need the platform files from the
 previous section as well as the source code of the NAS Parallel
 Benchmarks. Just  clone `this repository
 <https://framagit.org/simgrid/simgrid-template-smpi>`_  to get them all:
 
-.. code-block:: shell
+.. code-block:: console
 
-   git clone https://framagit.org/simgrid/simgrid-template-smpi.git
-   cd simgrid-template-smpi/
+   git clone https://framagit.org/simgrid/simgrid-template-smpi.git
+   cd simgrid-template-smpi/
 
 If you struggle with the compilation, then you should double-check
 your :ref:`SimGrid installation <install>`.  On need, please refer to
@@ -353,7 +357,7 @@ Compiling the program is straightforward (double-check your
 :ref:`SimGrid installation <install>` if you get an error message):
 
 
-.. code-block:: shell
+.. code-block:: console
 
   $ smpicc -O3 roundtrip.c -o roundtrip
 
@@ -361,7 +365,7 @@ Compiling the program is straightforward (double-check your
 Once compiled, you can simulate the execution of this program on 16
 nodes from the ``cluster_crossbar.xml`` platform as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
    $ smpirun -np 16 -platform cluster_crossbar.xml -hostfile cluster_hostfile ./roundtrip
 
@@ -400,7 +404,7 @@ data size
 <https://www.nas.nasa.gov/publications/npb_problem_sizes.html>`_) with
 4 nodes.
 
-.. code-block:: shell
+.. code-block:: console
 
    $ make lu NPROCS=4 CLASS=S
    (compilation logs)
@@ -411,9 +415,9 @@ To get a better understanding of what is going on, activate the
 visualization tracing, and convert the produced trace for later
 use:
 
-.. code-block:: shell
+.. code-block:: console
 
-   smpirun -np 4 -platform ../cluster_backbone.xml -trace --cfg=tracing/filename:lu.S.4.trace bin/lu.S.4
+   smpirun -np 4 -platform ../cluster_backbone.xml -trace --cfg=tracing/filename:lu.S.4.trace bin/lu.S.4
 
 You can then produce a Gantt Chart with the following R chunk. You can
 either copy/paste it in an R session, or `turn it into a Rscript executable
@@ -422,23 +426,50 @@ run it again and again.
 
 .. code-block:: R
 
-   library(pajengr)
-   library(ggplot2)
-
    # Read the data
-   df_state = pajeng_read("lu.S.4.trace")
-   names(df_state) = c("Type", "Rank", "Container", "Start", "End", "Duration", "Level", "State");
-   df_state = df_state[!(names(df_state) %in% c("Type","Container","Level"))]
-   df_state$Rank = as.numeric(gsub("rank-","",df_state$Rank))
+   library(tidyverse)
+   library(pajengr)
+   dta <- pajeng_read("lu.S.4.trace")
+
+   # Manipulate the data
+   dta$state %>%
+      # Remove some unnecessary columns for this example
+      select(-Type, -Imbrication) %>%
+      # Create the nice MPI rank and operations identifiers
+      mutate(Container = as.integer(gsub("rank-", "", Container)),
+             Value = gsub("^PMPI_", "MPI_", Value)) %>%
+      # Rename some columns so it can better fit MPI terminology
+      rename(Rank = Container,
+             Operation = Value) -> df.states
 
    # Draw the Gantt Chart
-   gc = ggplot(data=df_state) + geom_rect(aes(xmin=Start, xmax=End, ymin=Rank, ymax=Rank+1,fill=State))
-
-   # Produce the output
-   plot(gc)
-   dev.off()
-
-This produces a file called ``Rplots.pdf`` with the following
+   df.states %>%
+      ggplot() +
+      # Each MPI operation is becoming a rectangle
+      geom_rect(aes(xmin=Start, xmax=End,
+                    ymin=Rank,  ymax=Rank + 1,
+                    fill=Operation)) +
+      # Cosmetics
+      xlab("Time [seconds]") +
+      ylab("Rank [count]") +
+      theme_bw(base_size=14) +
+      theme(
+        plot.margin = unit(c(0,0,0,0), "cm"),
+        legend.margin = margin(t = 0, unit='cm'),
+        panel.grid = element_blank(),
+        legend.position = "top",
+        legend.justification = "left",
+        legend.box.spacing = unit(0, "pt"),
+        legend.box.margin = margin(0,0,0,0),
+        legend.title = element_text(size=10)) -> plot
+
+    # Save the plot in a PNG file (dimensions in inches)
+    ggsave("smpi.png",
+           plot,
+           width = 10,
+           height = 3)
+
+This produces a file called ``smpi.png`` with the following
 content. You can find more visualization examples `online
 <https://simgrid.org/contrib/R_visualization.html>`_.
 
@@ -450,7 +481,7 @@ Lab 2: Tracing and Replay of LU
 
 Now compile and execute the LU benchmark, class A, with 32 nodes.
 
-.. code-block:: shell
+.. code-block:: console
 
    $ make lu NPROCS=32 CLASS=A
 
@@ -465,7 +496,7 @@ skipped (the application must be network-dependent for this to work).
 
 You can even generate the trace during the live simulation as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
    $ smpirun -trace-ti --cfg=tracing/filename:LU.A.32 -np 32 -platform ../cluster_backbone.xml bin/lu.A.32
 
@@ -473,7 +504,7 @@ The produced trace is composed of a file ``LU.A.32`` and a folder
 ``LU.A.32_files``. You can replay this trace with SMPI thanks to ``smpirun``.
 For example, the following command replays the trace on a different platform:
 
-.. code-block:: shell
+.. code-block:: console
 
    $ smpirun -np 32 -platform ../cluster_crossbar.xml -hostfile ../cluster_hostfile -replay LU.A.32
 
@@ -508,9 +539,9 @@ The computing part of this example is the matrix multiplication routine
 
 .. literalinclude:: /tuto_smpi/gemm_mpi.cpp
    :language: cpp
-   :lines: 4-19
+   :lines: 9-24
 
-.. code-block:: shell
+.. code-block:: console
 
   $ smpicxx -O3 gemm_mpi.cpp -o gemm
   $ time smpirun -np 16 -platform cluster_crossbar.xml -hostfile cluster_hostfile --cfg=smpi/display-timing:yes --cfg=smpi/running-power:1000000000 ./gemm
@@ -529,7 +560,7 @@ running the simulation. Here we say that its speed is the same as one of the
 processors we are simulating (1Gf), so that 1 second of computation is injected 
 as 1 second in the simulation.
 
-.. code-block:: shell
+.. code-block:: console
 
   [5.568556] [smpi_kernel/INFO] Simulated time: 5.56856 seconds.
 
@@ -573,7 +604,7 @@ earlier if the expected stability is reached after fewer samples.
 Now run the code again with various sizes and parameters and check the time taken for the 
 simulation, as well as the resulting simulated time.
 
-.. code-block:: shell
+.. code-block:: console
 
   [5.575691] [smpi_kernel/INFO] Simulated time: 5.57569 seconds.
   The simulation took 1.23698 seconds (after parsing and platform setup)
@@ -607,7 +638,7 @@ Find it and replace the two other ones with ``SMPI_SHARED_MALLOC`` (there is onl
 
 Once done, you can now run
 
-.. code-block:: shell
+.. code-block:: console
 
    $ make dt NPROCS=85 CLASS=C
    (compilation logs)
@@ -633,14 +664,14 @@ It will display at the end of a (successful) run the largest allocations and the
 targets for sharing, or setting the threshold for automatic ones.
 For DT, the process would be to run a smaller class of problems, 
 
-.. code-block:: shell
+.. code-block:: console
 
    $ make dt NPROCS=21 CLASS=A
    $ smpirun --cfg=smpi/display-allocs:yes -np 21 -platform ../cluster_backbone.xml bin/dt.A.x BH
 
 Which should output:
 
-.. code-block:: shell
+.. code-block:: console
 
     [smpi_utils/INFO] Memory Usage: Simulated application allocated 198533192 bytes during its lifetime through malloc/calloc calls.
     Largest allocation at once from a single process was 3553184 bytes, at dt.c:388. It was called 3 times during the whole simulation.
index 6899c5e..8bfbb3e 100644 (file)
@@ -48,11 +48,11 @@ your machine: it works out of the box on Linux, Windows (with WSL2) and FreeBSD.
 -Denable_model-checking .``) and then compile SimGrid :ref:`as usual <install_src>`. Unfortunately, Mc SimGrid does not work natively
 on Mac OS X yet, so mac users should stick to the docker method for now.
 
-.. code-block:: shell
+.. code-block:: console
 
-   docker image pull simgrid/tuto-mc
-   mkdir ~/tuto-mcsimgrid # or chose another directory to share between your computer and the docker container 
-   docker run -it --rm --name mcsimgrid --volume ~/tuto-mcsimgrid:/source/tutorial simgrid/tuto-mc bash
+   docker image pull simgrid/tuto-mc
+   mkdir ~/tuto-mcsimgrid # or chose another directory to share between your computer and the docker container 
+   docker run -it --rm --name mcsimgrid --volume ~/tuto-mcsimgrid:/source/tutorial simgrid/tuto-mc bash
 
 In the container, you have access to the following directories of interest:
 
@@ -72,7 +72,7 @@ Motivational example
 Let's go with a first example of a bugged program. Once in the container, copy all files from the tutorial into the directory shared
 between your host computer and the container.
 
-.. code-block:: shell
+.. code-block:: console
 
   # From within the container
   $ cp -r /source/tuto-mc.git/* /source/tutorial/
@@ -95,7 +95,7 @@ The provided code is rather simple: Three ``client`` are launched with an intege
 send their parameter to a given mailbox. A ``server`` receives 3 messages and assumes that the last received message is the number ``3``.
 If you compile and run it, it simply works:
 
-.. code-block:: shell
+.. code-block:: console
 
    $ cmake . && make
    (output omitted)
@@ -116,7 +116,7 @@ the message ``3`` to arrive last. Depending on the link speed, any order should
 source code and/or the platform file, but this is not a method. Time to start Mc SimGrid, the SimGrid model checker, to exhaustively test
 all message orders. For that, you simply launch your simulation as a parameter to the ``simgrid-mc`` binary as you would do with ``valgrind``:
 
-.. code-block:: shell
+.. code-block:: console
 
    $ simgrid-mc ./ndet-receive-s4u small_platform.xml
    (some output ignored)
@@ -135,7 +135,7 @@ now read it together. It can be split in several parts:
     all possible outcome of the code, the execution is sometimes rewind to explore another possible branch (here: another possible
     message ordering). Note also that all times are always 0 in the model checker, since the time is abstracted away in this mode.
 
-    .. code-block:: shell
+    .. code-block:: console
 
        [0.000000] [mc_safety/INFO] Check a safety property. Reduction is: dpor.
        [Jupiter:client:(2) 0.000000] [example/INFO] Sending 1
@@ -158,7 +158,7 @@ now read it together. It can be split in several parts:
   - Then you have the error message, along with a backtrace of the application at the point where the assertion fails. Not all the frames of
     the backtrace are useful, and some are omitted here.
 
-    .. code-block:: shell
+    .. code-block:: console
 
        [Tremblay:server:(1) 0.000000] /source/tutorial/ndet-receive-s4u.cpp:27: [root/CRITICAL] Assertion value_got == 3 failed
        Backtrace (displayed in actor server):
@@ -170,7 +170,7 @@ now read it together. It can be split in several parts:
   - First, the error message itself. The ``xbt_assert`` in the code result in an ``abort()`` in the application, that is interpreted as an
     application crash by the model-checker.
 
-    .. code-block:: shell
+    .. code-block:: console
 
        [0.000000] [mc_ModelChecker/INFO] **************************
        [0.000000] [mc_ModelChecker/INFO] ** CRASH IN THE PROGRAM **
@@ -182,7 +182,7 @@ now read it together. It can be split in several parts:
     calls we made (put/get) are split in atomic calls (iSend+Wait/iRecv+Wait), and all executions are interleaved. Also, Mc SimGrid
     reports the first faulty execution it finds: it may not be the shorter possible one.
 
-    .. code-block:: shell
+    .. code-block:: console
   
        [0.000000] [mc_ModelChecker/INFO] Counter-example execution trace:
        [0.000000] [mc_ModelChecker/INFO]   [(1)Tremblay (server)] iRecv(dst=(1)Tremblay (server), buff=(verbose only), size=(verbose only))
@@ -198,7 +198,7 @@ now read it together. It can be split in several parts:
 
   - Then, the execution path is given.
 
-    .. code-block:: shell
+    .. code-block:: console
 
        [0.000000] [mc_record/INFO] Path = 1;2;1;1;2;4;1;1;3;1
 
@@ -206,7 +206,7 @@ now read it together. It can be split in several parts:
     without ``simgrid-mc``. This is because ``simgrid-mc`` forbids to use a debugger such as gdb or valgrind on the code during the
     model-checking. For example, you can trigger the same execution in valgrind as follows:
 
-    .. code-block:: shell
+    .. code-block:: console
 
        $ valgrind ./ndet-receive-s4u small_platform.xml --cfg=model-check/replay:'1;2;1;1;2;4;1;1;3;1'
        ==402== Memcheck, a memory error detector
@@ -233,7 +233,7 @@ now read it together. It can be split in several parts:
     point of the exploration), the visited states (the amount of times we visited another state -- the same state may have been visited
     several times) and the amount of transitions.
 
-    .. code-block:: shell
+    .. code-block:: console
 
        [0.000000] [mc_safety/INFO] Expanded states = 22
        [0.000000] [mc_safety/INFO] Visited states = 56
@@ -257,7 +257,7 @@ translation of ``ndet-receive-s4u.cpp`` to MPI.
 |br|
 You can compile and run it on top of SimGrid as follows.
 
-.. code-block:: shell
+.. code-block:: console
 
    $ smpicc ndet-receive-mpi.c -o ndet-receive-mpi
    $ smpirun -np 4 -platform small_platform.xml ndet-receive-mpi
@@ -266,14 +266,14 @@ Interestingly enough, the bug is triggered on my machine even without Mc SimGrid
 leading to it. It may not be the case on your machine, as this depends on the iteration order of an unsorted collection. Instead, we
 should use Mc SimGrid to exhaustively explore the state space and trigger the bug in all cases.
 
-.. code-block:: shell
+.. code-block:: console
 
    $ smpirun -wrapper simgrid-mc -np 4 -platform small_platform.xml ndet-receive-mpi
 
 The produced output is then very similar to the one you get with S4U, even if the exact execution path leading to the bug may differs. You
 can also trigger a given execution path out of the model-checker, for example to explore it with valgrind.
 
-.. code-block:: shell
+.. code-block:: console
 
    $ smpirun -wrapper valgrind -np 4 -platform small_platform.xml --cfg=model-check/replay:'1;2;1;1;4;1;1;3;1' ndet-receive-mpi
 
index d4f1814..16e0bfb 100644 (file)
@@ -342,7 +342,7 @@ and a download link.
 **Children tags:** :ref:`pf_tag_config` (must come first),
 :ref:`pf_tag_cluster`, :ref:`pf_tag_cabinet`, :ref:`pf_tag_peer`,
 :ref:`pf_tag_zone`, :ref:`pf_tag_trace`, :ref:`pf_tag_trace_connect`, or
-:ref:`pf_tag_actor` in :ref:`deployment <deploy>` files.|br|
+:ref:`pf_tag_actor` in :ref:`deployment <deploy>` files. |br|
 **Attributes:**
 
 :``version``: Version of the DTD, describing the whole XML format.
@@ -372,11 +372,10 @@ following functions:
 - Host: :cpp:func:`simgrid::s4u::Host::get_property` or :cpp:func:`MSG_host_get_property_value`
 - Link: :cpp:func:`simgrid::s4u::Link::get_property`
 - Disk: :cpp:func:`simgrid::s4u::Disk::get_property`
-- Storage :cpp:func:`MSG_storage_get_property_value` (deprecated)
-- Zone: :cpp:func:`simgrid::s4u::Zone::get_property` of :cpp:func:`MSG_zone_get_property_value`
+- Zone: :cpp:func:`simgrid::s4u::NetZone::get_property` of :cpp:func:`MSG_zone_get_property_value`
 
 **Parent tags:** :ref:`pf_tag_actor`, :ref:`pf_tag_config`, :ref:`pf_tag_cluster`, :ref:`pf_tag_host`,
-:ref:`pf_tag_link`, :ref:`pf_tag_disk`,:ref:`pf_tag_storage` (deprecated), :ref:`pf_tag_zone` |br|
+:ref:`pf_tag_link`, :ref:`pf_tag_disk`,:ref:`pf_tag_zone` |br|
 **Children tags:** none |br|
 **Attributes:**
 
@@ -429,7 +428,7 @@ break the routes that are longer than 1 hop.
 <zone>
 ------
 
-A networking zone is an area in which elements are located. See :cpp:class:`simgrid::s4u::Zone`.
+A networking zone is an area in which elements are located. See :cpp:class:`simgrid::s4u::NetZone`.
 
 **Parent tags:** :ref:`pf_tag_platform`, :ref:`pf_tag_zone` (only internal nodes, i.e., zones
 containing only inner zones or clusters but no basic
@@ -442,6 +441,213 @@ elements such as host or peer) |br|
    No other zone may have the same name over the whole platform.
 :``routing``: Routing algorithm to use.
 
+-------------------------------------------------------------------------------
+
+.. _pf_tag_zoneRoute:
+
+<zoneRoute>
+-----------
+
+The purpose of this entity is to define a route between two zones.
+Recall that all zones form a tree, so to connect two sibling zones,
+you must give such a zoneRoute specifying the source and destination zones,
+along with the gateway in each zone (i.e., the point to reach within that zone to reach the zone),
+and the list of links to go from one zone to another.
+
+**Parent tags:** :ref:`pf_tag_zone` |br|
+**Children tags:** :ref:`pf_tag_link_ctn` |br|
+**Attributes:**
+
+:``src``: Zone from which this route starts. Must be an existing zone.
+:``dst``: Zone to which this route leads. Must be an existing zone.
+:``gw_src``: Netpoint (within src zone) from which this route starts. Must be an existing host/router.
+:``gw_dst``: Netpoint (within dst zone) to which this route leads. Must be an existing host/router.
+:``symmetrical``: Whether this route is symmetrical, ie, whether we
+                 are defining the route ``dst -> src`` at the same
+                 time. Valid values: ``yes``, ``no``, ``YES``, ``NO``.
+
+-------------------------------------------------------------------------------
+
+.. _pf_tag_cluster:
+
+<cluster>
+---------
+
+This tag is commonly used when one wants to define many hosts and a network quickly.
+Technically, cluster is a meta-tag: **from the inner SimGrid point of
+view, a cluster is a network zone where some optimized routing is defined**.
+The default inner organization of the cluster is as follow:
+
+.. code-block:: text
+
+                 __________
+                |          |
+                |  router  |
+    ____________|__________|_____________ backbone
+      |   |   |              |     |   |
+    l0|        l1| l2|           l97| l96 |   | l99
+      |   |   |   ........   |     |   |
+      |                                |
+    c-0.me                             c-99.me
+
+
+Here, a set of **hosts** is defined. Each of them has a **link**
+to a central backbone (backbone is a link itself, as a link can
+be used to represent a switch).
+A **router** allows to connect a **cluster** to the outside world. Internally,
+SimGrid treats a cluster as a network zone containing all hosts: the router is the
+gateway for the cluster.
+
+There is an alternative organization, which is as follows:
+
+.. code-block:: text
+
+         __________
+        |          |
+        |  router  |
+        |__________|
+            / | \
+           /  |  \
+       l0 / l1|   \l2
+         /    |    \
+        /     |     \
+    host0   host1   host2
+
+The principle is the same, except that there is no backbone. This representation
+can be obtained easily: just do not set the bb_* attributes.
+
+**Parent tags:** :ref:`pf_tag_platform`, :ref:`pf_tag_zone` |br|
+**Children tags:** none |br|
+**Attributes:**
+
+:``id``: The identifier of the cluster. Facilitates referring to this cluster.
+:``prefix``: Each node of the cluster has to have a name. This name will be prefixed with this prefix.
+:``suffix``: Each node of the cluster will be suffixed with this suffix
+:``radical``: Regexp used to generate cluster nodes name.
+
+    Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. 
+    
+    The produced number is concatenated between prefix and suffix to form machine names.
+:``speed``: Same as the ``speed`` attribute of the :ref:`pf_tag_host` tag.
+:``core``: Same as the ``core`` attribute of the :ref:`pf_tag_host` tag.
+:``bw``: Bandwidth for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
+:``lat``: Latency for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
+:``sharing_policy``: Sharing policy for the links between nodes and backbone (if any). See :ref:`pf_tag_link` for syntax/details.
+:``bb_bw``: Bandwidth for backbone (if any). See :ref:`pf_tag_link` for syntax/details.
+
+    If bb_bw and bb_lat attributes are omitted, no backbone is created (alternative cluster architecture described earlier).
+:``bb_lat``: Latency for backbone (if any). See :ref:`pf_tag_link` section for syntax/details.
+
+    If bb_lat and bb_bw attributes are omitted, no backbone is created (alternative cluster architecture described earlier).
+:``bb_sharing_policy``: Sharing policy for the backbone (if any). See :ref:`pf_tag_link` section for syntax/details.
+:``limiter_link``: Bandwidth for limiter link (if any).
+
+    This adds a specific link for each node, to set the maximum bandwidth reached when communicating in both directions at the same time.
+    
+    In theory this value should be 2*bw for splitduplex links, but in reality this might be less. This value will depend heavily on the communication model, and on the cluster's hardware, so no default value can be set, this has to be measured.
+    
+    More details can be obtained in `Toward Better Simulation of MPI Applications on Ethernet/TCP Networks <https://hal.inria.fr/hal-00919507/>`_
+:``loopback_bw``: Bandwidth for loopback (if any). See :ref:`pf_tag_link` section for syntax/details.
+
+    If loopback_bw and loopback_lat attributes are omitted, no loopback link is created and all intra-node communication will use the main network link of the node.
+    
+    The sharing policy of a loopback link is **FATPIPE** :ref:`pf_tag_link`.
+:``loopback_lat``: Latency for loopback (if any). See loopback_bw for more info.
+:``topology``: Network topology to use.
+
+    SimGrid currently supports FLAT (with or without backbone, as described before), TORUS, FAT_TREE and DRAGONFLY attributes for this tag.
+
+    See :ref:`platform_examples` for more details.
+
+:``topo_parameters``: Specific parameters to pass for the topology defined in the topology tag.
+
+    For torus networks, comma-separated list of the number of nodes in each dimension of the torus.
+    
+    Please refer to :ref:`platform_examples`.
+
+
+Cluster example
+^^^^^^^^^^^^^^^
+
+Consider the following two (and independent) uses of the ``cluster`` tag:
+
+.. code-block:: xml
+
+    <cluster id="my_cluster_1" prefix="" suffix="" radical="0-262144"
+         speed="1e9" bw="125e6" lat="5E-5"/>
+
+    <cluster id="my_cluster_2" prefix="c-" suffix=".me" radical="0-99"
+         speed="1e9" bw="125e6" lat="5E-5"
+         bb_bw="2.25e9" bb_lat="5E-4"/>
+
+
+The second example creates one router and 100 machines with the following names:
+
+.. code-block:: text
+
+    c-my_cluster_2_router.me
+    c-0.me
+    c-1.me
+    c-2.me
+    ...
+    c-99.me
+
+.. note::
+    
+    The router name is defined as the resulting string: prefix + clusterId + "_router" + suffix.
+    In this case: *my_cluster_1_router* and *my_cluster_2_router.me*.
+
+-------------------------------------------------------------------------------
+
+.. _pf_tag_cabinet:
+
+<cabinet>
+---------
+
+.. note::
+    This tag is only available when the routing mode of the network zone
+    is set to ``Cluster``.
+
+The cabinet tag is, like the :ref:`pf_tag_cluster` tag,
+a meta-tag. This means that it is simply a shortcut for creating a set of (homogenous) hosts and links quickly;
+unsurprisingly, this tag was introduced to setup cabinets in data centers. Unlike
+:ref:`pf_tag_cluster`, however, the :ref:`pf_tag_cabinet` assumes that you create the backbone
+and routers yourself; see our examples below.
+
+**Parent tags:** :ref:`pf_tag_zone` |br|
+**Children tags:** none |br|
+**Attributes:**
+
+:``id``: The identifier of the cabinet. Facilitates referring to it.
+:``prefix``: Each node of the cabinet has to have a name. This name will be prefixed with this prefix.
+:``suffix``: Each node of the cabinet will be suffixed with this suffix.
+:``radical``: Regexp used to generate cabinet nodes name.
+    Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. 
+    
+    The produced number is concatenated between prefix and suffix to form machine names.
+:``speed``: Same as the ``speed`` attribute of the :ref:`pf_tag_host` tag.
+:``bw``: Bandwidth for the links between nodes and backbone (if any). See the :ref:`pf_tag_link` for syntax/details.
+:``lat``: Latency for the links between nodes and backbone (if any). See the :ref:`pf_tag_link` for syntax/details.
+
+.. note::
+    Please note that as of now, it is impossible to change attributes such as,
+    amount of cores (always set to 1), the initial state of hosts/links
+    (always set to ON), the sharing policy of the links (always set to **SPLITDUPLEX** :ref:`pf_tag_link` ).
+
+
+Cabinet example
+^^^^^^^^^^^^^^^
+The following example shows how to use the cabinet tag.
+
+.. literalinclude:: ../../examples/platforms/meta_cluster.xml
+
+\note
+   Please note that you must specify the :ref:`pf_backbone` tag by yourself;
+   this is not done automatically and there are no checks
+   that ensure this backbone was defined.
+
+The hosts generated in the above example are named host-1.cluster, host-2.cluster1
+etc.
 
 .. |br| raw:: html
 
index 0e5a943..082e64b 100644 (file)
@@ -180,7 +180,7 @@ Communications
 ==============
 
 .. doxygentypedef:: msg_comm_t
-
+.. doxygentypedef:: const_msg_comm_t
 .. doxygenfunction:: MSG_comm_destroy
 .. doxygenfunction:: MSG_comm_get_status
 .. doxygenfunction:: MSG_comm_get_task
@@ -244,7 +244,7 @@ processes.
 
 NetZone Management
 ==================
-Network Zone (:cpp:class:`msg_file_t`) and associated functions.
+Network Zone (:cpp:type:`msg_netzone_t`) and associated functions.
 
 .. doxygentypedef:: msg_netzone_t
 .. doxygenfunction:: MSG_zone_get_by_name
@@ -255,6 +255,8 @@ Network Zone (:cpp:class:`msg_file_t`) and associated functions.
 .. doxygenfunction:: MSG_zone_get_sons
 .. doxygenfunction:: MSG_zone_set_property_value
 
+.. _Java_doc:
+
 Java bindings
 *************
 
@@ -280,14 +282,14 @@ Using the Java bindings
 In most cases, you can use the SimGrid bindings as if it was a Java
 library:
 
-.. code-block:: shell
+.. code-block:: console
 
    $ javac -classpath .:path/to/simgrid.jar your/java/Code.java
    $ java -classpath .:path/to/simgrid.jar your.java.Code the/parameter/to/your/code
 
 For example:
 
-.. code-block:: shell
+.. code-block:: console
 
    $ cd examples/deprecated/java
    $ java -classpath ../../simgrid.jar:. .:../../simgrid.jar app.pingpong.Main ../platforms/platform.xml 
@@ -360,7 +362,6 @@ Package org.simgrid.msg
 
    Class org.simgrid.msg.As <java/org/simgrid/msg/As>
    Class org.simgrid.msg.Comm <java/org/simgrid/msg/Comm>
-   Class org.simgrid.msg.File <java/org/simgrid/msg/File>
    Class org.simgrid.msg.Host <java/org/simgrid/msg/Host>
    Class org.simgrid.msg.HostFailureException <java/org/simgrid/msg/HostFailureException>
    Class org.simgrid.msg.HostNotFoundException <java/org/simgrid/msg/HostNotFoundException>
@@ -372,8 +373,6 @@ Package org.simgrid.msg
    Class org.simgrid.msg.ProcessKilledError <java/org/simgrid/msg/ProcessKilledError>
    Class org.simgrid.msg.ProcessNotFoundException <java/org/simgrid/msg/ProcessNotFoundException>
    Class org.simgrid.msg.Semaphore <java/org/simgrid/msg/Semaphore>
-   Class org.simgrid.msg.Storage <java/org/simgrid/msg/Storage>
-   Class org.simgrid.msg.StorageNotFoundException <java/org/simgrid/msg/StorageNotFoundException>
    Class org.simgrid.msg.Task <java/org/simgrid/msg/Task>
    Class org.simgrid.msg.TaskCancelledException <java/org/simgrid/msg/TaskCancelledException>
    Class org.simgrid.msg.TimeoutException <java/org/simgrid/msg/TimeoutException>
index 42bc82c..a0b52e0 100644 (file)
@@ -438,10 +438,7 @@ Basic management
          #include <simgrid/actor.h>
 
       .. doxygentypedef:: sg_actor_t
-      .. cpp:type:: const s4u_Actor* const_sg_actor_t
-
-         Pointer to a constant actor object.
-
+      .. doxygentypedef:: const_sg_actor_t
       .. doxygenfunction:: sg_actor_ref
       .. doxygenfunction:: sg_actor_unref
 
@@ -460,6 +457,7 @@ Creating actors
 
       .. doxygenfunction:: simgrid::s4u::Actor::init(const std::string &name, s4u::Host *host)
       .. doxygenfunction:: simgrid::s4u::Actor::start(const std::function< void()> &code)
+      .. doxygenfunction:: simgrid::s4u::Actor::set_stacksize
 
    .. group-tab:: Python
 
@@ -470,6 +468,7 @@ Creating actors
       .. doxygenfunction:: sg_actor_create(const char *name, sg_host_t host, xbt_main_func_t code, int argc, char *const *argv)
       .. doxygenfunction:: sg_actor_init(const char *name, sg_host_t host)
       .. doxygenfunction:: sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char *const *argv)
+      .. doxygenfunction:: sg_actor_set_stacksize
 
       .. doxygenfunction:: sg_actor_attach(const char *name, void *data, sg_host_t host, xbt_dict_t properties)
       .. doxygenfunction:: sg_actor_detach()
@@ -741,7 +740,6 @@ the execution, or start an asynchronous activity.
       .. doxygenfunction:: simgrid::s4u::this_actor::execute(double flop)
       .. doxygenfunction:: simgrid::s4u::this_actor::execute(double flop, double priority)
       .. doxygenfunction:: simgrid::s4u::this_actor::parallel_execute(const std::vector< s4u::Host * > &hosts, const std::vector< double > &flops_amounts, const std::vector< double > &bytes_amounts)
-      .. doxygenfunction:: simgrid::s4u::this_actor::parallel_execute(const std::vector< s4u::Host * > &hosts, const std::vector< double > &flops_amounts, const std::vector< double > &bytes_amounts, double timeout)
 
    .. group-tab:: Python
 
@@ -1005,7 +1003,7 @@ Sending data
       .. automethod:: simgrid.Mailbox.put
       .. automethod:: simgrid.Mailbox.put_async
 
-   .. group-tab: C
+   .. group-tab:: C
 
       .. doxygenfunction:: sg_mailbox_put(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
       .. doxygenfunction:: sg_mailbox_put_init(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
@@ -1032,6 +1030,7 @@ Receiving data
    .. group-tab:: Python
 
        .. automethod:: simgrid.Mailbox.get
+       .. automethod:: simgrid.Mailbox.get_async
 
    .. group-tab:: C
 
@@ -1085,6 +1084,16 @@ Basic management
       idiom on disks because SimGrid does not allow (yet) to create nor
       destroy resources once the simulation is started. 
          
+      .. doxygenfunction:: simgrid::s4u::Disk::seal()
+
+   .. group-tab:: Python
+
+      .. code:: Python
+
+         from simgrid import Disk
+
+      .. automethod:: simgrid.Disk.seal
+
 
 Querying info
 -------------
@@ -1101,6 +1110,12 @@ Querying info
       .. doxygenfunction:: simgrid::s4u::Disk::get_read_bandwidth() const
       .. doxygenfunction:: simgrid::s4u::Disk::get_write_bandwidth() const
       .. doxygenfunction:: simgrid::s4u::Disk::set_property(const std::string &, const std::string &value)
+      .. doxygenfunction:: simgrid::s4u::Disk::set_sharing_policy(Operation op, SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {})
+
+   .. group-tab:: Python
+
+      .. autoattribute:: simgrid.Disk.name
+      .. automethod:: simgrid.Disk.set_sharing_policy
 
 I/O operations
 --------------
@@ -1115,6 +1130,13 @@ I/O operations
       .. doxygenfunction:: simgrid::s4u::Disk::write(sg_size_t size) const
       .. doxygenfunction:: simgrid::s4u::Disk::write_async(sg_size_t size) const
 
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.Disk.read
+      .. automethod:: simgrid.Disk.read_async
+      .. automethod:: simgrid.Disk.write
+      .. automethod:: simgrid.Disk.write_async
+
 Signals
 -------
 
@@ -1151,6 +1173,7 @@ Basic management
       destroy resources once the simulation is started. 
 
       .. doxygenfunction:: simgrid::s4u::Host::destroy()
+      .. doxygenfunction:: simgrid::s4u::Host::seal()
 
    .. group-tab:: Python
 
@@ -1158,6 +1181,8 @@ Basic management
 
          from simgrid import Host
 
+      .. automethod:: simgrid.Host.seal
+
    .. group-tab:: C
 
       .. code:: C
@@ -1196,6 +1221,23 @@ Retrieving hosts
       .. doxygenfunction:: sg_host_list()
       .. doxygenfunction:: sg_hosts_as_dynar()
 
+Modifying characteristics
+-------------------------
+
+.. tabs::
+
+   .. group-tab:: C++
+
+      .. doxygenfunction:: simgrid::s4u::Host::set_core_count(int core_count)
+      .. doxygenfunction:: simgrid::s4u::Host::set_coordinates(const std::string& coords)
+      .. doxygenfunction:: simgrid::s4u::Host::set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {})
+
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.Host.set_core_count
+      .. automethod:: simgrid.Host.set_coordinates
+      .. automethod:: simgrid.Host.set_sharing_policy
+
 Querying info
 -------------
 
@@ -1258,6 +1300,10 @@ Retrieving components
       .. doxygenfunction:: simgrid::s4u::Host::get_disks() const
       .. doxygenfunction:: simgrid::s4u::Host::remove_disk(const std::string &disk_name)
 
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.Host.get_disks
+
    .. group-tab:: C
 
       .. doxygenfunction:: sg_host_get_actor_list(const_sg_host_t host, xbt_dynar_t whereto)
@@ -1327,10 +1373,17 @@ using :cpp:func:`Comm::sendto() <simgrid::s4u::Comm::sendto()>`.
 
    .. group-tab:: C++
 
-      .. doxygenfunction:: simgrid::s4u::Host::get_englobing_zone()
+      .. doxygenfunction:: simgrid::s4u::Host::get_englobing_zone() const
       .. doxygenfunction:: simgrid::s4u::Host::get_netpoint() const
       .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< Link * > &links, double *latency) const
       .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< kernel::resource::LinkImpl * > &links, double *latency) const
+      .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
+      .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, const std::string& read_bandwidth, const std::string& write_bandwidth)
+
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.Host.get_netpoint
+      .. automethod:: simgrid.Host.create_disk
 
    .. group-tab:: C
 
@@ -1358,6 +1411,8 @@ Signals
 =============
 
 .. doxygenclass:: simgrid::s4u::Link
+.. doxygenclass:: simgrid::s4u::SplitDuplexLink
+.. doxygenclass:: simgrid::s4u::LinkInRoute
 
 Basic management
 ----------------
@@ -1374,12 +1429,16 @@ Basic management
       idiom on hosts because SimGrid does not allow (yet) to create nor
       destroy resources once the simulation is started. 
 
+      .. doxygenfunction:: simgrid::s4u::Link::seal()
+
    .. group-tab:: Python
 
       .. code:: Python
 
          from simgrid import Link
 
+      .. automethod:: simgrid.Link.seal
+
    .. group-tab:: C
 
       .. code:: C
@@ -1403,6 +1462,10 @@ Retrieving links
       .. doxygenfunction:: simgrid::s4u::Link::by_name(const std::string &name)
       .. doxygenfunction:: simgrid::s4u::Link::by_name_or_null(const std::string &name)
 
+   .. group-tab:: Python
+
+      .. autoattribute:: simgrid.Link.name
+
    .. group-tab:: C
 
       .. doxygenfunction:: sg_link_by_name(const char *name)
@@ -1440,6 +1503,15 @@ Modifying characteristics
 
       .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth(double value)
       .. doxygenfunction:: simgrid::s4u::Link::set_latency(double value)
+      .. doxygenfunction:: simgrid::s4u::Link::set_latency(const std::string& value)
+      .. doxygenfunction:: simgrid::s4u::Link::set_concurrency_limit(int limit)
+      .. doxygenfunction:: simgrid::s4u::Link::set_sharing_policy(SharingPolicy policy, const NonLinearResourceCb& cb = {})
+
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.Link.set_latency
+      .. automethod:: simgrid.Link.set_concurrency_limit
+      .. automethod:: simgrid.Link.set_sharing_policy
 
    .. group-tab:: C
 
@@ -1496,6 +1568,10 @@ WIFI links
 
       .. doxygenfunction:: simgrid::s4u::Link::set_host_wifi_rate
 
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.Link.set_host_wifi_rate
+
 Signals
 -------
 
@@ -1533,6 +1609,17 @@ Basic management
       idiom on network zones because SimGrid does not allow (yet) to create nor
       destroy resources once the simulation is started. 
 
+      .. automethod:: simgrid.NetZone.seal
+
+   .. group-tab:: Python
+
+      .. code:: Python
+
+         from simgrid import NetZone
+
+      .. autoclass:: simgrid.NetZone
+      .. automethod:: simgrid.NetZone.seal
+
    .. group-tab:: C
 
       .. code:: C
@@ -1569,6 +1656,12 @@ Querying info
 
       .. doxygenfunction:: simgrid::s4u::NetZone::get_cname() const
       .. doxygenfunction:: simgrid::s4u::NetZone::get_name() const
+      .. doxygenfunction:: simgrid::s4u::NetZone::get_netpoint()
+
+   .. group-tab:: Python
+
+      .. autoattribute:: simgrid.NetZone.name
+      .. automethod:: simgrid.NetZone.get_netpoint
 
    .. group-tab:: C
 
@@ -1585,6 +1678,10 @@ User data and properties
       .. doxygenfunction:: simgrid::s4u::NetZone::get_property(const std::string &key) const
       .. doxygenfunction:: simgrid::s4u::NetZone::set_property(const std::string &key, const std::string &value)
 
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.NetZone.set_property
+
    .. group-tab:: C
 
       .. doxygenfunction:: sg_zone_get_property_value(const_sg_netzone_t as, const char *name)
@@ -1611,11 +1708,17 @@ Routing data
 
    .. group-tab:: C++
 
-      .. doxygenfunction:: simgrid::s4u::NetZone::add_bypass_route
       .. doxygenfunction:: simgrid::s4u::NetZone::add_component(kernel::routing::NetPoint *elm)
       .. doxygenfunction:: simgrid::s4u::NetZone::add_route
+      .. doxygenfunction:: simgrid::s4u::NetZone::add_bypass_route
       .. doxygenfunction:: simgrid::s4u::NetZone::get_children() const
-      .. doxygenfunction:: simgrid::s4u::NetZone::get_father()
+      .. doxygenfunction:: simgrid::s4u::NetZone::get_parent() const
+      .. doxygenfunction:: simgrid::s4u::NetZone::set_parent(const NetZone* parent)
+
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.NetZone.add_route
+      .. automethod:: simgrid.NetZone.set_parent
 
    .. group-tab:: C
 
@@ -1629,9 +1732,89 @@ Signals
   .. group-tab:: C++
 
      .. doxygenvariable:: simgrid::s4u::NetZone::on_creation
-     .. doxygenvariable:: simgrid::s4u::NetZone::on_route_creation
      .. doxygenvariable:: simgrid::s4u::NetZone::on_seal
 
+Creating resources
+------------------
+
+Zones
+^^^^^
+.. tabs::
+
+  .. group-tab:: C++
+
+     .. doxygenfunction:: simgrid::s4u::create_full_zone(const std::string& name)
+     .. doxygenfunction:: simgrid::s4u::create_empty_zone(const std::string& name)
+     .. doxygenfunction:: simgrid::s4u::create_star_zone(const std::string& name)
+     .. doxygenfunction:: simgrid::s4u::create_dijkstra_zone(const std::string& name, bool cache)
+     .. doxygenfunction:: simgrid::s4u::create_floyd_zone(const std::string& name)
+     .. doxygenfunction:: simgrid::s4u::create_vivaldi_zone(const std::string& name)
+     .. doxygenfunction:: simgrid::s4u::create_wifi_zone(const std::string& name)
+     .. doxygenfunction:: simgrid::s4u::create_torus_zone(const std::string& name, const NetZone* parent, const std::vector<unsigned int>& dimensions, const ClusterCallbacks& set_callbacks, double bandwidth, double latency, Link::SharingPolicy sharing_policy)
+     .. doxygenfunction:: simgrid::s4u::create_fatTree_zone(const std::string& name, const NetZone* parent, const FatTreeParams& parameters, const ClusterCallbacks& set_callbacks, double bandwidth, double latency, Link::SharingPolicy sharing_policy)
+     .. doxygenfunction:: simgrid::s4u::create_dragonfly_zone(const std::string& name, const NetZone* parent, const DragonflyParams& parameters, const ClusterCallbacks& set_callbacks, double bandwidth, double latency, Link::SharingPolicy sharing_policy)
+
+  .. group-tab:: Python
+
+     .. automethod:: simgrid.NetZone.create_full_zone
+     .. automethod:: simgrid.NetZone.create_empty_zone
+     .. automethod:: simgrid.NetZone.create_star_zone
+     .. automethod:: simgrid.NetZone.create_dijkstra_zone
+     .. automethod:: simgrid.NetZone.create_floyd_zone
+     .. automethod:: simgrid.NetZone.create_vivaldi_zone
+     .. automethod:: simgrid.NetZone.create_wifi_zone
+     .. automethod:: simgrid.NetZone.create_torus_zone
+     .. automethod:: simgrid.NetZone.create_fatTree_zone
+     .. automethod:: simgrid.NetZone.create_dragonfly_zone
+
+Hosts
+^^^^^
+
+.. tabs::
+
+  .. group-tab:: C++
+
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<double>& speed_per_pstate)
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, double speed)
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<std::string>& speed_per_pstate)
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::string& speed)
+
+  .. group-tab:: Python
+
+     .. automethod:: simgrid.NetZone.create_host
+
+Links
+^^^^^
+
+.. tabs::
+
+  .. group-tab:: C++
+
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<double>& bandwidths)
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, double bandwidth)
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<std::string>& bandwidthds)
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::string& bandwidth)
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, const std::string& bandwidth)
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, double bandwidth)
+
+  .. group-tab:: Python
+
+     .. automethod:: simgrid.NetZone.create_link
+     .. automethod:: simgrid.NetZone.create_split_duplex_link
+
+Router
+^^^^^^
+
+.. tabs::
+
+  .. group-tab:: C++
+
+     .. doxygenfunction:: simgrid::s4u::NetZone::create_router(const std::string& name)
+
+  .. group-tab:: Python
+
+     .. automethod:: simgrid.NetZone.create_router
+
 .. _API_s4u_VirtualMachine:
 
 =======================
@@ -1745,6 +1928,10 @@ Signals
 
 .. _API_s4u_Activity:
 
+==========
+Activities
+==========
+
 ==============
 class Activity
 ==============
@@ -1754,7 +1941,7 @@ class Activity
 **Known subclasses:**
 :ref:`Communications <API_s4u_Comm>` (started on Mailboxes and consuming links),
 :ref:`Executions <API_s4u_Exec>` (started on Host and consuming CPU resources)
-:ref:`I/O <API_s4u_Io>` (started on and consumming disks).
+:ref:`I/O <API_s4u_Io>` (started on and consuming disks).
 See also the :ref:`section on activities <s4u_Activities>` above.
 
 Basic management
@@ -1886,19 +2073,27 @@ also start direct communications as shown below.
       .. doxygenfunction:: simgrid::s4u::Comm::cancel
       .. doxygenfunction:: simgrid::s4u::Comm::start
       .. doxygenfunction:: simgrid::s4u::Comm::test
-      .. doxygenfunction:: simgrid::s4u::Comm::test_any(const std::vector< CommPtr > *comms)
+      .. doxygenfunction:: simgrid::s4u::Comm::test_any(const std::vector< CommPtr >comms)
       .. doxygenfunction:: simgrid::s4u::Comm::wait
-      .. doxygenfunction:: simgrid::s4u::Comm::wait_all(const std::vector< CommPtr > *comms)
-      .. doxygenfunction:: simgrid::s4u::Comm::wait_any(const std::vector< CommPtr > *comms)
-      .. doxygenfunction:: simgrid::s4u::Comm::wait_any_for(const std::vector< CommPtr > *comms_in, double timeout)
+      .. doxygenfunction:: simgrid::s4u::Comm::wait_all(const std::vector< CommPtr >& comms)
+      .. doxygenfunction:: simgrid::s4u::Comm::wait_all_for(const std::vector< CommPtr >& comms, double timeout)
+      .. doxygenfunction:: simgrid::s4u::Comm::wait_any(const std::vector< CommPtr >& comms)
+      .. doxygenfunction:: simgrid::s4u::Comm::wait_any_for(const std::vector< CommPtr >& comms, double timeout)
       .. doxygenfunction:: simgrid::s4u::Comm::wait_for
 
    .. group-tab:: Python
 
-       .. automethod:: simgrid.Comm.test
-       .. automethod:: simgrid.Comm.wait
-       .. automethod:: simgrid.Comm.wait_all
-       .. automethod:: simgrid.Comm.wait_any
+      .. automethod:: simgrid.Comm.test
+      .. automethod:: simgrid.Comm.wait
+      .. automethod:: simgrid.Comm.wait_all
+      .. automethod:: simgrid.Comm.wait_any
+
+   .. group-tab:: C
+
+      .. doxygenfunction:: sg_comm_test
+      .. doxygenfunction:: sg_comm_wait
+      .. doxygenfunction:: sg_comm_wait_all
+      .. doxygenfunction:: sg_comm_wait_any
 
 Signals
 -------
@@ -1959,11 +2154,7 @@ Querying info
       .. doxygenfunction:: simgrid::s4u::Exec::get_finish_time() const
       .. doxygenfunction:: simgrid::s4u::Exec::get_host() const
       .. doxygenfunction:: simgrid::s4u::Exec::get_host_number() const
-      .. cpp:function:: double Exec::get_remaining()
-
-         On sequential executions, returns the amount of flops that remain to be done;
-         This cannot be used on parallel executions.
-      
+      .. doxygenfunction:: simgrid::s4u::Exec::get_remaining
       .. doxygenfunction:: simgrid::s4u::Exec::get_remaining_ratio
       .. doxygenfunction:: simgrid::s4u::Exec::get_start_time() const
       .. doxygenfunction:: simgrid::s4u::Exec::set_bound(double bound)
@@ -1993,12 +2184,11 @@ Life cycle
    .. group-tab:: C++
 
       .. doxygenfunction:: simgrid::s4u::Exec::cancel
-      .. doxygenfunction:: simgrid::s4u::Exec::set_timeout(double timeout)
       .. doxygenfunction:: simgrid::s4u::Exec::start
       .. doxygenfunction:: simgrid::s4u::Exec::test
       .. doxygenfunction:: simgrid::s4u::Exec::wait
-      .. doxygenfunction:: simgrid::s4u::Exec::wait_any(std::vector< ExecPtr > *execs)
-      .. doxygenfunction:: simgrid::s4u::Exec::wait_any_for(std::vector< ExecPtr > *execs, double timeout)
+      .. doxygenfunction:: simgrid::s4u::Exec::wait_any(const std::vector< ExecPtr >& execs)
+      .. doxygenfunction:: simgrid::s4u::Exec::wait_any_for(const std::vector< ExecPtr >& execs, double timeout)
       .. doxygenfunction:: simgrid::s4u::Exec::wait_for
 
    .. group-tab:: Python
@@ -2071,6 +2261,15 @@ Life cycle
       .. doxygenfunction:: simgrid::s4u::Io::test
       .. doxygenfunction:: simgrid::s4u::Io::wait
       .. doxygenfunction:: simgrid::s4u::Io::wait_for
+      .. doxygenfunction:: simgrid::s4u::Io::wait_any
+      .. doxygenfunction:: simgrid::s4u::Io::wait_any_for
+
+   .. group-tab:: Python
+
+      .. automethod:: simgrid.Io.test
+      .. automethod:: simgrid.Io.wait
+      .. automethod:: simgrid.Io.wait_any_for
+      .. automethod:: simgrid.Io.wait_any
 
 .. _API_s4u_Synchronizations:
 
@@ -2099,9 +2298,7 @@ Basic management
 
          .. doxygentypedef:: MutexPtr
 
-         .. doxygenfunction:: simgrid::s4u::Mutex::Mutex(kernel::activity::MutexImpl *mutex)
          .. doxygenfunction:: simgrid::s4u::Mutex::create()
-         .. doxygenfunction:: simgrid::s4u::Mutex::~Mutex()
 
       .. group-tab:: C
 
@@ -2255,8 +2452,6 @@ Basic management
             #include <simgrid/s4u/Semaphore.hpp>
 
          .. doxygentypedef:: SemaphorePtr
-         .. doxygenfunction:: simgrid::s4u::Semaphore::Semaphore(unsigned int initial_capacity)
-         .. doxygenfunction:: simgrid::s4u::Semaphore::~Semaphore()
          .. doxygenfunction:: simgrid::s4u::Semaphore::create(unsigned int initial_capacity)
 
       .. group-tab:: C
index 0462def..a62509f 100644 (file)
@@ -74,9 +74,9 @@ If you use cmake, set the variables ``MPI_C_COMPILER``, ``MPI_CXX_COMPILER`` and
 ``MPI_Fortran_COMPILER`` to the full path of smpicc, smpicxx and smpiff (or
 smpif90), respectively. Example:
 
-.. code-block:: shell
+.. code-block:: console
 
-   cmake -DMPI_C_COMPILER=/opt/simgrid/bin/smpicc -DMPI_CXX_COMPILER=/opt/simgrid/bin/smpicxx -DMPI_Fortran_COMPILER=/opt/simgrid/bin/smpiff .
+   cmake -DMPI_C_COMPILER=/opt/simgrid/bin/smpicc -DMPI_CXX_COMPILER=/opt/simgrid/bin/smpicxx -DMPI_Fortran_COMPILER=/opt/simgrid/bin/smpiff .
 
 ....................
 Simulating your Code
@@ -84,9 +84,9 @@ Simulating your Code
 
 Use the ``smpirun`` script as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
-   smpirun -hostfile my_hostfile.txt -platform my_platform.xml ./program -blah
+   smpirun -hostfile my_hostfile.txt -platform my_platform.xml ./program -blah
 
 - ``my_hostfile.txt`` is a classical MPI hostfile (that is, this file
   lists the machines on which the processes must be dispatched, one
@@ -120,17 +120,17 @@ following commands. Once in GDB, each MPI ranks will be represented as
 a regular thread, and you can explore the state of each of them as
 usual.
 
-.. code-block:: shell
+.. code-block:: console
 
-   smpirun -wrapper valgrind ...other args...
-   smpirun -wrapper "gdb --args" --cfg=contexts/factory:thread ...other args...
+   smpirun -wrapper valgrind ...other args...
+   smpirun -wrapper "gdb --args" --cfg=contexts/factory:thread ...other args...
 
 Some shortcuts are available:
 
 - ``-gdb`` is equivalent to ``-wrapper "gdb --args" -keep-temps``, to run within gdb debugger
 - ``-lldb`` is equivalent to ``-wrapper "lldb --" -keep-temps``, to run within lldb debugger
-- ``-vgdb`` is equivalent to ``-wrapper "valgrind --vgdb=yes --vgdb-error=0"
--keep-temps``, to run within valgrind and allow to attach a debugger
+- ``-vgdb`` is equivalent to ``-wrapper "valgrind --vgdb=yes --vgdb-error=0" -keep-temps``,
+  to run within valgrind and allow to attach a debugger
 
 To help locate bottlenecks and largest allocations in the simulated application,
 the -analyze flag can be passed to smpirun. It will activate
@@ -687,7 +687,13 @@ their duration, and this duration will be used for the subsequent
 iterations. These samples are done per processor with
 SMPI_SAMPLE_LOCAL, and shared between all processors with
 SMPI_SAMPLE_GLOBAL. Of course, none of this will work if the execution
-time of your loop iteration are not stable.
+time of your loop iteration are not stable. If some parameters have an
+incidence on the timing of a kernel, and if they are reused often 
+(same kernel launched with a few different sizes during the run, for example), 
+SMPI_SAMPLE_LOCAL_TAG and SMPI_SAMPLE_GLOBAL_TAG can be used, with a tag 
+as last parameter, to differentiate between calls. The tag is a character 
+chain crafted by the user, with a maximum size of 128, and should include
+what is necessary to group calls of a given size together. 
 
 This feature is demoed by the example file
 `examples/smpi/NAS/ep.c <https://framagit.org/simgrid/simgrid/tree/master/examples/smpi/NAS/ep.c>`_
@@ -777,10 +783,10 @@ functional or that you are cross-compiling, try to define the
 ``SMPI_PRETEND_CC`` environment variable before running the
 configuration.
 
-.. code-block:: shell
+.. code-block:: console
 
-   SMPI_PRETEND_CC=1 ./configure # here come the configure parameters
-   make
+   SMPI_PRETEND_CC=1 ./configure # here come the configure parameters
+   make
 
 Indeed, the programs compiled with ``smpicc`` cannot be executed
 without ``smpirun`` (they are shared libraries and do weird things on
@@ -802,10 +808,10 @@ fail without ``smpirun``.
 In addition to the previous answers, some projects also need to be
 explicitly told what compiler to use, as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
-   SMPI_PRETEND_CC=1 ./configure CC=smpicc # here come the other configure parameters
-   make
+   SMPI_PRETEND_CC=1 ./configure CC=smpicc # here come the other configure parameters
+   make
 
 Maybe your configure is using another variable, such as ``cc`` (in
 lower case) or similar. Just check the logs.
@@ -841,7 +847,7 @@ SimGrid uses time-independent traces, in which each actor is given a
 script of the actions to do sequentially. These trace files can
 actually be captured with the online version of SMPI, as follows:
 
-.. code-block:: shell
+.. code-block:: console
 
    $ smpirun -trace-ti --cfg=tracing/filename:LU.A.32 -np 32 -platform ../cluster_backbone.xml bin/lu.A.32
 
@@ -854,12 +860,14 @@ To replay this with SMPI, you need to first compile the provided
 `simgrid/examples/smpi/replay
 <https://framagit.org/simgrid/simgrid/tree/master/examples/smpi/replay>`_.
 
-.. code-block:: shell
+.. code-block:: console
 
    $ smpicxx ../replay.cpp -O3 -o ../smpi_replay
 
 Afterward, you can replay your trace in SMPI as follows:
 
+.. code-block:: console
+
    $ smpirun -np 32 -platform ../cluster_torus.xml -ext smpi_replay ../smpi_replay LU.A.32
 
 All the outputs are gone, as the application is not really simulated
index 39715a8..d380ee1 100644 (file)
@@ -56,40 +56,35 @@ Giving back to SimGrid
 We are sometimes asked by users how to give back to the project. Here
 are some ideas, but if you have new ones, feel free to share them with us.
 
+Provide fresh-eyes feedback
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+We are working on the project since years. We take for granted things that are hard to infer at first, and traps we don't even see anymore. 
+Likewise, it's hard for us to maintain the documentation uptodate with the current situation, because we don't rely on the doc when navigating the project.
+This is why your first impression as a newcomer to the project is utterly precious for us. 
+Please make sure to write a `discovery report <https://diff.wikimedia.org/2014/03/25/seeing-through-the-eyes-of-new-technical-contributors/>`_ to enlight us.
+You can send it either as a bug report, as a mail on the list or simply post it as is to the Mattermost channel.
+
 Spread the word
 ^^^^^^^^^^^^^^^
 
-There are many ways to help the SimGrid project. The first and most
-natural one is to **use SimGrid for your research, and say so**. Cite
-the SimGrid framework in your papers and discuss of its advantages with
-your colleagues to spread the word. When we ask for new funding to
-sustain the project, the number of publications enabled by SimGrid is
-always the first question we get. The more you use the framework,
-the better for us. 
-
-Make sure that your scientific publications using SimGrid actually
-cite the `right paper <https://simgrid.org/publications.html>`_.
-Also make sure that these citations are correctly listed on 
-`our list <https://simgrid.org/usages.html>`_.
-
-You can also **help us constituting an active and welcoming user
-community**. Subscribe to the mailing lists, and answer the
-questions that newscomers have if you can. Point them (gently ;) to
-the relevant part of the documentation on need, and help them becoming
-part of our community too. 
-
-Another easy way to help the project is to add a link to the `SimGrid
-homepage <https://simgrid.org>`_ on your site to improve SimGrid's ranking in
-search engines.
-
-Finally, if you organize a scientific event where you expect many
-potential users, you can invite us to give a tutorial on SimGrid. We
-found that 45 minutes to one hour is very sharp, but
-`doable <http://people.irisa.fr/Martin.Quinson/blog/2012/1120/Simgrid_at_Louvain/>`_.
-It is enough to explain the main motivations and outcomes of the
-project in order to motivate the attendees get more information on
-SimGrid, and eventually improve their scientific habits by using a
-sound simulation framework. 
+A simple way to help the SimGrid project is to **use SimGrid for your research, and say so**. 
+`Cite the SimGrid framework<https://simgrid.org/publications.html>`_ in your papers and speak of it with your colleagues to spread the word. 
+The number of publications enabled by SimGrid is really important when asking for further fundings to sustain the project:
+The more you use the framework, the better for us. 
+
+Add a link to the `SimGrid homepage <https://simgrid.org>`_ on your site to improve our ranking in search engines.
+
+You can also **help us constituting an active and welcoming user community**. Answer to the question sent to the mailing lists if you can, gently pointing to
+the relevant part of the documentation on need, and help newscomers becoming part of our community too. 
+
+Finally, you can invite us for a talk on SimGrid to events you organize.
+We have various format, ranging from a focused `20 minute talks <http://people.irisa.fr/Martin.Quinson/blog/2020/1124/SimGrid_presentations>`_ 
+to a `45mn dense tutorial <http://people.irisa.fr/Martin.Quinson/blog/2012/1120/Simgrid_at_Louvain/>`_, 
+to a `2 hours seminar <http://people.irisa.fr/Martin.Quinson/blog/2016/0524/Experimental_methodology_for_distributed_systems>`_, or
+even to `multi-days events <https://simgrid.org/tutorials.html>`_.
+Note that even if most of these examples are from the same individual, several people in the team can present the project.
+It's just that I wrote this paragraph so took the examples I knew, from my own experience :)
 
 Report (and fix) issues
 ^^^^^^^^^^^^^^^^^^^^^^^
@@ -102,7 +97,7 @@ large code and documentation base. So please, **report any issue you
 find**, be it a typo in the documentation, a paragraph that needs to
 be reworded, a bug in the code, or any other problem. The best way to
 do so is to open an issue on our
-`Bug Tracker <https://github.com/simgrid/simgrid/issues>`_ so
+`Bug Tracker <https://framagit.org/simgrid/simgrid/issues>`_ so
 that we don't forget about it. 
 
 The worst way to report such issues is to go through private emails.
index 89b8cb2..fed868f 100644 (file)
@@ -36,7 +36,7 @@ copyright = u'2002-2021, The SimGrid Team'
 author = u'The SimGrid Team'
 
 # The short X.Y version
-version = u'3.27.1'
+version = u'3.28.1'
 
 # -- General configuration ---------------------------------------------------
 
@@ -71,8 +71,8 @@ nitpick_ignore = [
   ('cpp:identifier', 'boost::intrusive_ptr<Activity>'),
   ('cpp:identifier', 'boost::intrusive_ptr<Actor>'),
   ('cpp:identifier', 'boost::intrusive_ptr<Barrier>'),
-  ('cpp:identifier', 'boost::intrusive_ptr<ConditionVariable>'),
   ('cpp:identifier', 'boost::intrusive_ptr<Comm>'),
+  ('cpp:identifier', 'boost::intrusive_ptr<ConditionVariable>'),
   ('cpp:identifier', 'boost::intrusive_ptr<Exec>'),
   ('cpp:identifier', 'boost::intrusive_ptr<Io>'),
   ('cpp:identifier', 'boost::intrusive_ptr<Mutex>'),
@@ -80,44 +80,73 @@ nitpick_ignore = [
   ('cpp:identifier', 'kernel'),
   ('cpp:identifier', 'kernel::activity'),
   ('cpp:identifier', 'kernel::activity::ActivityImplPtr'),
+  ('cpp:identifier', 'kernel::activity::CommImpl'),
   ('cpp:identifier', 'kernel::activity::CommImplPtr'),
   ('cpp:identifier', 'kernel::actor'),
   ('cpp:identifier', 'kernel::actor::ActorCodeFactory'),
   ('cpp:identifier', 'kernel::actor::ActorImpl'),
   ('cpp:identifier', 'kernel::profile'),
+  ('cpp:identifier', 'kernel::profile::Profile'),
   ('cpp:identifier', 'kernel::resource'),
   ('cpp:identifier', 'kernel::resource::Action'),
+  ('cpp:identifier', 'kernel::resource::Action::State'),
+  ('cpp:identifier', 'kernel::resource::LinkImpl'),
   ('cpp:identifier', 'kernel::resource::NetworkAction'),
   ('cpp:identifier', 'kernel::routing'),
   ('cpp:identifier', 'kernel::routing::NetPoint'),
-  ('cpp:identifier', 'sg_msg_Comm'),
-  ('cpp:identifier', 'sg_msg_Task'),
-  ('cpp:identifier', 'simgrid'),
-  ('cpp:identifier', 'simgrid::s4u'),
-  ('cpp:identifier', 'simgrid::s4u::this_actor'),
-  ('cpp:identifier', 'simgrid::s4u::Activity_T<Comm>'),
-  ('cpp:identifier', 'simgrid::s4u::Activity_T<Exec>'),
-  ('cpp:identifier', 'simgrid::s4u::Activity_T<Io>'),
-  ('cpp:identifier', 'simgrid::xbt'),
-  ('cpp:identifier', 'this_actor'),
   ('cpp:identifier', 's4u'),
   ('cpp:identifier', 's4u_Actor'),
   ('cpp:identifier', 's4u_Barrier'),
   ('cpp:identifier', 's4u_Comm'),
   ('cpp:identifier', 's4u_ConditionVariable'),
   ('cpp:identifier', 's4u_Exec'),
+  ('cpp:identifier', 's4u_File'),
   ('cpp:identifier', 's4u_Host'),
-  ('cpp:identifier', 's4u_NetZone'),
+  ('cpp:identifier', 's4u_Link'),
   ('cpp:identifier', 's4u_Mailbox'),
   ('cpp:identifier', 's4u_Mutex'),
-  ('cpp:identifier', 's4u_Link'),
+  ('cpp:identifier', 's4u_NetZone'),
   ('cpp:identifier', 's4u_Semaphore'),
-  ('cpp:identifier', 's4u_VirtualMachine'),
   ('cpp:identifier', 's4u_VM'),
+  ('cpp:identifier', 's4u_VirtualMachine'),
+  ('cpp:identifier', 'sg_msg_Comm'),
+  ('cpp:identifier', 'sg_msg_Task'),
+  ('cpp:identifier', 'simgrid'),
+  ('cpp:identifier', 'simgrid::s4u'),
+  ('cpp:identifier', 'simgrid::s4u::Activity_T<Comm>'),
+  ('cpp:identifier', 'simgrid::s4u::Activity_T<Exec>'),
+  ('cpp:identifier', 'simgrid::s4u::Activity_T<Io>'),
+  ('cpp:identifier', 'simgrid::s4u::this_actor'),
+  ('cpp:identifier', 'simgrid::xbt'),
+  ('cpp:identifier', 'simgrid::xbt::string'),
   ('cpp:identifier', 'size_t'),
+  ('cpp:identifier', 'ssize_t'),
+  ('cpp:identifier', 'this_actor'),
   ('cpp:identifier', 'uint64_t'),
   ('cpp:identifier', 'xbt'),
+  ('cpp:identifier', 'xbt::Extendable<Actor>'),
+  ('cpp:identifier', 'xbt::Extendable<Disk>'),
+  ('cpp:identifier', 'xbt::Extendable<File>'),
+  ('cpp:identifier', 'xbt::Extendable<Host>'),
+  ('cpp:identifier', 'xbt::Extendable<Link>'),
   ('cpp:identifier', 'xbt::signal<void()>'),
+  ('cpp:identifier', 'xbt::signal<void(Actor const&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Actor&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Comm const&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Comm const&, bool is_sender)>'),
+  ('cpp:identifier', 'xbt::signal<void(Disk const&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Disk&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Exec const&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Host const&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Host&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Link const&)>'),
+  ('cpp:identifier', 'xbt::signal<void(Link&)>'),
+  ('cpp:identifier', 'xbt::signal<void(NetZone const&)>'),
+  ('cpp:identifier', 'xbt::signal<void(VirtualMachine const&)>'),
+  ('cpp:identifier', 'xbt::signal<void(const Actor&, const Host &previous_location)>'),
+  ('cpp:identifier', 'xbt::signal<void(double)>'),
+  ('cpp:identifier', 'xbt::signal<void(kernel::resource::NetworkAction&)>'),
+  ('cpp:identifier', 'xbt::signal<void(kernel::resource::NetworkAction&, kernel::resource::Action::State)>'),
   ('cpp:identifier', 'xbt::signal<void(void)>'),
   ('cpp:identifier', 'xbt::string'),
 ]
index 97d219e..f710aa1 100644 (file)
      transform="translate(-2.308124,-62.995623)"
      style="display:inline">
     <a
-       xlink:href="platform.html"
+       xlink:href="Platform.html"
        style="fill:#ffffff;fill-opacity:1"
        id="a2388"
        inkscape:label="PlatformLink">
            sodipodi:role="line">available resources</tspan></text>
     </a>
     <a
-       xlink:href="Experimental_Setup.html"
+       xlink:href="Experimental_setup.html"
        inkscape:label="XPSetupLink"
        id="a6081">
       <rect
            id="tspan820">Setup</tspan></text>
     </a>
     <a
-       xlink:href="platform.html#performance-profiles-and-churn"
        transform="translate(21.166664,43.282215)"
        inkscape:label="ProfileLink"
        style="fill:#ffffff;fill-opacity:1"
            id="tspan2827" /></text>
     </a>
     <a
-       xlink:href="Deploying_your_Application.html"
+       xlink:href="Deploying_your_application.html"
        inkscape:label="DeployLink"
        transform="translate(-2.8431311e-6,13.229176)"
        id="a6179">
          style="line-height:4.4979167px;text-align:start;text-anchor:start;fill:#0a3455;fill-opacity:1;stroke-width:0.26458332px"
          id="tspan4614">Manual</tspan></text>
     <a
-       xlink:href="platform.html#defining-a-routing"
+       xlink:href="Platform_routing.html"
        transform="translate(-32.808342,8.6462044)"
        style="display:inline;fill:#ffffff;fill-opacity:1"
        id="a6094"
        inkscape:label="OfflineTraceLink"
        style="display:inline;fill:#ffffff;fill-opacity:1"
        id="a6097-3-1"
-       transform="translate(-56.885422,31.905132)"
-       xlink:href="">
+       transform="translate(-56.885422,31.905132)">
       <rect
          inkscape:label="OfflineTraceBox"
          ry="0.87357658"
            sodipodi:role="line">+</tspan></text>
     </g>
     <a
-       xlink:href="Platform_Examples.html"
+       xlink:href="Platform_examples.html"
        inkscape:label="ExamplesLink"
        transform="translate(-20.902092,-41.010402)"
        style="display:inline;fill:#ffffff;fill-opacity:1"
            style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888903px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';stroke-width:0.26458332px">Examples</tspan></text>
     </a>
     <a
-       xlink:href="XML_Reference.html"
+       xlink:href="XML_reference.html"
        id="a6161-7-2"
        style="display:inline;fill:#ffffff;fill-opacity:1"
        transform="translate(6.879166,-41.010404)"
diff --git a/docs/source/img/starzone.drawio b/docs/source/img/starzone.drawio
new file mode 100644 (file)
index 0000000..e75ccc5
--- /dev/null
@@ -0,0 +1 @@
+<mxfile host="app.diagrams.net" modified="2021-06-17T09:26:15.849Z" agent="5.0 (X11)" etag="N6K-KrzHWejq6iRW8KEo" version="14.7.10" type="device"><diagram name="Page-1" id="97916047-d0de-89f5-080d-49f4d83e522f">7VrJcuM2EP0aHe0SCK5Hy0tSlZnEVU5lmcsUTEISYorggJAlzdcHJACuoGSNSMt2zcUWGnu/7n7NJifwerX9haF0+ZlGOJ5Y02g7gTcTywp8S/zNBTspcC1PChaMRFIEKsED+Y6VcKqkaxLhrDGQUxpzkjaFIU0SHPKGDDFGN81hcxo3d03RAncEDyGKtfTSqeR/k4gvlRy4QdXxKyaLpdrc1zd8ROHTgtF1onZMaIJlzwrpZdQtsyWK6KYmgrcTeM0o5fLXanuN41yvWmdy3l1Pb3kVhhP+kgkXd1+izfcFYMFnn95/DX//9tdvF0BB94zitdKGOi3fafUU18P5KmACZ5sl4fghRWHeuxH2IGRLvopV95zE8TWNKSvmwghhfx4KecYZfcK1Hjf08eM879F6yadnT5iHS9WI0SOO72lGOKGJkMV4Lm46e8aME4Hep1b3ikRRfuYZiskiFzAJWDnhSsnLgeruohtve7UKSqyE/WO6wpztxBA1AfoKXmX7lqPam8qOHFvJljUTgtoukLLeRbl2BaL4oXA8AlN9iRqEOBIGr5qU8SVd0ATFt5V0VoE8Fa1qzCdKUwXHf5jznfJetOa0CbwEWHuP0NgMJ9FV7p2iWbhFIbkj+WWKTeQp86Pt1724CV2zEO+5MjRjxHCMOHlurm/St5p6T4nYucTWDZrYdiDjiC0wV7Mq1MSt0a42LM0HZP372J55n8oI5IqVSZR3PMFKfIPnu3HuL3NanK6yH/fbmuqOi6ywgCsxALjptuoUvxb5/08keQJ6KXE0uZrsMxpm4cdNY9IeHApLwGyfCzMszoMei/Vyo1K6Fos7s4lzs8/JFZ2oyVWgrhvgHgfrDQkX00vbtYMGpBdqzx+1SD2EzucZ5pN2iBjAHmCvOUTk+UXWAE3WcLRN+aZVrnrtqRQXp+yzsjgWuQQ+zF4oS2WCMSfbPBgOwRA2bHp36e01hvANBOGPxg/2OfjhEBt0+WNAfnBfhx/ccfjBheZ9xuUHb0R+gF9Fypd8bJKwD5EEcFzQjAyncYQ+uN00ltYC4zGIe7rBGIP/7MV2cs4w7/hvLcw7IzqwfYzvjs4sQl3/5PMvXd38VzaFDpTgZqs2kK1dvXWPGRE6z2OIEp6RqlTYldSxZxzwT+S0k4xrAHIw+vr1u/B1L3hjvh4Y4GgpLFuitNAQ2hX0Vy+2FEYt3cvV9IjZ7TOWLAmMlFmv9Cg3afMsoxzxOu/WHE2yds31ZlmC0j+pZDO56QBQue2wHHShMpVn7LGg0kXPn1h13Qq8NazAT6z6sLLfGlb9BYyXUpIFTJT0IKhYdH4pKvsvIyehVn6YmQZAwW55jOV2UQCWAQY4Ggz2YZfp5le9dWT7iOSqq6V6Dd6gBC0buAwAvJZyZc7XKQMcXKhEd+h6Qmsfy5sedS4IjhzfXH+cegUw5UBHpqSe8fEThU+PRzj/u6xWgIPVCj8AXtNqBnGe8g2kWjXwmiuMV66wBqhX9D4fO2/q+fiMj7N9j6mVYTlWMEzhqxPWRirH+lPzPsbw9pqvcIDpld4HSFcbXwgMkDV5rWdCOD1z7qrD9OCh6I91rlNxMcri6MjsdSTuyuOTMrIq3WsZ0AAYt9+ZAMN3GWBqAHm8zzKC9xH88ZZwWU21pq5qy3LqNLBVu6qm5o1drdGupQ5IJa/0Eq/t5T2s0V2o/UTsg0uRWQPXdaAXWE7QXLbnoeBYMnKCZlZm2/tz81PHQ/sVcnk4VjyU7x7X6YfO5WWgOcObR/0Nif7mpb3Cj2Q+oll9IimHV9+gwtv/AQ==</diagram></mxfile>
\ No newline at end of file
diff --git a/docs/source/img/starzone.svg b/docs/source/img/starzone.svg
new file mode 100644 (file)
index 0000000..0a02eb1
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="544px" height="425px" viewBox="-0.5 -0.5 544 425" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-06-17T09:26:05.511Z&quot; agent=&quot;5.0 (X11)&quot; etag=&quot;8zs880AeDuDJ0-BdlMEE&quot; version=&quot;14.7.10&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;97916047-d0de-89f5-080d-49f4d83e522f&quot;&gt;7VrJcuM2EP0aHe0SCK5Hy0tSlZnEVU5lmcsUTEISYorggJAlzdcHJACuoGSNSMt2zcUWGnu/7n7NJifwerX9haF0+ZlGOJ5Y02g7gTcTywp8S/zNBTspcC1PChaMRFIEKsED+Y6VcKqkaxLhrDGQUxpzkjaFIU0SHPKGDDFGN81hcxo3d03RAncEDyGKtfTSqeR/k4gvlRy4QdXxKyaLpdrc1zd8ROHTgtF1onZMaIJlzwrpZdQtsyWK6KYmgrcTeM0o5fLXanuN41yvWmdy3l1Pb3kVhhP+kgkXd1+izfcFYMFnn95/DX//9tdvF0BB94zitdKGOi3fafUU18P5KmACZ5sl4fghRWHeuxH2IGRLvopV95zE8TWNKSvmwghhfx4KecYZfcK1Hjf08eM879F6yadnT5iHS9WI0SOO72lGOKGJkMV4Lm46e8aME4Hep1b3ikRRfuYZiskiFzAJWDnhSsnLgeruohtve7UKSqyE/WO6wpztxBA1AfoKXmX7lqPam8qOHFvJljUTgtoukLLeRbl2BaL4oXA8AlN9iRqEOBIGr5qU8SVd0ATFt5V0VoE8Fa1qzCdKUwXHf5jznfJetOa0CbwEWHuP0NgMJ9FV7p2iWbhFIbkj+WWKTeQp86Pt1724CV2zEO+5MjRjxHCMOHlurm/St5p6T4nYucTWDZrYdiDjiC0wV7Mq1MSt0a42LM0HZP372J55n8oI5IqVSZR3PMFKfIPnu3HuL3NanK6yH/fbmuqOi6ywgCsxALjptuoUvxb5/08keQJ6KXE0uZrsMxpm4cdNY9IeHApLwGyfCzMszoMei/Vyo1K6Fos7s4lzs8/JFZ2oyVWgrhvgHgfrDQkX00vbtYMGpBdqzx+1SD2EzucZ5pN2iBjAHmCvOUTk+UXWAE3WcLRN+aZVrnrtqRQXp+yzsjgWuQQ+zF4oS2WCMSfbPBgOwRA2bHp36e01hvANBOGPxg/2OfjhEBt0+WNAfnBfhx/ccfjBheZ9xuUHb0R+gF9Fypd8bJKwD5EEcFzQjAyncYQ+uN00ltYC4zGIe7rBGIP/7MV2cs4w7/hvLcw7IzqwfYzvjs4sQl3/5PMvXd38VzaFDpTgZqs2kK1dvXWPGRE6z2OIEp6RqlTYldSxZxzwT+S0k4xrAHIw+vr1u/B1L3hjvh4Y4GgpLFuitNAQ2hX0Vy+2FEYt3cvV9IjZ7TOWLAmMlFmv9Cg3afMsoxzxOu/WHE2yds31ZlmC0j+pZDO56QBQue2wHHShMpVn7LGg0kXPn1h13Qq8NazAT6z6sLLfGlb9BYyXUpIFTJT0IKhYdH4pKvsvIyehVn6YmQZAwW55jOV2UQCWAQY4Ggz2YZfp5le9dWT7iOSqq6V6Dd6gBC0buAwAvJZyZc7XKQMcXKhEd+h6Qmsfy5sedS4IjhzfXH+cegUw5UBHpqSe8fEThU+PRzj/u6xWgIPVCj8AXtNqBnGe8g2kWjXwmiuMV66wBqhX9D4fO2/q+fiMj7N9j6mVYTlWMEzhqxPWRirH+lPzPsbw9pqvcIDpld4HSFcbXwgMkDV5rWdCOD1z7qrD9OCh6I91rlNxMcri6MjsdSTuyuOTMrIq3WsZ0AAYt9+ZAMN3GWBqAHm8zzKC9xH88ZZwWU21pq5qy3LqNLBVu6qm5o1drdGupQ5IJa/0Eq/t5T2s0V2o/UTsg0uRWQPXdaAXWE7QXLbnoeBYMnKCZlZm2/tz81PHQ/sVcnk4VjyU7x7X6YfO5WWgOcObR/0Nif7mpb3Cj2Q+oll9IimHV9+gwtv/AQ==&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="0" y="100" width="540" height="320" rx="48" ry="48" fill="none" stroke="none" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="0" y="100" width="540" height="320" rx="48" ry="48" fill="none" stroke="none" pointer-events="all"/><path d="M 11.68 112.37 C 11.68 112.37 11.68 112.37 11.68 112.37 M 11.68 112.37 C 11.68 112.37 11.68 112.37 11.68 112.37 M 3.55 127.82 C 8.34 119.96 16.77 113.6 20.6 108.2 M 3.55 127.82 C 8.16 122.29 11.29 118.69 20.6 108.2 M 1.97 135.73 C 11.6 122.67 23.83 112.49 28.87 104.79 M 1.97 135.73 C 10.33 126.05 17.9 116.82 28.87 104.79 M 1.05 142.88 C 8.47 133.04 20.68 123.5 35.17 103.64 M 1.05 142.88 C 9.16 133.6 15.69 125.19 35.17 103.64 M 0.79 149.28 C 12.34 133.06 26.66 120.65 40.81 103.24 M 0.79 149.28 C 14.71 133.4 30.51 116.45 40.81 103.24 M 1.19 154.92 C 12.17 142.32 25.11 128.2 48.42 100.58 M 1.19 154.92 C 12.71 140.45 24.19 126.76 48.42 100.58 M 0.93 161.32 C 12.07 147.18 23.78 131.47 54.07 100.19 M 0.93 161.32 C 13.21 146.79 24.06 134.78 54.07 100.19 M 1.32 166.96 C 14.77 151.95 26.81 139.12 59.05 100.55 M 1.32 166.96 C 24.09 141.75 45.99 115.31 59.05 100.55 M 1.06 173.36 C 20.26 153.4 38.17 130.85 64.7 100.16 M 1.06 173.36 C 16.06 156.03 32.81 136.86 64.7 100.16 M 0.8 179.76 C 18.09 160.63 38.77 139.39 69.68 100.52 M 0.8 179.76 C 20.45 157.6 39.22 136.73 69.68 100.52 M 1.19 185.4 C 25.41 157.11 50.36 129.56 75.33 100.12 M 1.19 185.4 C 24.24 159.77 45.94 133.6 75.33 100.12 M 0.93 191.8 C 22.06 170.24 38.81 146.87 80.31 100.48 M 0.93 191.8 C 26.94 162.44 51.73 130.85 80.31 100.48 M 1.33 197.44 C 25.23 171.62 51.42 141.07 85.96 100.09 M 1.33 197.44 C 25.58 167.68 51.41 139.11 85.96 100.09 M 1.06 203.84 C 33.96 164.58 70.65 126.51 90.94 100.45 M 1.06 203.84 C 31.46 169.29 60.83 135.11 90.94 100.45 M 0.8 210.24 C 37.83 170.86 70.08 130.67 95.93 100.81 M 0.8 210.24 C 25.67 182.77 49.63 155.64 95.93 100.81 M 1.2 215.88 C 33.6 180.32 63.97 142.6 101.57 100.41 M 1.2 215.88 C 26.13 189.31 49.1 160.82 101.57 100.41 M 0.94 222.28 C 25.88 191.05 51.03 161.61 106.56 100.77 M 0.94 222.28 C 22.47 197.52 45.85 171.29 106.56 100.77 M 1.33 227.92 C 27.64 197.27 53.28 169.34 112.2 100.38 M 1.33 227.92 C 43.26 178.52 87.75 127.79 112.2 100.38 M 1.07 234.32 C 33.89 195.68 68.1 159.22 117.19 100.74 M 1.07 234.32 C 38.65 190.92 76.24 146.76 117.19 100.74 M 0.81 240.72 C 36.17 198.99 74.27 160.14 122.83 100.34 M 0.81 240.72 C 33.34 200.55 68.69 161.93 122.83 100.34 M 1.2 246.36 C 40.83 199.83 80.56 157.14 127.82 100.7 M 1.2 246.36 C 29.47 216.13 55.61 184.08 127.82 100.7 M 0.94 252.76 C 37.2 214.65 69.75 176.21 133.46 100.31 M 0.94 252.76 C 52.77 192.66 103.52 134.84 133.46 100.31 M 1.34 258.4 C 33.72 218.26 69.39 181.9 138.45 100.67 M 1.34 258.4 C 48.8 202.9 95.8 147.97 138.45 100.67 M 1.07 264.8 C 38.32 222.8 77.07 180.02 144.09 100.27 M 1.07 264.8 C 49.6 208.36 98.72 150.39 144.09 100.27 M 0.81 271.2 C 42.06 221.8 86.33 172.25 149.08 100.63 M 0.81 271.2 C 43.76 220.35 87.78 169.8 149.08 100.63 M 1.21 276.84 C 31.93 239.98 61.9 206.1 154.72 100.24 M 1.21 276.84 C 58.53 207.16 117.06 140.46 154.72 100.24 M 0.95 283.24 C 48.5 229.09 94.92 175.83 159.71 100.6 M 0.95 283.24 C 45.33 233.14 89.4 182.89 159.71 100.6 M 1.34 288.88 C 62.4 219.44 123.08 147.24 165.35 100.2 M 1.34 288.88 C 46.71 234.52 93.63 181.91 165.35 100.2 M 1.08 295.28 C 40.89 249.6 80.46 203.01 170.34 100.56 M 1.08 295.28 C 66.47 220.55 133.4 143.8 170.34 100.56 M 0.82 301.68 C 41.61 255.85 80.2 210.28 175.98 100.17 M 0.82 301.68 C 39.11 257.95 76.72 215.28 175.98 100.17 M 1.21 307.32 C 60.03 242 117.19 176.83 180.97 100.53 M 1.21 307.32 C 40.56 261.44 79.47 217.44 180.97 100.53 M 0.95 313.72 C 38.98 269.56 79.82 224.59 186.61 100.14 M 0.95 313.72 C 55.37 249.81 111.29 186.82 186.61 100.14 M 1.34 319.36 C 52.26 262.79 100.25 206.76 191.6 100.5 M 1.34 319.36 C 74.73 233.36 149.39 147.89 191.6 100.5 M 1.08 325.76 C 70.06 247.44 137.25 170.36 197.25 100.1 M 1.08 325.76 C 48.81 272.01 95.86 216.43 197.25 100.1 M 0.82 332.16 C 48.53 279.15 94.63 224.61 202.23 100.46 M 0.82 332.16 C 45.78 276.79 92.83 223.14 202.23 100.46 M 1.22 337.8 C 50.01 283.3 97.42 227.08 207.22 100.82 M 1.22 337.8 C 70.54 260.14 138.8 180.38 207.22 100.82 M 0.96 344.2 C 65.43 267.19 133.66 190.7 212.86 100.43 M 0.96 344.2 C 72.23 262.4 142.9 181.96 212.86 100.43 M 1.35 349.84 C 51.21 290.8 104.29 231.58 217.85 100.79 M 1.35 349.84 C 48.09 297.13 92.66 245.5 217.85 100.79 M 1.09 356.24 C 52.95 297.2 105.8 236.97 223.49 100.39 M 1.09 356.24 C 76.55 269.36 152.31 183.23 223.49 100.39 M 0.83 362.64 C 72.67 278.75 146.89 192.89 228.48 100.75 M 0.83 362.64 C 65.06 287.01 131.34 210.61 228.48 100.75 M 1.22 368.28 C 50.75 310.63 99.45 255.17 234.12 100.36 M 1.22 368.28 C 94.82 261.11 187.55 154.38 234.12 100.36 M 0.96 374.68 C 52.5 315.8 102.58 258.17 239.11 100.72 M 0.96 374.68 C 90.39 271.82 180.11 170.36 239.11 100.72 M 2.01 379.57 C 85.14 284.23 169.74 187.16 244.75 100.32 M 2.01 379.57 C 75.92 293.63 148.65 209.73 244.75 100.32 M 3.06 384.45 C 59.84 318.61 115.74 255.74 249.74 100.68 M 3.06 384.45 C 55.68 323.24 110.48 260.17 249.74 100.68 M 4.11 389.34 C 56.63 330.17 109.02 269.13 255.38 100.29 M 4.11 389.34 C 86.03 294.76 168.86 200.04 255.38 100.29 M 5.16 394.23 C 69.26 322.98 131.77 249.87 260.37 100.65 M 5.16 394.23 C 100.13 284.41 194.99 176.22 260.37 100.65 M 6.87 398.36 C 70.89 323.26 135.06 249.79 266.01 100.25 M 6.87 398.36 C 66.55 330.97 124.19 262.87 266.01 100.25 M 8.58 402.5 C 96.77 299.34 185.81 196.71 271 100.61 M 8.58 402.5 C 94.74 303.64 179.82 206.25 271 100.61 M 10.94 405.88 C 63.68 344.76 118.19 281.61 276.64 100.22 M 10.94 405.88 C 66.94 340.84 122.69 276.7 276.64 100.22 M 13.3 409.26 C 109.24 299.01 204.76 191.36 281.63 100.58 M 13.3 409.26 C 112.82 296.43 211.22 183.2 281.63 100.58 M 16.32 411.88 C 90.66 325.31 165.67 238 287.27 100.19 M 16.32 411.88 C 117.11 294.09 219.8 176.97 287.27 100.19 M 20 413.75 C 102.75 315.55 188.68 218.67 292.26 100.55 M 20 413.75 C 114.25 304.15 209.79 194.6 292.26 100.55 M 23.67 415.62 C 123.46 302.52 221.62 188.77 297.9 100.15 M 23.67 415.62 C 102.53 324.62 180.4 234.84 297.9 100.15 M 27.35 417.49 C 83.6 352.93 140.17 286.66 302.89 100.51 M 27.35 417.49 C 106.57 324.94 186.66 231.77 302.89 100.51 M 31.68 418.6 C 90.24 349.08 150.33 280.48 308.53 100.12 M 31.68 418.6 C 132.8 300.35 234.81 183.92 308.53 100.12 M 36.66 418.96 C 99.16 347.72 161.68 274 313.52 100.48 M 36.66 418.96 C 145.99 292.34 254.96 166.36 313.52 100.48 M 41.65 419.32 C 119.2 327.9 199.35 236.58 318.51 100.84 M 41.65 419.32 C 134.88 313.57 227.43 207.92 318.51 100.84 M 46.64 419.68 C 135.94 316.17 227.05 213.62 324.15 100.44 M 46.64 419.68 C 108.3 349.28 168.66 278.76 324.15 100.44 M 50.31 421.55 C 131.67 328.68 213.26 235.15 329.14 100.8 M 50.31 421.55 C 150.59 306.65 250.17 191.39 329.14 100.8 M 55.3 421.91 C 121.79 344.41 188.42 270.1 334.78 100.41 M 55.3 421.91 C 141.14 321.58 227.66 221.98 334.78 100.41 M 60.94 421.52 C 126.34 346.44 191.46 273.13 339.77 100.77 M 60.94 421.52 C 143.18 326.11 225.18 232.52 339.77 100.77 M 65.93 421.88 C 144.2 333.7 220.11 245.24 345.41 100.37 M 65.93 421.88 C 171.57 299.71 276.46 178.99 345.41 100.37 M 71.57 421.48 C 178.53 297.11 284.01 173.92 350.4 100.73 M 71.57 421.48 C 144.63 335.9 217.32 251.76 350.4 100.73 M 76.56 421.84 C 169.25 316.25 260.1 210.37 356.04 100.34 M 76.56 421.84 C 160.79 325.65 244.08 229.74 356.04 100.34 M 82.2 421.45 C 169.55 322.66 254.61 224.42 361.03 100.7 M 82.2 421.45 C 153.34 339.3 224.17 257.56 361.03 100.7 M 87.19 421.81 C 162.2 331.78 239.8 244.77 366.67 100.3 M 87.19 421.81 C 179.61 315.07 273.14 208.3 366.67 100.3 M 92.18 422.17 C 155.78 347.16 219.73 270.66 371.66 100.66 M 92.18 422.17 C 186.98 311.96 282.29 202.71 371.66 100.66 M 97.82 421.78 C 196.65 309.57 295.27 194.66 377.3 100.27 M 97.82 421.78 C 182.31 321.98 267.45 224.21 377.3 100.27 M 102.81 422.14 C 177.12 333.97 254.32 247.03 382.29 100.63 M 102.81 422.14 C 172.58 338.93 243.8 257.08 382.29 100.63 M 108.45 421.74 C 218.43 294.38 328.39 166.78 387.93 100.24 M 108.45 421.74 C 169.85 351.86 230.27 282.71 387.93 100.24 M 113.44 422.1 C 173.23 351.89 234.32 284.64 392.92 100.6 M 113.44 422.1 C 169.74 357.11 227.36 290.59 392.92 100.6 M 119.08 421.71 C 175.39 356.67 231.71 291.24 398.56 100.2 M 119.08 421.71 C 184.02 347.69 249 273.85 398.56 100.2 M 124.07 422.07 C 215.7 318.7 308.34 211.16 403.55 100.56 M 124.07 422.07 C 202.12 332.04 279.19 242.68 403.55 100.56 M 129.71 421.67 C 231.37 306.19 330.19 190.34 409.19 100.17 M 129.71 421.67 C 213.74 325.85 297.04 229.74 409.19 100.17 M 134.7 422.03 C 237.39 304.76 337.26 188.25 414.18 100.53 M 134.7 422.03 C 197.12 351.01 258.06 279.53 414.18 100.53 M 140.34 421.64 C 201.73 352.08 264.07 281.79 419.82 100.13 M 140.34 421.64 C 233.27 316.18 325.77 210.78 419.82 100.13 M 145.33 422 C 240.05 315.19 333.81 207.17 424.81 100.49 M 145.33 422 C 217.01 337.85 290.01 253.69 424.81 100.49 M 150.97 421.6 C 240.52 313.73 334.19 209.53 430.45 100.1 M 150.97 421.6 C 207.25 354.51 265.47 287.65 430.45 100.1 M 155.96 421.96 C 256.01 306.43 353.73 192.75 435.44 100.46 M 155.96 421.96 C 239.73 327.48 322.45 232.75 435.44 100.46 M 161.6 421.57 C 219.18 358.32 274.14 292.94 440.42 100.82 M 161.6 421.57 C 271 296.92 380.29 170.34 440.42 100.82 M 166.59 421.93 C 276.43 293.65 389.02 166.66 446.07 100.42 M 166.59 421.93 C 248.65 326.65 330.91 231.41 446.07 100.42 M 172.23 421.53 C 263.71 315.1 357.22 210.16 451.06 100.78 M 172.23 421.53 C 259.57 321.81 348.14 220.25 451.06 100.78 M 177.22 421.89 C 267.97 316.88 359.53 211.48 456.7 100.39 M 177.22 421.89 C 261.37 326.47 343.66 231.43 456.7 100.39 M 182.86 421.5 C 289.26 297.3 396.13 172.02 461.69 100.75 M 182.86 421.5 C 289.33 300.07 394.2 178.34 461.69 100.75 M 187.85 421.86 C 265.79 332.44 342.84 243.99 467.33 100.35 M 187.85 421.86 C 248.13 354.18 307.38 286.09 467.33 100.35 M 193.49 421.47 C 257.73 349.36 320.11 276.81 472.32 100.71 M 193.49 421.47 C 290.47 308.54 388.19 196.5 472.32 100.71 M 198.48 421.83 C 271.78 339.08 343.98 257.37 477.96 100.32 M 198.48 421.83 C 262.79 346.63 327.83 272.5 477.96 100.32 M 203.46 422.19 C 282.22 334.46 359.43 246.52 482.95 100.68 M 203.46 422.19 C 311.49 299.27 417.41 176.49 482.95 100.68 M 209.11 421.79 C 313.41 303.62 416.43 184.57 488.59 100.28 M 209.11 421.79 C 264.81 355.53 322.05 289.62 488.59 100.28 M 214.09 422.15 C 307.66 312.46 403.13 203.22 492.92 101.4 M 214.09 422.15 C 321.41 298.89 428.72 175.8 492.92 101.4 M 219.74 421.76 C 325.56 298.92 431.67 178.1 497.91 101.76 M 219.74 421.76 C 293.52 337.58 367.31 253.92 497.91 101.76 M 224.72 422.12 C 282.53 355.9 339.7 290.73 502.89 102.12 M 224.72 422.12 C 294.78 340.72 364.32 261.4 502.89 102.12 M 230.37 421.72 C 323.63 311.96 419.94 201.83 508.54 101.73 M 230.37 421.72 C 286.15 356.58 343.43 290.54 508.54 101.73 M 235.35 422.08 C 300.72 346.73 366.72 270.29 512.21 103.59 M 235.35 422.08 C 302.89 345.75 369.73 269 512.21 103.59 M 241 421.69 C 346.74 303.38 451.19 182.85 516.54 104.71 M 241 421.69 C 325.03 324.79 408.74 227.57 516.54 104.71 M 245.98 422.05 C 352.07 303.06 456.51 182.48 520.22 106.58 M 245.98 422.05 C 353.38 298.62 459.94 176.63 520.22 106.58 M 251.63 421.65 C 330.7 330.27 412.59 235.04 523.89 108.45 M 251.63 421.65 C 332.29 328.2 415.63 232.31 523.89 108.45 M 256.61 422.01 C 347.87 315 441.57 208.09 526.91 111.07 M 256.61 422.01 C 334.49 331.17 415.18 240.39 526.91 111.07 M 262.26 421.62 C 363.81 304.95 466.44 187.63 529.93 113.7 M 262.26 421.62 C 320.06 354.68 378.38 287.46 529.93 113.7 M 267.24 421.98 C 331.25 350.22 392.53 278.97 532.29 117.08 M 267.24 421.98 C 359.29 316.93 449.41 212.89 532.29 117.08 M 272.89 421.58 C 376.82 301.51 478.45 183.18 534.66 120.45 M 272.89 421.58 C 360.71 320.39 448.13 218.67 534.66 120.45 M 277.87 421.94 C 363.05 323.93 448.46 228.08 537.02 123.83 M 277.87 421.94 C 347.77 339.53 418.3 257.52 537.02 123.83 M 283.52 421.55 C 377.01 313.16 473.29 202.75 538.72 127.97 M 283.52 421.55 C 337.83 359.01 392.83 294.83 538.72 127.97 M 288.5 421.91 C 355.77 347.06 422.84 267.96 539.12 133.61 M 288.5 421.91 C 341.57 359.32 394.63 298.64 539.12 133.61 M 294.15 421.52 C 350.49 354.93 407.75 289.49 540.17 138.5 M 294.15 421.52 C 365.62 339.27 436.66 257.91 540.17 138.5 M 299.14 421.88 C 370.22 341.1 442.21 257.17 541.22 143.39 M 299.14 421.88 C 360.43 353 420.74 283.21 541.22 143.39 M 304.78 421.48 C 395.59 319.95 483.72 215.96 540.96 149.79 M 304.78 421.48 C 366.96 350.3 429.25 280.31 540.96 149.79 M 309.77 421.84 C 360.89 360.16 411.08 302.64 541.35 155.43 M 309.77 421.84 C 369.38 355.38 427.04 288.1 541.35 155.43 M 315.41 421.45 C 378.9 349.34 440.68 277.31 541.09 161.83 M 315.41 421.45 C 382.26 344.53 450.92 266.61 541.09 161.83 M 320.4 421.81 C 373.48 361.96 423.76 304.34 541.49 167.47 M 320.4 421.81 C 373.89 357.94 429.32 294.21 541.49 167.47 M 325.38 422.17 C 385.85 350.86 446.77 281.48 541.23 173.87 M 325.38 422.17 C 382.36 356.16 439.35 291.75 541.23 173.87 M 331.03 421.77 C 390.5 352.81 452.41 283.45 540.96 180.26 M 331.03 421.77 C 385.23 361.34 437.84 300.19 540.96 180.26 M 336.01 422.13 C 383.73 367.06 430.75 312.76 541.36 185.91 M 336.01 422.13 C 388.84 362.28 441.08 300.97 541.36 185.91 M 341.66 421.74 C 411.22 342.85 479 263.89 541.1 192.31 M 341.66 421.74 C 391.02 366.86 439.88 310.83 541.1 192.31 M 346.64 422.1 C 387.92 370.06 432.82 320.96 541.49 197.95 M 346.64 422.1 C 401.35 359.24 457.76 295.98 541.49 197.95 M 352.29 421.7 C 411.6 352.13 472.77 280.64 541.23 204.35 M 352.29 421.7 C 423.63 341.3 492.58 260.74 541.23 204.35 M 357.27 422.06 C 404.49 367.18 452.08 312.56 540.97 210.74 M 357.27 422.06 C 429.42 337.21 503.36 253.6 540.97 210.74 M 362.92 421.67 C 419.79 355.88 474.35 290.85 541.36 216.39 M 362.92 421.67 C 426.15 348.12 490.74 274.03 541.36 216.39 M 367.9 422.03 C 433.62 344.31 500.62 269.32 541.1 222.79 M 367.9 422.03 C 426.06 356.37 484.32 288.98 541.1 222.79 M 373.55 421.63 C 405.69 381.33 441.2 340.95 541.5 228.43 M 373.55 421.63 C 426.08 362.74 477.9 305.42 541.5 228.43 M 378.53 421.99 C 437.57 355.97 492.39 291.9 541.24 234.83 M 378.53 421.99 C 428.47 365.8 478.11 308 541.24 234.83 M 384.18 421.6 C 423.7 377.48 465.9 332.61 540.97 241.22 M 384.18 421.6 C 427.54 373.94 469.2 324.12 540.97 241.22 M 389.16 421.96 C 444.68 355.85 502.54 291.47 541.37 246.87 M 389.16 421.96 C 449.08 354.81 507.08 286.65 541.37 246.87 M 394.81 421.56 C 439.07 374.57 480.52 327.12 541.11 253.26 M 394.81 421.56 C 439.95 370.26 484.55 318.62 541.11 253.26 M 399.79 421.92 C 451.94 362.3 505.35 302.06 541.5 258.91 M 399.79 421.92 C 444.73 368.31 490.7 316.27 541.5 258.91 M 405.44 421.53 C 451.91 369.29 494.7 318.39 541.24 265.31 M 405.44 421.53 C 434.7 388.86 461.83 356.99 541.24 265.31 M 410.42 421.89 C 447.61 378.99 489.19 331.11 541.63 270.95 M 410.42 421.89 C 453.94 371.59 500.19 319.12 541.63 270.95 M 416.07 421.5 C 461.57 366.67 505.85 317.99 541.37 277.35 M 416.07 421.5 C 461.97 369.21 506.7 316.77 541.37 277.35 M 421.05 421.86 C 450.62 391.31 477.09 359.07 541.11 283.74 M 421.05 421.86 C 460.61 376.73 499.41 330.82 541.11 283.74 M 426.7 421.46 C 468.13 372.5 512.29 323.05 541.51 289.39 M 426.7 421.46 C 463.25 376.98 503.05 332 541.51 289.39 M 431.68 421.82 C 465.51 387.04 494.93 350.76 541.24 295.78 M 431.68 421.82 C 460.46 388.28 490.34 353.89 541.24 295.78 M 436.67 422.18 C 465.89 391.6 494.97 356.7 541.64 301.43 M 436.67 422.18 C 461.23 392.62 487.06 362.46 541.64 301.43 M 442.31 421.79 C 469.62 389.23 497.18 360.05 541.38 307.83 M 442.31 421.79 C 479.37 377.88 515.76 335.02 541.38 307.83 M 447.3 422.15 C 468.8 396.46 490.9 374.74 541.12 314.22 M 447.3 422.15 C 483.37 379.67 518.9 338.27 541.12 314.22 M 452.94 421.75 C 479.92 391.4 508.69 359.58 541.51 319.87 M 452.94 421.75 C 486.75 384.9 518.51 346.64 541.51 319.87 M 457.93 422.11 C 483.67 392.05 509.92 362.43 541.25 326.26 M 457.93 422.11 C 477.31 399.57 495.38 377.14 541.25 326.26 M 463.57 421.72 C 489.79 393.26 515.41 361.53 541.64 331.91 M 463.57 421.72 C 481.62 399.7 499.44 378.69 541.64 331.91 M 468.56 422.08 C 484.04 402.48 502.8 383.34 541.38 338.31 M 468.56 422.08 C 485.18 403.63 503.17 385.38 541.38 338.31 M 474.2 421.68 C 500.52 388.89 527.57 359.08 541.12 344.7 M 474.2 421.68 C 487.6 404.91 504.03 388.52 541.12 344.7 M 479.19 422.04 C 492.83 403.85 509.23 389.98 541.52 350.35 M 479.19 422.04 C 503.08 395.04 526.82 366.03 541.52 350.35 M 484.83 421.65 C 498.04 406.02 510.63 391.44 541.25 356.74 M 484.83 421.65 C 497.86 405.34 513.36 387.95 541.25 356.74 M 489.82 422.01 C 508.79 399.39 524.35 381.85 541.65 362.39 M 489.82 422.01 C 505.67 405.76 519.67 388.13 541.65 362.39 M 494.81 422.37 C 505.07 409.15 519.04 395.99 541.39 368.78 M 494.81 422.37 C 510.17 405.63 524.41 388.41 541.39 368.78 M 500.45 421.97 C 509.71 409.66 517.38 399.48 542.44 373.67 M 500.45 421.97 C 513.08 407.03 525.01 394.07 542.44 373.67 M 508.72 418.56 C 517.21 407.18 529.51 394.66 541.52 380.83 M 508.72 418.56 C 518.29 406.9 529.24 395.56 541.52 380.83 M 516.33 415.9 C 522.44 409.05 526.51 403.7 539.29 389.49 M 516.33 415.9 C 524.29 407.54 532.26 397.16 539.29 389.49" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><path d="M 11.68 112.37 C 11.68 112.37 11.68 112.37 11.68 112.37 M 11.68 112.37 C 11.68 112.37 11.68 112.37 11.68 112.37 M 3.55 127.82 C 8.34 119.96 16.77 113.6 20.6 108.2 M 3.55 127.82 C 8.16 122.29 11.29 118.69 20.6 108.2 M 1.97 135.73 C 11.6 122.67 23.83 112.49 28.87 104.79 M 1.97 135.73 C 10.33 126.05 17.9 116.82 28.87 104.79 M 1.05 142.88 C 8.47 133.04 20.68 123.5 35.17 103.64 M 1.05 142.88 C 9.16 133.6 15.69 125.19 35.17 103.64 M 0.79 149.28 C 12.34 133.06 26.66 120.65 40.81 103.24 M 0.79 149.28 C 14.71 133.4 30.51 116.45 40.81 103.24 M 1.19 154.92 C 12.17 142.32 25.11 128.2 48.42 100.58 M 1.19 154.92 C 12.71 140.45 24.19 126.76 48.42 100.58 M 0.93 161.32 C 12.07 147.18 23.78 131.47 54.07 100.19 M 0.93 161.32 C 13.21 146.79 24.06 134.78 54.07 100.19 M 1.32 166.96 C 14.77 151.95 26.81 139.12 59.05 100.55 M 1.32 166.96 C 24.09 141.75 45.99 115.31 59.05 100.55 M 1.06 173.36 C 20.26 153.4 38.17 130.85 64.7 100.16 M 1.06 173.36 C 16.06 156.03 32.81 136.86 64.7 100.16 M 0.8 179.76 C 18.09 160.63 38.77 139.39 69.68 100.52 M 0.8 179.76 C 20.45 157.6 39.22 136.73 69.68 100.52 M 1.19 185.4 C 25.41 157.11 50.36 129.56 75.33 100.12 M 1.19 185.4 C 24.24 159.77 45.94 133.6 75.33 100.12 M 0.93 191.8 C 22.06 170.24 38.81 146.87 80.31 100.48 M 0.93 191.8 C 26.94 162.44 51.73 130.85 80.31 100.48 M 1.33 197.44 C 25.23 171.62 51.42 141.07 85.96 100.09 M 1.33 197.44 C 25.58 167.68 51.41 139.11 85.96 100.09 M 1.06 203.84 C 33.96 164.58 70.65 126.51 90.94 100.45 M 1.06 203.84 C 31.46 169.29 60.83 135.11 90.94 100.45 M 0.8 210.24 C 37.83 170.86 70.08 130.67 95.93 100.81 M 0.8 210.24 C 25.67 182.77 49.63 155.64 95.93 100.81 M 1.2 215.88 C 33.6 180.32 63.97 142.6 101.57 100.41 M 1.2 215.88 C 26.13 189.31 49.1 160.82 101.57 100.41 M 0.94 222.28 C 25.88 191.05 51.03 161.61 106.56 100.77 M 0.94 222.28 C 22.47 197.52 45.85 171.29 106.56 100.77 M 1.33 227.92 C 27.64 197.27 53.28 169.34 112.2 100.38 M 1.33 227.92 C 43.26 178.52 87.75 127.79 112.2 100.38 M 1.07 234.32 C 33.89 195.68 68.1 159.22 117.19 100.74 M 1.07 234.32 C 38.65 190.92 76.24 146.76 117.19 100.74 M 0.81 240.72 C 36.17 198.99 74.27 160.14 122.83 100.34 M 0.81 240.72 C 33.34 200.55 68.69 161.93 122.83 100.34 M 1.2 246.36 C 40.83 199.83 80.56 157.14 127.82 100.7 M 1.2 246.36 C 29.47 216.13 55.61 184.08 127.82 100.7 M 0.94 252.76 C 37.2 214.65 69.75 176.21 133.46 100.31 M 0.94 252.76 C 52.77 192.66 103.52 134.84 133.46 100.31 M 1.34 258.4 C 33.72 218.26 69.39 181.9 138.45 100.67 M 1.34 258.4 C 48.8 202.9 95.8 147.97 138.45 100.67 M 1.07 264.8 C 38.32 222.8 77.07 180.02 144.09 100.27 M 1.07 264.8 C 49.6 208.36 98.72 150.39 144.09 100.27 M 0.81 271.2 C 42.06 221.8 86.33 172.25 149.08 100.63 M 0.81 271.2 C 43.76 220.35 87.78 169.8 149.08 100.63 M 1.21 276.84 C 31.93 239.98 61.9 206.1 154.72 100.24 M 1.21 276.84 C 58.53 207.16 117.06 140.46 154.72 100.24 M 0.95 283.24 C 48.5 229.09 94.92 175.83 159.71 100.6 M 0.95 283.24 C 45.33 233.14 89.4 182.89 159.71 100.6 M 1.34 288.88 C 62.4 219.44 123.08 147.24 165.35 100.2 M 1.34 288.88 C 46.71 234.52 93.63 181.91 165.35 100.2 M 1.08 295.28 C 40.89 249.6 80.46 203.01 170.34 100.56 M 1.08 295.28 C 66.47 220.55 133.4 143.8 170.34 100.56 M 0.82 301.68 C 41.61 255.85 80.2 210.28 175.98 100.17 M 0.82 301.68 C 39.11 257.95 76.72 215.28 175.98 100.17 M 1.21 307.32 C 60.03 242 117.19 176.83 180.97 100.53 M 1.21 307.32 C 40.56 261.44 79.47 217.44 180.97 100.53 M 0.95 313.72 C 38.98 269.56 79.82 224.59 186.61 100.14 M 0.95 313.72 C 55.37 249.81 111.29 186.82 186.61 100.14 M 1.34 319.36 C 52.26 262.79 100.25 206.76 191.6 100.5 M 1.34 319.36 C 74.73 233.36 149.39 147.89 191.6 100.5 M 1.08 325.76 C 70.06 247.44 137.25 170.36 197.25 100.1 M 1.08 325.76 C 48.81 272.01 95.86 216.43 197.25 100.1 M 0.82 332.16 C 48.53 279.15 94.63 224.61 202.23 100.46 M 0.82 332.16 C 45.78 276.79 92.83 223.14 202.23 100.46 M 1.22 337.8 C 50.01 283.3 97.42 227.08 207.22 100.82 M 1.22 337.8 C 70.54 260.14 138.8 180.38 207.22 100.82 M 0.96 344.2 C 65.43 267.19 133.66 190.7 212.86 100.43 M 0.96 344.2 C 72.23 262.4 142.9 181.96 212.86 100.43 M 1.35 349.84 C 51.21 290.8 104.29 231.58 217.85 100.79 M 1.35 349.84 C 48.09 297.13 92.66 245.5 217.85 100.79 M 1.09 356.24 C 52.95 297.2 105.8 236.97 223.49 100.39 M 1.09 356.24 C 76.55 269.36 152.31 183.23 223.49 100.39 M 0.83 362.64 C 72.67 278.75 146.89 192.89 228.48 100.75 M 0.83 362.64 C 65.06 287.01 131.34 210.61 228.48 100.75 M 1.22 368.28 C 50.75 310.63 99.45 255.17 234.12 100.36 M 1.22 368.28 C 94.82 261.11 187.55 154.38 234.12 100.36 M 0.96 374.68 C 52.5 315.8 102.58 258.17 239.11 100.72 M 0.96 374.68 C 90.39 271.82 180.11 170.36 239.11 100.72 M 2.01 379.57 C 85.14 284.23 169.74 187.16 244.75 100.32 M 2.01 379.57 C 75.92 293.63 148.65 209.73 244.75 100.32 M 3.06 384.45 C 59.84 318.61 115.74 255.74 249.74 100.68 M 3.06 384.45 C 55.68 323.24 110.48 260.17 249.74 100.68 M 4.11 389.34 C 56.63 330.17 109.02 269.13 255.38 100.29 M 4.11 389.34 C 86.03 294.76 168.86 200.04 255.38 100.29 M 5.16 394.23 C 69.26 322.98 131.77 249.87 260.37 100.65 M 5.16 394.23 C 100.13 284.41 194.99 176.22 260.37 100.65 M 6.87 398.36 C 70.89 323.26 135.06 249.79 266.01 100.25 M 6.87 398.36 C 66.55 330.97 124.19 262.87 266.01 100.25 M 8.58 402.5 C 96.77 299.34 185.81 196.71 271 100.61 M 8.58 402.5 C 94.74 303.64 179.82 206.25 271 100.61 M 10.94 405.88 C 63.68 344.76 118.19 281.61 276.64 100.22 M 10.94 405.88 C 66.94 340.84 122.69 276.7 276.64 100.22 M 13.3 409.26 C 109.24 299.01 204.76 191.36 281.63 100.58 M 13.3 409.26 C 112.82 296.43 211.22 183.2 281.63 100.58 M 16.32 411.88 C 90.66 325.31 165.67 238 287.27 100.19 M 16.32 411.88 C 117.11 294.09 219.8 176.97 287.27 100.19 M 20 413.75 C 102.75 315.55 188.68 218.67 292.26 100.55 M 20 413.75 C 114.25 304.15 209.79 194.6 292.26 100.55 M 23.67 415.62 C 123.46 302.52 221.62 188.77 297.9 100.15 M 23.67 415.62 C 102.53 324.62 180.4 234.84 297.9 100.15 M 27.35 417.49 C 83.6 352.93 140.17 286.66 302.89 100.51 M 27.35 417.49 C 106.57 324.94 186.66 231.77 302.89 100.51 M 31.68 418.6 C 90.24 349.08 150.33 280.48 308.53 100.12 M 31.68 418.6 C 132.8 300.35 234.81 183.92 308.53 100.12 M 36.66 418.96 C 99.16 347.72 161.68 274 313.52 100.48 M 36.66 418.96 C 145.99 292.34 254.96 166.36 313.52 100.48 M 41.65 419.32 C 119.2 327.9 199.35 236.58 318.51 100.84 M 41.65 419.32 C 134.88 313.57 227.43 207.92 318.51 100.84 M 46.64 419.68 C 135.94 316.17 227.05 213.62 324.15 100.44 M 46.64 419.68 C 108.3 349.28 168.66 278.76 324.15 100.44 M 50.31 421.55 C 131.67 328.68 213.26 235.15 329.14 100.8 M 50.31 421.55 C 150.59 306.65 250.17 191.39 329.14 100.8 M 55.3 421.91 C 121.79 344.41 188.42 270.1 334.78 100.41 M 55.3 421.91 C 141.14 321.58 227.66 221.98 334.78 100.41 M 60.94 421.52 C 126.34 346.44 191.46 273.13 339.77 100.77 M 60.94 421.52 C 143.18 326.11 225.18 232.52 339.77 100.77 M 65.93 421.88 C 144.2 333.7 220.11 245.24 345.41 100.37 M 65.93 421.88 C 171.57 299.71 276.46 178.99 345.41 100.37 M 71.57 421.48 C 178.53 297.11 284.01 173.92 350.4 100.73 M 71.57 421.48 C 144.63 335.9 217.32 251.76 350.4 100.73 M 76.56 421.84 C 169.25 316.25 260.1 210.37 356.04 100.34 M 76.56 421.84 C 160.79 325.65 244.08 229.74 356.04 100.34 M 82.2 421.45 C 169.55 322.66 254.61 224.42 361.03 100.7 M 82.2 421.45 C 153.34 339.3 224.17 257.56 361.03 100.7 M 87.19 421.81 C 162.2 331.78 239.8 244.77 366.67 100.3 M 87.19 421.81 C 179.61 315.07 273.14 208.3 366.67 100.3 M 92.18 422.17 C 155.78 347.16 219.73 270.66 371.66 100.66 M 92.18 422.17 C 186.98 311.96 282.29 202.71 371.66 100.66 M 97.82 421.78 C 196.65 309.57 295.27 194.66 377.3 100.27 M 97.82 421.78 C 182.31 321.98 267.45 224.21 377.3 100.27 M 102.81 422.14 C 177.12 333.97 254.32 247.03 382.29 100.63 M 102.81 422.14 C 172.58 338.93 243.8 257.08 382.29 100.63 M 108.45 421.74 C 218.43 294.38 328.39 166.78 387.93 100.24 M 108.45 421.74 C 169.85 351.86 230.27 282.71 387.93 100.24 M 113.44 422.1 C 173.23 351.89 234.32 284.64 392.92 100.6 M 113.44 422.1 C 169.74 357.11 227.36 290.59 392.92 100.6 M 119.08 421.71 C 175.39 356.67 231.71 291.24 398.56 100.2 M 119.08 421.71 C 184.02 347.69 249 273.85 398.56 100.2 M 124.07 422.07 C 215.7 318.7 308.34 211.16 403.55 100.56 M 124.07 422.07 C 202.12 332.04 279.19 242.68 403.55 100.56 M 129.71 421.67 C 231.37 306.19 330.19 190.34 409.19 100.17 M 129.71 421.67 C 213.74 325.85 297.04 229.74 409.19 100.17 M 134.7 422.03 C 237.39 304.76 337.26 188.25 414.18 100.53 M 134.7 422.03 C 197.12 351.01 258.06 279.53 414.18 100.53 M 140.34 421.64 C 201.73 352.08 264.07 281.79 419.82 100.13 M 140.34 421.64 C 233.27 316.18 325.77 210.78 419.82 100.13 M 145.33 422 C 240.05 315.19 333.81 207.17 424.81 100.49 M 145.33 422 C 217.01 337.85 290.01 253.69 424.81 100.49 M 150.97 421.6 C 240.52 313.73 334.19 209.53 430.45 100.1 M 150.97 421.6 C 207.25 354.51 265.47 287.65 430.45 100.1 M 155.96 421.96 C 256.01 306.43 353.73 192.75 435.44 100.46 M 155.96 421.96 C 239.73 327.48 322.45 232.75 435.44 100.46 M 161.6 421.57 C 219.18 358.32 274.14 292.94 440.42 100.82 M 161.6 421.57 C 271 296.92 380.29 170.34 440.42 100.82 M 166.59 421.93 C 276.43 293.65 389.02 166.66 446.07 100.42 M 166.59 421.93 C 248.65 326.65 330.91 231.41 446.07 100.42 M 172.23 421.53 C 263.71 315.1 357.22 210.16 451.06 100.78 M 172.23 421.53 C 259.57 321.81 348.14 220.25 451.06 100.78 M 177.22 421.89 C 267.97 316.88 359.53 211.48 456.7 100.39 M 177.22 421.89 C 261.37 326.47 343.66 231.43 456.7 100.39 M 182.86 421.5 C 289.26 297.3 396.13 172.02 461.69 100.75 M 182.86 421.5 C 289.33 300.07 394.2 178.34 461.69 100.75 M 187.85 421.86 C 265.79 332.44 342.84 243.99 467.33 100.35 M 187.85 421.86 C 248.13 354.18 307.38 286.09 467.33 100.35 M 193.49 421.47 C 257.73 349.36 320.11 276.81 472.32 100.71 M 193.49 421.47 C 290.47 308.54 388.19 196.5 472.32 100.71 M 198.48 421.83 C 271.78 339.08 343.98 257.37 477.96 100.32 M 198.48 421.83 C 262.79 346.63 327.83 272.5 477.96 100.32 M 203.46 422.19 C 282.22 334.46 359.43 246.52 482.95 100.68 M 203.46 422.19 C 311.49 299.27 417.41 176.49 482.95 100.68 M 209.11 421.79 C 313.41 303.62 416.43 184.57 488.59 100.28 M 209.11 421.79 C 264.81 355.53 322.05 289.62 488.59 100.28 M 214.09 422.15 C 307.66 312.46 403.13 203.22 492.92 101.4 M 214.09 422.15 C 321.41 298.89 428.72 175.8 492.92 101.4 M 219.74 421.76 C 325.56 298.92 431.67 178.1 497.91 101.76 M 219.74 421.76 C 293.52 337.58 367.31 253.92 497.91 101.76 M 224.72 422.12 C 282.53 355.9 339.7 290.73 502.89 102.12 M 224.72 422.12 C 294.78 340.72 364.32 261.4 502.89 102.12 M 230.37 421.72 C 323.63 311.96 419.94 201.83 508.54 101.73 M 230.37 421.72 C 286.15 356.58 343.43 290.54 508.54 101.73 M 235.35 422.08 C 300.72 346.73 366.72 270.29 512.21 103.59 M 235.35 422.08 C 302.89 345.75 369.73 269 512.21 103.59 M 241 421.69 C 346.74 303.38 451.19 182.85 516.54 104.71 M 241 421.69 C 325.03 324.79 408.74 227.57 516.54 104.71 M 245.98 422.05 C 352.07 303.06 456.51 182.48 520.22 106.58 M 245.98 422.05 C 353.38 298.62 459.94 176.63 520.22 106.58 M 251.63 421.65 C 330.7 330.27 412.59 235.04 523.89 108.45 M 251.63 421.65 C 332.29 328.2 415.63 232.31 523.89 108.45 M 256.61 422.01 C 347.87 315 441.57 208.09 526.91 111.07 M 256.61 422.01 C 334.49 331.17 415.18 240.39 526.91 111.07 M 262.26 421.62 C 363.81 304.95 466.44 187.63 529.93 113.7 M 262.26 421.62 C 320.06 354.68 378.38 287.46 529.93 113.7 M 267.24 421.98 C 331.25 350.22 392.53 278.97 532.29 117.08 M 267.24 421.98 C 359.29 316.93 449.41 212.89 532.29 117.08 M 272.89 421.58 C 376.82 301.51 478.45 183.18 534.66 120.45 M 272.89 421.58 C 360.71 320.39 448.13 218.67 534.66 120.45 M 277.87 421.94 C 363.05 323.93 448.46 228.08 537.02 123.83 M 277.87 421.94 C 347.77 339.53 418.3 257.52 537.02 123.83 M 283.52 421.55 C 377.01 313.16 473.29 202.75 538.72 127.97 M 283.52 421.55 C 337.83 359.01 392.83 294.83 538.72 127.97 M 288.5 421.91 C 355.77 347.06 422.84 267.96 539.12 133.61 M 288.5 421.91 C 341.57 359.32 394.63 298.64 539.12 133.61 M 294.15 421.52 C 350.49 354.93 407.75 289.49 540.17 138.5 M 294.15 421.52 C 365.62 339.27 436.66 257.91 540.17 138.5 M 299.14 421.88 C 370.22 341.1 442.21 257.17 541.22 143.39 M 299.14 421.88 C 360.43 353 420.74 283.21 541.22 143.39 M 304.78 421.48 C 395.59 319.95 483.72 215.96 540.96 149.79 M 304.78 421.48 C 366.96 350.3 429.25 280.31 540.96 149.79 M 309.77 421.84 C 360.89 360.16 411.08 302.64 541.35 155.43 M 309.77 421.84 C 369.38 355.38 427.04 288.1 541.35 155.43 M 315.41 421.45 C 378.9 349.34 440.68 277.31 541.09 161.83 M 315.41 421.45 C 382.26 344.53 450.92 266.61 541.09 161.83 M 320.4 421.81 C 373.48 361.96 423.76 304.34 541.49 167.47 M 320.4 421.81 C 373.89 357.94 429.32 294.21 541.49 167.47 M 325.38 422.17 C 385.85 350.86 446.77 281.48 541.23 173.87 M 325.38 422.17 C 382.36 356.16 439.35 291.75 541.23 173.87 M 331.03 421.77 C 390.5 352.81 452.41 283.45 540.96 180.26 M 331.03 421.77 C 385.23 361.34 437.84 300.19 540.96 180.26 M 336.01 422.13 C 383.73 367.06 430.75 312.76 541.36 185.91 M 336.01 422.13 C 388.84 362.28 441.08 300.97 541.36 185.91 M 341.66 421.74 C 411.22 342.85 479 263.89 541.1 192.31 M 341.66 421.74 C 391.02 366.86 439.88 310.83 541.1 192.31 M 346.64 422.1 C 387.92 370.06 432.82 320.96 541.49 197.95 M 346.64 422.1 C 401.35 359.24 457.76 295.98 541.49 197.95 M 352.29 421.7 C 411.6 352.13 472.77 280.64 541.23 204.35 M 352.29 421.7 C 423.63 341.3 492.58 260.74 541.23 204.35 M 357.27 422.06 C 404.49 367.18 452.08 312.56 540.97 210.74 M 357.27 422.06 C 429.42 337.21 503.36 253.6 540.97 210.74 M 362.92 421.67 C 419.79 355.88 474.35 290.85 541.36 216.39 M 362.92 421.67 C 426.15 348.12 490.74 274.03 541.36 216.39 M 367.9 422.03 C 433.62 344.31 500.62 269.32 541.1 222.79 M 367.9 422.03 C 426.06 356.37 484.32 288.98 541.1 222.79 M 373.55 421.63 C 405.69 381.33 441.2 340.95 541.5 228.43 M 373.55 421.63 C 426.08 362.74 477.9 305.42 541.5 228.43 M 378.53 421.99 C 437.57 355.97 492.39 291.9 541.24 234.83 M 378.53 421.99 C 428.47 365.8 478.11 308 541.24 234.83 M 384.18 421.6 C 423.7 377.48 465.9 332.61 540.97 241.22 M 384.18 421.6 C 427.54 373.94 469.2 324.12 540.97 241.22 M 389.16 421.96 C 444.68 355.85 502.54 291.47 541.37 246.87 M 389.16 421.96 C 449.08 354.81 507.08 286.65 541.37 246.87 M 394.81 421.56 C 439.07 374.57 480.52 327.12 541.11 253.26 M 394.81 421.56 C 439.95 370.26 484.55 318.62 541.11 253.26 M 399.79 421.92 C 451.94 362.3 505.35 302.06 541.5 258.91 M 399.79 421.92 C 444.73 368.31 490.7 316.27 541.5 258.91 M 405.44 421.53 C 451.91 369.29 494.7 318.39 541.24 265.31 M 405.44 421.53 C 434.7 388.86 461.83 356.99 541.24 265.31 M 410.42 421.89 C 447.61 378.99 489.19 331.11 541.63 270.95 M 410.42 421.89 C 453.94 371.59 500.19 319.12 541.63 270.95 M 416.07 421.5 C 461.57 366.67 505.85 317.99 541.37 277.35 M 416.07 421.5 C 461.97 369.21 506.7 316.77 541.37 277.35 M 421.05 421.86 C 450.62 391.31 477.09 359.07 541.11 283.74 M 421.05 421.86 C 460.61 376.73 499.41 330.82 541.11 283.74 M 426.7 421.46 C 468.13 372.5 512.29 323.05 541.51 289.39 M 426.7 421.46 C 463.25 376.98 503.05 332 541.51 289.39 M 431.68 421.82 C 465.51 387.04 494.93 350.76 541.24 295.78 M 431.68 421.82 C 460.46 388.28 490.34 353.89 541.24 295.78 M 436.67 422.18 C 465.89 391.6 494.97 356.7 541.64 301.43 M 436.67 422.18 C 461.23 392.62 487.06 362.46 541.64 301.43 M 442.31 421.79 C 469.62 389.23 497.18 360.05 541.38 307.83 M 442.31 421.79 C 479.37 377.88 515.76 335.02 541.38 307.83 M 447.3 422.15 C 468.8 396.46 490.9 374.74 541.12 314.22 M 447.3 422.15 C 483.37 379.67 518.9 338.27 541.12 314.22 M 452.94 421.75 C 479.92 391.4 508.69 359.58 541.51 319.87 M 452.94 421.75 C 486.75 384.9 518.51 346.64 541.51 319.87 M 457.93 422.11 C 483.67 392.05 509.92 362.43 541.25 326.26 M 457.93 422.11 C 477.31 399.57 495.38 377.14 541.25 326.26 M 463.57 421.72 C 489.79 393.26 515.41 361.53 541.64 331.91 M 463.57 421.72 C 481.62 399.7 499.44 378.69 541.64 331.91 M 468.56 422.08 C 484.04 402.48 502.8 383.34 541.38 338.31 M 468.56 422.08 C 485.18 403.63 503.17 385.38 541.38 338.31 M 474.2 421.68 C 500.52 388.89 527.57 359.08 541.12 344.7 M 474.2 421.68 C 487.6 404.91 504.03 388.52 541.12 344.7 M 479.19 422.04 C 492.83 403.85 509.23 389.98 541.52 350.35 M 479.19 422.04 C 503.08 395.04 526.82 366.03 541.52 350.35 M 484.83 421.65 C 498.04 406.02 510.63 391.44 541.25 356.74 M 484.83 421.65 C 497.86 405.34 513.36 387.95 541.25 356.74 M 489.82 422.01 C 508.79 399.39 524.35 381.85 541.65 362.39 M 489.82 422.01 C 505.67 405.76 519.67 388.13 541.65 362.39 M 494.81 422.37 C 505.07 409.15 519.04 395.99 541.39 368.78 M 494.81 422.37 C 510.17 405.63 524.41 388.41 541.39 368.78 M 500.45 421.97 C 509.71 409.66 517.38 399.48 542.44 373.67 M 500.45 421.97 C 513.08 407.03 525.01 394.07 542.44 373.67 M 508.72 418.56 C 517.21 407.18 529.51 394.66 541.52 380.83 M 508.72 418.56 C 518.29 406.9 529.24 395.56 541.52 380.83 M 516.33 415.9 C 522.44 409.05 526.51 403.7 539.29 389.49 M 516.33 415.9 C 524.29 407.54 532.26 397.16 539.29 389.49" fill="none" stroke="#dae8fc" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 48 100 M 48 100 C 215.44 100.18 383.73 100.37 492 100 M 48 100 C 199.65 97.7 350.93 97.87 492 100 M 492 100 C 524.29 100.68 539.1 117.62 540 148 M 492 100 C 522.73 99.61 539.89 116.64 540 148 M 540 148 C 540.14 203.98 538.08 263.25 540 372 M 540 148 C 538 231.8 538.19 313.68 540 372 M 540 372 C 539.04 402.99 524.44 419.28 492 420 M 540 372 C 540.05 404.24 523.41 418.56 492 420 M 492 420 C 384.17 421.76 274.9 422.7 48 420 M 492 420 C 362.74 420.18 234.33 420.28 48 420 M 48 420 C 15.58 418.46 0.58 404.93 0 372 M 48 420 C 14.03 419.79 1.93 403.37 0 372 M 0 372 C 2.9 305.37 0.49 242.63 0 148 M 0 372 C -2.39 297.49 -2.01 221.18 0 148 M 0 148 C -1.33 116.36 17.87 101.42 48 100 M 0 148 C -2.03 116.34 18.23 100.93 48 100" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><path d="M 48 100 M 48 100 C 215.44 100.18 383.73 100.37 492 100 M 48 100 C 199.65 97.7 350.93 97.87 492 100 M 492 100 C 524.29 100.68 539.1 117.62 540 148 M 492 100 C 522.73 99.61 539.89 116.64 540 148 M 540 148 C 540.14 203.98 538.08 263.25 540 372 M 540 148 C 538 231.8 538.19 313.68 540 372 M 540 372 C 539.04 402.99 524.44 419.28 492 420 M 540 372 C 540.05 404.24 523.41 418.56 492 420 M 492 420 C 384.17 421.76 274.9 422.7 48 420 M 492 420 C 362.74 420.18 234.33 420.28 48 420 M 48 420 C 15.58 418.46 0.58 404.93 0 372 M 48 420 C 14.03 419.79 1.93 403.37 0 372 M 0 372 C 2.9 305.37 0.49 242.63 0 148 M 0 372 C -2.39 297.49 -2.01 221.18 0 148 M 0 148 C -1.33 116.36 17.87 101.42 48 100 M 0 148 C -2.03 116.34 18.23 100.93 48 100" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 90 320 L 90 170 L 310 170" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 221px; margin-left: 91px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 16px">Link1</font></div></div></div></foreignObject><text x="91" y="224" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Link1</text></switch></g><ellipse cx="90" cy="360" rx="40" ry="40" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 360px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div style="font-size: 13px"><font style="font-size: 18px">A</font></div></div></div></div></foreignObject><text x="90" y="364" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">A</text></switch></g><path d="M 250 321.27 L 250 210 L 310 210" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 280px; margin-left: 260px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 16px">Link3_down</font></div></div></div></foreignObject><text x="260" y="283" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Link3_down</text></switch></g><ellipse cx="240" cy="360" rx="40" ry="40" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 360px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 18px">B</font></div></div></div></foreignObject><text x="240" y="364" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">B</text></switch></g><path d="M 450 320 L 450 255 L 420 255 L 420 170" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 255px; margin-left: 425px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 16px">Link4</font></div></div></div></foreignObject><text x="425" y="258" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Link4</text></switch></g><ellipse cx="450" cy="360" rx="40" ry="40" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 360px; margin-left: 411px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 18px">C</font></div></div></div></foreignObject><text x="450" y="364" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">C</text></switch></g><ellipse cx="320" cy="360" rx="3" ry="3" fill="#000000" stroke="none" pointer-events="all"/><rect x="300" y="340" width="40" height="40" fill="none" stroke="none" pointer-events="all"/><ellipse cx="350" cy="360" rx="3" ry="3" fill="#000000" stroke="none" pointer-events="all"/><rect x="330" y="340" width="40" height="40" fill="none" stroke="none" pointer-events="all"/><ellipse cx="380" cy="360" rx="3" ry="3" fill="#000000" stroke="none" pointer-events="all"/><rect x="360" y="340" width="40" height="40" fill="none" stroke="none" pointer-events="all"/><rect x="30" y="110" width="120" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 117px; margin-left: 32px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 21px">Star Zone</font></div></div></div></foreignObject><text x="32" y="129" fill="#000000" font-family="Helvetica" font-size="12px">Star Zone</text></switch></g><path d="M 310 20 L 310 110 Q 310 120 310 130 L 310 150 Q 310 160 310 170 L 310 210 Q 310 220 310 230 L 310 260" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 130px; margin-left: 300px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 17px">Backbone</font></div></div></div></foreignObject><text x="300" y="133" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Backbone</text></switch></g><path d="M 420 170 L 420 110 L 310 110" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 130px; margin-left: 420px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 16px">Link5</font></div></div></div></foreignObject><text x="420" y="133" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Link5</text></switch></g><ellipse cx="420" cy="170" rx="3" ry="3" fill="#000000" stroke="none" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><ellipse cx="420" cy="170" rx="3" ry="3" fill="#000000" stroke="none" pointer-events="all"/><rect x="400" y="150" width="40" height="40" fill="none" stroke="none" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="400" y="150" width="40" height="40" fill="none" stroke="none" pointer-events="all"/><rect x="250" y="0" width="100" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 10px; margin-left: 300px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; "><font style="font-size: 16px">Outer world</font></div></div></div></foreignObject><text x="300" y="14" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Outer world</text></switch></g><path d="M 216.48 327.52 L 216.52 290 L 217 190 L 310 190" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 210px; margin-left: 210px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 16px">Link3_up</font></div></div></div></foreignObject><text x="210" y="213" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Link3_up</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
\ No newline at end of file
diff --git a/docs/source/img/zone_tree.drawio b/docs/source/img/zone_tree.drawio
new file mode 100644 (file)
index 0000000..8bae8b3
--- /dev/null
@@ -0,0 +1 @@
+<mxfile host="app.diagrams.net" modified="2021-06-16T10:19:15.643Z" agent="5.0 (X11)" etag="AUI4ZKKA6cQazM-fsGMu" version="14.4.4" type="device"><diagram name="Page-1" id="97916047-d0de-89f5-080d-49f4d83e522f">7VpBc6IwFP41HLsDhAQ4stp2L+3sDIdujwhRmSJxEKvur99EEiEJbG13UWk9yftC8pLvfXnyAgYYLbb3RbScP5AEZ4ZtJlsDjA3btk1k0x+G7CrEAhaqkFmRJhyrgTD9jTlocnSdJngl3VgSkpXpUgZjkuc4LiUsKgqykW+bkkz2uoxmWAPCOMoE+g3W+FOalHOOW8ivG37gdDbnzj3brRomUfwyK8g65x5zkuOqZRGJYfgqV/MoIZsGBG4NMCoIKaurxXaEM8as4Kzqd9fRelhKgfPymA6g6vAaZWu+7iDkg6zKneBivxbMulgG+D5Ns2xEMlLsG0ESYW8aU3xVFuQFN1pQ7OHJlLWIVe67k7wM+dgHuwq/5VBbXwKf0CsuSrxtQHxJ95gscFns6C281XU5vVx8DuT2po6jEOi8EUHHEUGPuHpmh7FrEukF57GDU0cjVWMUJ1Rs3MTZhGxua+D7HqANbMEpVeSBWyFDRhPOk4DJnJqTjMQvFXSXsmm18qyFh07UgeO/Mb4i6yLGklLYxI8JgViz2P4ICmobMbBMUw/CAWyLAff3k6R0ql3O7NqZGKNaCe/W3A/KSNCSlYNsZTJlVMxwqQ1EQxHtGrct2Q2r7hlDKE8ZQjHlWmTVmLXkDiQfp0J3YCqk4it2vyhoUia4+cxMYYy3krXj1nvUW0WPQ7mHwnEM0sfgYZ6OcPTkPN4g50vI3DI9RedWPzr33b51DoeWbS9D5+6X0DlS0iyytKH+k9BVTz0IHV6F/gGhwy8hdN85ldBVTz08ubTFEXqa+oMQahvgDJWKVpa0aPfoSuXwvHmaSqWVaX9geaZ1g7+dQLpV1p0c5GAB0GtyUGpY8PF/QVMeyvX6KmoUP/ZJUgMyr4L9XIKlzk+jWN89j2LFidZVsZ9Esa59GsGiM6VY+yrYzyVYzztRhnXOI1j9xcZlC/ajxTLepmWjG7WeuS92XXdihlxgv3tzGMdV3G/sF6AU2G6f+8WzLMkbNLW66egKWz1KsvuqsF3flyftSu/wetow+jFqELranhlafW2ZjqeE7ewFNtIP8oIQDZ5qv+vV2RmZRi1M638EQ2PaUV/eXADT+tvGIHQGzzSy4MUx3XoQenMRH238E9dQrcW983OtH4UyroefQZB/cVyL6Ctcg8Fz7Tno4rjWz58Y18PP1+rnBr1yTc36Q73qObz+FhLc/gE=</diagram></mxfile>
\ No newline at end of file
diff --git a/docs/source/img/zone_tree.svg b/docs/source/img/zone_tree.svg
new file mode 100644 (file)
index 0000000..ea13c3b
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="633px" height="379px" viewBox="-0.5 -0.5 633 379" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-06-16T09:26:45.188Z&quot; agent=&quot;5.0 (X11)&quot; etag=&quot;rTRh24HieiH4WnhfT_EW&quot; version=&quot;14.4.4&quot; type=&quot;device&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;97916047-d0de-89f5-080d-49f4d83e522f&quot;&gt;7VpLc5swEP41HNPhJQFHaifpJZnOcEhzxCDbTDDyYDm2++srGckgCRonLbZJfDK7eqz2209rVsJwRovtfRkv5w84Rblhm+nWcMaGbdsmtOkP0+wqjW+blWJWZmmlsmpFlP1GXCm6rbMUraSOBOOcZEtZmeCiQAmRdHFZ4o3cbYpz2eoyniFNESVxLrTfQK1/ylIy53oLBnXDD5TN5kR46FUNkzh5mZV4XXCLBS5Q1bKIxTTcy9U8TvGmoXJuDWdUYkyqp8V2hHIGrMCsGnfX0XpwpUQFOWaAUw14jfM19zuM+CQrshNY7H1BbIhlON+nWZ6PcI7LfaOTxsifJlS/IiV+QY0WmPhoMmUtwsv9cFyQiM99kKvwWy6VdRf4gl5RSdC2oeIu3SO8QKTc0S681fM4vJx7LuDypo6j4Oe8EUHXFUGPOXtmh7lrEOkDx7EDU1cDVUMUpZRsXET5BG9ua8X3vYI2MIczysgDtoKGDCZUpCGjORUnOU5eKtVdxpbVirMWHrpQF4z/hvgKr8sESUxhCz8mBMJnHgELAgFtIwaWaepBOCjbYsDt/cQZXWqXMbs2JuaoPOHDmvtBmQlYMnOgrSyGxOUMEW0iGop41+i2ZB1W3SsGQF4yAGLJNcmqOWvKHUA+joXewFhIyVfuflGlSZHg4jMThTDeStKOS+9hbxU9rip8GI0TJ3sMH+bZCMVP7uMNdL8EzS3TV3hu9cPzwOub52Bo2fYyeO59CZ5DJc1CS5vqPxFdtdQD0cGV6B8gOvgSRA/cUxFdtdTDm0tbHIGvsT+MgLYBzlCpaGVJC3ePrlQO75unqVRakQ4GlmdaN/jbCaSbZd3JQQ6W4/SaHJQa1vn4v6ApT+X5fRU1ih37JKkBmlfCfi7CUuOnYWzgnYex4kTrythPwljPPg1h4ZlSrH0l7OcirO+fKMO65yGsfrFx2YT9aLGMthlpDKPSM7fFnutBTJAL7HdvDuO4ivuN/eIoBbbX537xLUuyBkytbjq6wlaPkuy+KmwvCORFe9IdXk8bRj9GDSNP2zNDq68t0/WVsJ29wIb6QV4YwcFDHXRdnZ0RadiCtP5HMDSkXfXy5gKQ1m8bw8gdPNLQAheHdOtB6M1FfLTxT1gDtRb3z4+1fhTKsB5+BoHBxWEtoq9g7Qwea9+FF4e1fv7EsB5+vlY/N+gVayrWH+pV7+H1p5DO7R8=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="290" y="0" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="290" y="0" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="320.5" y="27.75">AS1</text></g><path d="M 321 44.5 L 321 95.5 Q 321 105.5 311 105.5 L 40 105.5 Q 30 105.5 30 115.5 L 30 155.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 30 165.53 L 25 155.53 L 35 155.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 321 44.5 L 321 95.5 Q 321 105.5 331 105.5 L 589 105.5 Q 599 105.5 599 115.5 L 599 155.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 599 165.53 L 594 155.53 L 604 155.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 321 44.5 L 321 95.5 Q 321 105.5 311 105.5 L 176 105.5 Q 166 105.5 166 115.5 L 166 155.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 166 165.53 L 161 155.53 L 171 155.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 321 44.5 L 321 95.5 Q 321 105.5 331 105.5 L 451 105.5 Q 461 105.5 461 115.5 L 461 155.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 461 165.53 L 456 155.53 L 466 155.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="290" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="290" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="320.5" y="197.75">AS5</text></g><path d="M 321 214.5 L 321 265.5 Q 321 275.5 311 275.5 L 130 275.5 Q 120 275.5 120 285.5 L 120 315.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 120 325.53 L 115 315.53 L 125 315.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 321 214.5 L 321 265.5 Q 321 275.5 331 275.5 L 510 275.5 Q 520 275.5 520 285.5 L 520 315.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 520 325.53 L 515 315.53 L 525 315.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 321 214.5 L 321 265.5 Q 321 275.5 311 275.5 L 250 275.5 Q 240 275.5 240 285.5 L 240 315.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 240 325.53 L 235 315.53 L 245 315.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 321 214.5 L 321 265.5 Q 321 275.5 331 275.5 L 390 275.5 Q 400 275.5 400 285.5 L 400 315.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 400 325.53 L 395 315.53 L 405 315.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><path d="M 321 44.5 L 321 110 Q 321 120 321 130 L 321 155.53" fill="none" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 321 165.53 L 316 155.53 L 326 155.53 Z" fill="#23445d" stroke="#23445d" stroke-width="4" stroke-miterlimit="10" pointer-events="all"/><rect x="568" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="568" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="598.5" y="197.75">AS7</text></g><rect x="430" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="430" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="460.5" y="197.75">AS6</text></g><rect x="0" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="0" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="30.5" y="197.75">AS2</text></g><rect x="135" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="135" y="170" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="165.5" y="197.75">AS4</text></g><rect x="90" y="330" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="90" y="330" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="120.5" y="357.75">AS5-1</text></g><rect x="210" y="330" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="210" y="330" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="240.5" y="357.75">AS5-2</text></g><rect x="366" y="330" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="366" y="330" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="396.5" y="357.75">AS5-3</text></g><rect x="492" y="330" width="62" height="44.5" rx="6.67" ry="6.67" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="492" y="330" width="62" height="44.5" rx="6.67" ry="6.67" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g fill="#000000" font-family="Helvetica" font-weight="bold" text-anchor="middle" font-size="14px"><text x="522.5" y="357.75">AS5-4</text></g></g></svg>
\ No newline at end of file
diff --git a/docs/source/img/zoom_comm.drawio b/docs/source/img/zoom_comm.drawio
new file mode 100644 (file)
index 0000000..d3cda17
--- /dev/null
@@ -0,0 +1 @@
+<mxfile host="app.diagrams.net" modified="2021-06-16T14:45:53.551Z" agent="5.0 (X11)" etag="1-Ju0Aeqe1JzJO-0mNAZ" version="14.4.4" type="device"><diagram name="Page-1" id="97916047-d0de-89f5-080d-49f4d83e522f">7Vpbl6I4EP41PrYHCJf42LeZfujZM2fdObvzGCFitiNxILY6v34TCEK4KDOC2p59klRCSL6vqlJVcQQel9vPMVotvrAA05FlBNsReBpZlmW4lviRkl0mMYHpZpIwJoGSFYIp+YmV0FDSNQlwog3kjFFOVrrQZ1GEfa7JUByzjT5szqj+1RUKcU0w9RHNpWOnkP9NAr5QctOdFB0vmIQL9XFoeVnHDPlvYczWkfpixCKc9SxRPo3aZbJAAduUROB5BB5jxnj2tNw+YiqRzTHL3vvU0rvfSowj3uUFkL3wjuha7Vuti+9yINKNYDneHIGHOaH0kVEWp50gQBjOfSFPeMzecKnH9SGezWVPvsX0dRbxqZp73864N23RpmiG6VeWEE5YJIQUz8U+Ht5xzIng5rXSzdlK9CJKQtmKMy72o++VfMY4Z0u5lDfM/YX6dEhRInXEEM912BSSciq8LYkUjJ8xW2Ie78QQ1WsDRalSeGui2ptCd7yc9kVJbfYvIqWx4X7ugjjxoLhr5jGy//xr9+352x8E0Rc/Wf6kL693jnNl7LZg2oB8K8yOocPsWHWYLbcBZtMZDGa3AWaXcgWAhrf7Y83yjrskheZeDBAIbItO8RTK3/upmU8kFpbNlfXUaBSASvmCL6nCPjcKXwCL4warWJIgkK8/xFgsBM3SqaQxrBiJeAqS8zBynuRca84SxWM/NNquo9EIGmh0Gli0BiPRO9VWHAwDu8lWoDUDrvurtqL5qh4Qh6ZxFHFgNkAO4GCYw9vzT9DWYbZdu+6fmjTbHE61J4P5J+dW/RMEFf9kX9g/5UfaACRat0qiY+okOuDSJDYFZL9GogmbSAw3nUksHKqkYbMgHE9XyJe9G5HK6fyWY+TeDyQHVCK5uqfMI1jtPBqMneHiOOfOvlUjM41KRG57dR69s1pZUyiXgR+Q9wL4PgzvhSW8PUjfi7XvVggXOyKrBB83RpSsskLHnGylAbdbZyVMmkMf+41h0gw6tmP0owjupJKZdTwyB8vLPLNVD04j/ZVEb539LQ5CnMecLOYLFrII0edC+qB75GLMK5PVjZTQfzHnOxWpShPWFUMQFO/+KTe+y8nGTt582qrJs9Zu3wruZaVMNNMSVSr5RCTKpaqI3MBhlRD7ZevYx4dsUoX6HMUh5kePyLqSxZgiTt71lfTvOpoykr78RHeVuRGPMKl6BLPhhD+rR7AvY55nMzPP6mpm3iXNLF/muU5o8P8JndqVq9uja1z6hL7BAjUEEw1k4NVBFp6wjrI3GMpD5jXtpvXh85pqwRTWiTxrXuPBazy9MsvLL0i1ynXfh5v3IQ43OFSRR6YdnS+EJOLpbelwNtdqZOpKXr082ltEmfQDGt5qksbYgtDTjPJOHRidqVWTf5W7KQ1h83kidKrK/X4NJ1htezXi1JpfZ2W4opqffdSnnrXm500O+lTl8XT8NP92SrpeytC/l/t+M12ve+IenW9euj7qfL3LOl97QOfbOdb5mM53ctB074wxcKHZq/fNp7bGdmVeODYsfZrhPDRsulq7sSzEbSi9nDcLyVVnkCzkZu+ha7crbsMd5lmzENheuzk1nunsX682nnHBhe8wIbieeKaIYD5yPJPpe//xjGgWf/PNjrLin9Tg+T8=</diagram></mxfile>
\ No newline at end of file
diff --git a/docs/source/img/zoom_comm.svg b/docs/source/img/zoom_comm.svg
new file mode 100644 (file)
index 0000000..1f04dec
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="723px" height="434px" viewBox="-0.5 -0.5 723 434" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-06-16T14:46:07.052Z&quot; agent=&quot;5.0 (X11)&quot; etag=&quot;_DU1SG_j-vd2vulZapHi&quot; version=&quot;14.4.4&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;97916047-d0de-89f5-080d-49f4d83e522f&quot;&gt;7Vpbl6I4EP41PrYHCJf42LeZfujZM2fdObvzGCFitiNxILY6v34TCEK4KDOC2p59klRCSL6vqlJVcQQel9vPMVotvrAA05FlBNsReBpZlmW4lviRkl0mMYHpZpIwJoGSFYIp+YmV0FDSNQlwog3kjFFOVrrQZ1GEfa7JUByzjT5szqj+1RUKcU0w9RHNpWOnkP9NAr5QctOdFB0vmIQL9XFoeVnHDPlvYczWkfpixCKc9SxRPo3aZbJAAduUROB5BB5jxnj2tNw+YiqRzTHL3vvU0rvfSowj3uUFkL3wjuha7Vuti+9yINKNYDneHIGHOaH0kVEWp50gQBjOfSFPeMzecKnH9SGezWVPvsX0dRbxqZp73864N23RpmiG6VeWEE5YJIQUz8U+Ht5xzIng5rXSzdlK9CJKQtmKMy72o++VfMY4Z0u5lDfM/YX6dEhRInXEEM912BSSciq8LYkUjJ8xW2Ie78QQ1WsDRalSeGui2ptCd7yc9kVJbfYvIqWx4X7ugjjxoLhr5jGy//xr9+352x8E0Rc/Wf6kL693jnNl7LZg2oB8K8yOocPsWHWYLbcBZtMZDGa3AWaXcgWAhrf7Y83yjrskheZeDBAIbItO8RTK3/upmU8kFpbNlfXUaBSASvmCL6nCPjcKXwCL4warWJIgkK8/xFgsBM3SqaQxrBiJeAqS8zBynuRca84SxWM/NNquo9EIGmh0Gli0BiPRO9VWHAwDu8lWoDUDrvurtqL5qh4Qh6ZxFHFgNkAO4GCYw9vzT9DWYbZdu+6fmjTbHE61J4P5J+dW/RMEFf9kX9g/5UfaACRat0qiY+okOuDSJDYFZL9GogmbSAw3nUksHKqkYbMgHE9XyJe9G5HK6fyWY+TeDyQHVCK5uqfMI1jtPBqMneHiOOfOvlUjM41KRG57dR69s1pZUyiXgR+Q9wL4PgzvhSW8PUjfi7XvVggXOyKrBB83RpSsskLHnGylAbdbZyVMmkMf+41h0gw6tmP0owjupJKZdTwyB8vLPLNVD04j/ZVEb539LQ5CnMecLOYLFrII0edC+qB75GLMK5PVjZTQfzHnOxWpShPWFUMQFO/+KTe+y8nGTt582qrJs9Zu3wruZaVMNNMSVSr5RCTKpaqI3MBhlRD7ZevYx4dsUoX6HMUh5kePyLqSxZgiTt71lfTvOpoykr78RHeVuRGPMKl6BLPhhD+rR7AvY55nMzPP6mpm3iXNLF/muU5o8P8JndqVq9uja1z6hL7BAjUEEw1k4NVBFp6wjrI3GMpD5jXtpvXh85pqwRTWiTxrXuPBazy9MsvLL0i1ynXfh5v3IQ43OFSRR6YdnS+EJOLpbelwNtdqZOpKXr082ltEmfQDGt5qksbYgtDTjPJOHRidqVWTf5W7KQ1h83kidKrK/X4NJ1htezXi1JpfZ2W4opqffdSnnrXm500O+lTl8XT8NP92SrpeytC/l/t+M12ve+IenW9euj7qfL3LOl97QOfbOdb5mM53ctB074wxcKHZq/fNp7bGdmVeODYsfZrhPDRsulq7sSzEbSi9nDcLyVVnkCzkZu+ha7crbsMd5lmzENheuzk1nunsX682nnHBhe8wIbieeKaIYD5yPJPpe//xjGgWf/PNjrLin9Tg+T8=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="0" y="0" width="720" height="430" rx="64.5" ry="64.5" fill="none" stroke="none" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="0" y="0" width="720" height="430" rx="64.5" ry="64.5" fill="none" stroke="none" pointer-events="all"/><path d="M 15.96 16.31 C 15.96 16.31 15.96 16.31 15.96 16.31 M 15.96 16.31 C 15.96 16.31 15.96 16.31 15.96 16.31 M 11.78 25.78 C 15.58 22.08 19.83 18.57 26.88 8.59 M 11.18 26.7 C 15.62 24.01 18.69 19.16 27.22 9.76 M 7.24 39.41 C 13.87 27.15 23.93 20.68 37.68 5.11 M 6.55 38.13 C 13.65 31.63 20.9 23.56 37.09 4.63 M 4.25 45.74 C 18.61 33.61 28.67 19.76 41.92 2.15 M 6.21 47.68 C 13.68 36.24 23.88 26 42.53 3.07 M -0.35 56.55 C 14.32 46.38 24.38 29.48 51.16 1.86 M 1.92 58.2 C 15.61 41.82 27.56 27.15 49.32 2.68 M 2.12 61.87 C 20.17 44.81 32.76 25.46 53.73 0.38 M 2.05 63.44 C 20.03 42.18 37.73 20.39 55.78 1.65 M 0.26 71.79 C 23.1 45.73 41.04 23.28 62.24 1.44 M 2.17 70.3 C 25.17 43.16 48.63 17.07 60.93 0.76 M 2.49 75.68 C 23.79 47.58 49.56 17.81 64.57 -0.27 M 1.61 76.49 C 16.2 58.72 33 39.71 66.01 1.24 M 0.89 81.39 C 18.76 57.97 39.18 36.2 72.82 1.54 M 1.77 82.13 C 23.67 57.04 45.76 29.8 71.96 1.78 M 2.75 89.87 C 19.12 67.95 39.02 45.09 76.29 2.36 M 0.27 88.86 C 17.22 70.34 31.83 50.44 77 0.64 M 0.84 94.27 C 20.9 72.66 37.1 50.65 80.39 1.29 M 1.82 93.35 C 25.49 67.71 47.74 42.46 82.12 0.42 M 1.79 98.35 C 17.56 80.35 39.68 56.77 86.99 3.38 M 1.08 100.14 C 25.71 71.58 48.72 45.59 87.95 0.92 M 0.29 107.55 C 24.45 82.05 47.31 54.56 93.32 2.02 M 1.48 107.18 C 20.03 84.57 39.75 62.9 92.23 1.9 M 2.75 111.68 C 29.64 78.66 61.66 43.91 96.33 1.33 M 1.45 112.91 C 27.34 83.51 52.58 52.29 98.76 1.95 M 2.97 119.51 C 27.27 87.88 55.83 55.24 102.9 3.24 M 0.61 119.34 C 30.19 86.14 59.49 53.46 102.16 1.99 M 0.33 125.88 C 21.93 100.38 46.56 74.95 109.52 2.18 M 0.55 123.57 C 44.83 75.31 85.44 28.7 108.07 0.37 M 0.19 130.13 C 31.75 96.66 63.94 58.6 113.94 3.64 M 1.8 130.62 C 41.34 82.79 82.76 36.82 113.44 1.95 M 0.11 135.15 C 33.84 99.34 64.73 64.9 117.37 -0.65 M 0.58 137 C 27.31 106.64 54.44 74.47 119.23 1.6 M 1.49 142.07 C 45.8 94.01 90.57 42.69 124.86 1.61 M 1.02 141.79 C 27.27 114.78 53.77 84.72 123.39 1.1 M 1.24 148.86 C 42.86 102.11 85.47 52.54 128.21 1.7 M 1.43 149.66 C 44.07 99.35 89.05 47.18 130.3 1.86 M 1.93 153.59 C 29.23 119.89 60.4 89.4 134.33 0.38 M 1.04 154.5 C 31.7 119.98 61.47 83.9 135.59 1.78 M 0.53 160.23 C 40.03 117.35 80.69 69.43 140 1.49 M 0.81 161.92 C 36.42 119.55 73.88 77.11 140.11 2.01 M 1.56 166.69 C 42.78 115.25 88.04 64 144.54 0.22 M 0.5 167.71 C 51.95 111.09 100.18 55.89 145.67 2.08 M 2.45 174.42 C 49.47 121.11 94.35 65.95 151.92 2.35 M 0.68 173.52 C 48.68 119.11 96.49 65.88 150.19 2.01 M 0.21 180.66 C 41.5 134.21 82.46 86.35 156.83 2.67 M 0.84 179.3 C 50.03 122.76 98.46 67.51 156.51 2.01 M 0.55 183.91 C 41.03 141.87 79.45 95.6 161.63 0.15 M 0.76 185.55 C 62.72 115.68 124.68 43.28 162.32 0.63 M 0.46 193.18 C 48.8 135.47 95.19 80.23 165.58 0.48 M 2.09 191.66 C 34.99 152.66 68.58 111.94 167.08 1.35 M 0.99 196.82 C 36.67 158.66 72.3 118.14 171.41 0.46 M 1.54 197.97 C 62.11 128.14 121.02 60.14 172.25 0.65 M 0.08 204.28 C 66.63 129.01 132.78 52.39 178.11 1.04 M 0.65 203.7 C 64.86 129.66 127.23 56.85 177.84 1.3 M 1.41 209.88 C 71.43 132.53 138.7 50.43 181.38 1.53 M 0.47 209.96 C 48.38 156.48 94.48 104.14 183.03 0.49 M 1.33 216.59 C 47.3 159.66 94.17 105.79 188.3 2.76 M 1.58 215.07 C 73 131.36 144.99 48.21 187.46 1.25 M 0.62 223.4 C 46.85 167.47 93.3 117.63 192.81 1.41 M 0.79 222.71 C 67.33 149.27 131.45 74.88 193.36 0.83 M 0.82 229.8 C 50.78 173.01 99.44 115.48 199.33 2.35 M 0.32 228.25 C 76.84 143.31 150.91 57.32 198.98 1.95 M 0.72 235.13 C 62.58 165.98 123.22 96.86 205.04 0.86 M 1.38 233.57 C 80.52 141.21 158.85 50.79 204.08 1.39 M 1.4 241.12 C 56.78 179.16 110.88 115.95 207.97 0.84 M 0.98 240.94 C 64.07 168.79 127.41 94.85 209.17 1.07 M 0.47 246.9 C 78.93 157.14 157.24 64.54 215.8 0.19 M 1.04 245.63 C 44.54 195.83 89.4 144.17 215.02 1.06 M 2.09 252.5 C 77.34 163.7 154.97 74.23 219.34 0.11 M 1.69 252.41 C 48.61 198.63 96.04 143.53 219.15 1.91 M 0.49 259.35 C 76.14 176.68 147.34 92.47 223.52 2.69 M 0.58 259.51 C 79.17 168.09 159.01 76.94 224.54 1.53 M 1.03 264.62 C 84.04 171.56 166.77 77.98 229.67 0.08 M 1.91 264.48 C 54.79 201.93 109.25 139.46 230.99 1.91 M 0.36 271.79 C 76.31 184.73 149.79 99.98 234.9 0.97 M 1.12 270.85 C 85.49 174.16 170.13 76.67 234.82 1.29 M 2.63 277.69 C 69.42 196.41 138.07 117.53 240.48 1.58 M 1.61 276.72 C 91.01 173.97 181.64 70.51 241.26 1.26 M 0.13 284.08 C 89.86 181.31 179.83 79.67 244.97 2.71 M 1.65 282.78 C 87.58 182.56 176.16 80.98 246.42 1.59 M 1.3 289.91 C 77.74 199.82 157.13 107.71 252.82 1.35 M 0.57 289.95 C 78.95 200.09 157.83 109.98 251.7 1.2 M 2.49 296.32 C 89.51 190.91 182.06 86.61 255.71 1.71 M 1.69 294.83 C 63.67 224.62 123.53 154.13 257.22 2.11 M 1.96 301.89 C 103.69 182.55 208.86 63.57 262.69 2.08 M 0.86 302.04 C 55.15 237.58 109.81 174.09 262.46 1.51 M 0.47 307.15 C 68.84 229.86 135.68 152.07 267.4 1.4 M 1.82 307.6 C 74.47 224.6 147.62 140.69 267.01 1.89 M 1.29 313.66 C 70.54 232.28 140.06 151.88 273.1 0.24 M 1.75 313.66 C 85.63 216.71 169.48 120.58 272.42 0.77 M 0.22 319.14 C 81.4 225.31 161.59 131.95 278.96 2.22 M 0.66 320.09 C 91.71 217.19 180.13 115.56 278.12 1.66 M 2.06 326.39 C 115.13 199 224.97 70.81 284.25 1.99 M 1.49 326.16 C 92.05 219.76 182.99 115.58 283.63 0.84 M 0.32 332.97 C 112.49 206.15 221.74 78.26 288.27 2.2 M 0.82 332.26 C 60.51 262.05 120.46 192.32 288.76 1.37 M 1.37 336.86 C 82.37 245.34 162.1 154.11 294.1 1.23 M 1.94 338.1 C 75.93 252.89 148.69 169.7 294.66 1.13 M 1.51 344.17 C 90.02 241.13 180.09 138.04 298.23 1.39 M 1.57 344.07 C 106.71 222.65 211.5 102.39 298.81 1.38 M 0.69 350.37 C 101.99 233.63 202.4 116.81 304.53 1.15 M 1.5 350.35 C 110.8 224.31 220.7 98.12 305.15 1.08 M 1.08 356.44 C 93.28 251.21 185.25 146.8 310.06 1.4 M 1.82 356.57 C 105.95 237.02 208.17 119.07 309.39 1.4 M 1.96 361.81 C 123.81 224.47 244.76 85.02 315.11 1.44 M 1.03 362.73 C 68.72 285.47 135.5 208.83 315.58 1.01 M 1.8 368.25 C 94.95 260.67 188.21 153.06 320.25 1.56 M 1.46 367.95 C 102.28 250.13 204.16 132.14 320.84 1.54 M 0.7 373.79 C 70.36 295.06 141.07 214.06 325.29 0.77 M 1.5 374.88 C 77.89 288.15 152.98 201.79 326.21 1.09 M 3.15 379.78 C 97.33 270.91 190.51 163.51 331.49 1.12 M 2.54 379.16 C 87.17 283.59 171.91 186.32 331.31 1.42 M 2.66 383.69 C 127.85 239.91 253.18 95.12 335.37 0.97 M 3.3 384.74 C 112.36 259.19 220.54 134.18 335.7 1.35 M 4.69 388.53 C 118.79 258.33 232.75 127.8 341.96 0.74 M 4.43 389.18 C 94.24 285.19 183.93 182.53 341.88 0.98 M 4.47 395.68 C 140.46 238.66 276.82 82.9 347.38 2 M 5.06 395.04 C 101.36 282.21 198.24 171.39 346.98 1.86 M 7.6 398.87 C 141.5 242.13 276.95 87.27 352.13 0.83 M 7.56 398.52 C 92.17 300.76 176.83 203.27 352.2 1.26 M 9.38 402.14 C 138.21 253.18 269.11 101.94 358.06 1.93 M 9.16 402.77 C 135.71 255.24 263.57 108.92 357.69 1.69 M 10.36 407 C 98.98 305.17 188.25 203.84 363.09 1.59 M 10.49 406.82 C 108.12 295.69 205.51 183.46 363.02 1.22 M 13.75 409.96 C 147.36 255.65 283.15 99.14 367.81 1.84 M 13.19 409.67 C 126.64 281.17 238.98 151.35 367.64 1.44 M 15.79 413 C 89.48 327.92 163.04 244.26 373.36 1.39 M 16.16 412.15 C 91.98 324.26 169.43 235.91 373.79 0.93 M 18.52 416.51 C 111.58 307.91 205.13 199.78 378.45 1.78 M 18.15 415.64 C 149.54 266.08 279.49 116.52 378.91 1.64 M 21.63 418.08 C 95.72 335.61 169.77 250.83 383.67 1.55 M 21.76 418.64 C 129.25 294.98 235.76 172.14 384.22 1.57 M 24.86 421.17 C 104.52 328.82 186.98 233.48 388.45 0.78 M 24.16 420.78 C 165.09 256.04 308.12 92.39 389.47 1.93 M 28.75 423.46 C 128.94 308.89 227.37 195.63 395.39 1.61 M 28.41 423.38 C 149.22 285.15 269.39 146.01 395.13 1.44 M 31.09 424.82 C 127.18 316.17 223.32 205.6 399.27 1.65 M 32.14 424.78 C 174.59 261.48 316.86 98.15 399.57 1.86 M 36.54 426.05 C 149.83 294.77 262.75 165.69 405.72 0.85 M 35.82 425.66 C 151.07 295.61 265.4 165.19 405.22 0.74 M 39.65 428 C 162.13 286.9 283.64 147.36 410.62 1.36 M 39.58 427.53 C 112.61 341.57 187.35 256.08 410.17 1.7 M 44.48 429.64 C 149.63 310.63 252.04 190.99 415.65 1.55 M 43.87 429.4 C 120.9 341.85 196.22 255.47 415.89 0.79 M 48.52 429.53 C 181.91 278.33 315.09 125.98 420.43 0.66 M 48.78 429.37 C 185.07 272.68 321.79 114.73 421.29 1.62 M 53.57 430.01 C 141.41 331.38 226.35 233.24 426.84 0.93 M 54.02 429.87 C 188.32 276.16 321.68 123.29 426.41 0.83 M 59.11 430.24 C 152.07 323.04 245.2 216.56 431.24 0.9 M 58.77 430.78 C 169.29 300.9 281.31 171.22 432.07 1.7 M 63.23 430.42 C 164.82 313.97 266.19 197.87 436.74 0.82 M 63.8 431.53 C 175.27 301.31 286.53 173.15 437.15 1.2 M 68.39 432.47 C 171.29 313.43 275.49 193.88 442.24 0.77 M 67.74 432.66 C 174.62 309.46 281.65 185.96 442.29 1.16 M 72.8 432.51 C 218.7 265.71 363.65 97.15 448.26 1.21 M 72.35 432.56 C 197.69 291.36 321.1 149.04 447.95 0.96 M 78.46 431.98 C 188.6 307.24 297.13 182.85 452.42 1.15 M 78.72 432.3 C 187.99 307.11 298.26 180.72 453.27 1.5 M 83.7 432.96 C 174.7 331.52 263.7 227.56 457.84 1.02 M 83.31 432.74 C 207.09 290.52 331.51 147.02 458.31 1.83 M 89.43 432.17 C 203.18 302.26 315.4 171.49 463.82 1.9 M 89.18 431.94 C 224.77 274.42 362.08 115.99 463.78 0.94 M 94.52 432.02 C 224.46 281.74 355.71 130.8 469.33 1.49 M 93.61 432.33 C 229.29 275.8 366.7 118.02 468.36 1.98 M 99.47 432.22 C 211.29 301.04 326.01 170.47 473.48 1.84 M 99.15 433.35 C 183.95 334.87 270.49 235.31 474.1 1.64 M 105.04 432.23 C 224.88 292.97 347.81 152.14 478.85 1.08 M 104.56 432.43 C 205.25 315.7 306.16 200.04 478.95 1.37 M 109.37 433.64 C 205.25 321.05 302.36 209.42 484.68 1.98 M 109.29 433.19 C 217.07 310.76 323.4 188.08 485.19 1.63 M 114.82 431.89 C 204.12 330.52 290.83 230.78 490.19 2.09 M 114.98 432.45 C 212.59 322.81 308.3 213.25 489.5 1.89 M 120.16 433.58 C 232.23 303.2 343.38 175.33 495.73 0.7 M 120.22 433.05 C 199.66 340.62 279.01 249.51 495.48 1.29 M 126.47 433.08 C 208.29 338.36 290.87 241.55 499.75 1.78 M 125.96 432.49 C 245.93 292.53 365.83 154.2 500.48 1.78 M 130.95 433.01 C 252.83 292.08 376.46 150.34 506.34 1.75 M 131.06 432.5 C 270.24 273.02 408.35 114.38 506.52 0.88 M 136.02 432.05 C 251.78 301.85 365.51 171.12 510.99 2 M 136.88 432.57 C 224.29 329.99 313.93 227.57 511.09 1.17 M 141.49 432.67 C 225.56 334.68 309.12 238.38 516.08 1.47 M 141.25 433.04 C 288.06 262.4 435.05 93.73 516.52 1.4 M 147.31 432.04 C 286.46 274.38 424.2 114.18 521.55 1.17 M 147.02 432.65 C 279.69 280.52 412.94 127.15 521.58 1.29 M 152.13 433.07 C 242.03 329.19 330.34 226.8 527.53 1.55 M 152.09 432.46 C 300.09 263.03 448.73 92.47 527.59 1.35 M 157.62 432.05 C 300.99 270.53 442.55 107.68 532.94 2.26 M 157.93 432.56 C 232.09 344.98 307.7 257.6 532.5 1.3 M 162.26 432.9 C 308.46 263.94 455.7 95.63 538.27 1.08 M 162.79 432.85 C 303.47 272.22 442.2 112.34 537.74 0.74 M 168.86 431.65 C 304.96 275.95 439.97 121.39 542.47 1.66 M 168.66 432.08 C 276.22 307.85 382.21 185.31 543.1 1.48 M 173.51 432.24 C 273.79 316.22 375.63 199.39 548.94 1.3 M 173.65 432.65 C 319.16 265.23 465.84 96.51 548.83 1.09 M 179.55 432.61 C 262.92 337.66 345.26 242.53 552.87 1.9 M 178.95 432.47 C 287.88 308.54 396.44 184.55 553.7 1.61 M 183.31 432.52 C 277.09 324.95 369.18 218.71 559.99 0.86 M 183.63 432.97 C 259.67 345.87 336.37 257.66 559.45 0.65 M 189.64 432.45 C 313.61 287.54 440.6 142.22 564.32 2.1 M 190 432.54 C 293.67 313.44 396.83 194.86 564.11 0.98 M 194.52 433.37 C 289.62 324.2 384.34 215.12 569.44 1.31 M 194.41 432.88 C 283.42 330.86 370.37 230 569 1.52 M 200.52 432.47 C 332.65 280.26 465.05 128.92 574.39 1.16 M 200.54 432.57 C 308.64 310.3 415.27 187.75 575.25 1.6 M 205.84 432.56 C 354.95 262.26 503.89 88.92 580.31 0.91 M 205.52 432.53 C 350.57 264.41 495.85 97.31 579.52 1.86 M 210.18 432.96 C 358.16 263.11 502.54 96.38 586.11 0.93 M 210.76 431.98 C 337.89 286.47 465.1 140.93 585.89 0.98 M 216.57 432.48 C 350.66 274.75 487.82 116.8 590.27 2.39 M 216.03 432.38 C 310.07 326.22 403.56 218.29 590.21 1.99 M 220.59 432.32 C 311 329.99 399.42 228.57 596.72 1.46 M 220.89 433.25 C 306.99 333.61 394.39 233.1 595.92 0.97 M 226.66 432.06 C 304.11 343.95 379.74 257.63 600.66 1.86 M 226.84 432.41 C 329.97 313.85 434.46 192.93 600.78 1.41 M 230.72 433.68 C 366.2 276.19 500.25 121 607.27 0.97 M 231.4 432.52 C 360.58 284.75 488.45 136.81 607.09 1.3 M 236.67 433.22 C 363.58 286.98 489.08 142.51 611.07 0.83 M 236.78 432.13 C 317.85 339.18 398.99 246.22 611.64 1.91 M 242.19 433.38 C 350.67 305.08 461.23 177.75 617.86 0.64 M 242.3 432.88 C 324.94 338.75 407.69 244.05 617.47 1.24 M 247.8 432.85 C 384.33 277.13 519.65 121.13 622.5 1.38 M 248.15 432.14 C 351.2 313.69 454.64 194.71 622.29 1.21 M 252.3 432.42 C 346.11 326.86 436.39 222.43 627.61 1.45 M 252.55 432.6 C 402.21 261.24 551.63 89.57 627.79 1.15 M 258.65 432.41 C 349.16 328.33 441.3 222.81 632.57 1.36 M 258.73 432.56 C 393.41 277.21 527.79 122.41 632.91 1.74 M 262.98 432.35 C 372.35 310.29 480.2 186.9 639.44 0.95 M 263.36 433.06 C 408.73 265.54 554.15 98.15 638.29 0.91 M 268.47 433.16 C 390.5 292.35 513.61 152.03 643.54 0.81 M 269.01 432.22 C 357.31 330.54 445.82 228.82 643.56 1.83 M 274.38 432.09 C 417.15 269 558.23 105.61 648.93 1.23 M 274.26 433.15 C 374.75 315.91 477.13 197.95 649.46 0.73 M 280.32 432.9 C 399.46 292.06 520.75 153.77 655.59 0.42 M 279.75 432.67 C 413.21 276.74 547.71 122.51 655.53 -0.18 M 284.87 432.75 C 411.48 288.5 538.53 143.93 660.93 0.24 M 284.66 432.46 C 406.44 293.44 527.45 154.02 660.37 0.34 M 289.88 432.42 C 404.89 298.87 520.1 165.41 665.75 0.34 M 290.4 432.56 C 387.44 322.95 483.37 212.61 665.37 0.85 M 295.87 432.81 C 389.72 321.91 486.39 211.5 669.62 1.08 M 295.46 432.91 C 436.56 268.55 578.8 105.27 670.3 2 M 301.49 432.31 C 428.94 283.3 558.84 134.64 675.46 2.41 M 300.7 432.46 C 426.94 288.32 552.21 143.98 674.94 2.3 M 305.38 432.93 C 421.06 301.74 534.26 171.92 679.2 2.9 M 305.83 432.32 C 405.11 318.79 504.39 204.87 679.37 2.96 M 312.06 432.88 C 405.74 323.33 499.9 212.98 682.4 4.93 M 311.48 432.46 C 417.49 308.22 523.96 184.7 683.19 5.29 M 316.08 432.73 C 434.3 294.9 552.28 158.98 685.79 7.61 M 316.46 432.44 C 457.29 269.54 599.38 106.37 686.5 6.95 M 322.37 432.67 C 411.42 329.78 501.29 226.73 690.88 7.68 M 322.25 432.15 C 424.69 316.6 525.88 199.84 690.95 7.83 M 327.23 432.41 C 405.72 343.55 483.55 253.41 694.54 9.2 M 327.09 432.52 C 439.73 302.98 552.96 172.48 695.3 9.53 M 331.56 432.33 C 433.57 317.27 534.49 200.94 698.24 11.71 M 332.17 432.99 C 455.37 291.04 578.58 148.98 698.55 11.68 M 337.94 432.76 C 470.12 281.15 601.55 129.68 700.83 14.59 M 338.18 432.51 C 483.2 265.56 628.1 99.19 700.89 14.11 M 342.94 433.19 C 448.15 308.18 556 184.47 704.84 17.01 M 342.62 432.89 C 485 269.11 628.61 103.67 704.63 16.92 M 348.73 431.93 C 430.46 339.18 510.81 248.2 707.23 19.69 M 348.45 432.29 C 485.79 271.75 624.71 111.75 707.62 20.06 M 353.7 432.27 C 431.18 340.34 510.22 250.32 709 22.66 M 353.33 433.15 C 444.52 330.78 534.81 227.23 709.82 22.84 M 358.36 431.85 C 472.67 302.63 586.5 170.36 711.39 26.32 M 358.93 432.46 C 496.22 275.81 633.47 117.63 712.18 26.77 M 363.91 433.59 C 482.91 298.93 599.93 163.22 713.94 29.82 M 364.17 432.99 C 496.83 279.12 630.09 125.21 714.1 30.94 M 370.19 431.82 C 456.91 329.33 547.1 227.47 716.76 33.83 M 369.73 432.72 C 471.29 315.64 572.54 198.73 715.95 34.11 M 374.25 432.92 C 475.06 315.41 577.83 198.78 718.26 37.97 M 374.49 432.79 C 490.53 298.61 606.43 165.3 717.75 37.97 M 381.05 431.73 C 482.15 318.56 582.47 203.14 718.09 42.84 M 380.04 432.66 C 503.64 288.71 628.79 144.82 719.24 42.93 M 386.05 432.24 C 497.55 300.85 611.2 171.32 720.34 47.72 M 385.53 432.41 C 504.26 296.83 622.51 160.13 720.03 47.58 M 390.74 432.03 C 516.39 287.25 642.37 142.77 721.68 52.23 M 391.35 432.64 C 478.55 332.05 566.22 231.99 720.79 52.93 M 396.44 433.3 C 480.19 335.72 563.7 237.93 721.64 58.08 M 395.61 432.84 C 509.04 302.83 621.11 173.62 721.77 58.75 M 402.15 432.13 C 504.61 312.72 608.26 193.9 721.95 63.76 M 401.84 432.06 C 466.91 356.58 532.21 281.19 721.51 63.99 M 406.35 432.8 C 482.02 347.5 556.64 262.23 721.45 70.97 M 406.55 432.98 C 498.85 325.78 591.55 218.9 721.72 70.2 M 411.39 432.05 C 475.25 357.91 539.49 284.54 720.93 76.65 M 411.89 432.77 C 532.85 292.86 653.34 154.19 720.83 77.23 M 417.48 431.93 C 481.72 357.55 544.04 285.22 720.83 83.34 M 417.27 432.8 C 499.04 337.62 582.33 241.06 721.22 82.39 M 422.92 432.43 C 539.72 295.64 655.77 161.66 721.9 89.27 M 422.79 432.23 C 485.05 361.75 547.62 290.33 721.36 89.28 M 426.91 431.95 C 516.22 329.72 605.39 227.11 721.18 93.92 M 427.69 432.63 C 494.2 357.15 560.86 280.11 722.11 94.78 M 434.06 432.81 C 519.82 330.18 608.97 228.27 720.62 100.89 M 433.97 432.21 C 495.7 361.89 557.12 291.05 721.56 100.92 M 438.01 432.04 C 495.48 366.5 553.32 300.45 721.32 106.79 M 438.13 432.26 C 544.91 308.31 652.86 185 721.75 107.29 M 443.33 431.24 C 512.55 353.03 581.66 273.31 721.94 113.6 M 444.59 432.63 C 538.64 323.24 634.72 212.26 721.79 112.6 M 449.24 433.05 C 549.83 314.88 653.18 198.16 721.66 118.84 M 449.35 432.95 C 512.76 361.5 574.85 288.94 721.02 119.46 M 454.76 433.57 C 560.7 310.45 666.4 189.25 721.55 125.21 M 453.9 432.94 C 539.46 334.71 625.3 236.34 721.78 125.31 M 459.62 433.39 C 524.78 358.64 589.05 283.2 722.45 131.92 M 459.27 432.08 C 554.79 322.46 649.38 213.88 722.02 130.92 M 465.72 433.66 C 563.27 318.79 663.6 204.51 722.11 137.39 M 465.3 433.41 C 524.37 364.94 584.13 295.98 721.63 137.2 M 471.25 433.2 C 525.16 367.67 582.37 301.87 722.16 143.41 M 470.6 432.97 C 527.66 367.24 585.63 300.41 721.94 143.77 M 475.43 432.42 C 557.53 336.42 642.2 241.7 722.26 150.12 M 475.57 433.14 C 561.8 333.77 647.45 234.58 721.23 149.72 M 480.19 432.32 C 553 352.68 621.52 274.04 721.19 156.09 M 480.76 432.56 C 570.89 329.08 660.61 225.39 722.2 155.38 M 486.02 433.54 C 540.95 365.3 597.66 300.92 720.9 160.64 M 486.58 432.56 C 565.53 343.89 643.26 254.77 721.74 161.41 M 490.55 432.79 C 582.89 331.67 670.13 229.02 722.33 166.41 M 491.09 432.93 C 537.69 378.69 584.86 324.63 721.72 167.7 M 497.08 431.71 C 576.02 339.73 655.25 247.94 720.86 173.12 M 496.36 433.37 C 584.9 330.77 674.05 227.51 721.46 173.61 M 502.85 431.24 C 552.76 370.53 606.33 310.74 722.5 180 M 502.29 433.03 C 549.86 379.03 597.01 324.76 721.1 180.92 M 507.81 432.71 C 551.78 380.41 596.33 328.31 721.85 185.72 M 506.57 433.27 C 582.45 344.42 659.97 256.62 722.42 186.16 M 513.13 431.74 C 586.05 351.32 655.15 270.65 722.66 193.68 M 512.87 432.13 C 593 343.39 671.84 252.45 721.52 192.72 M 516.96 432.89 C 560.55 383.17 604.36 334.33 721.73 198.68 M 517.51 432.29 C 597.21 340.02 676.78 248.47 721.79 198 M 523.76 432.8 C 594.03 352.64 664.28 274.22 721.44 204.33 M 523.08 432.93 C 590.2 353.74 658.21 275.99 721.95 204.19 M 528.72 432 C 572.42 381.57 616.93 328.87 721.49 209.68 M 527.8 433.28 C 580.32 372.57 633.25 312.77 722.09 210.72 M 532.65 432.24 C 592.41 368.21 648.89 300.85 720.72 217.65 M 533.74 433.05 C 578.99 381.67 621.79 332.33 721.74 217.11 M 538.34 433.98 C 579.54 387.1 619.65 341.3 722.5 222.47 M 538.75 433.19 C 600.81 361.32 661.7 291.86 721.15 222.83 M 544.88 433.38 C 585.39 384.37 625.05 340.61 722.34 228.81 M 544.83 431.94 C 588.08 381.82 633.14 330.9 721.5 228.63 M 549.57 431.73 C 585.06 392.64 619.05 352.64 722.19 233.83 M 550.01 433.12 C 599.3 375.28 650.58 317.51 721.28 234.14 M 554.54 433.11 C 604.47 378.48 647.64 325.42 720.87 240.68 M 555.24 432.85 C 601.62 378.26 648.98 323.05 721.04 240.92 M 559.76 431.5 C 603.05 386.51 645 337.34 722.96 245.34 M 560.97 432.5 C 600 386.28 641.19 339.49 721.53 247.54 M 565.63 431.47 C 597.61 393.35 631.66 354.54 721.88 252.01 M 565.36 432.53 C 611.39 377.92 658.57 324.93 721.97 253.92 M 572.31 431.44 C 624.36 369.62 679.38 307.87 722.11 258.35 M 570.67 432.22 C 614.31 381.97 656.94 332.69 721.4 258.42 M 575.68 432.63 C 629.46 371.29 683.67 309.12 722.25 265.1 M 576.57 432.5 C 623.51 379.17 670.1 324.78 722.01 264.64 M 580.16 434.21 C 626.66 379.31 672.38 327.32 720.75 271.08 M 581.33 433.09 C 615.5 393.97 649.61 354.73 722.07 271.81 M 588.3 432.55 C 618.75 394.56 650.87 358.73 722.37 275.85 M 587.13 432.29 C 624.69 389.18 664.24 345.36 722.6 277.57 M 593.13 433.32 C 629.56 388.7 667.83 346.7 719.88 282.17 M 591.46 432.15 C 639.81 379.64 687.16 323.83 722.2 284.57 M 598.87 432.63 C 634.33 393.59 667.54 356.08 722.3 288.19 M 596.45 433.11 C 642.77 378.4 689.56 324.81 721.43 290.3 M 602.88 433.76 C 627.7 401.87 651.39 372.86 720.48 296.39 M 603.24 431.56 C 634.33 397.96 663 363.63 722.33 296.03 M 606.79 434.03 C 648.34 389.05 685.53 346.91 720.9 301.49 M 608.61 433.18 C 638.01 399.22 668.63 364 720.78 302.25 M 611.58 431.08 C 650.12 388.66 687.22 345.89 721.38 308.94 M 614.42 431.6 C 645.64 397.68 677.77 360.64 720.84 307.7 M 617.95 433.27 C 642.69 407.59 665.06 380.12 722.75 313.54 M 618.6 433.29 C 650.32 396.04 681.88 359.79 720.96 314.55 M 625.19 434.04 C 644.73 409.55 666.66 384.33 723.05 318.54 M 624.52 432.29 C 647.19 403.72 672.99 375.15 722.74 319.84 M 627.57 434.32 C 657.86 400.57 687.16 365.89 721.94 326.06 M 630.03 433.09 C 659.26 397.28 690.35 361.5 721.91 326.38 M 633.2 432.84 C 654.08 412.48 669.85 389.62 723.53 331.38 M 634.79 431.4 C 657.62 404.3 683.14 376.5 721.75 331.5 M 640.42 432.6 C 670.08 396.16 703.19 362.8 720.79 337.42 M 639.26 433 C 660.18 409.36 681.71 385.53 721.99 337.92 M 644.67 431.13 C 663.06 416.55 676.05 398.18 721.76 345.8 M 646.17 432.51 C 667.35 406.45 690.25 380.63 721.65 345.27 M 650.87 430.96 C 672.18 408.46 697.68 379.35 721.19 351.46 M 651.37 432.23 C 667.87 413.12 685.81 392.39 721.23 351.15 M 656.91 433.2 C 678.48 407.52 700.14 379.77 720.21 357.33 M 656 432.2 C 683.5 402.39 709.38 372 720.93 356.24 M 664.78 429.44 C 679.37 412.58 696.54 392.12 720.57 361.42 M 662.09 430.5 C 685.24 404.71 709.6 377.34 721.42 361.81 M 670.09 429.59 C 681.55 416.48 690.73 403.45 721.61 366.46 M 668.68 429.6 C 682.66 412.91 698.69 396.11 723.46 367.81 M 672.36 429.53 C 686.62 413.41 699.29 398.26 723.94 374.02 M 674.66 430.35 C 683.92 418.04 693.17 406.98 722.03 375.44 M 678.01 430.49 C 690.41 415.19 705.72 398.35 719.62 380.13 M 678.35 429.88 C 693.91 412.26 709.16 394.49 721.21 381.17 M 689.88 422.36 C 702.18 409.9 712.46 396.46 721.24 388.41 M 689.55 423.29 C 698.88 413.18 709.67 401.81 719.66 390.37" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><path d="M 15.96 16.31 C 15.96 16.31 15.96 16.31 15.96 16.31 M 15.96 16.31 C 15.96 16.31 15.96 16.31 15.96 16.31 M 11.78 25.78 C 15.58 22.08 19.83 18.57 26.88 8.59 M 11.18 26.7 C 15.62 24.01 18.69 19.16 27.22 9.76 M 7.24 39.41 C 13.87 27.15 23.93 20.68 37.68 5.11 M 6.55 38.13 C 13.65 31.63 20.9 23.56 37.09 4.63 M 4.25 45.74 C 18.61 33.61 28.67 19.76 41.92 2.15 M 6.21 47.68 C 13.68 36.24 23.88 26 42.53 3.07 M -0.35 56.55 C 14.32 46.38 24.38 29.48 51.16 1.86 M 1.92 58.2 C 15.61 41.82 27.56 27.15 49.32 2.68 M 2.12 61.87 C 20.17 44.81 32.76 25.46 53.73 0.38 M 2.05 63.44 C 20.03 42.18 37.73 20.39 55.78 1.65 M 0.26 71.79 C 23.1 45.73 41.04 23.28 62.24 1.44 M 2.17 70.3 C 25.17 43.16 48.63 17.07 60.93 0.76 M 2.49 75.68 C 23.79 47.58 49.56 17.81 64.57 -0.27 M 1.61 76.49 C 16.2 58.72 33 39.71 66.01 1.24 M 0.89 81.39 C 18.76 57.97 39.18 36.2 72.82 1.54 M 1.77 82.13 C 23.67 57.04 45.76 29.8 71.96 1.78 M 2.75 89.87 C 19.12 67.95 39.02 45.09 76.29 2.36 M 0.27 88.86 C 17.22 70.34 31.83 50.44 77 0.64 M 0.84 94.27 C 20.9 72.66 37.1 50.65 80.39 1.29 M 1.82 93.35 C 25.49 67.71 47.74 42.46 82.12 0.42 M 1.79 98.35 C 17.56 80.35 39.68 56.77 86.99 3.38 M 1.08 100.14 C 25.71 71.58 48.72 45.59 87.95 0.92 M 0.29 107.55 C 24.45 82.05 47.31 54.56 93.32 2.02 M 1.48 107.18 C 20.03 84.57 39.75 62.9 92.23 1.9 M 2.75 111.68 C 29.64 78.66 61.66 43.91 96.33 1.33 M 1.45 112.91 C 27.34 83.51 52.58 52.29 98.76 1.95 M 2.97 119.51 C 27.27 87.88 55.83 55.24 102.9 3.24 M 0.61 119.34 C 30.19 86.14 59.49 53.46 102.16 1.99 M 0.33 125.88 C 21.93 100.38 46.56 74.95 109.52 2.18 M 0.55 123.57 C 44.83 75.31 85.44 28.7 108.07 0.37 M 0.19 130.13 C 31.75 96.66 63.94 58.6 113.94 3.64 M 1.8 130.62 C 41.34 82.79 82.76 36.82 113.44 1.95 M 0.11 135.15 C 33.84 99.34 64.73 64.9 117.37 -0.65 M 0.58 137 C 27.31 106.64 54.44 74.47 119.23 1.6 M 1.49 142.07 C 45.8 94.01 90.57 42.69 124.86 1.61 M 1.02 141.79 C 27.27 114.78 53.77 84.72 123.39 1.1 M 1.24 148.86 C 42.86 102.11 85.47 52.54 128.21 1.7 M 1.43 149.66 C 44.07 99.35 89.05 47.18 130.3 1.86 M 1.93 153.59 C 29.23 119.89 60.4 89.4 134.33 0.38 M 1.04 154.5 C 31.7 119.98 61.47 83.9 135.59 1.78 M 0.53 160.23 C 40.03 117.35 80.69 69.43 140 1.49 M 0.81 161.92 C 36.42 119.55 73.88 77.11 140.11 2.01 M 1.56 166.69 C 42.78 115.25 88.04 64 144.54 0.22 M 0.5 167.71 C 51.95 111.09 100.18 55.89 145.67 2.08 M 2.45 174.42 C 49.47 121.11 94.35 65.95 151.92 2.35 M 0.68 173.52 C 48.68 119.11 96.49 65.88 150.19 2.01 M 0.21 180.66 C 41.5 134.21 82.46 86.35 156.83 2.67 M 0.84 179.3 C 50.03 122.76 98.46 67.51 156.51 2.01 M 0.55 183.91 C 41.03 141.87 79.45 95.6 161.63 0.15 M 0.76 185.55 C 62.72 115.68 124.68 43.28 162.32 0.63 M 0.46 193.18 C 48.8 135.47 95.19 80.23 165.58 0.48 M 2.09 191.66 C 34.99 152.66 68.58 111.94 167.08 1.35 M 0.99 196.82 C 36.67 158.66 72.3 118.14 171.41 0.46 M 1.54 197.97 C 62.11 128.14 121.02 60.14 172.25 0.65 M 0.08 204.28 C 66.63 129.01 132.78 52.39 178.11 1.04 M 0.65 203.7 C 64.86 129.66 127.23 56.85 177.84 1.3 M 1.41 209.88 C 71.43 132.53 138.7 50.43 181.38 1.53 M 0.47 209.96 C 48.38 156.48 94.48 104.14 183.03 0.49 M 1.33 216.59 C 47.3 159.66 94.17 105.79 188.3 2.76 M 1.58 215.07 C 73 131.36 144.99 48.21 187.46 1.25 M 0.62 223.4 C 46.85 167.47 93.3 117.63 192.81 1.41 M 0.79 222.71 C 67.33 149.27 131.45 74.88 193.36 0.83 M 0.82 229.8 C 50.78 173.01 99.44 115.48 199.33 2.35 M 0.32 228.25 C 76.84 143.31 150.91 57.32 198.98 1.95 M 0.72 235.13 C 62.58 165.98 123.22 96.86 205.04 0.86 M 1.38 233.57 C 80.52 141.21 158.85 50.79 204.08 1.39 M 1.4 241.12 C 56.78 179.16 110.88 115.95 207.97 0.84 M 0.98 240.94 C 64.07 168.79 127.41 94.85 209.17 1.07 M 0.47 246.9 C 78.93 157.14 157.24 64.54 215.8 0.19 M 1.04 245.63 C 44.54 195.83 89.4 144.17 215.02 1.06 M 2.09 252.5 C 77.34 163.7 154.97 74.23 219.34 0.11 M 1.69 252.41 C 48.61 198.63 96.04 143.53 219.15 1.91 M 0.49 259.35 C 76.14 176.68 147.34 92.47 223.52 2.69 M 0.58 259.51 C 79.17 168.09 159.01 76.94 224.54 1.53 M 1.03 264.62 C 84.04 171.56 166.77 77.98 229.67 0.08 M 1.91 264.48 C 54.79 201.93 109.25 139.46 230.99 1.91 M 0.36 271.79 C 76.31 184.73 149.79 99.98 234.9 0.97 M 1.12 270.85 C 85.49 174.16 170.13 76.67 234.82 1.29 M 2.63 277.69 C 69.42 196.41 138.07 117.53 240.48 1.58 M 1.61 276.72 C 91.01 173.97 181.64 70.51 241.26 1.26 M 0.13 284.08 C 89.86 181.31 179.83 79.67 244.97 2.71 M 1.65 282.78 C 87.58 182.56 176.16 80.98 246.42 1.59 M 1.3 289.91 C 77.74 199.82 157.13 107.71 252.82 1.35 M 0.57 289.95 C 78.95 200.09 157.83 109.98 251.7 1.2 M 2.49 296.32 C 89.51 190.91 182.06 86.61 255.71 1.71 M 1.69 294.83 C 63.67 224.62 123.53 154.13 257.22 2.11 M 1.96 301.89 C 103.69 182.55 208.86 63.57 262.69 2.08 M 0.86 302.04 C 55.15 237.58 109.81 174.09 262.46 1.51 M 0.47 307.15 C 68.84 229.86 135.68 152.07 267.4 1.4 M 1.82 307.6 C 74.47 224.6 147.62 140.69 267.01 1.89 M 1.29 313.66 C 70.54 232.28 140.06 151.88 273.1 0.24 M 1.75 313.66 C 85.63 216.71 169.48 120.58 272.42 0.77 M 0.22 319.14 C 81.4 225.31 161.59 131.95 278.96 2.22 M 0.66 320.09 C 91.71 217.19 180.13 115.56 278.12 1.66 M 2.06 326.39 C 115.13 199 224.97 70.81 284.25 1.99 M 1.49 326.16 C 92.05 219.76 182.99 115.58 283.63 0.84 M 0.32 332.97 C 112.49 206.15 221.74 78.26 288.27 2.2 M 0.82 332.26 C 60.51 262.05 120.46 192.32 288.76 1.37 M 1.37 336.86 C 82.37 245.34 162.1 154.11 294.1 1.23 M 1.94 338.1 C 75.93 252.89 148.69 169.7 294.66 1.13 M 1.51 344.17 C 90.02 241.13 180.09 138.04 298.23 1.39 M 1.57 344.07 C 106.71 222.65 211.5 102.39 298.81 1.38 M 0.69 350.37 C 101.99 233.63 202.4 116.81 304.53 1.15 M 1.5 350.35 C 110.8 224.31 220.7 98.12 305.15 1.08 M 1.08 356.44 C 93.28 251.21 185.25 146.8 310.06 1.4 M 1.82 356.57 C 105.95 237.02 208.17 119.07 309.39 1.4 M 1.96 361.81 C 123.81 224.47 244.76 85.02 315.11 1.44 M 1.03 362.73 C 68.72 285.47 135.5 208.83 315.58 1.01 M 1.8 368.25 C 94.95 260.67 188.21 153.06 320.25 1.56 M 1.46 367.95 C 102.28 250.13 204.16 132.14 320.84 1.54 M 0.7 373.79 C 70.36 295.06 141.07 214.06 325.29 0.77 M 1.5 374.88 C 77.89 288.15 152.98 201.79 326.21 1.09 M 3.15 379.78 C 97.33 270.91 190.51 163.51 331.49 1.12 M 2.54 379.16 C 87.17 283.59 171.91 186.32 331.31 1.42 M 2.66 383.69 C 127.85 239.91 253.18 95.12 335.37 0.97 M 3.3 384.74 C 112.36 259.19 220.54 134.18 335.7 1.35 M 4.69 388.53 C 118.79 258.33 232.75 127.8 341.96 0.74 M 4.43 389.18 C 94.24 285.19 183.93 182.53 341.88 0.98 M 4.47 395.68 C 140.46 238.66 276.82 82.9 347.38 2 M 5.06 395.04 C 101.36 282.21 198.24 171.39 346.98 1.86 M 7.6 398.87 C 141.5 242.13 276.95 87.27 352.13 0.83 M 7.56 398.52 C 92.17 300.76 176.83 203.27 352.2 1.26 M 9.38 402.14 C 138.21 253.18 269.11 101.94 358.06 1.93 M 9.16 402.77 C 135.71 255.24 263.57 108.92 357.69 1.69 M 10.36 407 C 98.98 305.17 188.25 203.84 363.09 1.59 M 10.49 406.82 C 108.12 295.69 205.51 183.46 363.02 1.22 M 13.75 409.96 C 147.36 255.65 283.15 99.14 367.81 1.84 M 13.19 409.67 C 126.64 281.17 238.98 151.35 367.64 1.44 M 15.79 413 C 89.48 327.92 163.04 244.26 373.36 1.39 M 16.16 412.15 C 91.98 324.26 169.43 235.91 373.79 0.93 M 18.52 416.51 C 111.58 307.91 205.13 199.78 378.45 1.78 M 18.15 415.64 C 149.54 266.08 279.49 116.52 378.91 1.64 M 21.63 418.08 C 95.72 335.61 169.77 250.83 383.67 1.55 M 21.76 418.64 C 129.25 294.98 235.76 172.14 384.22 1.57 M 24.86 421.17 C 104.52 328.82 186.98 233.48 388.45 0.78 M 24.16 420.78 C 165.09 256.04 308.12 92.39 389.47 1.93 M 28.75 423.46 C 128.94 308.89 227.37 195.63 395.39 1.61 M 28.41 423.38 C 149.22 285.15 269.39 146.01 395.13 1.44 M 31.09 424.82 C 127.18 316.17 223.32 205.6 399.27 1.65 M 32.14 424.78 C 174.59 261.48 316.86 98.15 399.57 1.86 M 36.54 426.05 C 149.83 294.77 262.75 165.69 405.72 0.85 M 35.82 425.66 C 151.07 295.61 265.4 165.19 405.22 0.74 M 39.65 428 C 162.13 286.9 283.64 147.36 410.62 1.36 M 39.58 427.53 C 112.61 341.57 187.35 256.08 410.17 1.7 M 44.48 429.64 C 149.63 310.63 252.04 190.99 415.65 1.55 M 43.87 429.4 C 120.9 341.85 196.22 255.47 415.89 0.79 M 48.52 429.53 C 181.91 278.33 315.09 125.98 420.43 0.66 M 48.78 429.37 C 185.07 272.68 321.79 114.73 421.29 1.62 M 53.57 430.01 C 141.41 331.38 226.35 233.24 426.84 0.93 M 54.02 429.87 C 188.32 276.16 321.68 123.29 426.41 0.83 M 59.11 430.24 C 152.07 323.04 245.2 216.56 431.24 0.9 M 58.77 430.78 C 169.29 300.9 281.31 171.22 432.07 1.7 M 63.23 430.42 C 164.82 313.97 266.19 197.87 436.74 0.82 M 63.8 431.53 C 175.27 301.31 286.53 173.15 437.15 1.2 M 68.39 432.47 C 171.29 313.43 275.49 193.88 442.24 0.77 M 67.74 432.66 C 174.62 309.46 281.65 185.96 442.29 1.16 M 72.8 432.51 C 218.7 265.71 363.65 97.15 448.26 1.21 M 72.35 432.56 C 197.69 291.36 321.1 149.04 447.95 0.96 M 78.46 431.98 C 188.6 307.24 297.13 182.85 452.42 1.15 M 78.72 432.3 C 187.99 307.11 298.26 180.72 453.27 1.5 M 83.7 432.96 C 174.7 331.52 263.7 227.56 457.84 1.02 M 83.31 432.74 C 207.09 290.52 331.51 147.02 458.31 1.83 M 89.43 432.17 C 203.18 302.26 315.4 171.49 463.82 1.9 M 89.18 431.94 C 224.77 274.42 362.08 115.99 463.78 0.94 M 94.52 432.02 C 224.46 281.74 355.71 130.8 469.33 1.49 M 93.61 432.33 C 229.29 275.8 366.7 118.02 468.36 1.98 M 99.47 432.22 C 211.29 301.04 326.01 170.47 473.48 1.84 M 99.15 433.35 C 183.95 334.87 270.49 235.31 474.1 1.64 M 105.04 432.23 C 224.88 292.97 347.81 152.14 478.85 1.08 M 104.56 432.43 C 205.25 315.7 306.16 200.04 478.95 1.37 M 109.37 433.64 C 205.25 321.05 302.36 209.42 484.68 1.98 M 109.29 433.19 C 217.07 310.76 323.4 188.08 485.19 1.63 M 114.82 431.89 C 204.12 330.52 290.83 230.78 490.19 2.09 M 114.98 432.45 C 212.59 322.81 308.3 213.25 489.5 1.89 M 120.16 433.58 C 232.23 303.2 343.38 175.33 495.73 0.7 M 120.22 433.05 C 199.66 340.62 279.01 249.51 495.48 1.29 M 126.47 433.08 C 208.29 338.36 290.87 241.55 499.75 1.78 M 125.96 432.49 C 245.93 292.53 365.83 154.2 500.48 1.78 M 130.95 433.01 C 252.83 292.08 376.46 150.34 506.34 1.75 M 131.06 432.5 C 270.24 273.02 408.35 114.38 506.52 0.88 M 136.02 432.05 C 251.78 301.85 365.51 171.12 510.99 2 M 136.88 432.57 C 224.29 329.99 313.93 227.57 511.09 1.17 M 141.49 432.67 C 225.56 334.68 309.12 238.38 516.08 1.47 M 141.25 433.04 C 288.06 262.4 435.05 93.73 516.52 1.4 M 147.31 432.04 C 286.46 274.38 424.2 114.18 521.55 1.17 M 147.02 432.65 C 279.69 280.52 412.94 127.15 521.58 1.29 M 152.13 433.07 C 242.03 329.19 330.34 226.8 527.53 1.55 M 152.09 432.46 C 300.09 263.03 448.73 92.47 527.59 1.35 M 157.62 432.05 C 300.99 270.53 442.55 107.68 532.94 2.26 M 157.93 432.56 C 232.09 344.98 307.7 257.6 532.5 1.3 M 162.26 432.9 C 308.46 263.94 455.7 95.63 538.27 1.08 M 162.79 432.85 C 303.47 272.22 442.2 112.34 537.74 0.74 M 168.86 431.65 C 304.96 275.95 439.97 121.39 542.47 1.66 M 168.66 432.08 C 276.22 307.85 382.21 185.31 543.1 1.48 M 173.51 432.24 C 273.79 316.22 375.63 199.39 548.94 1.3 M 173.65 432.65 C 319.16 265.23 465.84 96.51 548.83 1.09 M 179.55 432.61 C 262.92 337.66 345.26 242.53 552.87 1.9 M 178.95 432.47 C 287.88 308.54 396.44 184.55 553.7 1.61 M 183.31 432.52 C 277.09 324.95 369.18 218.71 559.99 0.86 M 183.63 432.97 C 259.67 345.87 336.37 257.66 559.45 0.65 M 189.64 432.45 C 313.61 287.54 440.6 142.22 564.32 2.1 M 190 432.54 C 293.67 313.44 396.83 194.86 564.11 0.98 M 194.52 433.37 C 289.62 324.2 384.34 215.12 569.44 1.31 M 194.41 432.88 C 283.42 330.86 370.37 230 569 1.52 M 200.52 432.47 C 332.65 280.26 465.05 128.92 574.39 1.16 M 200.54 432.57 C 308.64 310.3 415.27 187.75 575.25 1.6 M 205.84 432.56 C 354.95 262.26 503.89 88.92 580.31 0.91 M 205.52 432.53 C 350.57 264.41 495.85 97.31 579.52 1.86 M 210.18 432.96 C 358.16 263.11 502.54 96.38 586.11 0.93 M 210.76 431.98 C 337.89 286.47 465.1 140.93 585.89 0.98 M 216.57 432.48 C 350.66 274.75 487.82 116.8 590.27 2.39 M 216.03 432.38 C 310.07 326.22 403.56 218.29 590.21 1.99 M 220.59 432.32 C 311 329.99 399.42 228.57 596.72 1.46 M 220.89 433.25 C 306.99 333.61 394.39 233.1 595.92 0.97 M 226.66 432.06 C 304.11 343.95 379.74 257.63 600.66 1.86 M 226.84 432.41 C 329.97 313.85 434.46 192.93 600.78 1.41 M 230.72 433.68 C 366.2 276.19 500.25 121 607.27 0.97 M 231.4 432.52 C 360.58 284.75 488.45 136.81 607.09 1.3 M 236.67 433.22 C 363.58 286.98 489.08 142.51 611.07 0.83 M 236.78 432.13 C 317.85 339.18 398.99 246.22 611.64 1.91 M 242.19 433.38 C 350.67 305.08 461.23 177.75 617.86 0.64 M 242.3 432.88 C 324.94 338.75 407.69 244.05 617.47 1.24 M 247.8 432.85 C 384.33 277.13 519.65 121.13 622.5 1.38 M 248.15 432.14 C 351.2 313.69 454.64 194.71 622.29 1.21 M 252.3 432.42 C 346.11 326.86 436.39 222.43 627.61 1.45 M 252.55 432.6 C 402.21 261.24 551.63 89.57 627.79 1.15 M 258.65 432.41 C 349.16 328.33 441.3 222.81 632.57 1.36 M 258.73 432.56 C 393.41 277.21 527.79 122.41 632.91 1.74 M 262.98 432.35 C 372.35 310.29 480.2 186.9 639.44 0.95 M 263.36 433.06 C 408.73 265.54 554.15 98.15 638.29 0.91 M 268.47 433.16 C 390.5 292.35 513.61 152.03 643.54 0.81 M 269.01 432.22 C 357.31 330.54 445.82 228.82 643.56 1.83 M 274.38 432.09 C 417.15 269 558.23 105.61 648.93 1.23 M 274.26 433.15 C 374.75 315.91 477.13 197.95 649.46 0.73 M 280.32 432.9 C 399.46 292.06 520.75 153.77 655.59 0.42 M 279.75 432.67 C 413.21 276.74 547.71 122.51 655.53 -0.18 M 284.87 432.75 C 411.48 288.5 538.53 143.93 660.93 0.24 M 284.66 432.46 C 406.44 293.44 527.45 154.02 660.37 0.34 M 289.88 432.42 C 404.89 298.87 520.1 165.41 665.75 0.34 M 290.4 432.56 C 387.44 322.95 483.37 212.61 665.37 0.85 M 295.87 432.81 C 389.72 321.91 486.39 211.5 669.62 1.08 M 295.46 432.91 C 436.56 268.55 578.8 105.27 670.3 2 M 301.49 432.31 C 428.94 283.3 558.84 134.64 675.46 2.41 M 300.7 432.46 C 426.94 288.32 552.21 143.98 674.94 2.3 M 305.38 432.93 C 421.06 301.74 534.26 171.92 679.2 2.9 M 305.83 432.32 C 405.11 318.79 504.39 204.87 679.37 2.96 M 312.06 432.88 C 405.74 323.33 499.9 212.98 682.4 4.93 M 311.48 432.46 C 417.49 308.22 523.96 184.7 683.19 5.29 M 316.08 432.73 C 434.3 294.9 552.28 158.98 685.79 7.61 M 316.46 432.44 C 457.29 269.54 599.38 106.37 686.5 6.95 M 322.37 432.67 C 411.42 329.78 501.29 226.73 690.88 7.68 M 322.25 432.15 C 424.69 316.6 525.88 199.84 690.95 7.83 M 327.23 432.41 C 405.72 343.55 483.55 253.41 694.54 9.2 M 327.09 432.52 C 439.73 302.98 552.96 172.48 695.3 9.53 M 331.56 432.33 C 433.57 317.27 534.49 200.94 698.24 11.71 M 332.17 432.99 C 455.37 291.04 578.58 148.98 698.55 11.68 M 337.94 432.76 C 470.12 281.15 601.55 129.68 700.83 14.59 M 338.18 432.51 C 483.2 265.56 628.1 99.19 700.89 14.11 M 342.94 433.19 C 448.15 308.18 556 184.47 704.84 17.01 M 342.62 432.89 C 485 269.11 628.61 103.67 704.63 16.92 M 348.73 431.93 C 430.46 339.18 510.81 248.2 707.23 19.69 M 348.45 432.29 C 485.79 271.75 624.71 111.75 707.62 20.06 M 353.7 432.27 C 431.18 340.34 510.22 250.32 709 22.66 M 353.33 433.15 C 444.52 330.78 534.81 227.23 709.82 22.84 M 358.36 431.85 C 472.67 302.63 586.5 170.36 711.39 26.32 M 358.93 432.46 C 496.22 275.81 633.47 117.63 712.18 26.77 M 363.91 433.59 C 482.91 298.93 599.93 163.22 713.94 29.82 M 364.17 432.99 C 496.83 279.12 630.09 125.21 714.1 30.94 M 370.19 431.82 C 456.91 329.33 547.1 227.47 716.76 33.83 M 369.73 432.72 C 471.29 315.64 572.54 198.73 715.95 34.11 M 374.25 432.92 C 475.06 315.41 577.83 198.78 718.26 37.97 M 374.49 432.79 C 490.53 298.61 606.43 165.3 717.75 37.97 M 381.05 431.73 C 482.15 318.56 582.47 203.14 718.09 42.84 M 380.04 432.66 C 503.64 288.71 628.79 144.82 719.24 42.93 M 386.05 432.24 C 497.55 300.85 611.2 171.32 720.34 47.72 M 385.53 432.41 C 504.26 296.83 622.51 160.13 720.03 47.58 M 390.74 432.03 C 516.39 287.25 642.37 142.77 721.68 52.23 M 391.35 432.64 C 478.55 332.05 566.22 231.99 720.79 52.93 M 396.44 433.3 C 480.19 335.72 563.7 237.93 721.64 58.08 M 395.61 432.84 C 509.04 302.83 621.11 173.62 721.77 58.75 M 402.15 432.13 C 504.61 312.72 608.26 193.9 721.95 63.76 M 401.84 432.06 C 466.91 356.58 532.21 281.19 721.51 63.99 M 406.35 432.8 C 482.02 347.5 556.64 262.23 721.45 70.97 M 406.55 432.98 C 498.85 325.78 591.55 218.9 721.72 70.2 M 411.39 432.05 C 475.25 357.91 539.49 284.54 720.93 76.65 M 411.89 432.77 C 532.85 292.86 653.34 154.19 720.83 77.23 M 417.48 431.93 C 481.72 357.55 544.04 285.22 720.83 83.34 M 417.27 432.8 C 499.04 337.62 582.33 241.06 721.22 82.39 M 422.92 432.43 C 539.72 295.64 655.77 161.66 721.9 89.27 M 422.79 432.23 C 485.05 361.75 547.62 290.33 721.36 89.28 M 426.91 431.95 C 516.22 329.72 605.39 227.11 721.18 93.92 M 427.69 432.63 C 494.2 357.15 560.86 280.11 722.11 94.78 M 434.06 432.81 C 519.82 330.18 608.97 228.27 720.62 100.89 M 433.97 432.21 C 495.7 361.89 557.12 291.05 721.56 100.92 M 438.01 432.04 C 495.48 366.5 553.32 300.45 721.32 106.79 M 438.13 432.26 C 544.91 308.31 652.86 185 721.75 107.29 M 443.33 431.24 C 512.55 353.03 581.66 273.31 721.94 113.6 M 444.59 432.63 C 538.64 323.24 634.72 212.26 721.79 112.6 M 449.24 433.05 C 549.83 314.88 653.18 198.16 721.66 118.84 M 449.35 432.95 C 512.76 361.5 574.85 288.94 721.02 119.46 M 454.76 433.57 C 560.7 310.45 666.4 189.25 721.55 125.21 M 453.9 432.94 C 539.46 334.71 625.3 236.34 721.78 125.31 M 459.62 433.39 C 524.78 358.64 589.05 283.2 722.45 131.92 M 459.27 432.08 C 554.79 322.46 649.38 213.88 722.02 130.92 M 465.72 433.66 C 563.27 318.79 663.6 204.51 722.11 137.39 M 465.3 433.41 C 524.37 364.94 584.13 295.98 721.63 137.2 M 471.25 433.2 C 525.16 367.67 582.37 301.87 722.16 143.41 M 470.6 432.97 C 527.66 367.24 585.63 300.41 721.94 143.77 M 475.43 432.42 C 557.53 336.42 642.2 241.7 722.26 150.12 M 475.57 433.14 C 561.8 333.77 647.45 234.58 721.23 149.72 M 480.19 432.32 C 553 352.68 621.52 274.04 721.19 156.09 M 480.76 432.56 C 570.89 329.08 660.61 225.39 722.2 155.38 M 486.02 433.54 C 540.95 365.3 597.66 300.92 720.9 160.64 M 486.58 432.56 C 565.53 343.89 643.26 254.77 721.74 161.41 M 490.55 432.79 C 582.89 331.67 670.13 229.02 722.33 166.41 M 491.09 432.93 C 537.69 378.69 584.86 324.63 721.72 167.7 M 497.08 431.71 C 576.02 339.73 655.25 247.94 720.86 173.12 M 496.36 433.37 C 584.9 330.77 674.05 227.51 721.46 173.61 M 502.85 431.24 C 552.76 370.53 606.33 310.74 722.5 180 M 502.29 433.03 C 549.86 379.03 597.01 324.76 721.1 180.92 M 507.81 432.71 C 551.78 380.41 596.33 328.31 721.85 185.72 M 506.57 433.27 C 582.45 344.42 659.97 256.62 722.42 186.16 M 513.13 431.74 C 586.05 351.32 655.15 270.65 722.66 193.68 M 512.87 432.13 C 593 343.39 671.84 252.45 721.52 192.72 M 516.96 432.89 C 560.55 383.17 604.36 334.33 721.73 198.68 M 517.51 432.29 C 597.21 340.02 676.78 248.47 721.79 198 M 523.76 432.8 C 594.03 352.64 664.28 274.22 721.44 204.33 M 523.08 432.93 C 590.2 353.74 658.21 275.99 721.95 204.19 M 528.72 432 C 572.42 381.57 616.93 328.87 721.49 209.68 M 527.8 433.28 C 580.32 372.57 633.25 312.77 722.09 210.72 M 532.65 432.24 C 592.41 368.21 648.89 300.85 720.72 217.65 M 533.74 433.05 C 578.99 381.67 621.79 332.33 721.74 217.11 M 538.34 433.98 C 579.54 387.1 619.65 341.3 722.5 222.47 M 538.75 433.19 C 600.81 361.32 661.7 291.86 721.15 222.83 M 544.88 433.38 C 585.39 384.37 625.05 340.61 722.34 228.81 M 544.83 431.94 C 588.08 381.82 633.14 330.9 721.5 228.63 M 549.57 431.73 C 585.06 392.64 619.05 352.64 722.19 233.83 M 550.01 433.12 C 599.3 375.28 650.58 317.51 721.28 234.14 M 554.54 433.11 C 604.47 378.48 647.64 325.42 720.87 240.68 M 555.24 432.85 C 601.62 378.26 648.98 323.05 721.04 240.92 M 559.76 431.5 C 603.05 386.51 645 337.34 722.96 245.34 M 560.97 432.5 C 600 386.28 641.19 339.49 721.53 247.54 M 565.63 431.47 C 597.61 393.35 631.66 354.54 721.88 252.01 M 565.36 432.53 C 611.39 377.92 658.57 324.93 721.97 253.92 M 572.31 431.44 C 624.36 369.62 679.38 307.87 722.11 258.35 M 570.67 432.22 C 614.31 381.97 656.94 332.69 721.4 258.42 M 575.68 432.63 C 629.46 371.29 683.67 309.12 722.25 265.1 M 576.57 432.5 C 623.51 379.17 670.1 324.78 722.01 264.64 M 580.16 434.21 C 626.66 379.31 672.38 327.32 720.75 271.08 M 581.33 433.09 C 615.5 393.97 649.61 354.73 722.07 271.81 M 588.3 432.55 C 618.75 394.56 650.87 358.73 722.37 275.85 M 587.13 432.29 C 624.69 389.18 664.24 345.36 722.6 277.57 M 593.13 433.32 C 629.56 388.7 667.83 346.7 719.88 282.17 M 591.46 432.15 C 639.81 379.64 687.16 323.83 722.2 284.57 M 598.87 432.63 C 634.33 393.59 667.54 356.08 722.3 288.19 M 596.45 433.11 C 642.77 378.4 689.56 324.81 721.43 290.3 M 602.88 433.76 C 627.7 401.87 651.39 372.86 720.48 296.39 M 603.24 431.56 C 634.33 397.96 663 363.63 722.33 296.03 M 606.79 434.03 C 648.34 389.05 685.53 346.91 720.9 301.49 M 608.61 433.18 C 638.01 399.22 668.63 364 720.78 302.25 M 611.58 431.08 C 650.12 388.66 687.22 345.89 721.38 308.94 M 614.42 431.6 C 645.64 397.68 677.77 360.64 720.84 307.7 M 617.95 433.27 C 642.69 407.59 665.06 380.12 722.75 313.54 M 618.6 433.29 C 650.32 396.04 681.88 359.79 720.96 314.55 M 625.19 434.04 C 644.73 409.55 666.66 384.33 723.05 318.54 M 624.52 432.29 C 647.19 403.72 672.99 375.15 722.74 319.84 M 627.57 434.32 C 657.86 400.57 687.16 365.89 721.94 326.06 M 630.03 433.09 C 659.26 397.28 690.35 361.5 721.91 326.38 M 633.2 432.84 C 654.08 412.48 669.85 389.62 723.53 331.38 M 634.79 431.4 C 657.62 404.3 683.14 376.5 721.75 331.5 M 640.42 432.6 C 670.08 396.16 703.19 362.8 720.79 337.42 M 639.26 433 C 660.18 409.36 681.71 385.53 721.99 337.92 M 644.67 431.13 C 663.06 416.55 676.05 398.18 721.76 345.8 M 646.17 432.51 C 667.35 406.45 690.25 380.63 721.65 345.27 M 650.87 430.96 C 672.18 408.46 697.68 379.35 721.19 351.46 M 651.37 432.23 C 667.87 413.12 685.81 392.39 721.23 351.15 M 656.91 433.2 C 678.48 407.52 700.14 379.77 720.21 357.33 M 656 432.2 C 683.5 402.39 709.38 372 720.93 356.24 M 664.78 429.44 C 679.37 412.58 696.54 392.12 720.57 361.42 M 662.09 430.5 C 685.24 404.71 709.6 377.34 721.42 361.81 M 670.09 429.59 C 681.55 416.48 690.73 403.45 721.61 366.46 M 668.68 429.6 C 682.66 412.91 698.69 396.11 723.46 367.81 M 672.36 429.53 C 686.62 413.41 699.29 398.26 723.94 374.02 M 674.66 430.35 C 683.92 418.04 693.17 406.98 722.03 375.44 M 678.01 430.49 C 690.41 415.19 705.72 398.35 719.62 380.13 M 678.35 429.88 C 693.91 412.26 709.16 394.49 721.21 381.17 M 689.88 422.36 C 702.18 409.9 712.46 396.46 721.24 388.41 M 689.55 423.29 C 698.88 413.18 709.67 401.81 719.66 390.37" fill="none" stroke="#dae8fc" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 66.14 -1.91 M 63.91 -0.23 C 284.29 -2.34 504.3 -2.12 655.54 -0.79 M 64.59 0.28 C 290.18 -0.35 515.84 -0.78 655.22 -0.03 M 655.5 0 C 696.61 -0.51 720.8 23.3 721.28 65.76 M 655.9 -2 C 696.63 1.43 720.04 19.71 718.28 63.71 M 718.82 65.43 C 719.67 145.27 720.23 227.26 718.73 364.34 M 720.11 65.01 C 718.15 128.78 719.02 192.62 719.36 364.92 M 720 365.5 C 720.46 410.31 697.23 430.67 655.48 431.32 M 721.45 366.47 C 720.07 407.16 698.16 429.79 653.33 428.78 M 656.13 430.7 C 431.84 432.6 207.71 431.28 63.75 430.01 M 655.28 430.2 C 433.96 429.35 212.16 428.99 64.62 430.11 M 64.5 430 C 20.66 428.06 0.6 408.01 -1.2 367.16 M 66.42 431.83 C 23.4 429.8 1.52 407.57 1.08 367.53 M 0.82 365.07 C 0.24 250 -1.07 136.23 -0.48 64.74 M 0.26 366.03 C 1.02 267.95 0.26 169.83 0 64.5 M 0 64.5 C 1.47 21.62 21.15 -0.28 64.51 -0.36 M 1.98 63.02 C 0.32 21.78 21.46 -2.16 63.53 1.46" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><path d="M 66.14 -1.91 M 63.91 -0.23 C 284.29 -2.34 504.3 -2.12 655.54 -0.79 M 64.59 0.28 C 290.18 -0.35 515.84 -0.78 655.22 -0.03 M 655.5 0 C 696.61 -0.51 720.8 23.3 721.28 65.76 M 655.9 -2 C 696.63 1.43 720.04 19.71 718.28 63.71 M 718.82 65.43 C 719.67 145.27 720.23 227.26 718.73 364.34 M 720.11 65.01 C 718.15 128.78 719.02 192.62 719.36 364.92 M 720 365.5 C 720.46 410.31 697.23 430.67 655.48 431.32 M 721.45 366.47 C 720.07 407.16 698.16 429.79 653.33 428.78 M 656.13 430.7 C 431.84 432.6 207.71 431.28 63.75 430.01 M 655.28 430.2 C 433.96 429.35 212.16 428.99 64.62 430.11 M 64.5 430 C 20.66 428.06 0.6 408.01 -1.2 367.16 M 66.42 431.83 C 23.4 429.8 1.52 407.57 1.08 367.53 M 0.82 365.07 C 0.24 250 -1.07 136.23 -0.48 64.74 M 0.26 366.03 C 1.02 267.95 0.26 169.83 0 64.5 M 0 64.5 C 1.47 21.62 21.15 -0.28 64.51 -0.36 M 1.98 63.02 C 0.32 21.78 21.46 -2.16 63.53 1.46" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="70" y="230" width="260" height="150" rx="22.5" ry="22.5" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="70" y="230" width="260" height="150" rx="22.5" ry="22.5" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><rect x="35" y="30" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 40px; margin-left: 60px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; "><font style="font-size: 20px">AS1</font></div></div></div></foreignObject><text x="60" y="44" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">AS1</text></switch></g><rect x="380" y="30" width="310" height="380" rx="46.5" ry="46.5" fill="none" stroke="none" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="380" y="30" width="310" height="380" rx="46.5" ry="46.5" fill="none" stroke="none" pointer-events="all"/><path d="M 388.75 44.89 C 388.75 44.89 388.75 44.89 388.75 44.89 M 388.75 44.89 C 388.75 44.89 388.75 44.89 388.75 44.89 M 386.35 54.6 C 387.15 50.11 389.8 48.49 395.85 41.4 M 386.16 53.02 C 390.63 48.63 394.53 44.69 396.39 40.92 M 382.16 65.28 C 391.25 55.85 400.8 45.52 408.91 35.27 M 381.5 66.72 C 388.18 58.83 394.82 50.57 407.3 35.51 M 381.15 70.83 C 391.49 60.9 403.37 45.46 414 32.49 M 380.08 72.72 C 391.73 61.83 400.71 49.26 414.5 34.73 M 379.95 77.41 C 395.94 61.69 406.15 47.24 421.1 33.22 M 381.12 77.12 C 394.6 63.15 405.63 49.11 421.4 33.17 M 381.84 85.81 C 393.7 69.22 408.3 53.69 427.24 30.52 M 380.93 84.42 C 390.35 72.95 399.69 63.74 427.21 31.73 M 382.93 90.68 C 401.75 65.48 420.79 45.17 433.64 29.78 M 380.32 89.46 C 391.98 76.78 402.9 63.77 432.54 31.12 M 379.68 94.72 C 391.74 83.99 404.16 69.16 437.07 29.08 M 380.37 95.93 C 396.72 77.62 414.15 59.02 438.04 31.51 M 380.31 101.59 C 405.81 74.32 430.36 47.43 441.49 29.94 M 381.15 102.44 C 398.87 83.52 416.93 64.03 442.26 31.45 M 379.68 110.4 C 406.76 78.19 428.43 50.38 447.39 31.98 M 380.87 109.25 C 403.39 84.33 423.67 59.45 448.35 31.73 M 380.06 116.1 C 403.95 91.17 423.13 65.99 455.38 31.13 M 379.96 115.89 C 400.78 92.32 419.11 70.38 453.9 31.86 M 379.96 121.18 C 404.41 97.77 425.68 73.61 458.24 31.78 M 380.14 121.05 C 411.89 86.34 440.28 52.75 460.24 31.41 M 382.93 128.13 C 400.47 100.94 421.25 79.16 464.5 33.01 M 380.51 126.28 C 405.05 100.57 427.5 74.1 464.36 30.46 M 380.41 133.84 C 401.11 109.9 418.66 90.16 470.46 28.75 M 380.7 132.62 C 412.35 99.89 440.73 63.89 470.17 30.98 M 383.13 138.57 C 409.08 103.58 438.64 70.64 475.81 29.97 M 381.56 138.74 C 406.81 110.07 431.67 80.82 474.4 31.26 M 380.71 144.13 C 408.87 113.13 435.98 85.24 479.66 28.87 M 380.98 145.4 C 415.58 106.05 448.69 68.95 479.94 31.28 M 381 150.81 C 410.66 116.14 442.82 81.88 484.08 29.09 M 380.59 151.54 C 413.53 113.13 446.4 75.94 485.66 31.15 M 380.99 155.79 C 409.36 120.89 437.41 89.2 490.22 29.85 M 380.9 156.97 C 417.05 117.22 451.88 76.48 491.75 30.51 M 379.61 165.65 C 416.8 124.02 447.85 87.13 497.83 32.2 M 381.4 164.05 C 420.22 116.91 460.98 71.08 495.59 30.91 M 378.51 172 C 411.34 131.91 446.27 94.04 501.34 31.13 M 379.6 169.56 C 418.49 126.19 457.23 81.17 501.11 31.26 M 382.86 175.92 C 405.7 144.15 435.64 114.2 505.39 29.84 M 381.17 176.34 C 408.08 143.81 434.95 112.6 506.55 30.22 M 380.3 182.41 C 416.85 138.79 455.72 97.65 512.9 31.72 M 381 182.03 C 425.12 131.34 470.88 77.87 511.98 31.45 M 380.18 189.21 C 416.43 152.65 446.73 111.84 516.91 31.22 M 380.22 187.16 C 413.62 152.81 445.64 114.98 516.82 30.66 M 381.02 193.77 C 428.1 140.4 476.33 87.27 523.06 29.83 M 381.04 193.45 C 425.18 144.61 469.98 92.74 522.74 30.6 M 378.97 200.32 C 429.94 143.87 481.28 85.91 529.78 30.49 M 381.05 200.16 C 413.95 161.14 450.26 121.17 527.32 30.64 M 380.28 204.7 C 411.35 168.92 442.52 132.55 532.8 31.48 M 381.06 206.62 C 431.03 149.52 479.75 92.44 532.69 30.52 M 380.92 212.36 C 437.79 148.98 492.39 84.8 540.38 31.85 M 381.34 212.38 C 427.52 157.78 475.29 103.07 538.83 30.54 M 381.66 220.36 C 427.53 163.78 476.16 106.95 543.47 32.37 M 379.77 219.69 C 438.48 153.87 496.51 87.46 543.73 31.95 M 381.67 225.06 C 437.57 159.81 495.34 93.06 548.46 29.78 M 381.57 225.25 C 422.91 175.53 466.03 127.6 549.45 31.37 M 380.53 230.96 C 443.23 159.29 505.71 85.75 554.24 30.98 M 380.2 231.17 C 449.18 154.71 514.99 77.15 553.66 31.24 M 381.69 237.29 C 452.15 153.46 523.27 71.58 561.45 30.95 M 381.48 237.36 C 443.27 168.72 503.53 99.56 560.55 30.79 M 381.59 244.37 C 447.89 164.64 517.89 85.24 566.52 30.41 M 380.03 243.28 C 433.69 184.06 484.81 124.34 564.64 31.61 M 379.8 250.13 C 428.91 194.85 476.38 137.87 570.6 29.67 M 379.69 250 C 447.91 170.64 515.66 91.84 570.94 30.47 M 380.46 255.5 C 429.28 199.38 477.38 145.08 576.22 30.17 M 381.38 255.01 C 438.26 190.04 495.15 123.99 575.85 30.98 M 380.37 262.15 C 443.96 192.47 504.01 122.88 581.2 31.66 M 380.05 261.7 C 452.33 181.32 522.13 102.14 580.95 30.3 M 380.33 267.55 C 453.06 188.39 521.29 109.27 587.44 31.08 M 380.31 266.83 C 455.9 182.24 529.34 96.36 586.15 30.69 M 381.72 272.58 C 450.31 193.54 519.28 111.42 592.12 31.2 M 380.87 273.53 C 441.71 205.6 502.07 137.52 591.47 30.83 M 380.4 279.09 C 451.85 197.46 524.14 114.19 596.07 30.88 M 380.2 280.49 C 428.47 224.34 476.44 168.94 597.53 31.48 M 380.78 285.29 C 468.12 184.09 555.86 82.87 603.55 30.57 M 380.14 285.35 C 463.82 191.55 547.86 94.51 603.17 31.11 M 380.4 291.12 C 461.36 200.08 542.24 106.73 608.3 31.42 M 380.46 292.63 C 444.67 215.07 511.22 139.34 607.31 31.57 M 381.27 297.73 C 463.78 205.37 546.49 109.22 612.93 29.62 M 380.23 298.04 C 470.37 197.95 558.47 96.35 613.29 30.89 M 380.68 304.49 C 442.67 232.63 505.43 162.38 617.27 31.55 M 380.62 304.27 C 469.62 199.3 560.13 95.39 618.51 30.35 M 381.25 310.32 C 467.54 209.73 552.18 110.81 623.5 30.64 M 380.31 311.06 C 451.1 231.12 520.4 151.73 623.7 31.88 M 380.79 316.05 C 469.02 214.67 557.01 113.09 628.54 31.35 M 380.77 316.76 C 476.76 205.87 573.32 95.27 628.46 31.19 M 381.33 321.76 C 459.92 231.73 541.35 137.27 632.62 31.5 M 381.07 322.65 C 435.74 256.82 491.69 192.09 633.62 31.56 M 379.55 328.96 C 447.41 251.88 514.27 175.59 640.27 30.73 M 380.79 329.06 C 434.18 267.7 486.45 207.59 639.74 30.75 M 380.78 334.66 C 446.35 258.34 513.22 181.82 644.12 31.66 M 380.47 334.89 C 475.68 226.15 571.98 115.57 643.95 30.89 M 381.04 340.82 C 444.74 264.55 511.24 190.93 650.27 30.58 M 380.19 341.39 C 487.95 218.3 596.13 93.9 649.73 30.89 M 379.82 346.42 C 480.63 234.48 578.77 120.15 654.47 31.22 M 380.11 347.25 C 439.43 280.1 498.6 212.25 654.72 32.37 M 380.45 354.11 C 467.58 252.63 554.02 150.93 659.35 33.72 M 380.4 353.27 C 477.61 241.54 573.32 131.42 658.7 32.99 M 380.91 358.78 C 471.76 253.79 564.32 148.35 663.63 33.83 M 380.28 359.92 C 471.58 253.45 562.36 147.54 662.69 34.01 M 381.92 364.85 C 470.89 261.7 560.76 159.83 667.84 34.46 M 381.76 364.86 C 467.09 266.96 551.1 169.22 667.78 34.5 M 381.1 370.59 C 442.3 299.29 505 228.29 671.3 36.85 M 381.46 369.81 C 492.01 243.4 601.91 117.49 671.37 36.41 M 381.82 375.28 C 439.38 304.98 499.83 238.41 674.76 39.99 M 381.8 375.22 C 465.68 276.62 551.15 177.98 674.56 39.29 M 384.02 381.02 C 495.24 249.57 609.22 118.08 678.85 40.93 M 383.3 380.93 C 472.2 276.28 561.5 172.91 678.68 40.71 M 384.13 383.82 C 447.58 313.83 508.67 242.57 681.62 44.26 M 384.62 384.32 C 462.77 293.54 542.36 201.86 680.49 44.43 M 386.05 388.36 C 497.31 260.76 610.52 129.57 683.48 46.86 M 386.45 388.72 C 494.65 264.53 602.96 139.19 683.09 47.24 M 387.38 392.94 C 468.02 300.02 550.06 207.96 686.53 51.21 M 388.47 393.34 C 490.56 273.9 594.26 154.04 686.24 49.95 M 390.43 396.37 C 457.39 318.83 524.51 241.1 687.26 54.36 M 390.42 395.99 C 471.84 305 552.28 212.43 687.85 54.05 M 393.61 399.59 C 504.48 271.92 614.38 144.15 689.52 59.37 M 393.19 398.51 C 493.49 284.39 593.26 168.57 689.88 58.51 M 395.97 401.63 C 496.23 288.52 596.04 173.32 690.76 63.47 M 396.35 402.52 C 473.36 315.91 548.83 229.17 691.42 62.37 M 400.25 404.11 C 468.04 324.31 537.62 243.3 691.02 68.69 M 399.32 404.3 C 471.93 321.32 543.01 239.14 691.62 68.3 M 403.8 406.34 C 464.33 333.69 524.87 263.51 691.56 73.56 M 403.66 405.86 C 463.12 338.83 523.73 268.83 692.21 74.42 M 408.15 407.03 C 468.44 335.6 529.94 264.17 692.86 78 M 408.07 407.31 C 507.4 292.19 608.58 175.9 693.31 78.66 M 411.1 409.32 C 507.09 299.84 601.47 191.11 693.09 85.74 M 412.03 408.18 C 510.71 296.77 608.05 185.17 692.95 85.31 M 415.33 410.44 C 527.87 281.44 637.42 153.32 694.05 91.64 M 416.39 409.5 C 512.31 300.3 606.58 191.84 693.73 91.15 M 421.6 408.89 C 496.61 321.06 573.68 233.39 692.21 98.33 M 421.37 409.34 C 511.28 306.54 602.62 202.8 693.02 96.84 M 427.05 409.16 C 511.56 313.82 595.26 217.31 691.96 102.94 M 426.13 410.59 C 527.06 292.28 628.14 175.39 692.5 103.99 M 431.35 409.21 C 485.38 349.19 537.89 287.3 693.37 110.43 M 431.5 410.06 C 527.55 299.58 623.38 190.11 693.64 108.83 M 436.41 410.69 C 495.13 341.54 552.75 276.08 693.75 114.83 M 437.39 410.06 C 493.35 344.73 551.07 279.73 692.28 115.23 M 443.57 410.36 C 530.5 308.94 617.11 209.46 692.58 121.06 M 442.74 409.64 C 513.25 328.59 583.93 246.98 692.98 121.9 M 448.53 410.91 C 503.83 345.8 560.84 279.35 692.84 127.13 M 447.89 409.54 C 524.93 321.16 601.57 232.6 692.37 127.81 M 452.25 409.91 C 535.96 314.01 618.24 218.63 691.81 135.28 M 452.2 410.21 C 515.64 339.01 578.49 267.12 692.51 134.36 M 457.43 409.52 C 543.47 311.29 628.98 212.58 692.82 141.06 M 458.79 410.64 C 527.24 332.58 594.47 254.07 692.99 140.1 M 463.28 410.25 C 532.21 330.04 603.52 249.3 694.02 145.42 M 462.7 410.17 C 538.08 326.46 612.12 241.54 693.35 145.62 M 467.86 410.68 C 536.1 333.66 603.84 256.72 693.87 151.96 M 468.73 409.85 C 530.47 340.09 592.53 269.21 691.94 152.51 M 475.16 409.73 C 548.25 326.31 619.85 242.1 692.22 159.03 M 473.58 410.47 C 521.32 358.01 568.35 303.98 692.5 158.16 M 479.71 408.69 C 530.3 349.71 579.23 293.49 693.25 165.65 M 479.46 410.6 C 558.5 317.6 640.17 225.02 693.15 164.08 M 484.61 410.99 C 527.47 361.02 571.26 310.01 694.32 169.07 M 485.07 410.87 C 554.57 330.68 624.32 251.49 692.75 169.68 M 491.26 410.37 C 536.64 356.24 580.92 303.59 693.32 175.39 M 490.05 409.61 C 530.7 361.66 572.47 313.24 692.77 176.52 M 495.72 409.59 C 557.61 336.55 622.59 264.62 691.19 183.25 M 495.51 409.93 C 538.17 358.44 581.44 308.92 692.93 183.29 M 500.31 409.21 C 548.26 358.4 591.85 306.62 692.23 190.2 M 500.07 409.73 C 568.7 331.83 635.8 255.75 693.38 188.98 M 504.72 409.25 C 563.17 342.22 622.49 276.47 693.88 195.01 M 506.29 410.07 C 550.81 358.07 594.37 306.4 692.13 195.56 M 511.92 409.12 C 565.04 348.42 616.94 287.24 693.08 200.16 M 511.98 409.5 C 561.85 350.35 612.13 291.7 692.77 200.74 M 515.73 409.35 C 559.32 363.01 600.19 314.96 693.91 206.11 M 516.91 409.67 C 568.85 348.29 624.14 285.34 692.52 207.33 M 522.12 408.72 C 582.68 345.37 638.38 276.91 692.98 213.62 M 521.33 409.6 C 568.72 357.13 615.77 303.17 692.89 212.89 M 527.61 408.95 C 562.23 368.13 601.32 323.05 693.5 219.96 M 527.13 409.65 C 587.73 338.58 650.97 267.09 692.37 218.59 M 531.16 408.74 C 591.26 344.96 649.89 278.17 693.01 225.94 M 532.81 409.01 C 576.82 355.66 623.52 302.27 692.5 226.27 M 538.04 411.75 C 597.92 342.13 656.82 272.24 691.67 230.93 M 537.81 409.68 C 587.84 352.54 638.92 293.67 693.77 231.77 M 541.91 411.32 C 585.11 362.39 626.19 311.83 692.88 237.46 M 543.3 409.83 C 584.53 362.55 624.63 317.33 693.49 236.95 M 548.49 411.33 C 595.12 354.2 642.53 301.52 691.67 242.68 M 548.48 410.6 C 590.94 360.93 634.85 310.42 693.1 243.35 M 554.16 411.88 C 587.86 367.68 626.07 326.42 691.98 249.28 M 552.97 410.19 C 588.99 370.9 623.53 329.52 692.88 250.52 M 559.58 409.08 C 593.32 374.58 623.91 337.13 691.86 257.67 M 558.07 410.12 C 607.68 356.79 655.1 301.31 692.69 256.71 M 565.51 412.17 C 615.63 350.91 665.19 290.42 694 262.39 M 564.32 411.35 C 598.89 369.86 632.63 330.29 693.09 261.88 M 568.98 410.04 C 616.42 353.03 665.61 297.67 693.66 268.9 M 569.36 410.7 C 593.71 380.87 618.58 351.07 692.88 268.89 M 575.07 411.49 C 602.29 382.4 626.32 353.56 693.59 276.43 M 575.03 409.62 C 599.52 381.25 625.2 351.6 691.8 273.77 M 580.71 410.12 C 609.23 375.34 638.36 343.08 691.24 279.46 M 579.17 409.52 C 611.1 373.25 645.59 334.89 693.76 280.08 M 586.33 410.5 C 626.29 365.62 663.76 320.15 691.55 288.31 M 585.36 410.17 C 609.52 383.16 632.48 356.37 692.86 286.65 M 591.88 408.28 C 627.52 366.58 663.91 323.14 692.28 292.1 M 590.27 409.12 C 622.71 373.46 652.9 337.88 693.18 292.74 M 596.45 408.41 C 632.94 366.14 667.69 324.64 693.65 298.94 M 595.49 410.09 C 619.68 380.62 644.81 352.04 693.53 299.48 M 602.29 409.32 C 622.56 382.11 646.45 356.72 691.69 306.85 M 600.88 410.4 C 624.73 381.72 649.32 354.62 693.2 304.94 M 606.38 409.13 C 631 383.78 654.3 354.94 691.1 312.22 M 606.43 409.37 C 632.15 379.23 659.97 348.62 692.07 309.88 M 612.5 409.77 C 639.5 380.27 667.2 344.64 692.11 316.22 M 611.58 409.69 C 629.69 387.95 649.2 365.75 693.71 316.36 M 618.82 411.28 C 642.36 382.3 668.07 353.36 693.23 322.52 M 617.08 409.88 C 637.5 387.42 656.83 365.49 693.45 322.63 M 621.9 411.87 C 639.71 389.46 655.12 369.63 694.04 327.69 M 622.32 409.67 C 639.03 391.85 654.74 373.9 693.48 329.82 M 628.29 410.21 C 650.38 384.07 672.64 353.28 692.11 333.68 M 627.18 410.4 C 649.57 383.24 673.41 359.01 692.98 335.6 M 634.61 409.56 C 648.61 392.38 660.01 379.24 692.37 342.7 M 633.38 410.43 C 650.01 391.56 664.89 372.83 693.8 341.3 M 639.08 411.99 C 650.34 398.7 660.06 385.46 692.65 349.48 M 638.33 409.57 C 656.45 389.81 675.13 367.38 693.33 347.35 M 645.57 410.54 C 664.09 388.1 680.15 364.81 693.14 352.16 M 644.44 410.44 C 660.48 390.64 676.73 370.93 692.17 354.42 M 647.89 410.66 C 659.03 395.5 672.95 382.79 693.18 360.71 M 649.65 410.19 C 665.31 391.02 682.62 373.3 692.23 359.06 M 655.14 409.44 C 667.17 397.38 676.81 387.03 691.51 370.46 M 656.16 408.83 C 664.49 397.91 674.43 385.85 689.28 369.42 M 659.27 409.23 C 669.61 398.8 677.22 387.6 689.55 377.89 M 660.16 409.21 C 666.48 401.89 673.44 393.33 687.48 378.33 M 667.11 405.86 C 672.52 400 676.62 395.75 684.38 386.45 M 669.23 406.34 C 673.76 402.21 676.07 396.25 686.67 385.21" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><path d="M 388.75 44.89 C 388.75 44.89 388.75 44.89 388.75 44.89 M 388.75 44.89 C 388.75 44.89 388.75 44.89 388.75 44.89 M 386.35 54.6 C 387.15 50.11 389.8 48.49 395.85 41.4 M 386.16 53.02 C 390.63 48.63 394.53 44.69 396.39 40.92 M 382.16 65.28 C 391.25 55.85 400.8 45.52 408.91 35.27 M 381.5 66.72 C 388.18 58.83 394.82 50.57 407.3 35.51 M 381.15 70.83 C 391.49 60.9 403.37 45.46 414 32.49 M 380.08 72.72 C 391.73 61.83 400.71 49.26 414.5 34.73 M 379.95 77.41 C 395.94 61.69 406.15 47.24 421.1 33.22 M 381.12 77.12 C 394.6 63.15 405.63 49.11 421.4 33.17 M 381.84 85.81 C 393.7 69.22 408.3 53.69 427.24 30.52 M 380.93 84.42 C 390.35 72.95 399.69 63.74 427.21 31.73 M 382.93 90.68 C 401.75 65.48 420.79 45.17 433.64 29.78 M 380.32 89.46 C 391.98 76.78 402.9 63.77 432.54 31.12 M 379.68 94.72 C 391.74 83.99 404.16 69.16 437.07 29.08 M 380.37 95.93 C 396.72 77.62 414.15 59.02 438.04 31.51 M 380.31 101.59 C 405.81 74.32 430.36 47.43 441.49 29.94 M 381.15 102.44 C 398.87 83.52 416.93 64.03 442.26 31.45 M 379.68 110.4 C 406.76 78.19 428.43 50.38 447.39 31.98 M 380.87 109.25 C 403.39 84.33 423.67 59.45 448.35 31.73 M 380.06 116.1 C 403.95 91.17 423.13 65.99 455.38 31.13 M 379.96 115.89 C 400.78 92.32 419.11 70.38 453.9 31.86 M 379.96 121.18 C 404.41 97.77 425.68 73.61 458.24 31.78 M 380.14 121.05 C 411.89 86.34 440.28 52.75 460.24 31.41 M 382.93 128.13 C 400.47 100.94 421.25 79.16 464.5 33.01 M 380.51 126.28 C 405.05 100.57 427.5 74.1 464.36 30.46 M 380.41 133.84 C 401.11 109.9 418.66 90.16 470.46 28.75 M 380.7 132.62 C 412.35 99.89 440.73 63.89 470.17 30.98 M 383.13 138.57 C 409.08 103.58 438.64 70.64 475.81 29.97 M 381.56 138.74 C 406.81 110.07 431.67 80.82 474.4 31.26 M 380.71 144.13 C 408.87 113.13 435.98 85.24 479.66 28.87 M 380.98 145.4 C 415.58 106.05 448.69 68.95 479.94 31.28 M 381 150.81 C 410.66 116.14 442.82 81.88 484.08 29.09 M 380.59 151.54 C 413.53 113.13 446.4 75.94 485.66 31.15 M 380.99 155.79 C 409.36 120.89 437.41 89.2 490.22 29.85 M 380.9 156.97 C 417.05 117.22 451.88 76.48 491.75 30.51 M 379.61 165.65 C 416.8 124.02 447.85 87.13 497.83 32.2 M 381.4 164.05 C 420.22 116.91 460.98 71.08 495.59 30.91 M 378.51 172 C 411.34 131.91 446.27 94.04 501.34 31.13 M 379.6 169.56 C 418.49 126.19 457.23 81.17 501.11 31.26 M 382.86 175.92 C 405.7 144.15 435.64 114.2 505.39 29.84 M 381.17 176.34 C 408.08 143.81 434.95 112.6 506.55 30.22 M 380.3 182.41 C 416.85 138.79 455.72 97.65 512.9 31.72 M 381 182.03 C 425.12 131.34 470.88 77.87 511.98 31.45 M 380.18 189.21 C 416.43 152.65 446.73 111.84 516.91 31.22 M 380.22 187.16 C 413.62 152.81 445.64 114.98 516.82 30.66 M 381.02 193.77 C 428.1 140.4 476.33 87.27 523.06 29.83 M 381.04 193.45 C 425.18 144.61 469.98 92.74 522.74 30.6 M 378.97 200.32 C 429.94 143.87 481.28 85.91 529.78 30.49 M 381.05 200.16 C 413.95 161.14 450.26 121.17 527.32 30.64 M 380.28 204.7 C 411.35 168.92 442.52 132.55 532.8 31.48 M 381.06 206.62 C 431.03 149.52 479.75 92.44 532.69 30.52 M 380.92 212.36 C 437.79 148.98 492.39 84.8 540.38 31.85 M 381.34 212.38 C 427.52 157.78 475.29 103.07 538.83 30.54 M 381.66 220.36 C 427.53 163.78 476.16 106.95 543.47 32.37 M 379.77 219.69 C 438.48 153.87 496.51 87.46 543.73 31.95 M 381.67 225.06 C 437.57 159.81 495.34 93.06 548.46 29.78 M 381.57 225.25 C 422.91 175.53 466.03 127.6 549.45 31.37 M 380.53 230.96 C 443.23 159.29 505.71 85.75 554.24 30.98 M 380.2 231.17 C 449.18 154.71 514.99 77.15 553.66 31.24 M 381.69 237.29 C 452.15 153.46 523.27 71.58 561.45 30.95 M 381.48 237.36 C 443.27 168.72 503.53 99.56 560.55 30.79 M 381.59 244.37 C 447.89 164.64 517.89 85.24 566.52 30.41 M 380.03 243.28 C 433.69 184.06 484.81 124.34 564.64 31.61 M 379.8 250.13 C 428.91 194.85 476.38 137.87 570.6 29.67 M 379.69 250 C 447.91 170.64 515.66 91.84 570.94 30.47 M 380.46 255.5 C 429.28 199.38 477.38 145.08 576.22 30.17 M 381.38 255.01 C 438.26 190.04 495.15 123.99 575.85 30.98 M 380.37 262.15 C 443.96 192.47 504.01 122.88 581.2 31.66 M 380.05 261.7 C 452.33 181.32 522.13 102.14 580.95 30.3 M 380.33 267.55 C 453.06 188.39 521.29 109.27 587.44 31.08 M 380.31 266.83 C 455.9 182.24 529.34 96.36 586.15 30.69 M 381.72 272.58 C 450.31 193.54 519.28 111.42 592.12 31.2 M 380.87 273.53 C 441.71 205.6 502.07 137.52 591.47 30.83 M 380.4 279.09 C 451.85 197.46 524.14 114.19 596.07 30.88 M 380.2 280.49 C 428.47 224.34 476.44 168.94 597.53 31.48 M 380.78 285.29 C 468.12 184.09 555.86 82.87 603.55 30.57 M 380.14 285.35 C 463.82 191.55 547.86 94.51 603.17 31.11 M 380.4 291.12 C 461.36 200.08 542.24 106.73 608.3 31.42 M 380.46 292.63 C 444.67 215.07 511.22 139.34 607.31 31.57 M 381.27 297.73 C 463.78 205.37 546.49 109.22 612.93 29.62 M 380.23 298.04 C 470.37 197.95 558.47 96.35 613.29 30.89 M 380.68 304.49 C 442.67 232.63 505.43 162.38 617.27 31.55 M 380.62 304.27 C 469.62 199.3 560.13 95.39 618.51 30.35 M 381.25 310.32 C 467.54 209.73 552.18 110.81 623.5 30.64 M 380.31 311.06 C 451.1 231.12 520.4 151.73 623.7 31.88 M 380.79 316.05 C 469.02 214.67 557.01 113.09 628.54 31.35 M 380.77 316.76 C 476.76 205.87 573.32 95.27 628.46 31.19 M 381.33 321.76 C 459.92 231.73 541.35 137.27 632.62 31.5 M 381.07 322.65 C 435.74 256.82 491.69 192.09 633.62 31.56 M 379.55 328.96 C 447.41 251.88 514.27 175.59 640.27 30.73 M 380.79 329.06 C 434.18 267.7 486.45 207.59 639.74 30.75 M 380.78 334.66 C 446.35 258.34 513.22 181.82 644.12 31.66 M 380.47 334.89 C 475.68 226.15 571.98 115.57 643.95 30.89 M 381.04 340.82 C 444.74 264.55 511.24 190.93 650.27 30.58 M 380.19 341.39 C 487.95 218.3 596.13 93.9 649.73 30.89 M 379.82 346.42 C 480.63 234.48 578.77 120.15 654.47 31.22 M 380.11 347.25 C 439.43 280.1 498.6 212.25 654.72 32.37 M 380.45 354.11 C 467.58 252.63 554.02 150.93 659.35 33.72 M 380.4 353.27 C 477.61 241.54 573.32 131.42 658.7 32.99 M 380.91 358.78 C 471.76 253.79 564.32 148.35 663.63 33.83 M 380.28 359.92 C 471.58 253.45 562.36 147.54 662.69 34.01 M 381.92 364.85 C 470.89 261.7 560.76 159.83 667.84 34.46 M 381.76 364.86 C 467.09 266.96 551.1 169.22 667.78 34.5 M 381.1 370.59 C 442.3 299.29 505 228.29 671.3 36.85 M 381.46 369.81 C 492.01 243.4 601.91 117.49 671.37 36.41 M 381.82 375.28 C 439.38 304.98 499.83 238.41 674.76 39.99 M 381.8 375.22 C 465.68 276.62 551.15 177.98 674.56 39.29 M 384.02 381.02 C 495.24 249.57 609.22 118.08 678.85 40.93 M 383.3 380.93 C 472.2 276.28 561.5 172.91 678.68 40.71 M 384.13 383.82 C 447.58 313.83 508.67 242.57 681.62 44.26 M 384.62 384.32 C 462.77 293.54 542.36 201.86 680.49 44.43 M 386.05 388.36 C 497.31 260.76 610.52 129.57 683.48 46.86 M 386.45 388.72 C 494.65 264.53 602.96 139.19 683.09 47.24 M 387.38 392.94 C 468.02 300.02 550.06 207.96 686.53 51.21 M 388.47 393.34 C 490.56 273.9 594.26 154.04 686.24 49.95 M 390.43 396.37 C 457.39 318.83 524.51 241.1 687.26 54.36 M 390.42 395.99 C 471.84 305 552.28 212.43 687.85 54.05 M 393.61 399.59 C 504.48 271.92 614.38 144.15 689.52 59.37 M 393.19 398.51 C 493.49 284.39 593.26 168.57 689.88 58.51 M 395.97 401.63 C 496.23 288.52 596.04 173.32 690.76 63.47 M 396.35 402.52 C 473.36 315.91 548.83 229.17 691.42 62.37 M 400.25 404.11 C 468.04 324.31 537.62 243.3 691.02 68.69 M 399.32 404.3 C 471.93 321.32 543.01 239.14 691.62 68.3 M 403.8 406.34 C 464.33 333.69 524.87 263.51 691.56 73.56 M 403.66 405.86 C 463.12 338.83 523.73 268.83 692.21 74.42 M 408.15 407.03 C 468.44 335.6 529.94 264.17 692.86 78 M 408.07 407.31 C 507.4 292.19 608.58 175.9 693.31 78.66 M 411.1 409.32 C 507.09 299.84 601.47 191.11 693.09 85.74 M 412.03 408.18 C 510.71 296.77 608.05 185.17 692.95 85.31 M 415.33 410.44 C 527.87 281.44 637.42 153.32 694.05 91.64 M 416.39 409.5 C 512.31 300.3 606.58 191.84 693.73 91.15 M 421.6 408.89 C 496.61 321.06 573.68 233.39 692.21 98.33 M 421.37 409.34 C 511.28 306.54 602.62 202.8 693.02 96.84 M 427.05 409.16 C 511.56 313.82 595.26 217.31 691.96 102.94 M 426.13 410.59 C 527.06 292.28 628.14 175.39 692.5 103.99 M 431.35 409.21 C 485.38 349.19 537.89 287.3 693.37 110.43 M 431.5 410.06 C 527.55 299.58 623.38 190.11 693.64 108.83 M 436.41 410.69 C 495.13 341.54 552.75 276.08 693.75 114.83 M 437.39 410.06 C 493.35 344.73 551.07 279.73 692.28 115.23 M 443.57 410.36 C 530.5 308.94 617.11 209.46 692.58 121.06 M 442.74 409.64 C 513.25 328.59 583.93 246.98 692.98 121.9 M 448.53 410.91 C 503.83 345.8 560.84 279.35 692.84 127.13 M 447.89 409.54 C 524.93 321.16 601.57 232.6 692.37 127.81 M 452.25 409.91 C 535.96 314.01 618.24 218.63 691.81 135.28 M 452.2 410.21 C 515.64 339.01 578.49 267.12 692.51 134.36 M 457.43 409.52 C 543.47 311.29 628.98 212.58 692.82 141.06 M 458.79 410.64 C 527.24 332.58 594.47 254.07 692.99 140.1 M 463.28 410.25 C 532.21 330.04 603.52 249.3 694.02 145.42 M 462.7 410.17 C 538.08 326.46 612.12 241.54 693.35 145.62 M 467.86 410.68 C 536.1 333.66 603.84 256.72 693.87 151.96 M 468.73 409.85 C 530.47 340.09 592.53 269.21 691.94 152.51 M 475.16 409.73 C 548.25 326.31 619.85 242.1 692.22 159.03 M 473.58 410.47 C 521.32 358.01 568.35 303.98 692.5 158.16 M 479.71 408.69 C 530.3 349.71 579.23 293.49 693.25 165.65 M 479.46 410.6 C 558.5 317.6 640.17 225.02 693.15 164.08 M 484.61 410.99 C 527.47 361.02 571.26 310.01 694.32 169.07 M 485.07 410.87 C 554.57 330.68 624.32 251.49 692.75 169.68 M 491.26 410.37 C 536.64 356.24 580.92 303.59 693.32 175.39 M 490.05 409.61 C 530.7 361.66 572.47 313.24 692.77 176.52 M 495.72 409.59 C 557.61 336.55 622.59 264.62 691.19 183.25 M 495.51 409.93 C 538.17 358.44 581.44 308.92 692.93 183.29 M 500.31 409.21 C 548.26 358.4 591.85 306.62 692.23 190.2 M 500.07 409.73 C 568.7 331.83 635.8 255.75 693.38 188.98 M 504.72 409.25 C 563.17 342.22 622.49 276.47 693.88 195.01 M 506.29 410.07 C 550.81 358.07 594.37 306.4 692.13 195.56 M 511.92 409.12 C 565.04 348.42 616.94 287.24 693.08 200.16 M 511.98 409.5 C 561.85 350.35 612.13 291.7 692.77 200.74 M 515.73 409.35 C 559.32 363.01 600.19 314.96 693.91 206.11 M 516.91 409.67 C 568.85 348.29 624.14 285.34 692.52 207.33 M 522.12 408.72 C 582.68 345.37 638.38 276.91 692.98 213.62 M 521.33 409.6 C 568.72 357.13 615.77 303.17 692.89 212.89 M 527.61 408.95 C 562.23 368.13 601.32 323.05 693.5 219.96 M 527.13 409.65 C 587.73 338.58 650.97 267.09 692.37 218.59 M 531.16 408.74 C 591.26 344.96 649.89 278.17 693.01 225.94 M 532.81 409.01 C 576.82 355.66 623.52 302.27 692.5 226.27 M 538.04 411.75 C 597.92 342.13 656.82 272.24 691.67 230.93 M 537.81 409.68 C 587.84 352.54 638.92 293.67 693.77 231.77 M 541.91 411.32 C 585.11 362.39 626.19 311.83 692.88 237.46 M 543.3 409.83 C 584.53 362.55 624.63 317.33 693.49 236.95 M 548.49 411.33 C 595.12 354.2 642.53 301.52 691.67 242.68 M 548.48 410.6 C 590.94 360.93 634.85 310.42 693.1 243.35 M 554.16 411.88 C 587.86 367.68 626.07 326.42 691.98 249.28 M 552.97 410.19 C 588.99 370.9 623.53 329.52 692.88 250.52 M 559.58 409.08 C 593.32 374.58 623.91 337.13 691.86 257.67 M 558.07 410.12 C 607.68 356.79 655.1 301.31 692.69 256.71 M 565.51 412.17 C 615.63 350.91 665.19 290.42 694 262.39 M 564.32 411.35 C 598.89 369.86 632.63 330.29 693.09 261.88 M 568.98 410.04 C 616.42 353.03 665.61 297.67 693.66 268.9 M 569.36 410.7 C 593.71 380.87 618.58 351.07 692.88 268.89 M 575.07 411.49 C 602.29 382.4 626.32 353.56 693.59 276.43 M 575.03 409.62 C 599.52 381.25 625.2 351.6 691.8 273.77 M 580.71 410.12 C 609.23 375.34 638.36 343.08 691.24 279.46 M 579.17 409.52 C 611.1 373.25 645.59 334.89 693.76 280.08 M 586.33 410.5 C 626.29 365.62 663.76 320.15 691.55 288.31 M 585.36 410.17 C 609.52 383.16 632.48 356.37 692.86 286.65 M 591.88 408.28 C 627.52 366.58 663.91 323.14 692.28 292.1 M 590.27 409.12 C 622.71 373.46 652.9 337.88 693.18 292.74 M 596.45 408.41 C 632.94 366.14 667.69 324.64 693.65 298.94 M 595.49 410.09 C 619.68 380.62 644.81 352.04 693.53 299.48 M 602.29 409.32 C 622.56 382.11 646.45 356.72 691.69 306.85 M 600.88 410.4 C 624.73 381.72 649.32 354.62 693.2 304.94 M 606.38 409.13 C 631 383.78 654.3 354.94 691.1 312.22 M 606.43 409.37 C 632.15 379.23 659.97 348.62 692.07 309.88 M 612.5 409.77 C 639.5 380.27 667.2 344.64 692.11 316.22 M 611.58 409.69 C 629.69 387.95 649.2 365.75 693.71 316.36 M 618.82 411.28 C 642.36 382.3 668.07 353.36 693.23 322.52 M 617.08 409.88 C 637.5 387.42 656.83 365.49 693.45 322.63 M 621.9 411.87 C 639.71 389.46 655.12 369.63 694.04 327.69 M 622.32 409.67 C 639.03 391.85 654.74 373.9 693.48 329.82 M 628.29 410.21 C 650.38 384.07 672.64 353.28 692.11 333.68 M 627.18 410.4 C 649.57 383.24 673.41 359.01 692.98 335.6 M 634.61 409.56 C 648.61 392.38 660.01 379.24 692.37 342.7 M 633.38 410.43 C 650.01 391.56 664.89 372.83 693.8 341.3 M 639.08 411.99 C 650.34 398.7 660.06 385.46 692.65 349.48 M 638.33 409.57 C 656.45 389.81 675.13 367.38 693.33 347.35 M 645.57 410.54 C 664.09 388.1 680.15 364.81 693.14 352.16 M 644.44 410.44 C 660.48 390.64 676.73 370.93 692.17 354.42 M 647.89 410.66 C 659.03 395.5 672.95 382.79 693.18 360.71 M 649.65 410.19 C 665.31 391.02 682.62 373.3 692.23 359.06 M 655.14 409.44 C 667.17 397.38 676.81 387.03 691.51 370.46 M 656.16 408.83 C 664.49 397.91 674.43 385.85 689.28 369.42 M 659.27 409.23 C 669.61 398.8 677.22 387.6 689.55 377.89 M 660.16 409.21 C 666.48 401.89 673.44 393.33 687.48 378.33 M 667.11 405.86 C 672.52 400 676.62 395.75 684.38 386.45 M 669.23 406.34 C 673.76 402.21 676.07 396.25 686.67 385.21" fill="none" stroke="#d5e8d4" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 427.21 30.48 M 425.87 29.83 C 503.42 29.62 580.16 29.68 642.07 31.05 M 426.24 29.67 C 505.63 28.05 582.58 28.66 644.05 30.52 M 643.5 30 C 674.49 30.1 688.1 46.91 688.23 77.56 M 643.93 30.73 C 672.61 27.91 689.33 45.43 690.89 78.66 M 690.26 76.48 C 689.27 174.21 690.66 270.88 688.87 362.06 M 689.48 75.89 C 689.88 157.63 689.7 237.51 689.87 363.56 M 690 363.5 C 690.83 395.77 675.16 409.68 642.82 411.63 M 691.78 365.48 C 689.17 394.38 676.65 411.47 642.51 411.42 M 643.59 409.2 C 585.24 409.84 529.45 409.21 425.87 410.21 M 644.24 410.59 C 560.04 411.61 477.42 412.48 426.68 409.4 M 426.5 410 C 397.17 411.8 381.22 395.4 378.64 363.15 M 428.01 411.22 C 395.13 408.87 381.14 394.38 381.11 362.13 M 381.5 363.5 C 379.56 291.16 378.37 218.11 380.29 77.23 M 379.78 363.37 C 379.52 264.72 379.33 166.89 380.11 76.27 M 380 76.5 C 381.76 47.02 394.46 28.69 426.41 30.7 M 379.33 77.82 C 381.96 44.88 396.56 29.4 425.28 27.99" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><path d="M 427.21 30.48 M 425.87 29.83 C 503.42 29.62 580.16 29.68 642.07 31.05 M 426.24 29.67 C 505.63 28.05 582.58 28.66 644.05 30.52 M 643.5 30 C 674.49 30.1 688.1 46.91 688.23 77.56 M 643.93 30.73 C 672.61 27.91 689.33 45.43 690.89 78.66 M 690.26 76.48 C 689.27 174.21 690.66 270.88 688.87 362.06 M 689.48 75.89 C 689.88 157.63 689.7 237.51 689.87 363.56 M 690 363.5 C 690.83 395.77 675.16 409.68 642.82 411.63 M 691.78 365.48 C 689.17 394.38 676.65 411.47 642.51 411.42 M 643.59 409.2 C 585.24 409.84 529.45 409.21 425.87 410.21 M 644.24 410.59 C 560.04 411.61 477.42 412.48 426.68 409.4 M 426.5 410 C 397.17 411.8 381.22 395.4 378.64 363.15 M 428.01 411.22 C 395.13 408.87 381.14 394.38 381.11 362.13 M 381.5 363.5 C 379.56 291.16 378.37 218.11 380.29 77.23 M 379.78 363.37 C 379.52 264.72 379.33 166.89 380.11 76.27 M 380 76.5 C 381.76 47.02 394.46 28.69 426.41 30.7 M 379.33 77.82 C 381.96 44.88 396.56 29.4 425.28 27.99" fill="none" stroke="#82b366" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="410" y="174" width="250" height="120" rx="18" ry="18" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="410" y="174" width="250" height="120" rx="18" ry="18" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><rect x="405" y="50" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 60px; margin-left: 430px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; "><font style="font-size: 20px">AS5</font></div></div></div></foreignObject><text x="430" y="64" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">AS5</text></switch></g><rect x="85" y="240" width="50" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 250px; margin-left: 110px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; "><font style="font-size: 20px">AS2</font></div></div></div></foreignObject><text x="110" y="254" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">AS2</text></switch></g><path d="M 423.23 234.51 L 477.83 235.32 L 478.74 264.35 L 422.44 265.14" fill="#ffffff" stroke="none" pointer-events="all"/><path d="M 423.48 234.29 C 441.49 234.55 458.05 234.04 479.56 233.72 M 422.45 233.43 C 436.23 232.99 448.67 234.62 478.44 234.44 M 476.35 234.57 C 478.07 244.77 478.52 252.75 478.87 264.7 M 477.18 233.16 C 478.27 243.61 478.08 254.25 478.01 264.53 M 479.68 263.11 C 457.43 264.98 433.5 265.38 423.26 262.53 M 478.13 263.57 C 457.71 263.02 439.94 262.63 422.62 264.68 M 424.51 264.29 C 424.41 255.43 422.13 247.03 421.96 235.62 M 423.65 264.28 C 422.29 257.51 422.1 249.81 423.08 234.49" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 53px; height: 1px; padding-top: 249px; margin-left: 424px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 18px">gw2</font></div></div></div></foreignObject><text x="451" y="253" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">gw2</text></switch></g><rect x="570" y="184" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 194px; margin-left: 605px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; "><font style="font-size: 20px">AS5-4</font></div></div></div></foreignObject><text x="605" y="198" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">AS5-4</text></switch></g><ellipse cx="285" cy="275" rx="25" ry="25" fill="transparent" stroke="none" pointer-events="all"/><path d="M 261.61 264.29 C 261.61 264.29 261.61 264.29 261.61 264.29 M 261.61 264.29 C 261.61 264.29 261.61 264.29 261.61 264.29 M 260.37 271.71 C 265.45 269.34 267.99 265.15 274.47 256.76 M 261.99 270.79 C 265.25 266.11 270.67 258.68 274.71 255.49 M 260.68 278.11 C 264.26 270.03 269.93 266.79 280.27 252.52 M 261.7 278.03 C 266.65 270.95 271.53 265.17 280.46 254.07 M 261.44 282.03 C 267.73 275.14 275.77 267.1 287.21 254.23 M 261.1 282.84 C 271.49 271.69 281.09 260.26 286.59 255.04 M 263.63 287.76 C 269.2 278.55 277.86 270.48 292.15 252.68 M 263.61 285.32 C 274.13 274.03 284.33 263.72 291.99 252.01 M 264.84 287.74 C 277.66 275.99 290.53 262.6 297.71 253.8 M 266.79 289.76 C 275.77 278.2 283.63 267.83 295.11 255.56 M 267.66 293.25 C 281.4 279.64 290.92 265.1 298.64 258.59 M 269.01 291.15 C 278.22 283.21 285.9 274.04 298.56 258.9 M 269.64 297.18 C 283.29 281.55 297.26 266.72 302.46 259.91 M 271.58 295.69 C 282.15 283.05 295.01 270.08 302 260.49 M 275.61 296.76 C 284.07 288.08 292.83 276.56 304.58 263.25 M 275.47 297.24 C 287.05 283.86 296.05 271.26 305.55 262.46 M 279.74 296.86 C 290.95 285.83 297.03 276.82 305.5 265.21 M 279.44 298.39 C 288.4 289.23 294.22 280.98 307.18 266.91 M 287.19 299.19 C 289.61 290.79 293.85 286.95 310.55 269.48 M 286.08 297.4 C 294.15 287.53 303.49 277.95 308.75 271.6 M 288.04 301.09 C 297.91 292.07 302.95 281.65 309.14 276.12 M 289.93 298.75 C 294.46 292.85 301.06 286.49 311.47 275 M 299.03 296.72 C 299.97 290.06 307.55 284.31 311.25 276.79 M 297.48 296.08 C 301.43 291 305.93 286.04 312.67 279.29" fill="none" stroke="#f8cecc" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 273.74 253.44 C 278.19 251.24 286.02 250.64 291.29 252.08 C 296.57 253.52 302.07 257.92 305.36 262.07 C 308.65 266.23 311.43 271.95 311.03 277.03 C 310.62 282.11 306.77 289.07 302.94 292.57 C 299.11 296.07 293.57 297.8 288.05 298.04 C 282.54 298.28 274.42 296.66 269.85 294 C 265.29 291.33 262.01 287.02 260.66 282.05 C 259.31 277.07 259.21 268.89 261.74 264.14 C 264.27 259.38 273.57 255.42 275.84 253.52 C 278.11 251.61 275.31 252.47 275.35 252.71 M 283.33 250.73 C 288.49 249.93 294.56 251.84 299.11 254.73 C 303.65 257.63 308.96 263.13 310.59 268.09 C 312.22 273.04 311.16 279.89 308.88 284.46 C 306.6 289.04 302.15 293.42 296.9 295.53 C 291.65 297.65 282.59 298.32 277.37 297.16 C 272.14 296.01 268.63 292.72 265.56 288.58 C 262.48 284.43 258.62 277.44 258.91 272.29 C 259.19 267.13 263.37 261.19 267.28 257.66 C 271.19 254.14 279.58 252.11 282.39 251.11 C 285.19 250.12 284.01 251.42 284.13 251.68" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 275px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div><font style="font-size: 18px">Host1</font></div></div></div></div></foreignObject><text x="285" y="279" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Host1</text></switch></g><path d="M 560 249 L 478 249" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 249px; margin-left: 519px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 18px">Link2</font></div></div></div></foreignObject><text x="519" y="252" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Link2</text></switch></g><ellipse cx="585" cy="249" rx="25" ry="25" fill="transparent" stroke="none" pointer-events="all"/><path d="M 561.97 239.19 C 561.97 239.19 561.97 239.19 561.97 239.19 M 561.97 239.19 C 561.97 239.19 561.97 239.19 561.97 239.19 M 561.43 244.07 C 568.11 240.66 572.55 235.56 577.57 229.19 M 561.82 245.45 C 566.32 239.74 571.78 234.09 576.91 228.91 M 559.77 254.5 C 565.69 246.97 574.05 237.31 581.02 226.98 M 560.24 251.86 C 569.31 242.32 576.64 234.42 582.78 228.03 M 562.9 254.64 C 571.84 245.2 581 238.84 589.39 228.54 M 564.15 255.33 C 568.87 249.5 573.68 244.4 587.25 227.24 M 565.32 259.71 C 572.31 250.75 578.84 247.81 594.63 228.44 M 565.45 258.63 C 574.56 248.48 584.53 237.9 593.71 227.43 M 567.92 264.13 C 576.1 253.97 580.18 247.89 597.16 228.11 M 567.2 262.62 C 574.69 253.86 581.7 246.37 597.31 229.28 M 569.51 267.38 C 582.53 253.9 594.01 237.32 599.91 230 M 570.43 265.41 C 578.58 256.2 588.69 244.47 601.27 231.62 M 570.97 271.01 C 581.33 259.69 586.81 250.71 603.88 231.57 M 572.57 269.57 C 580.59 259.21 588.93 250.05 603.73 232.64 M 574.68 271.53 C 584.58 258.95 593.07 250.04 606.29 236.43 M 576.12 272.21 C 582.88 263.16 590.95 253.39 606.16 235.26 M 579.47 271.91 C 589.51 261.44 600.51 249.76 610.02 241.57 M 579.92 272.74 C 589.52 261.4 600.15 251.13 608.14 241.57 M 583.98 273.95 C 590.87 265.75 600.2 257.47 607.76 245.75 M 585.77 274.46 C 590.76 266.15 597.72 259.61 609.71 245.43 M 588.16 274.25 C 595.57 267.24 606.08 256.62 611.47 249.73 M 588.25 274.7 C 593.04 269.83 598.55 265.83 610.21 249.94 M 598.03 271.61 C 601.81 268.24 605.51 260.62 612.6 252.66 M 596.7 273.48 C 602.93 265.5 610.32 258.23 612.65 254.05" fill="none" stroke="#f8cecc" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 592.65 226.08 C 597.91 227 603.81 231.02 606.71 235.28 C 609.62 239.55 610.77 246.36 610.08 251.67 C 609.38 256.98 606.62 263.53 602.54 267.15 C 598.45 270.76 590.94 273.1 585.57 273.34 C 580.19 273.59 574.43 271.8 570.3 268.6 C 566.18 265.4 562.17 259.1 560.82 254.15 C 559.48 249.19 559.81 243.39 562.23 238.88 C 564.66 234.37 569.28 228.71 575.35 227.07 C 581.41 225.43 593.94 228.26 598.6 229.05 C 603.26 229.83 603.62 231.54 603.29 231.78 M 578.52 225.73 C 583.18 224.07 589.81 224.82 594.75 226.99 C 599.69 229.17 605.53 233.83 608.18 238.78 C 610.82 243.72 612.1 251.46 610.63 256.65 C 609.16 261.85 604.23 267.07 599.35 269.95 C 594.47 272.83 586.6 274.79 581.37 273.94 C 576.14 273.08 571.5 268.95 567.98 264.83 C 564.45 260.71 560.51 254.26 560.2 249.22 C 559.9 244.17 562.91 238.51 566.14 234.54 C 569.36 230.57 577.47 226.85 579.55 225.38 C 581.63 223.91 578.4 225.15 578.62 225.7" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 249px; margin-left: 561px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 18px">Host2</font></div></div></div></foreignObject><text x="585" y="253" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Host2</text></switch></g><path d="M 180 335 L 285 335 L 285 300" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><ellipse cx="155" cy="335" rx="25" ry="25" fill="transparent" stroke="none" pointer-events="all"/><path d="M 135.41 320.22 C 135.41 320.22 135.41 320.22 135.41 320.22 M 135.41 320.22 C 135.41 320.22 135.41 320.22 135.41 320.22 M 130.92 331.65 C 134.7 326.21 142.98 317.43 147.27 314.13 M 130.58 332.68 C 134.68 326.89 139.73 320.55 146.22 312.51 M 131.02 337.08 C 136.04 328.15 141.97 321.64 152.33 310.71 M 132.07 336.19 C 136.46 331.91 142.16 325.36 153.16 313.13 M 131.66 340 C 140.25 331.1 148.13 323.62 159.53 313.3 M 132.65 341.58 C 137.97 334.58 143.52 329.31 157.25 313.01 M 135.31 345.45 C 144.81 334.01 152.75 326.54 163.39 315.98 M 134.95 344.43 C 144.36 334.5 154.71 323.41 161.44 314.37 M 136.1 349.39 C 148.21 336.6 155.05 328.94 167.63 311.83 M 136.4 349.76 C 144.9 337.9 154.1 328.78 166.65 314.44 M 138.37 354.09 C 146.93 346.23 151.34 336.64 171.97 317.44 M 138.88 353.35 C 149.33 339.58 162.23 325.89 171.53 315.78 M 141.34 353.24 C 150.81 346 157.1 337.87 174.54 318.66 M 142.41 354.78 C 151.39 343.77 161.17 334.43 171.98 320.07 M 143.79 358.12 C 153.82 349.56 157.26 341.71 175.92 321.5 M 144.9 357.55 C 152.07 349.01 159.37 342.5 176.26 322.89 M 148.59 358.18 C 160.87 348.23 170.84 336.03 179.83 325.84 M 149.76 359.55 C 158.84 348.51 167.4 338.08 178.74 325.38 M 151.38 362.67 C 159.74 352.13 165.28 346.71 178.39 329.71 M 153.63 360.69 C 162.29 350.36 170.22 339.56 178.2 330.48 M 157.12 361.77 C 165.67 354.46 169.06 347.93 177.96 336.95 M 158 359.96 C 165.31 353.86 169.86 345.95 178.77 336.47 M 165.51 360 C 169.34 351.75 176.21 347.07 180.61 342.58 M 165.69 358.69 C 170.57 352.7 175.43 347.39 180.4 342.36" fill="none" stroke="#f8cecc" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 150.8 310.48 C 155.72 309.13 162.61 310.6 167.15 313.11 C 171.69 315.62 176.08 320.65 178.04 325.55 C 179.99 330.45 180.44 337.4 178.86 342.53 C 177.28 347.66 173.28 353.66 168.56 356.34 C 163.84 359.01 156.1 359.46 150.55 358.57 C 145 357.68 138.79 355.05 135.25 351.01 C 131.71 346.97 129.31 339.44 129.32 334.33 C 129.32 329.22 130.73 324.37 135.28 320.37 C 139.82 316.37 152.39 311.84 156.59 310.35 C 160.79 308.86 160.73 310.92 160.47 311.44 M 154.58 311.09 C 159.52 310.83 165.56 313.81 169.5 316.69 C 173.45 319.56 177.04 323.34 178.26 328.32 C 179.48 333.31 179.21 341.63 176.81 346.6 C 174.42 351.57 168.92 356.13 163.88 358.13 C 158.83 360.13 151.42 360.35 146.54 358.6 C 141.66 356.85 137.21 351.83 134.6 347.63 C 131.98 343.43 130.41 338.53 130.85 333.4 C 131.28 328.26 133.36 320.65 137.22 316.81 C 141.07 312.96 151.33 311.35 153.99 310.33 C 156.66 309.32 153.25 310.16 153.21 310.71" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 335px; margin-left: 131px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div><font style="font-size: 18px">Host3</font></div></div></div></div></foreignObject><text x="155" y="339" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Host3</text></switch></g><rect x="409" y="80" width="251" height="70" rx="10.5" ry="10.5" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="409" y="80" width="251" height="70" rx="10.5" ry="10.5" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><rect x="580" y="90" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 100px; margin-left: 615px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; "><font style="font-size: 20px">AS5-3</font></div></div></div></foreignObject><text x="615" y="104" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">AS5-3</text></switch></g><path d="M 424 105 L 285 105 L 285 250" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 150px; margin-left: 284px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 18px">Link1</font></div></div></div></foreignObject><text x="284" y="153" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Link1</text></switch></g><path d="M 425.42 89.42 L 479.33 89.09 L 478.11 120.08 L 423.99 121.71" fill="#ffffff" stroke="none" pointer-events="all"/><path d="M 422.77 88.1 C 441.95 90 458.58 90.01 480.37 88.67 M 423.04 89.16 C 442.49 91.25 463.03 90.08 479.29 90.28 M 478.07 90.84 C 477.26 98.7 480.53 107.25 479.76 118.01 M 479 89.79 C 478.07 95.94 479.66 101.57 479.44 119.15 M 477.43 118.06 C 462.99 120.41 446.05 118.88 422.87 119.21 M 479 119.83 C 458.53 119.16 439.64 119.8 423.61 119.06 M 423.73 121 C 425.33 109.06 425.88 99.09 424.49 89.82 M 424.84 120.22 C 424.9 112.8 423.4 104.84 423.62 90.1" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 53px; height: 1px; padding-top: 105px; margin-left: 425px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 18px">gw1</font></div></div></div></foreignObject><text x="452" y="109" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">gw1</text></switch></g><path d="M 450.62 234 L 451.5 120" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 170px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><font style="font-size: 18px">Link3</font></div></div></div></foreignObject><text x="451" y="174" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">Link3</text></switch></g><rect x="409" y="324" width="251" height="70" rx="10.5" ry="10.5" fill="#000000" stroke="#000000" pointer-events="all" transform="translate(2,3)" opacity="0.25"/><rect x="409" y="324" width="251" height="70" rx="10.5" ry="10.5" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><rect x="570" y="340" width="70" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 350px; margin-left: 605px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; "><font style="font-size: 20px">AS5-5</font></div></div></div></foreignObject><text x="605" y="354" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">AS5-5</text></switch></g><path d="M 423.82 344.38 L 478.52 342.17 L 480.71 372.16 L 424.05 375.55" fill="#ffffff" stroke="none" pointer-events="all"/><path d="M 425.06 343.16 C 441.64 342.65 460.03 343.43 479.74 344.87 M 424.18 344.04 C 441.45 343.74 456.34 343.75 478.2 343.85 M 478.02 343.36 C 477.83 354.33 479.08 365.9 479.91 373.41 M 478.74 343.01 C 478.42 354.93 478.62 366.98 478.02 374.31 M 480.8 374.52 C 461.37 373.24 445.45 373.58 422.61 374.72 M 478.47 374.09 C 461.69 374.55 443.22 374.14 424.02 374.15 M 424.99 375.68 C 425.85 361.61 425.35 350.35 423.87 344.46 M 424.51 374.18 C 424.73 364.06 424.39 355.95 423.08 343.79" fill="none" stroke="#000000" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 53px; height: 1px; padding-top: 359px; margin-left: 425px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 18px">gw3</font></div></div></div></foreignObject><text x="452" y="363" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">gw3</text></switch></g><path d="M 450.66 264 L 451.5 344" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="stroke"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
\ No newline at end of file
index 65b5470..4ee9e24 100644 (file)
@@ -67,16 +67,18 @@ of every page. Bugs in the code should be reported
       Â Â Â Installing SimGrid <Installing_SimGrid.rst>
       Â Â Â Start your own project <Start_your_own_project.rst>
       Â Â Â The SimGrid community <community.rst>
+      Â Â Â Release Notes <Release_Notes.rst>
       Describing your application <application.rst>
       Â Â Â The S4U interface <app_s4u.rst>
       Â Â Â The SMPI interface <app_smpi.rst>
       Â Â Â The MSG interface <app_msg.rst>
       Â Â Â The XBT toolbox <The_XBT_toolbox.rst>
       Describing the simulated platform <Platform.rst>
-      Â Â Â Examples <Platform_examples.rst>
+      Â Â Â Demystifying the routing <Platform_routing.rst>
+      Â Â Â Network topology examples <Platform_examples.rst>
       Â Â Â Modeling hints <Platform_howtos.rst>
-      Â Â Â Defining a routing <Platform_routing.rst>
       Â Â Â XML reference <XML_reference.rst>
+      Â Â Â C++ platforms <Platform_cpp.rst>
       Describing the experimental setup <Experimental_setup.rst>
       Â Â Â Configuring SimGrid <Configuring_SimGrid.rst>
       Â Â Â Deploying your application <Deploying_your_application.rst>
diff --git a/docs/source/tuto_disk/CMakeLists.txt b/docs/source/tuto_disk/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4cb7b1b
--- /dev/null
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 2.8.8)
+project(tuto_disk)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
+
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/" "../../../")
+find_package(SimGrid REQUIRED)
+include_directories(${SimGrid_INCLUDE_DIR})
+
+set(SIMULATOR_SOURCES tuto_disk.cpp)
+add_executable(tuto_disk ${SIMULATOR_SOURCES})
+target_link_libraries(tuto_disk ${SimGrid_LIBRARY})
diff --git a/docs/source/tuto_disk/Dockerfile b/docs/source/tuto_disk/Dockerfile
new file mode 100644 (file)
index 0000000..5a58b42
--- /dev/null
@@ -0,0 +1,67 @@
+FROM debian:10.10-slim
+
+RUN printf '%s\n' \
+    "deb    [check-valid-until=no, trusted=yes] http://snapshot.debian.org/archive/debian/20210707T150931Z/ buster main contrib non-free" \
+    "deb-src [check-valid-until=no, trusted=yes] http://snapshot.debian.org/archive/debian/20210707T150931Z/ buster main contrib non-free" \
+    "deb     [check-valid-until=no, trusted=yes] http://snapshot.debian.org/archive/debian-security/20210707T150931Z/ buster/updates main contrib non-free" \
+    "deb-src [check-valid-until=no, trusted=yes] http://snapshot.debian.org/archive/debian-security/20210707T150931Z/ buster/updates main contrib non-free" > /etc/apt/sources.list \
+&& \
+    apt-get -o Acquire::Check-Valid-Until=false update \
+&& \
+    apt-get install -y --no-install-recommends \
+# emacs
+    emacs \
+    ess \
+    elpa-htmlize \
+# R
+    r-base-core \
+    r-cran-ggplot2 \
+    r-cran-dplyr \
+    r-cran-plyr \
+    r-cran-jsonlite \
+    r-cran-gridextra \
+# simgrid dependencies
+    g++ \
+    gcc \
+    git \
+    valgrind \
+    gfortran \
+    libboost-dev \
+    libboost-all-dev \
+    cmake \
+    dpkg-dev \
+# misc tools
+    curl \
+&& \
+    apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
+# install ox-rst to convert org to rst
+RUN mkdir /source && cd /source && \
+    git clone https://github.com/msnoigrs/ox-rst.git ox-rst.git
+
+# compile install simgrid
+RUN cd /source && git clone --depth=1 https://framagit.org/simgrid/simgrid.git simgrid.git && \
+    cd simgrid.git && \
+    cmake -DCMAKE_INSTALL_PREFIX=/usr/ -Denable_documentation=OFF -Denable_smpi=ON -Denable_compile_optimizations=ON . && \
+    make -j4 install
+
+## compile 
+RUN cd /source/simgrid.git/docs/source/tuto_disk && \
+    cmake . &&\
+    make
+
+# Generate HTML
+RUN cd /source/simgrid.git/docs/source/tuto_disk && \
+     emacs -l init.el -batch \
+        --eval "(require 'package)" \
+        --eval "(package-initialize)" \
+        --eval "(setq enable-local-eval t)" \
+        --eval "(setq enable-local-variables t)" \
+        --eval "(setq ess-ask-for-ess-directory nil)" \
+        --eval "(setq org-babel-execute-src-block t)" \
+        --eval "(setq org-export-babel-evaluate t)" \
+        analysis.org --funcall org-rst-export-to-rst
+
+WORKDIR /source/simgrid.git/
+ENTRYPOINT [ "/bin/bash"]
diff --git a/docs/source/tuto_disk/analysis.org b/docs/source/tuto_disk/analysis.org
new file mode 100644 (file)
index 0000000..04d6d88
--- /dev/null
@@ -0,0 +1,625 @@
+#+TITLE: Modeling I/O: the realistic way
+#+AUTHOR: The SimGrid Team
+#+OPTIONS: toc:nil title:nil author:nil num:nil
+
+* Modeling I/O: the realistic way
+:PROPERTIES:
+:CUSTOM_ID: howto_disk
+:END:
+
+** Introduction
+
+ This tutorial presents how to perform faithful IO experiments in
+ SimGrid. It is based on the paper "Adding Storage Simulation
+ Capacities to the SimGridToolkit: Concepts, Models, and API".
+
+ The paper presents a series of experiments to analyze the performance
+ of IO operations (read/write) on different kinds of disks (SATA, SAS,
+ SSD). In this tutorial, we present a detailed example of how to
+ extract experimental data to simulate: i) performance degradation
+ with concurrent operations (Fig. 8 in the paper) and ii) variability
+ in IO operations (Fig. 5 to 7).
+
+ - Link for paper: https://hal.inria.fr/hal-01197128
+ - Link for data: https://figshare.com/articles/dataset/Companion_of_the_SimGrid_storage_modeling_article/1175156
+
+ *Disclaimer*: 
+- The purpose of this document is to illustrate how we can
+ extract data from experiments and inject on SimGrid. However, the
+ data shown on this page may *not* reflect the reality.
+- You must run similar experiments on your hardware to get realistic
+  data for your context.
+- SimGrid has been in active development since the paper release in
+  2015, thus the MSG and XML description used in the paper may have
+  evolved and may not be available anymore.
+
+*** Running this tutorial
+
+ A Dockerfile is available in =docs/source/tuto_disk=. It allows you to
+ re-run this tutorial. For that, build the image and run the container:
+ - =docker build -t tuto_disk .=
+ - =docker run -it tuto_disk=
+
+** Analyzing the experimental data
+ We start by analyzing and extracting the real data available.
+*** Scripts
+
+ We use a special method to create non-uniform histograms to represent
+ the noise in IO operations. 
+
+ Unable to install the library properly, I copied the important methods
+ here.
+
+ Copied from: https://rdrr.io/github/dlebauer/pecan-priors/src/R/plots.R
+
+ #+begin_src R :results output :session *R* :exports none
+#' Variable-width (dagonally cut) histogram
+#'
+#' 
+#' When constructing a histogram, it is common to make all bars the same width.
+#' One could also choose to make them all have the same area.
+#' These two options have complementary strengths and weaknesses; the equal-width histogram oversmooths in regions of high density, and is poor at identifying sharp peaks; the equal-area histogram oversmooths in regions of low density, and so does not identify outliers.
+#' We describe a compromise approach which avoids both of these defects. We regard the histogram as an exploratory device, rather than as an estimate of a density. 
+#' @title Diagonally Cut Histogram 
+#' @param x is a numeric vector (the data)
+#' @param a is the scaling factor, default is 5 * IQR
+#' @param nbins is the number of bins, default is assigned by the Stuges method
+#' @param rx  is the range used for the left of the left-most bin to the right of the right-most bin  
+#' @param eps used to set artificial bound on min width / max height of bins as described in Denby and Mallows (2009) on page 24.
+#' @param xlab is label for the x axis 
+#' @param plot = TRUE produces the plot, FALSE returns the heights, breaks and counts
+#' @param lab.spikes = TRUE labels the \% of data in the spikes
+#' @return list with two elements, heights of length n and breaks of length n+1 indicating the heights and break points of the histogram bars. 
+#' @author Lorraine Denby, Colin Mallows
+#' @references Lorraine Denby, Colin Mallows. Journal of Computational and Graphical Statistics. March 1, 2009, 18(1): 21-31. doi:10.1198/jcgs.2009.0002.
+ dhist<-function(x, a=5*iqr(x),
+                 nbins=nclass.Sturges(x), rx = range(x,na.rm = TRUE),
+                 eps=.15, xlab = "x", plot = TRUE,lab.spikes = TRUE)
+ {
+
+   if(is.character(nbins))
+     nbins <- switch(casefold(nbins),
+                     sturges = nclass.Sturges(x),
+                     fd = nclass.FD(x),
+                     scott = nclass.scott(x),
+                     stop("Nclass method not recognized"))
+   else if(is.function(nbins))
+     nbins <- nbins(x)
+
+   x <- sort(x[!is.na(x)])
+   if(a == 0)
+     a <- diff(range(x))/100000000
+   if(a != 0 & a != Inf) {
+     n <- length(x)
+     h <- (rx[2] + a - rx[1])/nbins
+     ybr <- rx[1] + h * (0:nbins)
+     yupper <- x + (a * (1:n))/n
+                                         # upper and lower corners in the ecdf
+     ylower <- yupper - a/n
+                                         #
+     cmtx <- cbind(cut(yupper, breaks = ybr), cut(yupper, breaks = 
+                                 ybr, left.include = TRUE), cut(ylower, breaks = ybr),
+                   cut(ylower, breaks = ybr, left.include = TRUE))
+     cmtx[1, 3] <- cmtx[1, 4] <- 1
+                                         # to replace NAs when default r is used
+     cmtx[n, 1] <- cmtx[n, 2] <- nbins
+                                         #
+                                         #checksum <- apply(cmtx, 1, sum) %% 4
+     checksum <- (cmtx[, 1] + cmtx[, 2] + cmtx[, 3] + cmtx[, 4]) %%
+     4
+                                         # will be 2 for obs. that straddle two bins
+     straddlers <- (1:n)[checksum == 2]
+                                         # to allow for zero counts
+     if(length(straddlers) > 0) {
+       counts <- table(c(1:nbins, cmtx[ - straddlers, 1]))
+     } else {
+       counts <- table(c(1:nbins, cmtx[, 1]))
+     }
+     counts <- counts - 1
+                                         #
+     if(length(straddlers) > 0) {
+       for(i in straddlers) {
+         binno <- cmtx[i, 1]
+         theta <- ((yupper[i] - ybr[binno]) * n)/a
+         counts[binno - 1] <- counts[binno - 1] + (
+                                                   1 - theta)
+         counts[binno] <- counts[binno] + theta
+       }
+     }
+     xbr <- ybr
+     xbr[-1] <- ybr[-1] - (a * cumsum(counts))/n
+     spike<-eps*diff(rx)/nbins
+     flag.vec<-c(diff(xbr)<spike,F)
+     if ( sum(abs(diff(xbr))<=spike) >1) {
+       xbr.new<-xbr
+       counts.new<-counts
+       diff.xbr<-abs(diff(xbr))
+       amt.spike<-diff.xbr[length(diff.xbr)]
+       for (i in rev(2:length(diff.xbr))) {
+         if (diff.xbr[i-1]<=spike&diff.xbr[i]<=spike&
+             !is.na(diff.xbr[i])) {
+           amt.spike<-amt.spike+diff.xbr[i-1]
+           counts.new[i-1]<-counts.new[i-1]+counts.new[i]
+           xbr.new[i]<-NA
+           counts.new[i]<-NA
+           flag.vec[i-1]<-T
+         }
+         else amt.spike<-diff.xbr[i-1]
+       }
+       flag.vec<-flag.vec[!is.na(xbr.new)]
+       flag.vec<-flag.vec[-length(flag.vec)]
+       counts<-counts.new[!is.na(counts.new)]
+       xbr<-xbr.new[!is.na(xbr.new)]
+
+     }
+     else flag.vec<-flag.vec[-length(flag.vec)]
+     widths <- abs(diff(xbr))
+     ## N.B. argument "widths" in barplot must be xbr
+     heights <- counts/widths
+   }
+   bin.size <- length(x)/nbins
+   cut.pt <- unique(c(min(x) - abs(min(x))/1000,
+                      approx(seq(length(x)), x, (1:(nbins - 1)) * bin.size, rule = 2)$y, max(x)))
+   aa <- hist(x, breaks = cut.pt, plot = FALSE, probability = TRUE)
+   if(a == Inf) {
+     heights <- aa$counts
+     xbr <- aa$breaks
+   }
+   amt.height<-3
+   q75<-quantile(heights,.75)
+   if (sum(flag.vec)!=0) {
+     amt<-max(heights[!flag.vec])
+     ylim.height<-amt*amt.height
+     ind.h<-flag.vec&heights> ylim.height
+     flag.vec[heights<ylim.height*(amt.height-1)/amt.height]<-F
+     heights[ind.h] <- ylim.height
+   }
+   amt.txt<-0
+   end.y<-(-10000)
+   if(plot) {
+     barplot(heights, abs(diff(xbr)), space = 0, density = -1, xlab = 
+             xlab, plot = TRUE, xaxt = "n",yaxt='n')
+     at <- pretty(xbr)
+     axis(1, at = at - xbr[1], labels = as.character(at))
+     if (lab.spikes) {
+       if (sum(flag.vec)>=1) {
+         usr<-par('usr')
+         for ( i in seq(length(xbr)-1)) {
+           if (!flag.vec[i]) {
+             amt.txt<-0
+             if (xbr[i]-xbr[1]<end.y) amt.txt<-1
+           }
+           else {
+             amt.txt<-amt.txt+1
+             end.y<-xbr[i]-xbr[1]+3*par('cxy')[1]
+           }
+           if (flag.vec[i]) {
+             txt<-paste(' ',format(round(counts[i]/
+                                         sum(counts)*100)),'%',sep='')
+             par(xpd = TRUE)
+             text(xbr[i+1]-xbr[1],ylim.height-par('cxy')[2]*(amt.txt-1),txt, adj=0)
+           }}
+       }
+       else print('no spikes or more than one spike')
+     }
+     invisible(list(heights = heights, xbr = xbr))
+   }
+   else {
+     return(list(heights = heights, xbr = xbr,counts=counts))
+   }
+ }
+
+#' Calculate interquartile range
+#'
+#' Calculates the 25th and 75th quantiles given a vector x; used in function \link{dhist}.
+#' @title Interquartile range
+#' @param x vector
+#' @return numeric vector of length 2, with the 25th and 75th quantiles of input vector x. 
+ iqr<-function(x){
+   return(diff(quantile(x, c(0.25, 0.75), na.rm = TRUE)))
+ }
+
+ #+end_src
+
+*** Data preparation
+
+ Some initial configurations/list of packages.
+
+ #+begin_src R :results output :session *R* :exports both
+ library(jsonlite)
+ library(ggplot2)
+ library(plyr)
+ library(dplyr)
+ library(gridExtra)
+
+ IO_INFO = list()
+ #+end_src
+
+ This was copied from the =sg_storage_ccgrid15.org= available at the
+ figshare of the paper. Before executing this code, please download and
+ decompress the appropriate file.
+
+ #+begin_src sh :results output :exports both
+ curl -O -J -L "https://ndownloader.figshare.com/files/1928095"
+ tar xfz bench.tgz
+ #+end_src
+
+ Preparing data for varialiby analysis.
+
+ #+BEGIN_SRC R :session :results output :export none
+
+ clean_up <- function (df, infra){
+ names(df) <- c("Hostname","Date","DirectIO","IOengine","IOscheduler","Error","Operation","Jobs","BufferSize","FileSize","Runtime","Bandwidth","BandwidthMin","BandwidthMax","Latency", "LatencyMin", "LatencyMax","IOPS")
+ df=subset(df,Error=="0")
+ df=subset(df,DirectIO=="1")
+ df <- merge(df,infra,by="Hostname")
+ df$Hostname = sapply(strsplit(df$Hostname, "[.]"), "[", 1)
+ df$HostModel = paste(df$Hostname, df$Model, sep=" - ")
+ df$Duration = df$Runtime/1000 # fio outputs runtime in msec, we want to display seconds
+ df$Size = df$FileSize/1024/1024
+ df=subset(df,Duration!=0.000)
+ df$Bwi=df$Duration/df$Size
+ df[df$Operation=="read",]$Operation<- "Read"
+ df[df$Operation=="write",]$Operation<- "Write"
+ return(df)
+ }
+
+ grenoble <- read.csv('./bench/grenoble.csv', header=FALSE,sep = ";",
+ stringsAsFactors=FALSE)
+ luxembourg <- read.csv('./bench/luxembourg.csv', header=FALSE,sep = ";",  stringsAsFactors=FALSE)
+ nancy <- read.csv('./bench/nancy.csv', header=FALSE,sep = ";",  stringsAsFactors=FALSE)
+ all <- rbind(grenoble,nancy, luxembourg)
+ infra <- read.csv('./bench/infra.csv', header=FALSE,sep = ";",  stringsAsFactors=FALSE)
+ names(infra) <- c("Hostname","Model","DiskSize")
+
+ all = clean_up(all, infra)
+ griffon = subset(all,grepl("^griffon", Hostname))
+ griffon$Cluster <-"Griffon (SATA II)"
+ edel = subset(all,grepl("^edel", Hostname))
+ edel$Cluster<-"Edel (SSD)"
+
+ df = rbind(griffon[griffon$Jobs=="1" & griffon$IOscheduler=="cfq",],
+            edel[edel$Jobs=="1" & edel$IOscheduler=="cfq",])
+ #Get rid off of 64 Gb disks of Edel as they behave differently (used to be "edel-51")
+ df = df[!(grepl("^Edel",df$Cluster) & df$DiskSize=="64 GB"),]
+ #+END_SRC
+
+ Preparing data for concurrent analysis.
+ #+begin_src R :results output :session *R* :exports both
+   dfc = rbind(griffon[griffon$Jobs>1 & griffon$IOscheduler=="cfq",],
+              edel[edel$Jobs>1 & edel$IOscheduler=="cfq",])
+   dfc2 = rbind(griffon[griffon$Jobs==1 & griffon$IOscheduler=="cfq",],
+              edel[edel$Jobs==1 & edel$IOscheduler=="cfq",])
+   dfc = rbind(dfc,dfc2[sample(nrow(dfc2),size=200),])
+
+   dd <- data.frame(
+         Hostname="??",
+         Date = NA, #tmpl$Date,
+         DirectIO = NA,
+         IOengine = NA,
+         IOscheduler = NA,
+         Error = 0,
+         Operation = NA, #tmpl$Operation,
+         Jobs = NA, # #d$nb.of.concurrent.access,
+         BufferSize = NA, #d$bs,
+         FileSize = NA, #d$size,
+         Runtime = NA,
+         Bandwidth = NA,
+         BandwidthMin = NA,
+         BandwidthMax = NA,
+         Latency = NA,
+         LatencyMin = NA,
+         LatencyMax = NA,
+         IOPS = NA,
+         Model = NA, #tmpl$Model,
+         DiskSize = NA, #tmpl$DiskSize,
+         HostModel = NA,
+         Duration = NA, #d$time,
+         Size = NA,
+         Bwi = NA,
+         Cluster = NA) #tmpl$Cluster)
+
+   dd$Size = dd$FileSize/1024/1024
+   dd$Bwi = dd$Duration/dd$Size
+
+   dfc = rbind(dfc, dd)
+   # Let's get rid of small files!
+   dfc = subset(dfc,Size >= 10)
+   # Let's get rid of 64Gb edel disks
+   dfc = dfc[!(grepl("^Edel",dfc$Cluster) & dfc$DiskSize=="64 GB"),]
+
+   dfc$TotalSize=dfc$Size * dfc$Jobs
+   dfc$BW = (dfc$TotalSize) / dfc$Duration
+   dfc = dfc[dfc$BW>=20,] # get rid of one point that is typically an outlier and does not make sense
+
+   dfc$method="lm"
+   dfc[dfc$Cluster=="Edel (SSD)"  & dfc$Operation=="Read",]$method="loess"
+
+   dfc[dfc$Cluster=="Edel (SSD)"  & dfc$Operation=="Write" & dfc$Jobs ==1,]$method="lm"
+   dfc[dfc$Cluster=="Edel (SSD)"  & dfc$Operation=="Write" & dfc$Jobs ==1,]$method=""
+
+   dfc[dfc$Cluster=="Griffon (SATA II)" & dfc$Operation=="Write",]$method="lm"
+   dfc[dfc$Cluster=="Griffon (SATA II)"  & dfc$Operation=="Write" & dfc$Jobs ==1,]$method=""
+
+   dfd = dfc[dfc$Operation=="Write" & dfc$Jobs ==1 &
+             (dfc$Cluster %in% c("Griffon (SATA II)", "Edel (SSD)")),]
+   dfd = ddply(dfd,c("Cluster","Operation","Jobs","DiskSize"), summarize,
+               mean = mean(BW), num = length(BW), sd = sd(BW))
+   dfd$BW=dfd$mean
+   dfd$ci = 2*dfd$sd/sqrt(dfd$num)
+
+   dfrange=ddply(dfc,c("Cluster","Operation","DiskSize"), summarize,
+               max = max(BW))
+   dfrange=ddply(dfrange,c("Cluster","DiskSize"), mutate,
+               BW = max(max))
+   dfrange$Jobs=16
+
+ #+end_src
+
+*** Griffon (SATA)
+**** Modeling resource sharing w/ concurrent access
+
+ This figure presents the overall performance of IO operation with
+ concurrent access to the disk. Note that the image is different
+ from the one in the paper. Probably, we need to further clean the
+ available data to obtain exaclty the same results.
+
+ #+begin_src R :results output graphics :file fig/griffon_deg.png :exports both :width 600 :height 400 :session *R* 
+   ggplot(data=dfc,aes(x=Jobs,y=BW, color=Operation)) + theme_bw() +
+     geom_point(alpha=.3) +
+     geom_point(data=dfrange, size=0) +
+     facet_wrap(Cluster~Operation,ncol=2,scale="free_y")+ # ) + #
+     geom_smooth(data=dfc[dfc$method=="loess",], color="black", method=loess,se=TRUE,fullrange=T) +
+     geom_smooth(data=dfc[dfc$method=="lm",], color="black", method=lm,se=TRUE) +
+     geom_point(data=dfd, aes(x=Jobs,y=BW),color="black",shape=21,fill="white") +
+     geom_errorbar(data=dfd, aes(x=Jobs, ymin=BW-ci, ymax=BW+ci),color="black",width=.6) +
+     xlab("Number of concurrent operations") + ylab("Aggregated Bandwidth (MiB/s)")  + guides(color=FALSE)  + xlim(0,NA) + ylim(0,NA)
+
+ #+end_src
+
+***** Read
+ Getting read data for Griffon from 1 to 15 concurrent reads.
+
+ #+begin_src R :results output :session *R* :exports both
+ deg_griffon = dfc %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Read")
+ model = lm(BW~Jobs, data = deg_griffon)
+ IO_INFO[["griffon"]][["degradation"]][["read"]] = predict(model,data.frame(Jobs=seq(1,15)))
+
+ toJSON(IO_INFO, pretty = TRUE)
+ #+end_src
+
+***** Write
+
+ Same for write operations.
+
+ #+begin_src R :results output :session *R* :exports both
+ deg_griffon = dfc %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Write") %>% filter(Jobs > 2)
+ mean_job_1 = dfc %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Write") %>% filter(Jobs == 1) %>% summarize(mean = mean(BW))
+ model = lm(BW~Jobs, data = deg_griffon)
+ IO_INFO[["griffon"]][["degradation"]][["write"]] = c(mean_job_1$mean, predict(model,data.frame(Jobs=seq(2,15))))
+ toJSON(IO_INFO, pretty = TRUE)
+ #+end_src
+
+**** Modeling read/write bandwidth variability
+
+ Fig.5 in the paper presents the noise in the read/write operations in
+ the Griffon SATA disk.
+
+ The paper uses regular histogram to illustrate the distribution of the
+ effective bandwidth. However, in this tutorial, we use dhist
+ (https://rdrr.io/github/dlebauer/pecan-priors/man/dhist.html) to have a
+ more precise information over the highly dense areas around the mean.
+
+***** Read
+ First, we present the histogram for read operations.
+ #+begin_src R :results output graphics :file fig/griffon_read_dhist.png :exports both :width 600 :height 400 :session *R* 
+ griffon_read = df %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Read") %>% select(Bwi)
+ dhist(1/griffon_read$Bwi)
+ #+end_src
+
+ Saving it to be exported in json format.
+
+ #+begin_src R :results output :session *R* :exports both
+ griffon_read_dhist = dhist(1/griffon_read$Bwi, plot=FALSE)
+ IO_INFO[["griffon"]][["noise"]][["read"]] = c(breaks=list(griffon_read_dhist$xbr), heights=list(unclass(griffon_read_dhist$heights)))
+ IO_INFO[["griffon"]][["read_bw"]] = mean(1/griffon_read$Bwi)
+ toJSON(IO_INFO, pretty = TRUE)
+ #+end_src
+
+***** Write
+
+ Same analysis for write operations.
+ #+begin_src R :results output graphics :file fig/griffon_write_dhist.png :exports both :width 600 :height 400 :session *R* 
+ griffon_write = df %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Write") %>% select(Bwi)
+ dhist(1/griffon_write$Bwi)
+ #+end_src
+
+ #+begin_src R :results output :session *R* :exports both
+ griffon_write_dhist = dhist(1/griffon_write$Bwi, plot=FALSE)
+ IO_INFO[["griffon"]][["noise"]][["write"]] = c(breaks=list(griffon_write_dhist$xbr), heights=list(unclass(griffon_write_dhist$heights)))
+ IO_INFO[["griffon"]][["write_bw"]] = mean(1/griffon_write$Bwi)
+ toJSON(IO_INFO, pretty = TRUE)
+ #+end_src
+
+*** Edel (SSD)
+ This section presents the exactly same analysis for the Edel SSDs.
+
+**** Modeling resource sharing w/ concurrent access
+
+***** Read
+ Getting read data for Edel from 1 to 15 concurrent operations.
+
+ #+begin_src R :results output :session *R* :exports both
+ deg_edel = dfc %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Read")
+ model = loess(BW~Jobs, data = deg_edel)
+ IO_INFO[["edel"]][["degradation"]][["read"]] = predict(model,data.frame(Jobs=seq(1,15)))
+ toJSON(IO_INFO, pretty = TRUE)
+ #+end_src
+
+***** Write
+
+ Same for write operations.
+
+ #+begin_src R :results output :session *R* :exports both
+ deg_edel = dfc %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Write") %>% filter(Jobs > 2)
+ mean_job_1 = dfc %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Write") %>% filter(Jobs == 1) %>% summarize(mean = mean(BW))
+ model = lm(BW~Jobs, data = deg_edel)
+ IO_INFO[["edel"]][["degradation"]][["write"]] = c(mean_job_1$mean, predict(model,data.frame(Jobs=seq(2,15))))
+ toJSON(IO_INFO, pretty = TRUE)
+ #+end_src
+
+
+**** Modeling read/write bandwidth variability
+
+***** Read
+
+ #+begin_src R :results output graphics :file fig/edel_read_dhist.png :exports both :width 600 :height 400 :session *R* 
+ edel_read = df %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Read") %>% select(Bwi)
+ dhist(1/edel_read$Bwi)
+ #+end_src
+
+ Saving it to be exported in json format.
+
+ #+begin_src R :results output :session *R* :exports both
+ edel_read_dhist = dhist(1/edel_read$Bwi, plot=FALSE)
+ IO_INFO[["edel"]][["noise"]][["read"]] = c(breaks=list(edel_read_dhist$xbr), heights=list(unclass(edel_read_dhist$heights)))
+ IO_INFO[["edel"]][["read_bw"]] = mean(1/edel_read$Bwi)
+ toJSON(IO_INFO, pretty = TRUE)
+ #+end_src
+
+***** Write
+ #+begin_src R :results output graphics :file fig/edel_write_dhist.png :exports both :width 600 :height 400 :session *R* 
+
+ edel_write = df %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Write") %>% select(Bwi)
+ dhist(1/edel_write$Bwi)
+ #+end_src
+
+ Saving it to be exported later.
+ #+begin_src R :results output :session *R* :exports both
+ edel_write_dhist = dhist(1/edel_write$Bwi, plot=FALSE)
+ IO_INFO[["edel"]][["noise"]][["write"]] = c(breaks=list(edel_write_dhist$xbr), heights=list(unclass(edel_write_dhist$heights)))
+ IO_INFO[["edel"]][["write_bw"]] = mean(1/edel_write$Bwi)
+ toJSON(IO_INFO, pretty = TRUE)
+ #+end_src
+
+** Exporting to JSON
+ Finally, let's save it to a file to be opened by our simulator.
+
+ #+begin_src R :results output :session *R* :exports both
+ json = toJSON(IO_INFO, pretty = TRUE)
+ cat(json, file="IO_noise.json")
+ #+end_src
+
+
+** Injecting this data in SimGrid
+
+ To mimic this behavior in SimGrid, we use two features in the platform
+ description: non-linear sharing policy and bandwidth factors. For more
+ details, please see the source code in =tuto_disk.cpp=.
+
+*** Modeling resource sharing w/ concurrent access
+
+ The =set_sharing_policy= method allows the user to set a callback to
+ dynamically change the disk capacity. The callback is called each time
+ SimGrid will share the disk between a set of I/O operations.
+
+ The callback has access to the number of activities sharing the
+ resource and its current capacity. It must return the new resource's
+ capacity.
+
+ #+begin_src C++ :results output :eval no :exports code
+ static double disk_dynamic_sharing(double capacity, int n)
+ {
+    return capacity; //useless callback
+ }
+
+ auto* disk = host->create_disk("dump", 1e6, 1e6);
+ disk->set_sharing_policy(sg4::Disk::Operation::READ, sg4::Disk::SharingPolicy::NONLINEAR, &disk_dynamic_sharing);
+ #+end_src
+
+
+*** Modeling read/write bandwidth variability
+
+ The noise in I/O operations can be obtained by applying a factor to
+ the I/O bandwidth of the disk. This factor is applied when we update
+ the remaining amount of bytes to be transferred, increasing or
+ decreasing the effective disk bandwidth.
+
+ The =set_factor= method allows the user to set a callback to
+ dynamically change the factor to be applied for each I/O operation.
+ The callback has access to size of the operation and its type (read or
+ write). It must return a multiply factor (e.g. 1.0 for doing nothing).
+
+ #+begin_src C++ :results output :eval no :exports code
+ static double disk_variability(sg_size_t size, sg4::Io::OpType op)
+ {
+    return 1.0; //useless callback
+ }
+
+ auto* disk = host->create_disk("dump", 1e6, 1e6);
+ disk->set_factor_cb(&disk_variability);
+ #+end_src
+
+
+*** Running our simulation
+ The binary was compiled in the provided docker container.
+
+ #+begin_src sh :results output :exports both
+ ./tuto_disk > ./simgrid_disk.csv
+ #+end_src
+
+
+** Analyzing the SimGrid results
+
+The figure below presents the results obtained by SimGrid.
+
+The experiment performs I/O operations, varying the number of
+concurrent operations from 1 to 15. We run only 20 simulations for
+each case.
+
+We can see that the graphics are quite similar to the ones obtained in
+the real platform.
+
+ #+begin_src R :results output graphics :file fig/simgrid_results.png :exports both :width 600 :height 400 :session *R* 
+ sg_df = read.csv("./simgrid_disk.csv")
+ sg_df = sg_df %>% group_by(disk, op, flows) %>% mutate(bw=((size*flows)/elapsed)/10^6, method=if_else(disk=="edel" & op=="read", "loess", "lm"))
+ sg_dfd = sg_df %>% filter(flows==1 & op=="write") %>% group_by(disk, op, flows) %>% summarize(mean = mean(bw), sd = sd(bw), se=sd/sqrt(n()))
+
+ sg_df[sg_df$op=="write" & sg_df$flows ==1,]$method=""
+ ggplot(data=sg_df, aes(x=flows, y=bw, color=op)) + theme_bw() +
+     geom_point(alpha=.3) + 
+     geom_smooth(data=sg_df[sg_df$method=="loess",], color="black", method=loess,se=TRUE,fullrange=T) +
+     geom_smooth(data=sg_df[sg_df$method=="lm",], color="black", method=lm,se=TRUE) +
+     geom_errorbar(data=sg_dfd, aes(x=flows, y=mean, ymin=mean-2*se, ymax=mean+2*se),color="black",width=.6) +
+     facet_wrap(disk~op,ncol=2,scale="free_y")+ # ) + #
+     xlab("Number of concurrent operations") + ylab("Aggregated Bandwidth (MiB/s)")  + guides(color=FALSE)  + xlim(0,NA) + ylim(0,NA)
+
+ #+end_src
+
+Note: The variability in griffon read operation seems to decrease when
+we have more concurrent operations. This is a particularity of the
+griffon read speed profile and the elapsed time calculation.
+
+Given that:
+- Each point represents the time to perform the N I/O operations.
+- Griffon read speed decreases with the number of concurrent
+  operations.
+
+With 15 read operations:
+- At the beginning, every read gets the same bandwidth, about
+  42MiB/s.
+- We sample the noise in I/O operations, some will be faster than
+  others (e.g. factor > 1).
+
+When the first read operation finish:
+- We will recalculate the bandwidth sharing, now considering that we
+  have 14 active read operations. This will increase the bandwidth for
+  each operation (about 44MiB/s).
+- The remaining "slower" activities will be speed up.
+
+This behavior keeps happening until the end of the 15 operations,
+at each step, we speed up a little the slowest operations and
+consequently, decreasing the variability we see.
diff --git a/docs/source/tuto_disk/analysis.rst b/docs/source/tuto_disk/analysis.rst
new file mode 100644 (file)
index 0000000..e07daf0
--- /dev/null
@@ -0,0 +1,751 @@
+
+
+
+.. _howto_disk:
+
+Modeling I/O: the realistic way
+-------------------------------
+
+Introduction
+~~~~~~~~~~~~
+
+This tutorial presents how to perform faithful IO experiments in
+SimGrid. It is based on the paper "Adding Storage Simulation
+Capacities to the SimGridToolkit: Concepts, Models, and API".
+
+The paper presents a series of experiments to analyze the performance
+of IO operations (read/write) on different kinds of disks (SATA, SAS,
+SSD). In this tutorial, we present a detailed example of how to
+extract experimental data to simulate: i) performance degradation
+with concurrent operations (Fig. 8 in the paper) and ii) variability
+in IO operations (Fig. 5 to 7).
+
+- Link for paper: `https://hal.inria.fr/hal-01197128 <https://hal.inria.fr/hal-01197128>`_
+
+- Link for data: `https://figshare.com/articles/dataset/Companion_of_the_SimGrid_storage_modeling_article/1175156 <https://figshare.com/articles/dataset/Companion_of_the_SimGrid_storage_modeling_article/1175156>`_
+
+**Disclaimer**: 
+
+- The purpose of this document is to illustrate how we can
+  extract data from experiments and inject on SimGrid. However, the
+  data shown on this page may **not** reflect the reality.
+
+- You must run similar experiments on your hardware to get realistic
+  data for your context.
+
+- SimGrid has been in active development since the paper release in
+  2015, thus the MSG and XML description used in the paper may have
+  evolved and may not be available anymore.
+
+Running this tutorial
+^^^^^^^^^^^^^^^^^^^^^
+
+A Dockerfile is available in ``docs/source/tuto_disk``. It allows you to
+re-run this tutorial. For that, build the image and run the container:
+
+- ``docker build -t tuto_disk .``
+
+- ``docker run -it tuto_disk``
+
+Analyzing the experimental data
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We start by analyzing and extracting the real data available.
+
+Scripts
+^^^^^^^
+
+We use a special method to create non-uniform histograms to represent
+the noise in IO operations. 
+
+Unable to install the library properly, I copied the important methods
+here.
+
+Copied from: `https://rdrr.io/github/dlebauer/pecan-priors/src/R/plots.R <https://rdrr.io/github/dlebauer/pecan-priors/src/R/plots.R>`_
+
+Data preparation
+^^^^^^^^^^^^^^^^
+
+Some initial configurations/list of packages.
+
+.. code:: R
+
+    library(jsonlite)
+    library(ggplot2)
+    library(plyr)
+    library(dplyr)
+    library(gridExtra)
+
+    IO_INFO = list()
+
+::
+
+
+    Use suppressPackageStartupMessages() to eliminate package startup
+    messages.
+
+    Attaching package: 'dplyr'
+
+    The following objects are masked from 'package:plyr':
+
+        arrange, count, desc, failwith, id, mutate, rename, summarise,
+        summarize
+
+    The following objects are masked from 'package:stats':
+
+        filter, lag
+
+    The following objects are masked from 'package:base':
+
+        intersect, setdiff, setequal, union
+
+    Attaching package: 'gridExtra'
+
+    The following object is masked from 'package:dplyr':
+
+        combine
+
+This was copied from the ``sg_storage_ccgrid15.org`` available at the
+figshare of the paper. Before executing this code, please download and
+decompress the appropriate file.
+
+.. code:: sh
+
+    curl -O -J -L "https://ndownloader.figshare.com/files/1928095"
+    tar xfz bench.tgz
+
+Preparing data for varialiby analysis.
+
+.. code:: R
+
+
+    clean_up <- function (df, infra){
+    names(df) <- c("Hostname","Date","DirectIO","IOengine","IOscheduler","Error","Operation","Jobs","BufferSize","FileSize","Runtime","Bandwidth","BandwidthMin","BandwidthMax","Latency", "LatencyMin", "LatencyMax","IOPS")
+    df=subset(df,Error=="0")
+    df=subset(df,DirectIO=="1")
+    df <- merge(df,infra,by="Hostname")
+    df$Hostname = sapply(strsplit(df$Hostname, "[.]"), "[", 1)
+    df$HostModel = paste(df$Hostname, df$Model, sep=" - ")
+    df$Duration = df$Runtime/1000 # fio outputs runtime in msec, we want to display seconds
+    df$Size = df$FileSize/1024/1024
+    df=subset(df,Duration!=0.000)
+    df$Bwi=df$Duration/df$Size
+    df[df$Operation=="read",]$Operation<- "Read"
+    df[df$Operation=="write",]$Operation<- "Write"
+    return(df)
+    }
+
+    grenoble <- read.csv('./bench/grenoble.csv', header=FALSE,sep = ";",
+    stringsAsFactors=FALSE)
+    luxembourg <- read.csv('./bench/luxembourg.csv', header=FALSE,sep = ";",  stringsAsFactors=FALSE)
+    nancy <- read.csv('./bench/nancy.csv', header=FALSE,sep = ";",  stringsAsFactors=FALSE)
+    all <- rbind(grenoble,nancy, luxembourg)
+    infra <- read.csv('./bench/infra.csv', header=FALSE,sep = ";",  stringsAsFactors=FALSE)
+    names(infra) <- c("Hostname","Model","DiskSize")
+
+    all = clean_up(all, infra)
+    griffon = subset(all,grepl("^griffon", Hostname))
+    griffon$Cluster <-"Griffon (SATA II)"
+    edel = subset(all,grepl("^edel", Hostname))
+    edel$Cluster<-"Edel (SSD)"
+
+    df = rbind(griffon[griffon$Jobs=="1" & griffon$IOscheduler=="cfq",],
+               edel[edel$Jobs=="1" & edel$IOscheduler=="cfq",])
+    #Get rid off of 64 Gb disks of Edel as they behave differently (used to be "edel-51")
+    df = df[!(grepl("^Edel",df$Cluster) & df$DiskSize=="64 GB"),]
+
+Preparing data for concurrent analysis.
+
+.. code:: R
+
+    dfc = rbind(griffon[griffon$Jobs>1 & griffon$IOscheduler=="cfq",],
+               edel[edel$Jobs>1 & edel$IOscheduler=="cfq",])
+    dfc2 = rbind(griffon[griffon$Jobs==1 & griffon$IOscheduler=="cfq",],
+               edel[edel$Jobs==1 & edel$IOscheduler=="cfq",])
+    dfc = rbind(dfc,dfc2[sample(nrow(dfc2),size=200),])
+
+    dd <- data.frame(
+          Hostname="??",
+          Date = NA, #tmpl$Date,
+          DirectIO = NA,
+          IOengine = NA,
+          IOscheduler = NA,
+          Error = 0,
+          Operation = NA, #tmpl$Operation,
+          Jobs = NA, # #d$nb.of.concurrent.access,
+          BufferSize = NA, #d$bs,
+          FileSize = NA, #d$size,
+          Runtime = NA,
+          Bandwidth = NA,
+          BandwidthMin = NA,
+          BandwidthMax = NA,
+          Latency = NA,
+          LatencyMin = NA,
+          LatencyMax = NA,
+          IOPS = NA,
+          Model = NA, #tmpl$Model,
+          DiskSize = NA, #tmpl$DiskSize,
+          HostModel = NA,
+          Duration = NA, #d$time,
+          Size = NA,
+          Bwi = NA,
+          Cluster = NA) #tmpl$Cluster)
+
+    dd$Size = dd$FileSize/1024/1024
+    dd$Bwi = dd$Duration/dd$Size
+
+    dfc = rbind(dfc, dd)
+    # Let's get rid of small files!
+    dfc = subset(dfc,Size >= 10)
+    # Let's get rid of 64Gb edel disks
+    dfc = dfc[!(grepl("^Edel",dfc$Cluster) & dfc$DiskSize=="64 GB"),]
+
+    dfc$TotalSize=dfc$Size * dfc$Jobs
+    dfc$BW = (dfc$TotalSize) / dfc$Duration
+    dfc = dfc[dfc$BW>=20,] # get rid of one point that is typically an outlier and does not make sense
+
+    dfc$method="lm"
+    dfc[dfc$Cluster=="Edel (SSD)"  & dfc$Operation=="Read",]$method="loess"
+
+    dfc[dfc$Cluster=="Edel (SSD)"  & dfc$Operation=="Write" & dfc$Jobs ==1,]$method="lm"
+    dfc[dfc$Cluster=="Edel (SSD)"  & dfc$Operation=="Write" & dfc$Jobs ==1,]$method=""
+
+    dfc[dfc$Cluster=="Griffon (SATA II)" & dfc$Operation=="Write",]$method="lm"
+    dfc[dfc$Cluster=="Griffon (SATA II)"  & dfc$Operation=="Write" & dfc$Jobs ==1,]$method=""
+
+    dfd = dfc[dfc$Operation=="Write" & dfc$Jobs ==1 &
+              (dfc$Cluster %in% c("Griffon (SATA II)", "Edel (SSD)")),]
+    dfd = ddply(dfd,c("Cluster","Operation","Jobs","DiskSize"), summarize,
+                mean = mean(BW), num = length(BW), sd = sd(BW))
+    dfd$BW=dfd$mean
+    dfd$ci = 2*dfd$sd/sqrt(dfd$num)
+
+    dfrange=ddply(dfc,c("Cluster","Operation","DiskSize"), summarize,
+                max = max(BW))
+    dfrange=ddply(dfrange,c("Cluster","DiskSize"), mutate,
+                BW = max(max))
+    dfrange$Jobs=16
+
+Griffon (SATA)
+^^^^^^^^^^^^^^
+
+Modeling resource sharing w/ concurrent access
+::::::::::::::::::::::::::::::::::::::::::::::
+
+This figure presents the overall performance of IO operation with
+concurrent access to the disk. Note that the image is different
+from the one in the paper. Probably, we need to further clean the
+available data to obtain exaclty the same results.
+
+.. code:: R
+
+    ggplot(data=dfc,aes(x=Jobs,y=BW, color=Operation)) + theme_bw() +
+      geom_point(alpha=.3) +
+      geom_point(data=dfrange, size=0) +
+      facet_wrap(Cluster~Operation,ncol=2,scale="free_y")+ # ) + #
+      geom_smooth(data=dfc[dfc$method=="loess",], color="black", method=loess,se=TRUE,fullrange=T) +
+      geom_smooth(data=dfc[dfc$method=="lm",], color="black", method=lm,se=TRUE) +
+      geom_point(data=dfd, aes(x=Jobs,y=BW),color="black",shape=21,fill="white") +
+      geom_errorbar(data=dfd, aes(x=Jobs, ymin=BW-ci, ymax=BW+ci),color="black",width=.6) +
+      xlab("Number of concurrent operations") + ylab("Aggregated Bandwidth (MiB/s)")  + guides(color=FALSE)  + xlim(0,NA) + ylim(0,NA)
+
+.. image:: fig/griffon_deg.png
+
+Read
+''''
+
+Getting read data for Griffon from 1 to 15 concurrent reads.
+
+.. code:: R
+
+    deg_griffon = dfc %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Read")
+    model = lm(BW~Jobs, data = deg_griffon)
+    IO_INFO[["griffon"]][["degradation"]][["read"]] = predict(model,data.frame(Jobs=seq(1,15)))
+
+    toJSON(IO_INFO, pretty = TRUE)
+
+::
+
+
+    {
+      "griffon": {
+        "degradation": {
+          "read": [66.6308, 64.9327, 63.2346, 61.5365, 59.8384, 58.1403, 56.4423, 54.7442, 53.0461, 51.348, 49.6499, 47.9518, 46.2537, 44.5556, 42.8575]
+        }
+      }
+    }
+
+Write
+'''''
+
+Same for write operations.
+
+.. code:: R
+
+    deg_griffon = dfc %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Write") %>% filter(Jobs > 2)
+    mean_job_1 = dfc %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Write") %>% filter(Jobs == 1) %>% summarize(mean = mean(BW))
+    model = lm(BW~Jobs, data = deg_griffon)
+    IO_INFO[["griffon"]][["degradation"]][["write"]] = c(mean_job_1$mean, predict(model,data.frame(Jobs=seq(2,15))))
+    toJSON(IO_INFO, pretty = TRUE)
+
+::
+
+
+    {
+      "griffon": {
+        "degradation": {
+          "read": [66.6308, 64.9327, 63.2346, 61.5365, 59.8384, 58.1403, 56.4423, 54.7442, 53.0461, 51.348, 49.6499, 47.9518, 46.2537, 44.5556, 42.8575],
+          "write": [49.4576, 26.5981, 27.7486, 28.8991, 30.0495, 31.2, 32.3505, 33.501, 34.6515, 35.8019, 36.9524, 38.1029, 39.2534, 40.4038, 41.5543]
+        }
+      }
+    }
+
+Modeling read/write bandwidth variability
+:::::::::::::::::::::::::::::::::::::::::
+
+Fig.5 in the paper presents the noise in the read/write operations in
+the Griffon SATA disk.
+
+The paper uses regular histogram to illustrate the distribution of the
+effective bandwidth. However, in this tutorial, we use dhist
+(`https://rdrr.io/github/dlebauer/pecan-priors/man/dhist.html <https://rdrr.io/github/dlebauer/pecan-priors/man/dhist.html>`_) to have a
+more precise information over the highly dense areas around the mean.
+
+Read
+''''
+
+First, we present the histogram for read operations.
+
+.. code:: R
+
+    griffon_read = df %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Read") %>% select(Bwi)
+    dhist(1/griffon_read$Bwi)
+
+.. image:: fig/griffon_read_dhist.png
+
+Saving it to be exported in json format.
+
+.. code:: R
+
+    griffon_read_dhist = dhist(1/griffon_read$Bwi, plot=FALSE)
+    IO_INFO[["griffon"]][["noise"]][["read"]] = c(breaks=list(griffon_read_dhist$xbr), heights=list(unclass(griffon_read_dhist$heights)))
+    IO_INFO[["griffon"]][["read_bw"]] = mean(1/griffon_read$Bwi)
+    toJSON(IO_INFO, pretty = TRUE)
+
+::
+
+    Warning message:
+    In hist.default(x, breaks = cut.pt, plot = FALSE, probability = TRUE) :
+      argument 'probability' is not made use of
+
+    {
+      "griffon": {
+        "degradation": {
+          "read": [66.6308, 64.9327, 63.2346, 61.5365, 59.8384, 58.1403, 56.4423, 54.7442, 53.0461, 51.348, 49.6499, 47.9518, 46.2537, 44.5556, 42.8575],
+          "write": [49.4576, 26.5981, 27.7486, 28.8991, 30.0495, 31.2, 32.3505, 33.501, 34.6515, 35.8019, 36.9524, 38.1029, 39.2534, 40.4038, 41.5543]
+        },
+        "noise": {
+          "read": {
+       "breaks": [39.257, 51.3413, 60.2069, 66.8815, 71.315, 74.2973, 80.8883, 95.1944, 109.6767, 125.0231, 140.3519, 155.6807, 171.0094, 186.25],
+       "heights": [15.3091, 41.4578, 73.6826, 139.5982, 235.125, 75.3357, 4.1241, 3.3834, 0, 0.0652, 0.0652, 0.0652, 0.3937]
+          }
+        },
+        "read_bw": [68.5425]
+      }
+    }
+
+Write
+'''''
+
+Same analysis for write operations.
+
+.. code:: R
+
+    griffon_write = df %>% filter(grepl("^Griffon", Cluster)) %>% filter(Operation == "Write") %>% select(Bwi)
+    dhist(1/griffon_write$Bwi)
+
+.. image:: fig/griffon_write_dhist.png
+
+.. code:: R
+
+    griffon_write_dhist = dhist(1/griffon_write$Bwi, plot=FALSE)
+    IO_INFO[["griffon"]][["noise"]][["write"]] = c(breaks=list(griffon_write_dhist$xbr), heights=list(unclass(griffon_write_dhist$heights)))
+    IO_INFO[["griffon"]][["write_bw"]] = mean(1/griffon_write$Bwi)
+    toJSON(IO_INFO, pretty = TRUE)
+
+::
+
+    Warning message:
+    In hist.default(x, breaks = cut.pt, plot = FALSE, probability = TRUE) :
+      argument 'probability' is not made use of
+
+    {
+      "griffon": {
+        "degradation": {
+          "read": [66.6308, 64.9327, 63.2346, 61.5365, 59.8384, 58.1403, 56.4423, 54.7442, 53.0461, 51.348, 49.6499, 47.9518, 46.2537, 44.5556, 42.8575],
+          "write": [49.4576, 26.5981, 27.7486, 28.8991, 30.0495, 31.2, 32.3505, 33.501, 34.6515, 35.8019, 36.9524, 38.1029, 39.2534, 40.4038, 41.5543]
+        },
+        "noise": {
+          "read": {
+       "breaks": [39.257, 51.3413, 60.2069, 66.8815, 71.315, 74.2973, 80.8883, 95.1944, 109.6767, 125.0231, 140.3519, 155.6807, 171.0094, 186.25],
+       "heights": [15.3091, 41.4578, 73.6826, 139.5982, 235.125, 75.3357, 4.1241, 3.3834, 0, 0.0652, 0.0652, 0.0652, 0.3937]
+          },
+          "write": {
+       "breaks": [5.2604, 21.0831, 31.4773, 39.7107, 45.5157, 50.6755, 54.4726, 59.7212, 67.8983, 81.2193, 95.6333, 111.5864, 127.8409, 144.3015],
+       "heights": [1.7064, 22.6168, 38.613, 70.8008, 84.4486, 128.5118, 82.3692, 39.1431, 9.2256, 5.6195, 1.379, 0.6429, 0.1549]
+          }
+        },
+        "read_bw": [68.5425],
+        "write_bw": [50.6045]
+      }
+    }
+
+Edel (SSD)
+^^^^^^^^^^
+
+This section presents the exactly same analysis for the Edel SSDs.
+
+Modeling resource sharing w/ concurrent access
+::::::::::::::::::::::::::::::::::::::::::::::
+
+Read
+''''
+
+Getting read data for Edel from 1 to 15 concurrent operations.
+
+.. code:: R
+
+    deg_edel = dfc %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Read")
+    model = loess(BW~Jobs, data = deg_edel)
+    IO_INFO[["edel"]][["degradation"]][["read"]] = predict(model,data.frame(Jobs=seq(1,15)))
+    toJSON(IO_INFO, pretty = TRUE)
+
+::
+
+
+    {
+      "griffon": {
+        "degradation": {
+          "read": [66.6308, 64.9327, 63.2346, 61.5365, 59.8384, 58.1403, 56.4423, 54.7442, 53.0461, 51.348, 49.6499, 47.9518, 46.2537, 44.5556, 42.8575],
+          "write": [49.4576, 26.5981, 27.7486, 28.8991, 30.0495, 31.2, 32.3505, 33.501, 34.6515, 35.8019, 36.9524, 38.1029, 39.2534, 40.4038, 41.5543]
+        },
+        "noise": {
+          "read": {
+       "breaks": [39.257, 51.3413, 60.2069, 66.8815, 71.315, 74.2973, 80.8883, 95.1944, 109.6767, 125.0231, 140.3519, 155.6807, 171.0094, 186.25],
+       "heights": [15.3091, 41.4578, 73.6826, 139.5982, 235.125, 75.3357, 4.1241, 3.3834, 0, 0.0652, 0.0652, 0.0652, 0.3937]
+          },
+          "write": {
+       "breaks": [5.2604, 21.0831, 31.4773, 39.7107, 45.5157, 50.6755, 54.4726, 59.7212, 67.8983, 81.2193, 95.6333, 111.5864, 127.8409, 144.3015],
+       "heights": [1.7064, 22.6168, 38.613, 70.8008, 84.4486, 128.5118, 82.3692, 39.1431, 9.2256, 5.6195, 1.379, 0.6429, 0.1549]
+          }
+        },
+        "read_bw": [68.5425],
+        "write_bw": [50.6045]
+      },
+      "edel": {
+        "degradation": {
+          "read": [150.5119, 167.4377, 182.2945, 195.1004, 205.8671, 214.1301, 220.411, 224.6343, 227.7141, 230.6843, 233.0923, 235.2027, 236.8369, 238.0249, 238.7515]
+        }
+      }
+    }
+
+Write
+'''''
+
+Same for write operations.
+
+.. code:: R
+
+    deg_edel = dfc %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Write") %>% filter(Jobs > 2)
+    mean_job_1 = dfc %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Write") %>% filter(Jobs == 1) %>% summarize(mean = mean(BW))
+    model = lm(BW~Jobs, data = deg_edel)
+    IO_INFO[["edel"]][["degradation"]][["write"]] = c(mean_job_1$mean, predict(model,data.frame(Jobs=seq(2,15))))
+    toJSON(IO_INFO, pretty = TRUE)
+
+::
+
+
+    {
+      "griffon": {
+        "degradation": {
+          "read": [66.6308, 64.9327, 63.2346, 61.5365, 59.8384, 58.1403, 56.4423, 54.7442, 53.0461, 51.348, 49.6499, 47.9518, 46.2537, 44.5556, 42.8575],
+          "write": [49.4576, 26.5981, 27.7486, 28.8991, 30.0495, 31.2, 32.3505, 33.501, 34.6515, 35.8019, 36.9524, 38.1029, 39.2534, 40.4038, 41.5543]
+        },
+        "noise": {
+          "read": {
+       "breaks": [39.257, 51.3413, 60.2069, 66.8815, 71.315, 74.2973, 80.8883, 95.1944, 109.6767, 125.0231, 140.3519, 155.6807, 171.0094, 186.25],
+       "heights": [15.3091, 41.4578, 73.6826, 139.5982, 235.125, 75.3357, 4.1241, 3.3834, 0, 0.0652, 0.0652, 0.0652, 0.3937]
+          },
+          "write": {
+       "breaks": [5.2604, 21.0831, 31.4773, 39.7107, 45.5157, 50.6755, 54.4726, 59.7212, 67.8983, 81.2193, 95.6333, 111.5864, 127.8409, 144.3015],
+       "heights": [1.7064, 22.6168, 38.613, 70.8008, 84.4486, 128.5118, 82.3692, 39.1431, 9.2256, 5.6195, 1.379, 0.6429, 0.1549]
+          }
+        },
+        "read_bw": [68.5425],
+        "write_bw": [50.6045]
+      },
+      "edel": {
+        "degradation": {
+          "read": [150.5119, 167.4377, 182.2945, 195.1004, 205.8671, 214.1301, 220.411, 224.6343, 227.7141, 230.6843, 233.0923, 235.2027, 236.8369, 238.0249, 238.7515],
+          "write": [132.2771, 170.174, 170.137, 170.1, 170.063, 170.026, 169.9889, 169.9519, 169.9149, 169.8779, 169.8408, 169.8038, 169.7668, 169.7298, 169.6927]
+        }
+      }
+    }
+
+Modeling read/write bandwidth variability
+:::::::::::::::::::::::::::::::::::::::::
+
+Read
+''''
+
+.. code:: R
+
+    edel_read = df %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Read") %>% select(Bwi)
+    dhist(1/edel_read$Bwi)
+
+.. image:: fig/edel_read_dhist.png
+
+Saving it to be exported in json format.
+
+.. code:: R
+
+    edel_read_dhist = dhist(1/edel_read$Bwi, plot=FALSE)
+    IO_INFO[["edel"]][["noise"]][["read"]] = c(breaks=list(edel_read_dhist$xbr), heights=list(unclass(edel_read_dhist$heights)))
+    IO_INFO[["edel"]][["read_bw"]] = mean(1/edel_read$Bwi)
+    toJSON(IO_INFO, pretty = TRUE)
+
+::
+
+    Warning message:
+    In hist.default(x, breaks = cut.pt, plot = FALSE, probability = TRUE) :
+      argument 'probability' is not made use of
+
+    {
+      "griffon": {
+        "degradation": {
+          "read": [66.6308, 64.9327, 63.2346, 61.5365, 59.8384, 58.1403, 56.4423, 54.7442, 53.0461, 51.348, 49.6499, 47.9518, 46.2537, 44.5556, 42.8575],
+          "write": [49.4576, 26.5981, 27.7486, 28.8991, 30.0495, 31.2, 32.3505, 33.501, 34.6515, 35.8019, 36.9524, 38.1029, 39.2534, 40.4038, 41.5543]
+        },
+        "noise": {
+          "read": {
+       "breaks": [39.257, 51.3413, 60.2069, 66.8815, 71.315, 74.2973, 80.8883, 95.1944, 109.6767, 125.0231, 140.3519, 155.6807, 171.0094, 186.25],
+       "heights": [15.3091, 41.4578, 73.6826, 139.5982, 235.125, 75.3357, 4.1241, 3.3834, 0, 0.0652, 0.0652, 0.0652, 0.3937]
+          },
+          "write": {
+       "breaks": [5.2604, 21.0831, 31.4773, 39.7107, 45.5157, 50.6755, 54.4726, 59.7212, 67.8983, 81.2193, 95.6333, 111.5864, 127.8409, 144.3015],
+       "heights": [1.7064, 22.6168, 38.613, 70.8008, 84.4486, 128.5118, 82.3692, 39.1431, 9.2256, 5.6195, 1.379, 0.6429, 0.1549]
+          }
+        },
+        "read_bw": [68.5425],
+        "write_bw": [50.6045]
+      },
+      "edel": {
+        "degradation": {
+          "read": [150.5119, 167.4377, 182.2945, 195.1004, 205.8671, 214.1301, 220.411, 224.6343, 227.7141, 230.6843, 233.0923, 235.2027, 236.8369, 238.0249, 238.7515],
+          "write": [132.2771, 170.174, 170.137, 170.1, 170.063, 170.026, 169.9889, 169.9519, 169.9149, 169.8779, 169.8408, 169.8038, 169.7668, 169.7298, 169.6927]
+        },
+        "noise": {
+          "read": {
+       "breaks": [104.1667, 112.3335, 120.5003, 128.6671, 136.8222, 144.8831, 149.6239, 151.2937, 154.0445, 156.3837, 162.3555, 170.3105, 178.3243],
+       "heights": [0.1224, 0.1224, 0.1224, 0.2452, 1.2406, 61.6128, 331.2201, 167.6488, 212.1086, 31.3996, 2.3884, 1.747]
+          }
+        },
+        "read_bw": [152.7139]
+      }
+    }
+
+Write
+'''''
+
+.. code:: R
+
+
+    edel_write = df %>% filter(grepl("^Edel", Cluster)) %>% filter(Operation == "Write") %>% select(Bwi)
+    dhist(1/edel_write$Bwi)
+
+.. image:: fig/edel_write_dhist.png
+
+Saving it to be exported later.
+
+.. code:: R
+
+    edel_write_dhist = dhist(1/edel_write$Bwi, plot=FALSE)
+    IO_INFO[["edel"]][["noise"]][["write"]] = c(breaks=list(edel_write_dhist$xbr), heights=list(unclass(edel_write_dhist$heights)))
+    IO_INFO[["edel"]][["write_bw"]] = mean(1/edel_write$Bwi)
+    toJSON(IO_INFO, pretty = TRUE)
+
+::
+
+    Warning message:
+    In hist.default(x, breaks = cut.pt, plot = FALSE, probability = TRUE) :
+      argument 'probability' is not made use of
+
+    {
+      "griffon": {
+        "degradation": {
+          "read": [66.6308, 64.9327, 63.2346, 61.5365, 59.8384, 58.1403, 56.4423, 54.7442, 53.0461, 51.348, 49.6499, 47.9518, 46.2537, 44.5556, 42.8575],
+          "write": [49.4576, 26.5981, 27.7486, 28.8991, 30.0495, 31.2, 32.3505, 33.501, 34.6515, 35.8019, 36.9524, 38.1029, 39.2534, 40.4038, 41.5543]
+        },
+        "noise": {
+          "read": {
+       "breaks": [39.257, 51.3413, 60.2069, 66.8815, 71.315, 74.2973, 80.8883, 95.1944, 109.6767, 125.0231, 140.3519, 155.6807, 171.0094, 186.25],
+       "heights": [15.3091, 41.4578, 73.6826, 139.5982, 235.125, 75.3357, 4.1241, 3.3834, 0, 0.0652, 0.0652, 0.0652, 0.3937]
+          },
+          "write": {
+       "breaks": [5.2604, 21.0831, 31.4773, 39.7107, 45.5157, 50.6755, 54.4726, 59.7212, 67.8983, 81.2193, 95.6333, 111.5864, 127.8409, 144.3015],
+       "heights": [1.7064, 22.6168, 38.613, 70.8008, 84.4486, 128.5118, 82.3692, 39.1431, 9.2256, 5.6195, 1.379, 0.6429, 0.1549]
+          }
+        },
+        "read_bw": [68.5425],
+        "write_bw": [50.6045]
+      },
+      "edel": {
+        "degradation": {
+          "read": [150.5119, 167.4377, 182.2945, 195.1004, 205.8671, 214.1301, 220.411, 224.6343, 227.7141, 230.6843, 233.0923, 235.2027, 236.8369, 238.0249, 238.7515],
+          "write": [132.2771, 170.174, 170.137, 170.1, 170.063, 170.026, 169.9889, 169.9519, 169.9149, 169.8779, 169.8408, 169.8038, 169.7668, 169.7298, 169.6927]
+        },
+        "noise": {
+          "read": {
+       "breaks": [104.1667, 112.3335, 120.5003, 128.6671, 136.8222, 144.8831, 149.6239, 151.2937, 154.0445, 156.3837, 162.3555, 170.3105, 178.3243],
+       "heights": [0.1224, 0.1224, 0.1224, 0.2452, 1.2406, 61.6128, 331.2201, 167.6488, 212.1086, 31.3996, 2.3884, 1.747]
+          },
+          "write": {
+       "breaks": [70.9593, 79.9956, 89.0654, 98.085, 107.088, 115.9405, 123.5061, 127.893, 131.083, 133.6696, 135.7352, 139.5932, 147.4736],
+       "heights": [0.2213, 0, 0.3326, 0.4443, 1.4685, 11.8959, 63.869, 110.286, 149.9741, 202.887, 80.8298, 9.0298]
+          }
+        },
+        "read_bw": [152.7139],
+        "write_bw": [131.7152]
+      }
+    }
+
+Exporting to JSON
+~~~~~~~~~~~~~~~~~
+
+Finally, let's save it to a file to be opened by our simulator.
+
+.. code:: R
+
+    json = toJSON(IO_INFO, pretty = TRUE)
+    cat(json, file="IO_noise.json")
+
+Injecting this data in SimGrid
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To mimic this behavior in SimGrid, we use two features in the platform
+description: non-linear sharing policy and bandwidth factors. For more
+details, please see the source code in ``tuto_disk.cpp``.
+
+Modeling resource sharing w/ concurrent access
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``set_sharing_policy`` method allows the user to set a callback to
+dynamically change the disk capacity. The callback is called each time
+SimGrid will share the disk between a set of I/O operations.
+
+The callback has access to the number of activities sharing the
+resource and its current capacity. It must return the new resource's
+capacity.
+
+.. code:: C++
+
+    static double disk_dynamic_sharing(double capacity, int n)
+    {
+       return capacity; //useless callback
+    }
+
+    auto* disk = host->create_disk("dump", 1e6, 1e6);
+    disk->set_sharing_policy(sg4::Disk::Operation::READ, sg4::Disk::SharingPolicy::NONLINEAR, &disk_dynamic_sharing);
+
+Modeling read/write bandwidth variability
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The noise in I/O operations can be obtained by applying a factor to
+the I/O bandwidth of the disk. This factor is applied when we update
+the remaining amount of bytes to be transferred, increasing or
+decreasing the effective disk bandwidth.
+
+The ``set_factor`` method allows the user to set a callback to
+dynamically change the factor to be applied for each I/O operation.
+The callback has access to size of the operation and its type (read or
+write). It must return a multiply factor (e.g. 1.0 for doing nothing).
+
+.. code:: C++
+
+    static double disk_variability(sg_size_t size, sg4::Io::OpType op)
+    {
+       return 1.0; //useless callback
+    }
+
+    auto* disk = host->create_disk("dump", 1e6, 1e6);
+    disk->set_factor_cb(&disk_variability);
+
+Running our simulation
+^^^^^^^^^^^^^^^^^^^^^^
+
+The binary was compiled in the provided docker container.
+
+.. code:: sh
+
+    ./tuto_disk > ./simgrid_disk.csv
+
+Analyzing the SimGrid results
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The figure below presents the results obtained by SimGrid.
+
+The experiment performs I/O operations, varying the number of
+concurrent operations from 1 to 15. We run only 20 simulations for
+each case.
+
+We can see that the graphics are quite similar to the ones obtained in
+the real platform.
+
+.. code:: R
+
+    sg_df = read.csv("./simgrid_disk.csv")
+    sg_df = sg_df %>% group_by(disk, op, flows) %>% mutate(bw=((size*flows)/elapsed)/10^6, method=if_else(disk=="edel" & op=="read", "loess", "lm"))
+    sg_dfd = sg_df %>% filter(flows==1 & op=="write") %>% group_by(disk, op, flows) %>% summarize(mean = mean(bw), sd = sd(bw), se=sd/sqrt(n()))
+
+    sg_df[sg_df$op=="write" & sg_df$flows ==1,]$method=""
+
+    ggplot(data=sg_df, aes(x=flows, y=bw, color=op)) + theme_bw() +
+        geom_point(alpha=.3) + 
+        geom_smooth(data=sg_df[sg_df$method=="loess",], color="black", method=loess,se=TRUE,fullrange=T) +
+        geom_smooth(data=sg_df[sg_df$method=="lm",], color="black", method=lm,se=TRUE) +
+        geom_errorbar(data=sg_dfd, aes(x=flows, y=mean, ymin=mean-2*se, ymax=mean+2*se),color="black",width=.6) +
+        facet_wrap(disk~op,ncol=2,scale="free_y")+ # ) + #
+        xlab("Number of concurrent operations") + ylab("Aggregated Bandwidth (MiB/s)")  + guides(color=FALSE)  + xlim(0,NA) + ylim(0,NA)
+
+.. image:: fig/simgrid_results.png
+
+Note: The variability in griffon read operation seems to decrease when
+we have more concurrent operations. This is a particularity of the
+griffon read speed profile and the elapsed time calculation.
+
+Given that:
+
+- Each point represents the time to perform the N I/O operations.
+
+- Griffon read speed decreases with the number of concurrent
+  operations.
+
+With 15 read operations:
+
+- At the beginning, every read gets the same bandwidth, about
+  42MiB/s.
+
+- We sample the noise in I/O operations, some will be faster than
+  others (e.g. factor > 1).
+
+When the first read operation finish:
+
+- We will recalculate the bandwidth sharing, now considering that we
+  have 14 active read operations. This will increase the bandwidth for
+  each operation (about 44MiB/s).
+
+- The remaining "slower" activities will be speed up.
+
+This behavior keeps happening until the end of the 15 operations,
+at each step, we speed up a little the slowest operations and
+consequently, decreasing the variability we see.
diff --git a/docs/source/tuto_disk/fig/edel_read_dhist.png b/docs/source/tuto_disk/fig/edel_read_dhist.png
new file mode 100644 (file)
index 0000000..d4f7dc7
Binary files /dev/null and b/docs/source/tuto_disk/fig/edel_read_dhist.png differ
diff --git a/docs/source/tuto_disk/fig/edel_write_dhist.png b/docs/source/tuto_disk/fig/edel_write_dhist.png
new file mode 100644 (file)
index 0000000..22b8c9d
Binary files /dev/null and b/docs/source/tuto_disk/fig/edel_write_dhist.png differ
diff --git a/docs/source/tuto_disk/fig/griffon_deg.png b/docs/source/tuto_disk/fig/griffon_deg.png
new file mode 100644 (file)
index 0000000..c1d1f3e
Binary files /dev/null and b/docs/source/tuto_disk/fig/griffon_deg.png differ
diff --git a/docs/source/tuto_disk/fig/griffon_read_dhist.png b/docs/source/tuto_disk/fig/griffon_read_dhist.png
new file mode 100644 (file)
index 0000000..5bf99f6
Binary files /dev/null and b/docs/source/tuto_disk/fig/griffon_read_dhist.png differ
diff --git a/docs/source/tuto_disk/fig/griffon_write_dhist.png b/docs/source/tuto_disk/fig/griffon_write_dhist.png
new file mode 100644 (file)
index 0000000..b563365
Binary files /dev/null and b/docs/source/tuto_disk/fig/griffon_write_dhist.png differ
diff --git a/docs/source/tuto_disk/fig/simgrid_results.png b/docs/source/tuto_disk/fig/simgrid_results.png
new file mode 100644 (file)
index 0000000..6910129
Binary files /dev/null and b/docs/source/tuto_disk/fig/simgrid_results.png differ
diff --git a/docs/source/tuto_disk/init.el b/docs/source/tuto_disk/init.el
new file mode 100644 (file)
index 0000000..2129abf
--- /dev/null
@@ -0,0 +1,62 @@
+
+(package-initialize)
+(add-to-list 'package-archives
+                '("gnu" . "https://elpa.gnu.org/packages/"))
+(add-to-list 'package-archives
+                '("melpa-stable" . "https://stable.melpa.org/packages/"))
+(add-to-list 'package-archives
+                '("melpa" . "https://melpa.org/packages/"))
+(add-to-list 'load-path "/source/ox-rst.git/")
+(setq package-archive-priorities '(("melpa-stable" . 100)
+                                   ("melpa" . 50)
+                                   ("gnu" . 10)))
+
+(require 'org)
+(require 'ox-rst)
+
+(defun auto-fill-mode-on () (TeX-PDF-mode 1))
+(add-hook 'tex-mode-hook 'TeX-PDF-mode-on)
+(add-hook 'latex-mode-hook 'TeX-PDF-mode-on)
+(setq TeX-PDF-mode t)
+
+(defun auto-fill-mode-on () (auto-fill-mode 1))
+(add-hook 'text-mode-hook 'auto-fill-mode-on)
+(add-hook 'emacs-lisp-mode 'auto-fill-mode-on)
+(add-hook 'tex-mode-hook 'auto-fill-mode-on)
+(add-hook 'latex-mode-hook 'auto-fill-mode-on)
+
+(global-set-key (kbd "C-c l") 'org-store-link)
+
+;; In org-mode 9 you need to have #+PROPERTY: header-args :eval never-export 
+;; in the beginning or your document to tell org-mode not to evaluate every 
+;; code block every time you export.
+(setq org-confirm-babel-evaluate nil) ;; Do not ask for confirmation all the time!!
+
+
+(org-babel-do-load-languages
+ 'org-babel-load-languages
+ '(
+   (emacs-lisp . t)
+   (shell . t)
+   (python . t)
+   (R . t)
+   (ruby . t)
+   (ocaml . t)
+   (ditaa . t)
+   (dot . t)
+   (octave . t)
+   (sqlite . t)
+   (perl . t)
+   (screen . t)
+   (plantuml . t)
+   (lilypond . t)
+   (org . t)
+   (makefile . t)
+   ))
+(setq org-src-preserve-indentation t)
+
+(add-hook 'org-babel-after-execute-hook 'org-display-inline-images) 
+(add-hook 'org-mode-hook 'org-display-inline-images)
+(add-hook 'org-mode-hook 'org-babel-result-hide-all)
+
+(global-set-key (kbd "C-c S-t") 'org-babel-execute-subtree)
diff --git a/docs/source/tuto_disk/tuto_disk.cpp b/docs/source/tuto_disk/tuto_disk.cpp
new file mode 100644 (file)
index 0000000..d64b98f
--- /dev/null
@@ -0,0 +1,175 @@
+/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This tutorial presents how to faithful emulate disk operation in SimGrid
+ */
+
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/ptree.hpp>
+#include <random>
+#include <simgrid/s4u.hpp>
+
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(disk_test, "Messages specific for this simulation");
+
+/** @brief Calculates the bandwidth for disk doing async operations */
+static void estimate_bw(const sg4::Disk* disk, int n, int n_flows, bool read)
+{
+  unsigned long long size = 100000;
+  double cur_time         = sg4::Engine::get_clock();
+  std::vector<sg4::IoPtr> activities;
+  for (int i = 0; i < n_flows; i++) {
+    sg4::IoPtr act;
+    if (read)
+      act = disk->read_async(size);
+    else
+      act = disk->write_async(size);
+
+    activities.push_back(act);
+  }
+
+  for (const auto& act : activities)
+    act->wait();
+
+  double elapsed_time = sg4::Engine::get_clock() - cur_time;
+  printf("%s,%s,%d,%d,%d,%lf\n", disk->get_cname(), read ? "read" : "write", n, n_flows, size, elapsed_time);
+}
+
+static void host()
+{
+  /* - Estimating bw for each disk and considering concurrent flows */
+  for (int i = 0; i < 20; i++) {
+    for (int flows = 1; flows <= 15; flows++) {
+      for (auto* disk : sg4::Host::current()->get_disks()) {
+        estimate_bw(disk, i, flows, true);
+        estimate_bw(disk, i, flows, false);
+      }
+    }
+  }
+}
+
+/*************************************************************************************************/
+/** @brief Auxiliary class to generate noise in disk operations */
+class DiskNoise {
+  double bw_;
+  std::vector<double> breaks_;
+  std::vector<double> heights_;
+  std::mt19937& gen_;
+
+public:
+  DiskNoise(double capacity, std::mt19937& gen, const std::vector<double>& b, const std::vector<double> h)
+      : bw_(capacity), breaks_(b), heights_(h), gen_(gen)
+  {
+  }
+  double operator()(sg_size_t /*size*/) const
+  {
+    std::piecewise_constant_distribution<double> d(breaks_.begin(), breaks_.end(), heights_.begin());
+    auto value = d(gen_);
+    return value / bw_;
+  }
+};
+
+/** @brief Auxiliary method to get list of values from json in a vector */
+static std::vector<double> get_list_from_json(const boost::property_tree::ptree& pt, const std::string& path)
+{
+  std::vector<double> v;
+  for (const auto& it : pt.get_child(path)) {
+    double value = it.second.get_value<double>();
+    v.push_back(value * 1e6);
+  }
+  return v;
+}
+/*************************************************************************************************/
+/**
+ * @brief Non-linear resource callback for disks
+ *
+ * @param degradation Vector with effective read/write bandwidth
+ * @param capacity Resource current capacity in SimGrid
+ * @param n Number of activities sharing this resource
+ */
+static double disk_dynamic_sharing(const std::vector<double>& degradation, double capacity, int n)
+{
+  n--;
+  if (n >= degradation.size())
+    return capacity;
+  return degradation[n];
+}
+
+/**
+ * @brief Noise for I/O operations
+ *
+ * @param data Map with noise information
+ * @param size I/O size in bytes
+ * @param op I/O operation: read/write
+ */
+static double disk_variability(const std::unordered_map<sg4::Io::OpType, DiskNoise>& data, sg_size_t size,
+                               sg4::Io::OpType op)
+{
+  auto it = data.find(op);
+  if (it == data.end())
+    return 1.0;
+  double value = it->second(size);
+  return value;
+}
+
+/** @brief Creates a disk */
+static void create_disk(sg4::Host* host, std::mt19937& gen, const std::string& disk_name,
+                        const boost::property_tree::ptree& pt)
+{
+  double read_bw                = pt.get_child("read_bw").begin()->second.get_value<double>() * 1e6;
+  double write_bw               = pt.get_child("write_bw").begin()->second.get_value<double>() * 1e6;
+  auto* disk                    = host->create_disk(disk_name, read_bw, write_bw);
+  std::vector<double> read_deg  = get_list_from_json(pt, "degradation.read");
+  std::vector<double> write_deg = get_list_from_json(pt, "degradation.write");
+
+  /* get maximum possible disk speed for read/write disk constraint */
+  double max_bw = std::max(*std::max_element(read_deg.begin(), read_deg.end()),
+                           *std::max_element(write_deg.begin(), write_deg.end()));
+  disk->set_readwrite_bandwidth(max_bw);
+
+  disk->set_sharing_policy(sg4::Disk::Operation::READ, sg4::Disk::SharingPolicy::NONLINEAR,
+                           std::bind(&disk_dynamic_sharing, read_deg, std::placeholders::_1, std::placeholders::_2));
+  disk->set_sharing_policy(sg4::Disk::Operation::WRITE, sg4::Disk::SharingPolicy::NONLINEAR,
+                           std::bind(&disk_dynamic_sharing, write_deg, std::placeholders::_1, std::placeholders::_2));
+  /* this is the default behavior, expliciting only to make it clearer */
+  disk->set_sharing_policy(sg4::Disk::Operation::READWRITE, sg4::Disk::SharingPolicy::LINEAR);
+
+  /* configuring variability */
+  DiskNoise read_noise(read_bw, gen, get_list_from_json(pt, "noise.read.breaks"),
+                       get_list_from_json(pt, "noise.read.heights"));
+  DiskNoise write_noise(write_bw, gen, get_list_from_json(pt, "noise.write.breaks"),
+                        get_list_from_json(pt, "noise.write.heights"));
+
+  std::unordered_map<sg4::Io::OpType, DiskNoise> noise{{sg4::Io::OpType::READ, read_noise},
+                                                       {sg4::Io::OpType::WRITE, write_noise}};
+  disk->set_factor_cb(std::bind(&disk_variability, noise, std::placeholders::_1, std::placeholders::_2));
+  disk->seal();
+}
+
+/*************************************************************************************************/
+int main(int argc, char** argv)
+{
+  sg4::Engine e(&argc, argv);
+  std::mt19937 gen(42);
+  /* simple platform containing 1 host and 2 disk */
+  auto* zone = sg4::create_full_zone("bob_zone");
+  auto* bob  = zone->create_host("bob", 1e6);
+  std::ifstream jsonFile("IO_noise.json");
+  boost::property_tree::ptree pt;
+  boost::property_tree::read_json(jsonFile, pt);
+  for (const auto& it : pt.get_child("")) {
+    create_disk(bob, gen, it.first, it.second);
+  }
+  zone->seal();
+
+  sg4::Actor::create("", bob, host);
+
+  printf("disk,op,n,flows,size,elapsed\n");
+
+  e.run();
+
+  return 0;
+}
index 3e9afb7..ecc2cc4 100644 (file)
@@ -1,14 +1,17 @@
 #!/usr/bin/env Rscript
 args = commandArgs(trailingOnly=TRUE)
-library(ggplot2)
+library(tidyverse)
 library(pajengr)
 
 # Load and relabel the data
 df = pajeng_read(args[1])
-names(df$state) = c("Type", "Actor", "Container", "Start", "End", "Duration", "Level", "State")
-
-# Actually draw the graph
-p = ggplot(df$state) + geom_segment(aes(x=Start, xend=End, y=Actor, yend=Actor,color=State), size=5)
+df$state %>%
+    # rename some columns to use simgrid terminology
+    rename(Actor = Container,
+           State = Value) %>%
+    # do the plot
+    ggplot() +
+    geom_segment(aes(x=Start, xend=End, y=Actor, yend=Actor, color=State), size=5) -> p
 
 # Cosmetics to compact the resulting graph
 p.height <- length(unique(df$state$Actor)) * 0.05 + 2
index 950e809..92a14d6 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "stdio.h"
 #include "mpi.h"
 
index 1227018..17d558e 100644 (file)
Binary files a/docs/source/tuto_smpi/img/lu.S.4.png and b/docs/source/tuto_smpi/img/lu.S.4.png differ
index 53f523b..2422dc2 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2018-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include <mpi.h>
 #include <stdio.h>
 #include <stdlib.h>
index 70c0359..d55b6e2 100644 (file)
@@ -124,7 +124,7 @@ Starting and Stopping Actors
 
           This file is not really interesting: the important matter is in the XML file.
 
-      .. example-tab:: examples/c/actor-lifetime/actor-lifetime.c
+       .. example-tab:: examples/c/actor-lifetime/actor-lifetime.c
 
           This file is not really interesting: the important matter is in the XML file.
 
@@ -313,7 +313,7 @@ Communications on the Network
 
       .. example-tab:: examples/c/comm-wait/comm-wait.c
 
-         See also :cpp:func:`sg_mailbox_put_async()` and :cpp:func:`sg_comm__wait()`.
+         See also :cpp:func:`sg_mailbox_put_async()` and :cpp:func:`sg_comm_wait()`.
 
  - **Waiting for communications with timeouts:**
    This example is very similar to the previous one, simply adding how to declare timeouts when waiting on asynchronous communication.
@@ -322,7 +322,7 @@ Communications on the Network
 
       .. example-tab:: examples/cpp/comm-waituntil/s4u-comm-waituntil.cpp
 
-         See also :cpp:func:`simgrid::s4u::Mailbox::wait_until()` and :cpp:func:`simgrid::s4u::Comm::wait_for()`.
+         See also :cpp:func:`simgrid::s4u::Activity::wait_until()` and :cpp:func:`simgrid::s4u::Comm::wait_for()`.
 
  - **Suspending communications:**
    The ``suspend()`` and ``resume()`` functions allow to block the
@@ -607,10 +607,9 @@ Interacting with the Platform
 
       .. example-tab:: examples/c/platform-properties/platform-properties.c
 
-         - :cpp:func:`sg_actor_get_property()` and :cpp:func:`sg_actor_set_property()`
-         - :cpp:func:`sg_host_get_property()` and :cpp:func:sg_host_set_property()`
-         - :cpp:func:`sg_link_get_property()` and :cpp:func:`sg_link_set_property()`
-         - :cpp:func:`sg_link_get_property()` and :cpp:func:`sg_link_set_property()`
+         - :cpp:func:`sg_actor_get_property_value()`
+         - :cpp:func:`sg_host_get_property_value()` and :cpp:func:sg_host_set_property_value()`
+         - :cpp:func:`sg_zone_get_property_value()` and :cpp:func:`sg_zone_set_property_value()`
 
       .. group-tab:: XML
 
@@ -1090,11 +1089,3 @@ SimGrid is slower and may be less robust when MC is enabled.
 .. |br| raw:: html
 
    <br />
-
-.. |cpp| image:: /img/lang_cpp.png
-   :align: middle
-   :width: 12
-
-.. |py| image:: /img/lang_python.png
-   :align: middle
-   :width: 12
diff --git a/examples/c/actor-create/.gitignore b/examples/c/actor-create/.gitignore
deleted file mode 100644 (file)
index c6a8ca4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-actor-create-c
index 4420cd6..b105514 100644 (file)
@@ -25,7 +25,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(actor_yield, "Messages specific for this example");
 static void yielder(int argc, char* argv[])
 {
   xbt_assert(argc == 2, "The sender function expects 1 arguments from the XML deployment file");
-  long number_of_yields = xbt_str_parse_int(argv[1], "Invalid amount of yields: %s"); /* - number of yields */
+  long number_of_yields = xbt_str_parse_int(argv[1], "Invalid amount of yields");
 
   for (int i = 0; i < number_of_yields; i++)
     sg_actor_yield();
index 8b00e05..32f66ab 100644 (file)
@@ -83,10 +83,10 @@ void peer(int argc, char* argv[])
   xbt_assert(argc == 3 || argc == 4, "Wrong number of arguments");
 
   // Build peer object
-  peer_t peer = peer_init((int)xbt_str_parse_int(argv[1], "Invalid ID: %s"), argc == 4 ? 1 : 0);
+  peer_t peer = peer_init((int)xbt_str_parse_int(argv[1], "Invalid ID"), argc == 4 ? 1 : 0);
 
   // Retrieve deadline
-  peer->deadline = xbt_str_parse_double(argv[2], "Invalid deadline: %s");
+  peer->deadline = xbt_str_parse_double(argv[2], "Invalid deadline");
   xbt_assert(peer->deadline > 0, "Wrong deadline supplied");
 
   char* status = xbt_malloc0(FILE_PIECES + 1);
index 48f2d5a..340ac61 100644 (file)
@@ -30,7 +30,7 @@ void tracker(int argc, char* argv[])
   // Checking arguments
   xbt_assert(argc == 2, "Wrong number of arguments for the tracker.");
   // Retrieving end time
-  double deadline = xbt_str_parse_double(argv[1], "Invalid deadline: %s");
+  double deadline = xbt_str_parse_double(argv[1], "Invalid deadline");
   xbt_assert(deadline > 0, "Wrong deadline supplied");
 
   // Building peers array
index 8c88dca..801df69 100644 (file)
@@ -75,7 +75,7 @@ void broadcaster(int argc, char* argv[])
 {
   XBT_DEBUG("broadcaster");
   xbt_assert(argc > 2);
-  unsigned int host_count = (unsigned int)xbt_str_parse_int(argv[1], "Invalid number of peers: %s");
+  unsigned int host_count = (unsigned int)xbt_str_parse_int(argv[1], "Invalid number of peers");
 
   sg_mailbox_t* mailboxes = xbt_malloc(sizeof(sg_mailbox_t) * host_count);
 
@@ -86,7 +86,7 @@ void broadcaster(int argc, char* argv[])
     free(name);
   }
 
-  unsigned int piece_count = (unsigned int)xbt_str_parse_int(argv[2], "Invalid number of pieces: %s");
+  unsigned int piece_count = (unsigned int)xbt_str_parse_int(argv[2], "Invalid number of pieces");
 
   broadcaster_t bc = broadcaster_init(mailboxes, host_count, piece_count);
 
index 3161dd4..022e851 100644 (file)
@@ -30,7 +30,7 @@ static void peer_forward_file(peer_t p)
     p->pending_recvs[nb_pending_recvs] = sg_mailbox_get_async(p->me, &received);
     nb_pending_recvs++;
 
-    int idx = sg_comm_wait_any(p->pending_recvs, nb_pending_recvs);
+    ssize_t idx = sg_comm_wait_any(p->pending_recvs, nb_pending_recvs);
     if (idx != -1) {
       XBT_DEBUG("Peer %s got a 'SEND_DATA' message", sg_mailbox_get_name(p->me));
       /* move the last pending comm where the finished one was, and decrement */
index a7df2d8..c81825a 100644 (file)
@@ -21,10 +21,10 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(app_masterworker, "Messages specific for this examp
 static void master(int argc, char* argv[])
 {
   xbt_assert(argc == 5, "The master function expects 4 arguments from the XML deployment file");
-  long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");       /* - Number of tasks      */
-  double comp_size     = xbt_str_parse_double(argv[2], "Invalid computational size: %s"); /* - Compute cost    */
-  long comm_size       = xbt_str_parse_int(argv[3], "Invalid communication size: %s");    /* - Communication size */
-  long workers_count   = xbt_str_parse_int(argv[4], "Invalid amount of workers: %s");     /* - Number of workers    */
+  long number_of_tasks = xbt_str_parse_int(argv[1], "Invalid amount of tasks");       /* - Number of tasks      */
+  double comp_size     = xbt_str_parse_double(argv[2], "Invalid computational size"); /* - Compute cost    */
+  long comm_size       = xbt_str_parse_int(argv[3], "Invalid communication size");    /* - Communication size */
+  long workers_count   = xbt_str_parse_int(argv[4], "Invalid amount of workers");     /* - Number of workers    */
 
   XBT_INFO("Got %ld workers and %ld tasks to process", workers_count, number_of_tasks);
 
@@ -62,7 +62,7 @@ static void worker(int argc, char* argv[])
              "The worker expects a single argument from the XML deployment file: its worker ID (its numerical rank)");
   char mailbox_name[80];
 
-  long id = xbt_str_parse_int(argv[1], "Invalid argument %s");
+  long id = xbt_str_parse_int(argv[1], "Invalid argument");
 
   snprintf(mailbox_name, 79, "worker-%ld", id);
   sg_mailbox_t mailbox = sg_mailbox_by_name(mailbox_name);
index 6046f63..0d9eafd 100644 (file)
@@ -23,7 +23,7 @@ static void relay_runner(int argc, char* argv[])
   xbt_assert(argc == 0, "The relay_runner function does not accept any parameter from the XML deployment file");
 
   const char* name = sg_actor_self_get_name();
-  int rank         = (int)xbt_str_parse_int(name, "Any actor of this example must have a numerical name, not %s");
+  int rank         = (int)xbt_str_parse_int(name, "Any actor of this example must have a numerical name");
 
   sg_mailbox_t my_mailbox = sg_mailbox_by_name(name);
 
index 8f68d1d..802b90d 100644 (file)
@@ -19,10 +19,11 @@ $ ${bindir:=.}/c-app-token-ring ${platfdir}/routing_cluster.xml "--log=root.fmt:
 $ ${bindir:=.}/c-app-token-ring ${platfdir}/two_peers.xml "--log=root.fmt:[%12.6r]%e(%a@%h)%e%m%n"
 > [    0.000000] (maestro@) Number of hosts '2'
 > [    0.000000] (0@100030591) Host "0" send 'Token' to Host "1"
-> [    0.624423] (1@100036570) Host "1" received "Token"
-> [    0.624423] (1@100036570) Host "1" send 'Token' to Host "0"
-> [    1.248846] (0@100030591) Host "0" received "Token"
-> [    1.248846] (maestro@) Simulation time 1.24885
+> [    0.625106] (1@100036570) Host "1" received "Token"
+> [    0.625106] (1@100036570) Host "1" send 'Token' to Host "0"
+> [    1.250212] (0@100030591) Host "0" received "Token"
+> [    1.250212] (maestro@) Simulation time 1.25021
+
 
 $ ${bindir:=.}/c-app-token-ring ${platfdir}/meta_cluster.xml "--log=root.fmt:[%10.6r]%e(%a@%h)%e%m%n"
 > [  0.000000] (maestro@) Number of hosts '60'
index fd5fd66..0cccf01 100644 (file)
@@ -19,9 +19,9 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(cloud_capping, "Messages specific for this example"
 static void worker_main(int argc, char* argv[])
 {
   xbt_assert(argc == 4);
-  double computation_amount = xbt_str_parse_double(argv[1], "Invalid computation amount: %s");
-  int use_bound             = !!xbt_str_parse_int(argv[2], "Second parameter (use_bound) should be 0 or 1 but is: %s");
-  double bound              = xbt_str_parse_double(argv[3], "Invalid bound: %s");
+  double computation_amount = xbt_str_parse_double(argv[1], "Invalid computation amount");
+  int use_bound             = !!xbt_str_parse_int(argv[2], "Second parameter (use_bound) should be 0 or 1 but is");
+  double bound              = xbt_str_parse_double(argv[3], "Invalid bound");
 
   double clock_sta = simgrid_get_clock();
 
index 9e903db..9b39c6a 100644 (file)
@@ -20,10 +20,10 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(comm_wait, "Messages specific for this example");
 static void sender(int argc, char* argv[])
 {
   xbt_assert(argc == 5, "The sender function expects 4 arguments from the XML deployment file");
-  long messages_count     = xbt_str_parse_int(argv[1], "Invalid amount of messages: %s");  /* - number of messages */
-  long message_size       = xbt_str_parse_int(argv[2], "Invalid message size: %s");        /* - communication cost */
-  double sleep_start_time = xbt_str_parse_double(argv[3], "Invalid sleep start time: %s"); /* - start time */
-  double sleep_test_time  = xbt_str_parse_double(argv[4], "Invalid test time: %s");        /* - test time */
+  long messages_count     = xbt_str_parse_int(argv[1], "Invalid amount of messages");  /* - number of messages */
+  long message_size       = xbt_str_parse_int(argv[2], "Invalid message size");        /* - communication cost */
+  double sleep_start_time = xbt_str_parse_double(argv[3], "Invalid sleep start time"); /* - start time */
+  double sleep_test_time  = xbt_str_parse_double(argv[4], "Invalid test time");        /* - test time */
 
   XBT_INFO("sleep_start_time : %f , sleep_test_time : %f", sleep_start_time, sleep_test_time);
   sg_mailbox_t mailbox = sg_mailbox_by_name("receiver");
@@ -53,8 +53,8 @@ static void sender(int argc, char* argv[])
 static void receiver(int argc, char* argv[])
 {
   xbt_assert(argc == 3, "The relay_runner function does not accept any parameter from the XML deployment file");
-  double sleep_start_time = xbt_str_parse_double(argv[1], "Invalid sleep start parameter: %s"); /* - start time */
-  double sleep_test_time  = xbt_str_parse_double(argv[2], "Invalid sleep test parameter: %s");  /* - test time */
+  double sleep_start_time = xbt_str_parse_double(argv[1], "Invalid sleep start parameter"); /* - start time */
+  double sleep_test_time  = xbt_str_parse_double(argv[2], "Invalid sleep test parameter");  /* - test time */
   XBT_INFO("sleep_start_time : %f , sleep_test_time : %f", sleep_start_time, sleep_test_time);
 
   sg_actor_sleep_for(sleep_start_time); /* This actor first sleeps for "start time" seconds.  */
index a7d67a8..d095ce8 100644 (file)
@@ -20,9 +20,9 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(comm_waitall, "Messages specific for this msg examp
 static void sender(int argc, char* argv[])
 {
   xbt_assert(argc == 4, "This function expects 3 parameters from the XML deployment file");
-  long messages_count  = xbt_str_parse_int(argv[1], "Invalid message count: %s");
-  long message_size    = xbt_str_parse_int(argv[2], "Invalid message size: %s");
-  long receivers_count = xbt_str_parse_int(argv[3], "Invalid amount of receivers: %s");
+  long messages_count  = xbt_str_parse_int(argv[1], "Invalid message count");
+  long message_size    = xbt_str_parse_int(argv[2], "Invalid message size");
+  long receivers_count = xbt_str_parse_int(argv[3], "Invalid amount of receivers");
   xbt_assert(receivers_count > 0);
 
   /* Array in which we store all ongoing communications */
@@ -70,7 +70,7 @@ static void sender(int argc, char* argv[])
 static void receiver(int argc, char* argv[])
 {
   xbt_assert(argc == 2, "Expecting one parameter from the XML deployment file but got %d", argc);
-  int id = (int)xbt_str_parse_int(argv[1], "ID should be numerical, not %s");
+  int id = (int)xbt_str_parse_int(argv[1], "ID should be numerical");
   char mailbox_name[80];
   snprintf(mailbox_name, 79, "receiver-%d", id);
   sg_mailbox_t mbox = sg_mailbox_by_name(mailbox_name);
index 96a23ab..e5c030f 100644 (file)
@@ -19,9 +19,9 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(comm_waitany, "Messages specific for this example")
 static void sender(int argc, char* argv[])
 {
   xbt_assert(argc == 4, "Expecting 3 parameters from the XML deployment file but got %d", argc);
-  long messages_count  = xbt_str_parse_int(argv[1], "Invalid message count: %s");
-  long msg_size        = xbt_str_parse_int(argv[2], "Invalid message size: %s");
-  long receivers_count = xbt_str_parse_int(argv[3], "Invalid amount of receivers: %s");
+  long messages_count  = xbt_str_parse_int(argv[1], "Invalid message count");
+  long msg_size        = xbt_str_parse_int(argv[2], "Invalid message size");
+  long receivers_count = xbt_str_parse_int(argv[3], "Invalid amount of receivers");
   xbt_assert(receivers_count > 0);
 
   /* Array in which we store all ongoing communications */
@@ -64,13 +64,13 @@ static void sender(int argc, char* argv[])
    * Even in this simple example, the pending comms do not terminate in the exact same order of creation.
    */
   while (pending_comms_count != 0) {
-    int changed_pos = sg_comm_wait_any(pending_comms, pending_comms_count);
+    ssize_t changed_pos = sg_comm_wait_any(pending_comms, pending_comms_count);
     memmove(pending_comms + changed_pos, pending_comms + changed_pos + 1,
             sizeof(sg_comm_t) * (pending_comms_count - changed_pos - 1));
     pending_comms_count--;
 
     if (changed_pos != 0)
-      XBT_INFO("Remove the %dth pending comm: it terminated earlier than another comm that was initiated first.",
+      XBT_INFO("Remove the %zdth pending comm: it terminated earlier than another comm that was initiated first.",
                changed_pos);
   }
 
@@ -83,7 +83,7 @@ static void sender(int argc, char* argv[])
 static void receiver(int argc, char* argv[])
 {
   xbt_assert(argc == 2, "Expecting one parameter from the XML deployment file but got %d", argc);
-  int id = (int)xbt_str_parse_int(argv[1], "ID should be numerical, not %s");
+  int id = (int)xbt_str_parse_int(argv[1], "ID should be numerical");
   char mailbox_name[80];
   snprintf(mailbox_name, 79, "receiver-%d", id);
   sg_mailbox_t mbox = sg_mailbox_by_name(mailbox_name);
index 0c1f981..45c1826 100644 (file)
@@ -447,7 +447,7 @@ static void node(int argc, char* argv[])
   double deadline;
   xbt_assert(argc == 3 || argc == 5, "Wrong number of arguments for this node");
   s_node_t node         = {0};
-  node.id               = (int)xbt_str_parse_int(argv[1], "Invalid ID: %s");
+  node.id               = (int)xbt_str_parse_int(argv[1], "Invalid ID");
   node.known_id         = -1;
   node.ready            = -1;
   node.pending_messages = xbt_dynar_new(sizeof(pastry_message_t), NULL);
@@ -469,14 +469,14 @@ static void node(int argc, char* argv[])
 
   if (argc == 3) { // first ring
     XBT_DEBUG("Hey! Let's create the system.");
-    deadline   = xbt_str_parse_double(argv[2], "Invalid deadline: %s");
+    deadline   = xbt_str_parse_double(argv[2], "Invalid deadline");
     node.ready = 0;
     XBT_DEBUG("Create a new Pastry ring...");
     join_success = 1;
   } else {
-    node.known_id     = (int)xbt_str_parse_int(argv[2], "Invalid known ID: %s");
-    double sleep_time = xbt_str_parse_double(argv[3], "Invalid sleep time: %s");
-    deadline          = xbt_str_parse_double(argv[4], "Invalid deadline: %s");
+    node.known_id     = (int)xbt_str_parse_int(argv[2], "Invalid known ID");
+    double sleep_time = xbt_str_parse_double(argv[3], "Invalid sleep time");
+    deadline          = xbt_str_parse_double(argv[4], "Invalid deadline");
 
     // sleep before starting
     XBT_DEBUG("Let's sleep during %f", sleep_time);
@@ -522,13 +522,13 @@ int main(int argc, char* argv[])
   while (!strncmp(options[0], "-", 1)) {
     int length = strlen("-nb_bits=");
     if (!strncmp(options[0], "-nb_bits=", length) && strlen(options[0]) > length) {
-      nb_bits = (int)xbt_str_parse_int(options[0] + length, "Invalid nb_bits parameter: %s");
+      nb_bits = (int)xbt_str_parse_int(options[0] + length, "Invalid nb_bits parameter");
       XBT_DEBUG("Set nb_bits to %d", nb_bits);
     } else {
       length = strlen("-timeout=");
       xbt_assert(strncmp(options[0], "-timeout=", length) == 0 && strlen(options[0]) > length,
                  "Invalid pastry option '%s'", options[0]);
-      timeout = (int)xbt_str_parse_int(options[0] + length, "Invalid timeout parameter: %s");
+      timeout = (int)xbt_str_parse_int(options[0] + length, "Invalid timeout parameter");
       XBT_DEBUG("Set timeout to %d", timeout);
     }
     options++;
diff --git a/examples/c/energy-vm/.gitignore b/examples/c/energy-vm/.gitignore
deleted file mode 100644 (file)
index 59c6fd4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-energy_vm
index d168f17..ecdf06e 100644 (file)
@@ -14,7 +14,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(exec_basic, "Messages specific for this example");
 
 static void executor(int argc, char* argv[])
 {
-  /* sg_actor_self_execute() tells SimGrid to pause the calling actor
+  /* sg_actor_execute() tells SimGrid to pause the calling actor
    * until its host has computed the amount of flops passed as a parameter */
   sg_actor_execute(98095);
   XBT_INFO("Done.");
@@ -24,7 +24,7 @@ static void executor(int argc, char* argv[])
 
 static void privileged(int argc, char* argv[])
 {
-  /* sg_actor_self_execute_with_priority() specifies that this execution gets a larger share of the resource.
+  /* sg_actor_execute_with_priority() specifies that this execution gets a larger share of the resource.
    *
    * Since the priority is 2, it computes twice as fast as a regular one.
    *
index 405d494..afe68b1 100644 (file)
@@ -17,8 +17,8 @@ static void dvfs(int argc, char* argv[])
 {
   sg_host_t host = sg_host_self();
 
-  int nb = sg_host_get_nb_pstates(host);
-  XBT_INFO("Count of Processor states=%d", nb);
+  unsigned long nb = sg_host_get_nb_pstates(host);
+  XBT_INFO("Count of Processor states=%lu", nb);
 
   double current_peak = sg_host_get_speed(host);
   XBT_INFO("Current power peak=%f", current_peak);
@@ -29,12 +29,12 @@ static void dvfs(int argc, char* argv[])
   XBT_INFO("Task1 simulation time: %e", task_time);
 
   // Change power peak
-  int new_pstate = 2;
-  xbt_assert(new_pstate < nb, "Cannot set the host %s at pstate %d because it only provides %d pstates.",
+  unsigned long new_pstate = 2;
+  xbt_assert(new_pstate < nb, "Cannot set the host %s at pstate %lu because it only provides %lu pstates.",
              sg_host_get_name(host), new_pstate, nb);
 
   double peak_at = sg_host_get_pstate_speed(host, new_pstate);
-  XBT_INFO("Changing power peak value to %f (at index %d)", peak_at, new_pstate);
+  XBT_INFO("Changing power peak value to %f (at index %lu)", peak_at, new_pstate);
 
   sg_host_set_pstate(host, new_pstate);
 
@@ -48,8 +48,8 @@ static void dvfs(int argc, char* argv[])
 
   // Verify the default pstate is set to 0
   host    = sg_host_by_name("MyHost2");
-  int nb2 = sg_host_get_nb_pstates(host);
-  XBT_INFO("Count of Processor states=%d", nb2);
+  unsigned long nb2 = sg_host_get_nb_pstates(host);
+  XBT_INFO("Count of Processor states=%lu", nb2);
 
   double current_peak2 = sg_host_get_speed(host);
   XBT_INFO("Current power peak=%f", current_peak2);
index b5caa0b..e65ade7 100644 (file)
@@ -41,7 +41,7 @@ static void worker(int argc, char* argv[])
    * terminated.
    */
   while (pending_execs_count > 0) {
-    int pos;
+    ssize_t pos;
     if (with_timeout)
       pos = sg_exec_wait_any_for(pending_execs, pending_execs_count, 4);
     else
@@ -51,7 +51,7 @@ static void worker(int argc, char* argv[])
       XBT_INFO("Do not wait any longer for an activity");
       pending_execs_count = 0;
     } else {
-      XBT_INFO("Activity at position %d is complete", pos);
+      XBT_INFO("Activity at position %zd is complete", pos);
       memmove(pending_execs + pos, pending_execs + pos + 1, sizeof(sg_exec_t) * (pending_execs_count - pos - 1));
       pending_execs_count--;
     }
index e17fd2e..4472b55 100644 (file)
@@ -23,10 +23,10 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(platform_failures, "Messages specific for this exam
 static void master(int argc, char* argv[])
 {
   xbt_assert(argc == 5);
-  long number_of_tasks  = xbt_str_parse_int(argv[1], "Invalid amount of tasks: %s");
-  double task_comp_size = xbt_str_parse_double(argv[2], "Invalid computational size: %s");
-  long task_comm_size   = xbt_str_parse_int(argv[3], "Invalid communication size: %s");
-  long workers_count    = xbt_str_parse_int(argv[4], "Invalid amount of workers: %s");
+  long number_of_tasks  = xbt_str_parse_int(argv[1], "Invalid amount of tasks");
+  double task_comp_size = xbt_str_parse_double(argv[2], "Invalid computational size");
+  long task_comm_size   = xbt_str_parse_int(argv[3], "Invalid communication size");
+  long workers_count    = xbt_str_parse_int(argv[4], "Invalid amount of workers");
 
   XBT_INFO("Got %ld workers and %ld tasks to process", workers_count, number_of_tasks);
 
@@ -90,7 +90,7 @@ static void worker(int argc, char* argv[])
 {
   xbt_assert(argc == 2);
   char mailbox_name[80];
-  long id = xbt_str_parse_int(argv[1], "Invalid argument %s");
+  long id = xbt_str_parse_int(argv[1], "Invalid argument");
 
   snprintf(mailbox_name, 79, "worker-%ld", id);
   sg_mailbox_t mailbox = sg_mailbox_by_name(mailbox_name);
index bb0e3b8..8e6de3b 100644 (file)
@@ -20,7 +20,7 @@ static void peer(int argc, char* argv[])
 {
   int i = 0;
   while (i < argc) {
-    double wait_time = xbt_str_parse_double(argv[i], "Invalid wait time: %s");
+    double wait_time = xbt_str_parse_double(argv[i], "Invalid wait time");
     i++;
     sg_actor_sleep_for(wait_time);
     XBT_INFO("Trying to acquire %d (%sblocking)", i, sg_sem_would_block(sem) ? "" : "not ");
@@ -33,7 +33,7 @@ static void peer(int argc, char* argv[])
     }
     XBT_INFO("Acquired %d", i);
 
-    wait_time = xbt_str_parse_double(argv[i], "Invalid wait time: %s");
+    wait_time = xbt_str_parse_double(argv[i], "Invalid wait time");
     i++;
     sg_actor_sleep_for(wait_time);
     XBT_INFO("Releasing %d", i);
index 0260d9c..a266bd4 100644 (file)
@@ -63,24 +63,24 @@ endif()
 foreach (example actor-create actor-daemon actor-exiting actor-join actor-kill
                  actor-lifetime actor-migrate actor-suspend actor-yield actor-stacksize
                  app-bittorrent app-chainsend app-token-ring
-                 comm-pingpong comm-ready comm-suspend comm-wait comm-waitany comm-waitall comm-waituntil
-                 comm-dependent comm-host2host
+                 comm-pingpong comm-ready comm-serialize comm-suspend comm-wait comm-waitany comm-waitall comm-waituntil
+                 comm-dependent comm-host2host comm-failure
                  cloud-capping cloud-migration cloud-simple
                  dht-chord dht-kademlia
                  energy-exec energy-boot energy-link energy-vm energy-exec-ptask energy-wifi
                  engine-filtering
                  exec-async exec-basic exec-dvfs exec-remote exec-waitany exec-waitfor exec-dependent exec-unassigned
-                 exec-ptask exec-ptask-multicore
+                 exec-ptask-multicore exec-cpu-nonlinear exec-cpu-factors exec-failure
                  maestro-set
                  mc-bugged1 mc-bugged2 mc-electric-fence mc-failing-assert
                                 network-wifi
-                 io-async io-file-system io-file-remote io-disk-raw io-dependent
+                 io-async io-degradation io-file-system io-file-remote io-disk-raw io-dependent
                  platform-failures platform-profile platform-properties
                  plugin-host-load plugin-link-load plugin-prodcons
                  replay-comm replay-io
                  routing-get-clusters
                  synchro-barrier synchro-condition-variable synchro-condition-variable-waituntil synchro-mutex synchro-semaphore
-                 clusters-multicpu network-factors)
+                 clusters-multicpu network-factors network-nonlinear)
 
   # Use default source file unless specified otherwise
   if(NOT DEFINED _${example}_sources)
@@ -90,6 +90,7 @@ foreach (example actor-create actor-daemon actor-exiting actor-join actor-kill
   if(NOT DEFINED _${example}_disable)
     add_executable       (s4u-${example} EXCLUDE_FROM_ALL ${_${example}_sources})
     add_dependencies     (tests s4u-${example})
+    add_dependencies     (s4u-${example} platf_cpp)
     target_link_libraries(s4u-${example} simgrid)
     set_target_properties(s4u-${example} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${example})
 
@@ -101,6 +102,7 @@ foreach (example actor-create actor-daemon actor-exiting actor-join actor-kill
 
     ADD_TESH_FACTORIES(s4u-${example} "${_${example}_factories}"
                                       --setenv bindir=${CMAKE_CURRENT_BINARY_DIR}/${example}
+                                      --setenv libdir=${CMAKE_BINARY_DIR}/lib
                                       --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms
                                       --cd ${CMAKE_CURRENT_SOURCE_DIR}/${example}
                                       ${CMAKE_HOME_DIRECTORY}/examples/cpp/${example}/s4u-${example}.tesh)
@@ -204,7 +206,7 @@ endif()
 # Examples not accepting factories
 ##################################
 
-foreach (example trace-categories trace-masterworkers trace-platform trace-process-migration
+foreach (example exec-ptask trace-categories trace-masterworkers trace-platform trace-process-migration
                  trace-host-user-variables trace-link-user-variables trace-route-user-variables)
   add_executable       (s4u-${example} EXCLUDE_FROM_ALL ${example}/s4u-${example}.cpp)
   target_link_libraries(s4u-${example} simgrid)
diff --git a/examples/cpp/actor-create/.gitignore b/examples/cpp/actor-create/.gitignore
deleted file mode 100644 (file)
index 7cef20d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-s4u_launching
index 2a38069..c8f387b 100644 (file)
@@ -61,7 +61,7 @@ public:
       simgrid::s4u::CommPtr comm = me->get_async<FilePiece>(&received);
       pending_recvs.push_back(comm);
 
-      int idx = simgrid::s4u::Comm::wait_any(&pending_recvs);
+      ssize_t idx = simgrid::s4u::Comm::wait_any(pending_recvs);
       if (idx != -1) {
         comm = pending_recvs.at(idx);
         XBT_DEBUG("Peer %s got a 'SEND_DATA' message", me->get_cname());
@@ -116,7 +116,7 @@ public:
       simgrid::s4u::CommPtr comm = first->put_async(new FilePiece(), MESSAGE_SEND_DATA_HEADER_SIZE + PIECE_SIZE);
       pending_sends.push_back(comm);
     }
-    simgrid::s4u::Comm::wait_all(&pending_sends);
+    simgrid::s4u::Comm::wait_all(pending_sends);
   }
 
   Broadcaster(int hostcount, unsigned int piece_count) : piece_count(piece_count)
@@ -139,7 +139,7 @@ static void peer()
   p.joinChain();
   p.forwardFile();
 
-  simgrid::s4u::Comm::wait_all(&p.pending_sends);
+  simgrid::s4u::Comm::wait_all(p.pending_sends);
   double end_time = simgrid::s4u::Engine::get_clock();
 
   XBT_INFO("### %f %llu bytes (Avg %f MB/s); copy finished (simulated).", end_time - start_time, p.received_bytes,
index 76fb5f8..08a28c2 100644 (file)
@@ -16,13 +16,29 @@ $ ${bindir:=.}/s4u-app-token-ring ${platfdir}/routing_cluster.xml "--log=root.fm
 > [  0.131796] (0@host1) Host "0" received "Token"
 > [  0.131796] (maestro@) Simulation time 0.131796
 
+$ ${bindir:=.}/s4u-app-token-ring ${libdir}/librouting_cluster.so "--log=root.fmt:[%10.6r]%e(%a@%h)%e%m%n"
+> [  0.000000] (maestro@) Number of hosts '6'
+> [  0.000000] (0@host1) Host "0" send 'Token' to Host "1"
+> [  0.017354] (1@host2) Host "1" received "Token"
+> [  0.017354] (1@host2) Host "1" send 'Token' to Host "2"
+> [  0.035121] (2@host3) Host "2" received "Token"
+> [  0.035121] (2@host3) Host "2" send 'Token' to Host "3"
+> [  0.065898] (3@host4) Host "3" received "Token"
+> [  0.065898] (3@host4) Host "3" send 'Token' to Host "4"
+> [  0.083252] (4@host5) Host "4" received "Token"
+> [  0.083252] (4@host5) Host "4" send 'Token' to Host "5"
+> [  0.101019] (5@host6) Host "5" received "Token"
+> [  0.101019] (5@host6) Host "5" send 'Token' to Host "0"
+> [  0.131796] (0@host1) Host "0" received "Token"
+> [  0.131796] (maestro@) Simulation time 0.131796
+
 $ ${bindir:=.}/s4u-app-token-ring ${platfdir}/two_peers.xml "--log=root.fmt:[%12.6r]%e(%a@%h)%e%m%n"
 > [    0.000000] (maestro@) Number of hosts '2'
 > [    0.000000] (0@100030591) Host "0" send 'Token' to Host "1"
-> [    0.624423] (1@100036570) Host "1" received "Token"
-> [    0.624423] (1@100036570) Host "1" send 'Token' to Host "0"
-> [    1.248846] (0@100030591) Host "0" received "Token"
-> [    1.248846] (maestro@) Simulation time 1.24885
+> [    0.625106] (1@100036570) Host "1" received "Token"
+> [    0.625106] (1@100036570) Host "1" send 'Token' to Host "0"
+> [    1.250212] (0@100030591) Host "0" received "Token"
+> [    1.250212] (maestro@) Simulation time 1.25021
 
 $ ${bindir:=.}/s4u-app-token-ring ${platfdir}/meta_cluster.xml "--log=root.fmt:[%10.6r]%e(%a@%h)%e%m%n"
 > [  0.000000] (maestro@) Number of hosts '60'
index 49becd8..18c1184 100644 (file)
@@ -47,7 +47,7 @@ public:
     XBT_INFO("Done dispatching all messages");
 
     /* Now that all message exchanges were initiated, wait for their completion in one single call */
-    sg4::Comm::wait_all(&pending_comms);
+    sg4::Comm::wait_all(pending_comms);
 
     XBT_INFO("Goodbye now!");
   }
@@ -89,7 +89,7 @@ public:
  * @return netpoint, gateway: the netpoint to the StarZone and CPU0 as gateway
  */
 static std::pair<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*>
-create_hostzone(const sg4::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
+create_hostzone(const sg4::NetZone* zone, const std::vector<unsigned long>& /*coord*/, unsigned long id)
 {
   constexpr int num_cpus    = 8;     //!< Number of CPUs in the zone
   constexpr double speed    = 1e9;   //!< Speed of each CPU
@@ -110,13 +110,12 @@ create_hostzone(const sg4::NetZone* zone, const std::vector<unsigned int>& /*coo
     /* the first CPU is the gateway */
     if (i == 0)
       gateway = host;
-    /* create 2 links for a full-duplex communication */
-    sg4::Link* link_up   = host_zone->create_link("link-up-" + cpu_name, link_bw)->set_latency(link_lat)->seal();
-    sg4::Link* link_down = host_zone->create_link("link-down-" + cpu_name, link_bw)->set_latency(link_lat)->seal();
-    /* link UP, connection from CPU to outer world */
-    host_zone->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, std::vector<sg4::Link*>{link_up}, false);
-    /* link DOWN, connection from outer to CPU */
-    host_zone->add_route(nullptr, host->get_netpoint(), nullptr, nullptr, std::vector<sg4::Link*>{link_down}, false);
+    /* create split-duplex link */
+    sg4::SplitDuplexLink* link = host_zone->create_split_duplex_link("link-" + cpu_name, link_bw);
+    link->set_latency(link_lat)->seal();
+    /* connecting CPU to outer world */
+    host_zone->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, {{link, sg4::LinkInRoute::Direction::UP}},
+                         true);
   }
   /* seal newly created netzone */
   host_zone->seal();
@@ -140,7 +139,7 @@ create_hostzone(const sg4::NetZone* zone, const std::vector<unsigned int>& /*coo
  * @param id Internal identifier in the torus (for information)
  * @return Limiter link
  */
-static sg4::Link* create_limiter(sg4::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
+static sg4::Link* create_limiter(sg4::NetZone* zone, const std::vector<unsigned long>& /*coord*/, unsigned long id)
 {
   return zone->create_link("limiter-" + std::to_string(id), 1e9)->seal();
 }
diff --git a/examples/cpp/comm-failure/s4u-comm-failure.cpp b/examples/cpp/comm-failure/s4u-comm-failure.cpp
new file mode 100644 (file)
index 0000000..fadda21
--- /dev/null
@@ -0,0 +1,128 @@
+/* Copyright (c) 2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This example shows how to serialize a set of communications going through a link
+ *
+ * As for the other asynchronous examples, the sender initiates all the messages it wants to send and
+ * pack the resulting simgrid::s4u::CommPtr objects in a vector.
+ * At the same time, the receiver starts receiving all messages asynchronously. Without serialization,
+ * all messages would be received at the same timestamp in the receiver.
+ *
+ * However, as they will be serialized in a link of the platform, the messages arrive 2 by 2.
+ *
+ * The sender then blocks until all ongoing communication terminate, using simgrid::s4u::Comm::wait_all()
+ */
+
+#include <simgrid/s4u.hpp>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_comm_failure, "Messages specific for this s4u example");
+namespace sg4 = simgrid::s4u;
+
+class Sender {
+  std::string mailbox1_name;
+  std::string mailbox2_name;
+
+public:
+  Sender(const std::string& mailbox1_name, const std::string& mailbox2_name)
+      : mailbox1_name(mailbox1_name), mailbox2_name(mailbox2_name)
+  {
+  }
+
+  void operator()() const
+  {
+    auto mailbox1 = sg4::Mailbox::by_name(mailbox1_name);
+    auto mailbox2 = sg4::Mailbox::by_name(mailbox2_name);
+
+    XBT_INFO("Initiating asynchronous send to %s", mailbox1->get_cname());
+    auto comm1 = mailbox1->put_async((void*)666, 5);
+    XBT_INFO("Initiating asynchronous send to %s", mailbox2->get_cname());
+    auto comm2 = mailbox2->put_async((void*)666, 2);
+
+    XBT_INFO("Calling wait_any..");
+    std::vector<sg4::CommPtr> pending_comms;
+    pending_comms.push_back(comm1);
+    pending_comms.push_back(comm2);
+    try {
+      long index = sg4::Comm::wait_any(pending_comms);
+      XBT_INFO("Wait any returned index %ld (comm to %s)", index, pending_comms.at(index)->get_mailbox()->get_cname());
+    } catch (const simgrid::NetworkFailureException&) {
+      XBT_INFO("Sender has experienced a network failure exception, so it knows that something went wrong");
+      XBT_INFO("Now it needs to figure out which of the two comms failed by looking at their state");
+    }
+
+    XBT_INFO("Comm to %s has state: %s", comm1->get_mailbox()->get_cname(), comm1->get_state_str());
+    XBT_INFO("Comm to %s has state: %s", comm2->get_mailbox()->get_cname(), comm2->get_state_str());
+
+    try {
+      comm1->wait();
+    } catch (const simgrid::NetworkFailureException& e) {
+      XBT_INFO("Waiting on a FAILED comm raises an exception: '%s'", e.what());
+    }
+    XBT_INFO("Wait for remaining comm, just to be nice");
+    pending_comms.erase(pending_comms.begin());
+    simgrid::s4u::Comm::wait_any(pending_comms);
+  }
+};
+
+class Receiver {
+  std::string mailbox_name;
+
+public:
+  explicit Receiver(const std::string& mailbox_name) : mailbox_name(mailbox_name) {}
+
+  void operator()() const
+  {
+    auto mailbox = sg4::Mailbox::by_name(mailbox_name);
+    XBT_INFO("Receiver posting a receive...");
+    try {
+      mailbox->get<void*>();
+      XBT_INFO("Receiver has received successfully!");
+    } catch (const simgrid::NetworkFailureException&) {
+      XBT_INFO("Receiver has experience a network failure exception");
+    }
+  }
+};
+
+class LinkKiller {
+  std::string link_name;
+
+public:
+  explicit LinkKiller(const std::string& link_name) : link_name(link_name) {}
+
+  void operator()() const
+  {
+    auto link_to_kill = sg4::Link::by_name(link_name);
+    XBT_INFO("LinkKiller  sleeping 10 seconds...");
+    sg4::this_actor::sleep_for(10.0);
+    XBT_INFO("LinkKiller turning off link %s", link_to_kill->get_cname());
+    link_to_kill->turn_off();
+    XBT_INFO("LinkKiller killed. exiting");
+  }
+};
+
+int main(int argc, char** argv)
+{
+  sg4::Engine engine(&argc, argv);
+  auto* zone  = sg4::create_full_zone("AS0");
+  auto* host1 = zone->create_host("Host1", "1f");
+  auto* host2 = zone->create_host("Host2", "1f");
+  auto* host3 = zone->create_host("Host3", "1f");
+
+  sg4::LinkInRoute linkto2{zone->create_link("linkto2", "1bps")->seal()};
+  sg4::LinkInRoute linkto3{zone->create_link("linkto3", "1bps")->seal()};
+
+  zone->add_route(host1->get_netpoint(), host2->get_netpoint(), nullptr, nullptr, {linkto2}, false);
+  zone->add_route(host1->get_netpoint(), host3->get_netpoint(), nullptr, nullptr, {linkto3}, false);
+  zone->seal();
+
+  sg4::Actor::create("Sender", host1, Sender("mailbox2", "mailbox3"));
+  sg4::Actor::create("Receiver", host2, Receiver("mailbox2"))->daemonize();
+  sg4::Actor::create("Receiver", host3, Receiver("mailbox3"))->daemonize();
+  sg4::Actor::create("LinkKiller", host1, LinkKiller("linkto2"))->daemonize();
+
+  engine.run();
+
+  return 0;
+}
diff --git a/examples/cpp/comm-failure/s4u-comm-failure.tesh b/examples/cpp/comm-failure/s4u-comm-failure.tesh
new file mode 100644 (file)
index 0000000..c0b1209
--- /dev/null
@@ -0,0 +1,19 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/s4u-comm-failure "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (4:LinkKiller@Host1) LinkKiller  sleeping 10 seconds...
+> [  0.000000] (2:Receiver@Host2) Receiver posting a receive...
+> [  0.000000] (3:Receiver@Host3) Receiver posting a receive...
+> [  0.000000] (1:Sender@Host1) Initiating asynchronous send to mailbox2
+> [  0.000000] (1:Sender@Host1) Initiating asynchronous send to mailbox3
+> [  0.000000] (1:Sender@Host1) Calling wait_any..
+> [ 10.000000] (4:LinkKiller@Host1) LinkKiller turning off link linkto2
+> [ 10.000000] (4:LinkKiller@Host1) LinkKiller killed. exiting
+> [ 10.000000] (2:Receiver@Host2) Receiver has experience a network failure exception
+> [ 10.000000] (1:Sender@Host1) Sender has experienced a network failure exception, so it knows that something went wrong
+> [ 10.000000] (1:Sender@Host1) Now it needs to figure out which of the two comms failed by looking at their state
+> [ 10.000000] (1:Sender@Host1) Comm to mailbox2 has state: FAILED
+> [ 10.000000] (1:Sender@Host1) Comm to mailbox3 has state: STARTED
+> [ 10.000000] (1:Sender@Host1) Waiting on a FAILED comm raises an exception: 'Cannot wait for a failed communication'
+> [ 10.000000] (1:Sender@Host1) Wait for remaining comm, just to be nice
+> [ 16.494845] (3:Receiver@Host3) Receiver has received successfully!
index 25dbce2..6cbe694 100644 (file)
@@ -93,7 +93,7 @@ static void peer(int argc, char** argv)
   }
 
   XBT_INFO("I'm done, just waiting for my peers to receive the messages before exiting");
-  sg4::Comm::wait_all(&pending_comms);
+  sg4::Comm::wait_all(pending_comms);
 
   XBT_INFO("Goodbye now!");
 }
diff --git a/examples/cpp/comm-serialize/s4u-comm-serialize.cpp b/examples/cpp/comm-serialize/s4u-comm-serialize.cpp
new file mode 100644 (file)
index 0000000..8691b45
--- /dev/null
@@ -0,0 +1,122 @@
+/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This example shows how to serialize a set of communications going through a link
+ *
+ * As for the other asynchronous examples, the sender initiates all the messages it wants to send and
+ * pack the resulting simgrid::s4u::CommPtr objects in a vector.
+ * At the same time, the receiver starts receiving all messages asynchronously. Without serialization,
+ * all messages would be received at the same timestamp in the receiver.
+ *
+ * However, as they will be serialized in a link of the platform, the messages arrive 2 by 2.
+ *
+ * The sender then blocks until all ongoing communication terminate, using simgrid::s4u::Comm::wait_all()
+ */
+
+#include "simgrid/s4u.hpp"
+#include <string>
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_async_serialize, "Messages specific for this s4u example");
+
+class Sender {
+  int messages_count; /* - number of messages */
+  int msg_size;       /* - message size in bytes */
+
+public:
+  explicit Sender(int size, int count) : messages_count(count), msg_size(size) {}
+  void operator()() const
+  {
+    // sphinx-doc: init-begin (this line helps the doc to build; ignore it)
+    /* Vector in which we store all ongoing communications */
+    std::vector<sg4::CommPtr> pending_comms;
+
+    /* Make a vector of the mailboxes to use */
+    sg4::Mailbox* mbox = sg4::Mailbox::by_name("receiver");
+    // sphinx-doc: init-end
+
+    /* Start dispatching all messages to receiver */
+    for (int i = 0; i < messages_count; i++) {
+      std::string msg_content = std::string("Message ") + std::to_string(i);
+      // Copy the data we send: the 'msg_content' variable is not a stable storage location.
+      // It will be destroyed when this actor leaves the loop, ie before the receiver gets it
+      auto* payload = new std::string(msg_content);
+
+      XBT_INFO("Send '%s' to '%s'", msg_content.c_str(), mbox->get_cname());
+
+      /* Create a communication representing the ongoing communication, and store it in pending_comms */
+      sg4::CommPtr comm = mbox->put_async(payload, msg_size);
+      pending_comms.push_back(comm);
+    }
+
+    XBT_INFO("Done dispatching all messages");
+
+    /* Now that all message exchanges were initiated, wait for their completion in one single call */
+    sg4::Comm::wait_all(pending_comms);
+    // sphinx-doc: put-end
+
+    XBT_INFO("Goodbye now!");
+  }
+};
+
+/* Receiver actor expects 1 argument: number of messages to be received */
+class Receiver {
+  sg4::Mailbox* mbox;
+  int messages_count = 10; /* - number of messages */
+
+public:
+  explicit Receiver(int count) : messages_count(count) { mbox = sg4::Mailbox::by_name("receiver"); }
+  void operator()()
+  {
+    /* Vector in which we store all incoming msgs */
+    std::vector<std::unique_ptr<std::string*>> pending_msgs;
+    std::vector<sg4::CommPtr> pending_comms;
+
+    XBT_INFO("Wait for %d messages asynchronously", messages_count);
+    for (int i = 0; i < messages_count; i++) {
+      pending_msgs.push_back(std::make_unique<std::string*>());
+      pending_comms.emplace_back(mbox->get_async<std::string>(pending_msgs[i].get()));
+    }
+    while (not pending_comms.empty()) {
+      ssize_t index    = sg4::Comm::wait_any(pending_comms);
+      std::string* msg = *pending_msgs[index];
+      XBT_INFO("I got '%s'.", msg->c_str());
+      /* cleanup memory and remove from vectors */
+      delete msg;
+      pending_comms.erase(pending_comms.begin() + index);
+      pending_msgs.erase(pending_msgs.begin() + index);
+    }
+  }
+};
+
+int main(int argc, char* argv[])
+{
+  sg4::Engine e(&argc, argv);
+  /* Creates the platform
+   *  ________                 __________
+   * | Sender |===============| Receiver |
+   * |________|    Link1      |__________|
+   */
+  auto* zone     = sg4::create_full_zone("Zone1");
+  auto* sender   = zone->create_host("sender", 1)->seal();
+  auto* receiver = zone->create_host("receiver", 1)->seal();
+
+  /* create split-duplex link1 (UP/DOWN), limiting the number of concurrent flows in it for 2 */
+  const auto* link =
+      zone->create_split_duplex_link("link1", 10e9)->set_latency(10e-6)->set_concurrency_limit(2)->seal();
+
+  /* create routes between nodes */
+  zone->add_route(sender->get_netpoint(), receiver->get_netpoint(), nullptr, nullptr,
+                  {{link, sg4::LinkInRoute::Direction::UP}}, true);
+  zone->seal();
+
+  /* create actors Sender/Receiver */
+  sg4::Actor::create("receiver", receiver, Receiver(10));
+  sg4::Actor::create("sender", sender, Sender(1e6, 10));
+
+  e.run();
+
+  return 0;
+}
diff --git a/examples/cpp/comm-serialize/s4u-comm-serialize.tesh b/examples/cpp/comm-serialize/s4u-comm-serialize.tesh
new file mode 100644 (file)
index 0000000..dee2d01
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/s4u-comm-serialize "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:receiver@receiver) Wait for 10 messages asynchronously
+> [  0.000000] (2:sender@sender) Send 'Message 0' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 1' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 2' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 3' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 4' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 5' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 6' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 7' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 8' to 'receiver'
+> [  0.000000] (2:sender@sender) Send 'Message 9' to 'receiver'
+> [  0.000000] (2:sender@sender) Done dispatching all messages
+> [  0.000336] (1:receiver@receiver) I got 'Message 1'.
+> [  0.000336] (1:receiver@receiver) I got 'Message 0'.
+> [  0.000542] (1:receiver@receiver) I got 'Message 3'.
+> [  0.000542] (1:receiver@receiver) I got 'Message 2'.
+> [  0.000749] (1:receiver@receiver) I got 'Message 5'.
+> [  0.000749] (1:receiver@receiver) I got 'Message 4'.
+> [  0.000955] (1:receiver@receiver) I got 'Message 7'.
+> [  0.000955] (1:receiver@receiver) I got 'Message 6'.
+> [  0.001161] (1:receiver@receiver) I got 'Message 9'.
+> [  0.001161] (1:receiver@receiver) I got 'Message 8'.
+> [  0.001161] (2:sender@sender) Goodbye now!
index 79e78ac..13902a4 100644 (file)
@@ -68,7 +68,7 @@ public:
     XBT_INFO("Done dispatching all messages");
 
     /* Now that all message exchanges were initiated, wait for their completion in one single call */
-    sg4::Comm::wait_all(&pending_comms);
+    sg4::Comm::wait_all(pending_comms);
     // sphinx-doc: put-end
 
     XBT_INFO("Goodbye now!");
index e8f20ae..a7e57cd 100644 (file)
@@ -77,10 +77,10 @@ public:
      * Even in this simple example, the pending comms do not terminate in the exact same order of creation.
      */
     while (not pending_comms.empty()) {
-      int changed_pos = sg4::Comm::wait_any(&pending_comms);
+      ssize_t changed_pos = sg4::Comm::wait_any(pending_comms);
       pending_comms.erase(pending_comms.begin() + changed_pos);
       if (changed_pos != 0)
-        XBT_INFO("Remove the %dth pending comm: it terminated earlier than another comm that was initiated first.",
+        XBT_INFO("Remove the %zdth pending comm: it terminated earlier than another comm that was initiated first.",
                  changed_pos);
     }
 
index bc2fb64..73f797b 100644 (file)
@@ -22,13 +22,13 @@ int main(int argc, char* argv[])
   while (not strncmp(options[0], "-", 1)) {
     unsigned int length = strlen("-nb_bits=");
     if (not strncmp(options[0], "-nb_bits=", length) && strlen(options[0]) > length) {
-      nb_bits = static_cast<int>(xbt_str_parse_int(options[0] + length, "Invalid nb_bits parameter: %s"));
+      nb_bits = static_cast<int>(xbt_str_parse_int(options[0] + length, "Invalid nb_bits parameter"));
       XBT_DEBUG("Set nb_bits to %d", nb_bits);
     } else {
       length = strlen("-timeout=");
       xbt_assert(strncmp(options[0], "-timeout=", length) == 0 && strlen(options[0]) > length,
                  "Invalid chord option '%s'", options[0]);
-      timeout = static_cast<int>(xbt_str_parse_int(options[0] + length, "Invalid timeout parameter: %s"));
+      timeout = static_cast<int>(xbt_str_parse_int(options[0] + length, "Invalid timeout parameter"));
       XBT_DEBUG("Set timeout to %d", timeout);
     }
     options++;
index 39f3179..33fd4bf 100644 (file)
@@ -37,7 +37,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this example");
 
 static void simulate_bootup(simgrid::s4u::Host* host)
 {
-  int previous_pstate = host->get_pstate();
+  unsigned long previous_pstate = host->get_pstate();
 
   XBT_INFO("Switch to virtual pstate 3, that encodes the 'booting up' state in that platform");
   host->set_pstate(3);
@@ -48,13 +48,13 @@ static void simulate_bootup(simgrid::s4u::Host* host)
   XBT_INFO("Wait 150s to simulate the boot time.");
   simgrid::s4u::this_actor::sleep_for(150);
 
-  XBT_INFO("The host is now up and running. Switch back to previous pstate %d", previous_pstate);
+  XBT_INFO("The host is now up and running. Switch back to previous pstate %lu", previous_pstate);
   host->set_pstate(previous_pstate);
 }
 
 static void simulate_shutdown(simgrid::s4u::Host* host)
 {
-  int previous_pstate = host->get_pstate();
+  unsigned long previous_pstate = host->get_pstate();
 
   XBT_INFO("Switch to virtual pstate 4, that encodes the 'shutting down' state in that platform");
   host->set_pstate(4);
@@ -62,39 +62,37 @@ static void simulate_shutdown(simgrid::s4u::Host* host)
   XBT_INFO("Wait 7 seconds to simulate the shutdown time.");
   simgrid::s4u::this_actor::sleep_for(7);
 
-  XBT_INFO("Switch back to previous pstate %d, that will be used on reboot.", previous_pstate);
+  XBT_INFO("Switch back to previous pstate %lu, that will be used on reboot.", previous_pstate);
   host->set_pstate(previous_pstate);
 
   XBT_INFO("Actually shutdown the host");
   host->turn_off();
 }
 
-static int monitor()
+static void monitor()
 {
   simgrid::s4u::Host* host1 = simgrid::s4u::Host::by_name("MyHost1");
 
-  XBT_INFO("Initial pstate: %d; Energy dissipated so far:%.0E J", host1->get_pstate(),
+  XBT_INFO("Initial pstate: %lu; Energy dissipated so far:%.0E J", host1->get_pstate(),
            sg_host_get_consumed_energy(host1));
 
   XBT_INFO("Sleep for 10 seconds");
   simgrid::s4u::this_actor::sleep_for(10);
-  XBT_INFO("Done sleeping. Current pstate: %d; Energy dissipated so far: %.2f J", host1->get_pstate(),
+  XBT_INFO("Done sleeping. Current pstate: %lu; Energy dissipated so far: %.2f J", host1->get_pstate(),
            sg_host_get_consumed_energy(host1));
 
   simulate_shutdown(host1);
-  XBT_INFO("Host1 is now OFF. Current pstate: %d; Energy dissipated so far: %.2f J", host1->get_pstate(),
+  XBT_INFO("Host1 is now OFF. Current pstate: %lu; Energy dissipated so far: %.2f J", host1->get_pstate(),
            sg_host_get_consumed_energy(host1));
 
   XBT_INFO("Sleep for 10 seconds");
   simgrid::s4u::this_actor::sleep_for(10);
-  XBT_INFO("Done sleeping. Current pstate: %d; Energy dissipated so far: %.2f J", host1->get_pstate(),
+  XBT_INFO("Done sleeping. Current pstate: %lu; Energy dissipated so far: %.2f J", host1->get_pstate(),
            sg_host_get_consumed_energy(host1));
 
   simulate_bootup(host1);
-  XBT_INFO("Host1 is now ON again. Current pstate: %d; Energy dissipated so far: %.2f J", host1->get_pstate(),
+  XBT_INFO("Host1 is now ON again. Current pstate: %lu; Energy dissipated so far: %.2f J", host1->get_pstate(),
            sg_host_get_consumed_energy(host1));
-
-  return 0;
 }
 
 int main(int argc, char* argv[])
index c5a7558..40dce86 100644 (file)
@@ -35,7 +35,7 @@ static void sender(std::vector<std::string> args)
     std::vector<simgrid::s4u::CommPtr> comms;
     for (int i = 0; i < flow_amount; i++)
       comms.push_back(mailbox->put_async(bprintf("%d", i), comm_size));
-    simgrid::s4u::Comm::wait_all(&comms);
+    simgrid::s4u::Comm::wait_all(comms);
   }
   XBT_INFO("sender done.");
 }
@@ -59,7 +59,7 @@ static void receiver(std::vector<std::string> args)
     for (int i = 0; i < flow_amount; i++)
       comms.push_back(mailbox->get_async<char>(&data[i]));
 
-    simgrid::s4u::Comm::wait_all(&comms);
+    simgrid::s4u::Comm::wait_all(comms);
     for (int i = 0; i < flow_amount; i++)
       xbt_free(data[i]);
   }
index 6d1bb89..a2d9a7e 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2020-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 /**
  * Test the wifi energy plugin
  * Desactivate cross-factor to get round values
index ea90567..ac510a6 100644 (file)
@@ -36,7 +36,7 @@ public:
  * Then, it allows one to easily retrieve the hosts which frequency changed since the functor creation.
  */
 class FrequencyChanged {
-  std::map<simgrid::s4u::Host*, int> host_list;
+  std::map<simgrid::s4u::Host*, unsigned long> host_list;
 
 public:
   explicit FrequencyChanged(const simgrid::s4u::Engine& e)
diff --git a/examples/cpp/exec-cpu-factors/s4u-exec-cpu-factors.cpp b/examples/cpp/exec-cpu-factors/s4u-exec-cpu-factors.cpp
new file mode 100644 (file)
index 0000000..820614b
--- /dev/null
@@ -0,0 +1,67 @@
+/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This example shows how to simulate variability for CPUs, using multiplicative factors
+ */
+
+#include <simgrid/s4u.hpp>
+
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
+
+/*************************************************************************************************/
+static void runner()
+{
+  double computation_amount = sg4::this_actor::get_host()->get_speed();
+
+  XBT_INFO("Executing 1 tasks of %g flops, should take 1 second.", computation_amount);
+  sg4::this_actor::execute(computation_amount);
+  XBT_INFO("Executing 1 tasks of %g flops, it would take .001s without factor. It'll take .002s",
+           computation_amount / 10);
+  sg4::this_actor::execute(computation_amount / 1000);
+
+  XBT_INFO("Finished executing. Goodbye now!");
+}
+/*************************************************************************************************/
+/** @brief Variability for CPU */
+static double cpu_variability(const sg4::Host* host, double flops)
+{
+  /* creates variability for tasks smaller than 1% of CPU power.
+   * unrealistic, for learning purposes */
+  double factor = 1.0;
+  double speed  = host->get_speed();
+  if (flops < speed / 100) {
+    factor = 0.5;
+  }
+  XBT_INFO("Host %s, task with %lf flops, new factor %lf", host->get_cname(), flops, factor);
+  return factor;
+}
+
+/** @brief Create a simple 1-host platform */
+static void load_platform()
+{
+  auto* zone        = sg4::create_empty_zone("Zone1");
+  auto* runner_host = zone->create_host("runner", 1e6);
+  runner_host->set_factor_cb(std::bind(&cpu_variability, runner_host, std::placeholders::_1))->seal();
+  zone->seal();
+
+  /* create actor runner */
+  sg4::Actor::create("runner", runner_host, runner);
+}
+
+/*************************************************************************************************/
+int main(int argc, char* argv[])
+{
+  sg4::Engine e(&argc, argv);
+
+  /* create platform */
+  load_platform();
+
+  /* runs the simulation */
+  e.run();
+
+  return 0;
+}
diff --git a/examples/cpp/exec-cpu-factors/s4u-exec-cpu-factors.tesh b/examples/cpp/exec-cpu-factors/s4u-exec-cpu-factors.tesh
new file mode 100644 (file)
index 0000000..9fa8d57
--- /dev/null
@@ -0,0 +1,6 @@
+$ ${bindir:=.}/s4u-exec-cpu-factors "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:runner@runner) Executing 1 tasks of 1e+06 flops, should take 1 second.
+> [  0.000000] (0:maestro@) Host runner, task with 1000000.000000 flops, new factor 1.000000
+> [  1.000000] (1:runner@runner) Executing 1 tasks of 100000 flops, it would take .001s without factor. It'll take .002s
+> [  1.000000] (0:maestro@) Host runner, task with 1000.000000 flops, new factor 0.500000
+> [  1.002000] (1:runner@runner) Finished executing. Goodbye now!
diff --git a/examples/cpp/exec-cpu-nonlinear/s4u-exec-cpu-nonlinear.cpp b/examples/cpp/exec-cpu-nonlinear/s4u-exec-cpu-nonlinear.cpp
new file mode 100644 (file)
index 0000000..9e980cd
--- /dev/null
@@ -0,0 +1,72 @@
+/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This example shows how to simulate a non-linear resource sharing for
+ * CPUs.
+ */
+
+#include <simgrid/s4u.hpp>
+
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
+
+/*************************************************************************************************/
+static void runner()
+{
+  double computation_amount = sg4::this_actor::get_host()->get_speed();
+  int n_task                = 10;
+  std::vector<sg4::ExecPtr> tasks;
+
+  XBT_INFO(
+      "Execute %d tasks of %g flops, should take %d second in a CPU without degradation. It will take the double here.",
+      n_task, computation_amount, n_task);
+  for (int i = 0; i < n_task; i++) {
+    tasks.emplace_back(sg4::this_actor::exec_async(computation_amount));
+  }
+  XBT_INFO("Waiting for all tasks to be done!");
+  for (const auto& task : tasks)
+    task->wait();
+
+  XBT_INFO("Finished executing. Goodbye now!");
+}
+/*************************************************************************************************/
+/** @brief Non-linear resource sharing for CPU */
+static double cpu_nonlinear(const sg4::Host* host, double capacity, int n)
+{
+  /* emulates a degradation in CPU according to the number of tasks
+   * totally unrealistic but for learning purposes */
+  capacity = n > 1 ? capacity / 2 : capacity;
+  XBT_INFO("Host %s, %d concurrent tasks, new capacity %lf", host->get_cname(), n, capacity);
+  return capacity;
+}
+
+/** @brief Create a simple 1-host platform */
+static void load_platform()
+{
+  auto* zone        = sg4::create_empty_zone("Zone1");
+  auto* runner_host = zone->create_host("runner", 1e6);
+  runner_host->set_sharing_policy(sg4::Host::SharingPolicy::NONLINEAR,
+                                  std::bind(&cpu_nonlinear, runner_host, std::placeholders::_1, std::placeholders::_2));
+  runner_host->seal();
+  zone->seal();
+
+  /* create actor runner */
+  sg4::Actor::create("runner", runner_host, runner);
+}
+
+/*************************************************************************************************/
+int main(int argc, char* argv[])
+{
+  sg4::Engine e(&argc, argv);
+
+  /* create platform */
+  load_platform();
+
+  /* runs the simulation */
+  e.run();
+
+  return 0;
+}
diff --git a/examples/cpp/exec-cpu-nonlinear/s4u-exec-cpu-nonlinear.tesh b/examples/cpp/exec-cpu-nonlinear/s4u-exec-cpu-nonlinear.tesh
new file mode 100644 (file)
index 0000000..33f529e
--- /dev/null
@@ -0,0 +1,5 @@
+$ ${bindir:=.}/s4u-exec-cpu-nonlinear "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:runner@runner) Execute 10 tasks of 1e+06 flops, should take 10 second in a CPU without degradation. It will take the double here.
+> [  0.000000] (1:runner@runner) Waiting for all tasks to be done!
+> [  0.000000] (0:maestro@) Host runner, 10 concurrent tasks, new capacity 500000.000000
+> [ 20.000000] (1:runner@runner) Finished executing. Goodbye now!
index 68187bf..0fa1eb9 100644 (file)
@@ -41,7 +41,7 @@ static void worker()
 
   // wait for the completion of all activities
   while (not pending_execs.empty()) {
-    int changed_pos = simgrid::s4u::Exec::wait_any_for(&pending_execs, -1);
+    ssize_t changed_pos = simgrid::s4u::Exec::wait_any_for(pending_execs, -1);
     XBT_INFO("Exec '%s' is complete", pending_execs[changed_pos]->get_cname());
     pending_execs.erase(pending_execs.begin() + changed_pos);
   }
index d281d64..7df0140 100644 (file)
@@ -12,8 +12,8 @@ static int dvfs()
   double workload = 100E6;
   simgrid::s4u::Host* host = simgrid::s4u::this_actor::get_host();
 
-  int nb = host->get_pstate_count();
-  XBT_INFO("Count of Processor states=%d", nb);
+  unsigned long nb = host->get_pstate_count();
+  XBT_INFO("Count of Processor states=%lu", nb);
 
   XBT_INFO("Current power peak=%f", host->get_speed());
 
@@ -24,9 +24,9 @@ static int dvfs()
   XBT_INFO("Computation1 duration: %.2f", exec_time);
 
   // Change power peak
-  int new_pstate = 2;
+  unsigned long new_pstate = 2;
 
-  XBT_INFO("Changing power peak value to %f (at index %d)", host->get_pstate_speed(new_pstate), new_pstate);
+  XBT_INFO("Changing power peak value to %f (at index %lu)", host->get_pstate_speed(new_pstate), new_pstate);
 
   host->set_pstate(new_pstate);
 
@@ -40,7 +40,7 @@ static int dvfs()
 
   // Verify that the default pstate is set to 0
   host = simgrid::s4u::Host::by_name_or_null("MyHost2");
-  XBT_INFO("Count of Processor states=%d", host->get_pstate_count());
+  XBT_INFO("Count of Processor states=%lu", host->get_pstate_count());
 
   XBT_INFO("Current power peak=%f", host->get_speed());
   return 0;
diff --git a/examples/cpp/exec-failure/s4u-exec-failure.cpp b/examples/cpp/exec-failure/s4u-exec-failure.cpp
new file mode 100644 (file)
index 0000000..4bfc1d2
--- /dev/null
@@ -0,0 +1,82 @@
+/* Copyright (c) 2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This example shows how to serialize a set of communications going through a link
+ *
+ * As for the other asynchronous examples, the sender initiates all the messages it wants to send and
+ * pack the resulting simgrid::s4u::CommPtr objects in a vector.
+ * At the same time, the receiver starts receiving all messages asynchronously. Without serialization,
+ * all messages would be received at the same timestamp in the receiver.
+ *
+ * However, as they will be serialized in a link of the platform, the messages arrive 2 by 2.
+ *
+ * The sender then blocks until all ongoing communication terminate, using simgrid::s4u::Comm::wait_all()
+ */
+
+#include <simgrid/s4u.hpp>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_exec_failure, "Messages specific for this s4u example");
+namespace sg4 = simgrid::s4u;
+
+static void dispatcher(sg4::Host* host1, sg4::Host* host2)
+{
+  std::vector<sg4::ExecPtr> pending_execs;
+  XBT_INFO("Initiating asynchronous exec on %s", host1->get_cname());
+  auto exec1 = sg4::this_actor::exec_init(20)->set_host(host1);
+  pending_execs.push_back(exec1);
+  exec1->start();
+  XBT_INFO("Initiating asynchronous exec on %s", host2->get_cname());
+  auto exec2 = sg4::this_actor::exec_init(20)->set_host(host2);
+  pending_execs.push_back(exec2);
+  exec2->start();
+
+  XBT_INFO("Calling wait_any..");
+  try {
+    long index = sg4::Exec::wait_any(pending_execs);
+    XBT_INFO("Wait any returned index %ld (exec on %s)", index, pending_execs.at(index)->get_host()->get_cname());
+  } catch (const simgrid::HostFailureException&) {
+    XBT_INFO("Dispatcher has experienced a host failure exception, so it knows that something went wrong");
+    XBT_INFO("Now it needs to figure out which of the two execs failed by looking at their state");
+  }
+
+  XBT_INFO("Exec on %s has state: %s", pending_execs[0]->get_host()->get_cname(), pending_execs[0]->get_state_str());
+  XBT_INFO("Exec on %s has state: %s", pending_execs[1]->get_host()->get_cname(), pending_execs[1]->get_state_str());
+
+  try {
+    pending_execs[1]->wait();
+  } catch (const simgrid::HostFailureException& e) {
+    XBT_INFO("Waiting on a FAILED exec raises an exception: '%s'", e.what());
+  }
+  pending_execs.pop_back();
+  XBT_INFO("Wait for remaining exec, just to be nice");
+  simgrid::s4u::Exec::wait_any(pending_execs);
+  XBT_INFO("Dispatcher ends");
+}
+
+static void host_killer(sg4::Host* to_kill)
+{
+  XBT_INFO("HostKiller  sleeping 10 seconds...");
+  sg4::this_actor::sleep_for(10.0);
+  XBT_INFO("HostKiller turning off host %s", to_kill->get_cname());
+  to_kill->turn_off();
+  XBT_INFO("HostKiller ends");
+}
+
+int main(int argc, char** argv)
+{
+  sg4::Engine engine(&argc, argv);
+
+  auto* zone  = sg4::create_full_zone("AS0");
+  auto* host1 = zone->create_host("Host1", "1f");
+  auto* host2 = zone->create_host("Host2", "1f");
+  zone->seal();
+
+  sg4::Actor::create("Dispatcher", host1, dispatcher, host1, host2);
+  sg4::Actor::create("HostKiller", host1, host_killer, host2)->daemonize();
+
+  engine.run();
+
+  return 0;
+}
diff --git a/examples/cpp/exec-failure/s4u-exec-failure.tesh b/examples/cpp/exec-failure/s4u-exec-failure.tesh
new file mode 100644 (file)
index 0000000..8c37127
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/s4u-exec-failure "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:Dispatcher@Host1) Initiating asynchronous exec on Host1
+> [  0.000000] (2:HostKiller@Host1) HostKiller  sleeping 10 seconds...
+> [  0.000000] (1:Dispatcher@Host1) Initiating asynchronous exec on Host2
+> [  0.000000] (1:Dispatcher@Host1) Calling wait_any..
+> [ 10.000000] (2:HostKiller@Host1) HostKiller turning off host Host2
+> [ 10.000000] (1:Dispatcher@Host1) Dispatcher has experienced a host failure exception, so it knows that something went wrong
+> [ 10.000000] (1:Dispatcher@Host1) Now it needs to figure out which of the two execs failed by looking at their state
+> [ 10.000000] (1:Dispatcher@Host1) Exec on Host1 has state: STARTED
+> [ 10.000000] (1:Dispatcher@Host1) Exec on Host2 has state: FAILED
+> [ 10.000000] (1:Dispatcher@Host1) Waiting on a FAILED exec raises an exception: 'Cannot wait for a failed exec'
+> [ 10.000000] (1:Dispatcher@Host1) Wait for remaining exec, just to be nice
+> [ 10.000000] (2:HostKiller@Host1) HostKiller ends
+> [ 20.000000] (1:Dispatcher@Host1) Dispatcher ends
index 817bdf5..606f3a2 100644 (file)
@@ -50,3 +50,5 @@ $ ${bindir:=.}/s4u-exec-ptask ${platfdir}/energy_platform.xml --cfg=host/model:p
 > [375.500000] (0:maestro@) UNCAT LINK [360.500000 - 375.500000] bus bandwidth_used 100000.000000
 > [375.500000] (1:test@MyHost1) Goodbye now!
 > [375.500000] (0:maestro@) Simulation done.
+
+$ rm -f ./simgrid.trace
index dc91d04..6a7dde7 100644 (file)
@@ -42,6 +42,19 @@ static void wizard()
 
   exec->wait();
   XBT_INFO("Done!");
+
+  XBT_INFO("And now, even harder. Start a remote activity on Ginette and turn off the host after 0.5 sec");
+  exec = simgrid::s4u::this_actor::exec_init(48.492e6)->set_host(ginette);
+  exec->start();
+
+  simgrid::s4u::this_actor::sleep_for(0.5);
+  ginette->turn_off();
+  try {
+    exec->wait();
+  } catch (const simgrid::HostFailureException&) {
+    XBT_INFO("Execution failed on %s", ginette->get_cname());
+  }
+  XBT_INFO("Done!");
 }
 
 int main(int argc, char* argv[])
index 9b2c993..3ccd924 100644 (file)
@@ -10,3 +10,6 @@ $ ${bindir:=.}/s4u-exec-remote ${platfdir}/small_platform.xml "--log=root.fmt:[%
 > [  1.500000] (1:test@Fafard) Loads before the move: Boivin=0; Fafard=0; Ginette=48492000
 > [  1.600000] (1:test@Fafard) Loads after the move: Boivin=98095000; Fafard=0; Ginette=0
 > [  2.000000] (1:test@Fafard) Done!
+> [  2.000000] (1:test@Fafard) And now, even harder. Start a remote activity on Ginette and turn off the host after 0.5 sec
+> [  2.500000] (1:test@Fafard) Execution failed on Ginette
+> [  2.500000] (1:test@Fafard) Done!
index 07e6ec2..1149c4c 100644 (file)
@@ -33,17 +33,17 @@ static void worker(bool with_timeout)
    * terminated.
    */
   while (not pending_executions.empty()) {
-    int pos;
+    ssize_t pos;
     if (with_timeout)
-      pos = simgrid::s4u::Exec::wait_any_for(&pending_executions, 4);
+      pos = simgrid::s4u::Exec::wait_any_for(pending_executions, 4);
     else
-      pos = simgrid::s4u::Exec::wait_any(&pending_executions);
+      pos = simgrid::s4u::Exec::wait_any(pending_executions);
 
     if (pos < 0) {
       XBT_INFO("Do not wait any longer for an activity");
       pending_executions.clear();
     } else {
-      XBT_INFO("Activity '%s' (at position %d) is complete", pending_executions[pos]->get_cname(), pos);
+      XBT_INFO("Activity '%s' (at position %zd) is complete", pending_executions[pos]->get_cname(), pos);
       pending_executions.erase(pending_executions.begin() + pos);
     }
     XBT_INFO("%zu activities remain pending", pending_executions.size());
diff --git a/examples/cpp/io-degradation/s4u-io-degradation.cpp b/examples/cpp/io-degradation/s4u-io-degradation.cpp
new file mode 100644 (file)
index 0000000..0e8e4b5
--- /dev/null
@@ -0,0 +1,152 @@
+/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This example shows how to simulate a non-linear resource sharing for disk
+ * operations.
+ *
+ * It is inspired on the paper
+ * "Adding Storage Simulation Capacities to the SimGridToolkit: Concepts, Models, and API"
+ * Available at : https://hal.inria.fr/hal-01197128/document
+ *
+ * It shows how to simulate concurrent operations degrading overall performance of IO
+ * operations (specifically the effects presented in Fig. 8 of the paper).
+ */
+
+#include <simgrid/s4u.hpp>
+
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(disk_test, "Messages specific for this simulation");
+
+/** @brief Calculates the bandwidth for disk doing async operations */
+static void estimate_bw(const sg4::Disk* disk, int n_flows, bool read)
+{
+  unsigned long long size = 100000;
+  double cur_time         = sg4::Engine::get_clock();
+  std::vector<sg4::IoPtr> activities;
+  for (int i = 0; i < n_flows; i++) {
+    sg4::IoPtr act;
+    if (read)
+      act = disk->read_async(size);
+    else
+      act = disk->write_async(size);
+
+    activities.push_back(act);
+  }
+
+  for (const auto& act : activities)
+    act->wait();
+
+  double elapsed_time = sg4::Engine::get_clock() - cur_time;
+  double estimated_bw = static_cast<double>(size * n_flows) / elapsed_time;
+  XBT_INFO("Disk: %s, concurrent %s: %d, estimated bandwidth: %lf", disk->get_cname(), read ? "read" : "write", n_flows,
+           estimated_bw);
+}
+
+static void host()
+{
+  /* - Estimating bw for each disk and considering concurrent flows */
+  for (int n = 1; n < 15; n += 2) {
+    for (const auto* disk : sg4::Host::current()->get_disks()) {
+      estimate_bw(disk, n, true);
+      estimate_bw(disk, n, false);
+    }
+  }
+}
+
+/**
+ * @brief Non-linear resource callback for SSD disks
+ *
+ * In this case, we have measurements for some resource sharing and directly use them to return the
+ * correct value
+ * @param disk Disk on which the operation is happening (defined by the user through the std::bind)
+ * @param op read or write operation (defined by the user through the std::bind)
+ * @param capacity Resource current capacity in SimGrid
+ * @param n Number of activities sharing this resource
+ */
+static double ssd_dynamic_sharing(const sg4::Disk* /*disk*/, const std::string& op, double capacity, int n)
+{
+  /* measurements for SSD disks */
+  using DiskCapacity                                                   = std::unordered_map<int, double>;
+  static const std::unordered_map<std::string, DiskCapacity> SSD_SPEED = {{"write", {{1, 131.}}},
+                                                                          {"read",
+                                                                           {{1, 152.},
+                                                                            {2, 161.},
+                                                                            {3, 184.},
+                                                                            {4, 197.},
+                                                                            {5, 207.},
+                                                                            {6, 215.},
+                                                                            {7, 220.},
+                                                                            {8, 224.},
+                                                                            {9, 227.},
+                                                                            {10, 231.},
+                                                                            {11, 233.},
+                                                                            {12, 235.},
+                                                                            {13, 237.},
+                                                                            {14, 238.},
+                                                                            {15, 239.}}}};
+
+  const auto& data = SSD_SPEED.at(op);
+  /* no special bandwidth for this disk sharing N flows, just returns maximal capacity */
+  if (data.find(n) != data.end())
+    capacity = data.at(n);
+
+  return capacity;
+}
+
+/**
+ * @brief Non-linear resource callback for SATA disks
+ *
+ * In this case, the degradation for read operations is linear and we have a formula that represents it.
+ *
+ * @param disk Disk on which the operation is happening (defined by the user through the std::bind)
+ * @param capacity Resource current capacity in SimGrid
+ * @param n Number of activities sharing this resource
+ */
+static double sata_dynamic_sharing(const sg4::Disk* /*disk*/, double /*capacity*/, int n)
+{
+  return 68.3 - 1.7 * n;
+}
+
+/** @brief Creates an SSD disk, setting the appropriate callback for non-linear resource sharing */
+static void create_ssd_disk(sg4::Host* host, const std::string& disk_name)
+{
+  auto* disk = host->create_disk(disk_name, "240MBps", "170MBps");
+  disk->set_sharing_policy(sg4::Disk::Operation::READ, sg4::Disk::SharingPolicy::NONLINEAR,
+                           std::bind(&ssd_dynamic_sharing, disk, "read", std::placeholders::_1, std::placeholders::_2));
+  disk->set_sharing_policy(
+      sg4::Disk::Operation::WRITE, sg4::Disk::SharingPolicy::NONLINEAR,
+      std::bind(&ssd_dynamic_sharing, disk, "write", std::placeholders::_1, std::placeholders::_2));
+  disk->set_sharing_policy(sg4::Disk::Operation::READWRITE, sg4::Disk::SharingPolicy::LINEAR);
+}
+
+/** @brief Same for a SATA disk, only read operation follows a non-linear resource sharing */
+static void create_sata_disk(sg4::Host* host, const std::string& disk_name)
+{
+  auto* disk = host->create_disk(disk_name, "68MBps", "50MBps");
+  disk->set_sharing_policy(sg4::Disk::Operation::READ, sg4::Disk::SharingPolicy::NONLINEAR,
+                           std::bind(&sata_dynamic_sharing, disk, std::placeholders::_1, std::placeholders::_2));
+  /* this is the default behavior, expliciting only to make it clearer */
+  disk->set_sharing_policy(sg4::Disk::Operation::WRITE, sg4::Disk::SharingPolicy::LINEAR);
+  disk->set_sharing_policy(sg4::Disk::Operation::READWRITE, sg4::Disk::SharingPolicy::LINEAR);
+}
+
+int main(int argc, char** argv)
+{
+  sg4::Engine e(&argc, argv);
+  /* simple platform containing 1 host and 2 disk */
+  auto* zone = sg4::create_full_zone("bob_zone");
+  auto* bob  = zone->create_host("bob", 1e6);
+  create_ssd_disk(bob, "Edel (SSD)");
+  create_sata_disk(bob, "Griffon (SATA II)");
+  zone->seal();
+
+  simgrid::s4u::Actor::create("", bob, host);
+
+  e.run();
+  XBT_INFO("Simulated time: %g", simgrid::s4u::Engine::get_clock());
+
+  return 0;
+}
diff --git a/examples/cpp/io-degradation/s4u-io-degradation.tesh b/examples/cpp/io-degradation/s4u-io-degradation.tesh
new file mode 100644 (file)
index 0000000..4ede3fb
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/env tesh
+
+$ ${bindir}/s4u-io-degradation "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [657.894737] (1:@bob) Disk: Edel (SSD), concurrent read: 1, estimated bandwidth: 152.000000
+> [1421.253515] (1:@bob) Disk: Edel (SSD), concurrent write: 1, estimated bandwidth: 131.000000
+> [2922.755017] (1:@bob) Disk: Griffon (SATA II), concurrent read: 1, estimated bandwidth: 66.600000
+> [2922.757017] (1:@bob) Disk: Griffon (SATA II), concurrent write: 1, estimated bandwidth: 50000000.001182
+> [4553.191800] (1:@bob) Disk: Edel (SSD), concurrent read: 3, estimated bandwidth: 184.000000
+> [4553.193564] (1:@bob) Disk: Edel (SSD), concurrent write: 3, estimated bandwidth: 170000000.022058
+> [9300.029007] (1:@bob) Disk: Griffon (SATA II), concurrent read: 3, estimated bandwidth: 63.200000
+> [9300.035007] (1:@bob) Disk: Griffon (SATA II), concurrent write: 3, estimated bandwidth: 50000000.004972
+> [11715.493945] (1:@bob) Disk: Edel (SSD), concurrent read: 5, estimated bandwidth: 207.000000
+> [11715.496886] (1:@bob) Disk: Edel (SSD), concurrent write: 5, estimated bandwidth: 170000000.039581
+> [20076.700899] (1:@bob) Disk: Griffon (SATA II), concurrent read: 5, estimated bandwidth: 59.800000
+> [20076.710899] (1:@bob) Disk: Griffon (SATA II), concurrent write: 5, estimated bandwidth: 50000000.008004
+> [23258.529081] (1:@bob) Disk: Edel (SSD), concurrent read: 7, estimated bandwidth: 220.000000
+> [23258.533199] (1:@bob) Disk: Edel (SSD), concurrent write: 7, estimated bandwidth: 170000000.009542
+> [35669.880716] (1:@bob) Disk: Griffon (SATA II), concurrent read: 7, estimated bandwidth: 56.400000
+> [35669.894716] (1:@bob) Disk: Griffon (SATA II), concurrent write: 7, estimated bandwidth: 49999999.989814
+> [39634.652426] (1:@bob) Disk: Edel (SSD), concurrent read: 9, estimated bandwidth: 227.000000
+> [39634.657720] (1:@bob) Disk: Edel (SSD), concurrent write: 9, estimated bandwidth: 169999999.992853
+> [56615.789795] (1:@bob) Disk: Griffon (SATA II), concurrent read: 9, estimated bandwidth: 53.000000
+> [56615.807795] (1:@bob) Disk: Griffon (SATA II), concurrent write: 9, estimated bandwidth: 50000000.010025
+> [61336.837838] (1:@bob) Disk: Edel (SSD), concurrent read: 11, estimated bandwidth: 233.000000
+> [61336.844309] (1:@bob) Disk: Edel (SSD), concurrent write: 11, estimated bandwidth: 170000000.077813
+> [83514.263663] (1:@bob) Disk: Griffon (SATA II), concurrent read: 11, estimated bandwidth: 49.600000
+> [83514.285663] (1:@bob) Disk: Griffon (SATA II), concurrent write: 11, estimated bandwidth: 50000000.006350
+> [88999.517731] (1:@bob) Disk: Edel (SSD), concurrent read: 13, estimated bandwidth: 237.000000
+> [88999.525378] (1:@bob) Disk: Edel (SSD), concurrent write: 13, estimated bandwidth: 169999999.974881
+> [117138.053517] (1:@bob) Disk: Griffon (SATA II), concurrent read: 13, estimated bandwidth: 46.200000
+> [117138.079517] (1:@bob) Disk: Griffon (SATA II), concurrent write: 13, estimated bandwidth: 50000000.003806
+> [117138.079517] (0:maestro@) Simulated time: 117138
index 62fce80..3b38e53 100644 (file)
@@ -45,7 +45,7 @@ static void test()
   // wait for the completion of all activities
   bob_compute->wait();
   while (not pending_ios.empty()) {
-    int changed_pos = simgrid::s4u::Io::wait_any(&pending_ios);
+    ssize_t changed_pos = simgrid::s4u::Io::wait_any(pending_ios);
     XBT_INFO("Io '%s' is complete", pending_ios[changed_pos]->get_cname());
     pending_ios.erase(pending_ios.begin() + changed_pos);
   }
diff --git a/examples/cpp/io-file-system/.gitignore b/examples/cpp/io-file-system/.gitignore
deleted file mode 100644 (file)
index fa4d495..0000000
+++ /dev/null
@@ -1 +0,0 @@
-s4u_io_test
index e4235a0..3f8598e 100644 (file)
@@ -75,15 +75,13 @@ static void load_platform()
     /* create host */
     const sg4::Host* host = root->create_host(hostname, 1)->set_core_count(32)->seal();
     /* create UP/DOWN link */
-    sg4::Link* l_up   = root->create_link(hostname + "_up", BW_REMOTE)->set_latency(LATENCY)->seal();
-    sg4::Link* l_down = root->create_link(hostname + "_down", BW_REMOTE)->set_latency(LATENCY)->seal();
+    const sg4::Link* l = root->create_split_duplex_link(hostname, BW_REMOTE)->set_latency(LATENCY)->seal();
 
     /* add link UP/DOWN for communications from the host */
-    root->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, std::vector<sg4::Link*>{l_up}, false);
-    root->add_route(nullptr, host->get_netpoint(), nullptr, nullptr, std::vector<sg4::Link*>{l_down}, false);
+    root->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, {{l, sg4::LinkInRoute::Direction::UP}}, true);
 
-    sg4::Link* loopback = root->create_link(hostname + "_loopback", BW_LOCAL)->set_latency(LATENCY)->seal();
-    root->add_route(host->get_netpoint(), host->get_netpoint(), nullptr, nullptr, std::vector<sg4::Link*>{loopback});
+    const sg4::Link* loopback = root->create_link(hostname + "_loopback", BW_LOCAL)->set_latency(LATENCY)->seal();
+    root->add_route(host->get_netpoint(), host->get_netpoint(), nullptr, nullptr, {sg4::LinkInRoute(loopback)});
   }
 
   root->seal();
@@ -151,9 +149,14 @@ static double bandwidth_factor_cb(double size, const sg4::Host* src, const sg4::
 /*************************************************************************************************/
 class Sender {
   std::vector<sg4::Host*> hosts_;
+  double crosstraffic_ = 1.0;
 
 public:
-  explicit Sender(const std::vector<sg4::Host*>& hosts) : hosts_{hosts} {}
+  explicit Sender(const std::vector<sg4::Host*>& hosts, bool crosstraffic) : hosts_{hosts}
+  {
+    if (crosstraffic)
+      crosstraffic_ = 1.05; // add crosstraffic load if it is enabled
+  }
   void operator()() const
   {
     const std::vector<double> msg_sizes = {64e3, 64e6, 64e9}; // 64KB, 64MB, 64GB
@@ -165,7 +168,11 @@ public:
         if (host->get_name() == sg4::this_actor::get_host()->get_name()) {
           double lat_factor = get_factor_from_map(LOCAL_LAT_FACTOR, size);
           double bw_factor  = get_factor_from_map(LOCAL_BW_FACTOR, size);
-          double est_time   = sg4::Engine::get_clock() + size / (BW_LOCAL * bw_factor) + LATENCY * lat_factor;
+          /* Account for crosstraffic on local communications
+           * local communications use only a single link and crosstraffic impact on resource sharing
+           * on remote communications, we don't see this effect since we have split-duplex links */
+          double est_time =
+              sg4::Engine::get_clock() + size / (BW_LOCAL * bw_factor / crosstraffic_) + LATENCY * lat_factor;
 
           msg = "Local communication: size=" + std::to_string(size) + ". Use bw_factor=" + std::to_string(bw_factor) +
                 " lat_factor=" + std::to_string(lat_factor) + ". Estimated finished time=" + std::to_string(est_time);
@@ -211,10 +218,17 @@ public:
 /*************************************************************************************************/
 int main(int argc, char* argv[])
 {
+  bool crosstraffic = true;
   sg4::Engine e(&argc, argv);
   /* setting network model to default one */
   sg4::Engine::set_config("network/model:CM02");
 
+  /* test with crosstraffic disabled */
+  if (argc == 2 && std::string(argv[1]) == "disable_crosstraffic") {
+    sg4::Engine::set_config("network/crosstraffic:0");
+    crosstraffic = false;
+  }
+
   /* create platform */
   load_platform();
   /* setting network factors callbacks */
@@ -226,7 +240,8 @@ int main(int argc, char* argv[])
   sg4::Host* host_remote = e.host_by_name("dahu-10.grid5000.fr");
   sg4::Actor::create(std::string("receiver-local"), host, Receiver());
   sg4::Actor::create(std::string("receiver-remote"), host_remote, Receiver());
-  sg4::Actor::create(std::string("sender") + std::string(host->get_name()), host, Sender({host, host_remote}));
+  sg4::Actor::create(std::string("sender") + std::string(host->get_name()), host,
+                     Sender({host, host_remote}, crosstraffic));
 
   /* runs the simulation */
   e.run();
index 86d7a07..22f1b03 100644 (file)
@@ -1,5 +1,6 @@
-$ ${bindir:=.}/s4u-network-factors "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+$ ${bindir:=.}/s4u-network-factors disable_crosstraffic "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
 > [  0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'CM02'
+> [  0.000000] (0:maestro@) Configuration change: Set 'network/crosstraffic' to '0'
 > [  0.000086] (1:receiver-local@dahu-1.grid5000.fr) I got a 'Local communication: size=64000.000000. Use bw_factor=0.121192 lat_factor=650.221238. Estimated finished time=0.000086'.
 > [  0.000455] (2:receiver-remote@dahu-10.grid5000.fr) I got a 'Remote communication: size=64000.000000. Use bw_factor=0.316335 lat_factor=1761.478483. Estimated finished time=0.000455'.
 > [  0.060247] (1:receiver-local@dahu-1.grid5000.fr) I got a 'Local communication: size=64000000.000000. Use bw_factor=0.042815 lat_factor=0.000000. Estimated finished time=0.060247'.
@@ -9,3 +10,15 @@ $ ${bindir:=.}/s4u-network-factors "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
 > [ 27.801800] (3:senderdahu-1.grid5000.fr@dahu-1.grid5000.fr) Done dispatching all messages
 > [ 27.801800] (1:receiver-local@dahu-1.grid5000.fr) I got a 'finalize'.
 > [ 27.801800] (2:receiver-remote@dahu-10.grid5000.fr) I got a 'finalize'.
+
+$ ${bindir:=.}/s4u-network-factors "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'CM02'
+> [  0.000087] (1:receiver-local@dahu-1.grid5000.fr) I got a 'Local communication: size=64000.000000. Use bw_factor=0.121192 lat_factor=650.221238. Estimated finished time=0.000087'.
+> [  0.000456] (2:receiver-remote@dahu-10.grid5000.fr) I got a 'Remote communication: size=64000.000000. Use bw_factor=0.316335 lat_factor=1761.478483. Estimated finished time=0.000456'.
+> [  0.063237] (1:receiver-local@dahu-1.grid5000.fr) I got a 'Local communication: size=64000000.000000. Use bw_factor=0.042815 lat_factor=0.000000. Estimated finished time=0.063237'.
+> [  0.112683] (2:receiver-remote@dahu-10.grid5000.fr) I got a 'Remote communication: size=64000000.000000. Use bw_factor=0.103547 lat_factor=0.000000. Estimated finished time=0.112683'.
+> [ 15.626857] (1:receiver-local@dahu-1.grid5000.fr) I got a 'Local communication: size=64000000000.000000. Use bw_factor=0.174405 lat_factor=1017885.351877. Estimated finished time=15.626857'.
+> [ 28.538713] (2:receiver-remote@dahu-10.grid5000.fr) I got a 'Remote communication: size=64000000000.000000. Use bw_factor=0.402589 lat_factor=970913.455816. Estimated finished time=28.538713'.
+> [ 28.538713] (3:senderdahu-1.grid5000.fr@dahu-1.grid5000.fr) Done dispatching all messages
+> [ 28.538713] (1:receiver-local@dahu-1.grid5000.fr) I got a 'finalize'.
+> [ 28.538713] (2:receiver-remote@dahu-10.grid5000.fr) I got a 'finalize'.
diff --git a/examples/cpp/network-nonlinear/s4u-network-nonlinear.cpp b/examples/cpp/network-nonlinear/s4u-network-nonlinear.cpp
new file mode 100644 (file)
index 0000000..66332a1
--- /dev/null
@@ -0,0 +1,149 @@
+/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This example shows how to simulate a non-linear resource sharing for
+ * network links.
+ */
+
+#include <simgrid/s4u.hpp>
+
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_network_nonlinear, "Messages specific for this s4u example");
+
+/*************************************************************************************************/
+class Sender {
+  int messages_count; /* - number of messages */
+  int msg_size = 1e6; /* - message size in bytes */
+
+public:
+  explicit Sender(int count) : messages_count(count) {}
+  void operator()() const
+  {
+    // sphinx-doc: init-begin (this line helps the doc to build; ignore it)
+    /* Vector in which we store all ongoing communications */
+    std::vector<sg4::CommPtr> pending_comms;
+
+    /* Make a vector of the mailboxes to use */
+    sg4::Mailbox* mbox = sg4::Mailbox::by_name("receiver");
+    // sphinx-doc: init-end
+
+    /* Start dispatching all messages to receiver */
+    for (int i = 0; i < messages_count; i++) {
+      std::string msg_content = std::string("Message ") + std::to_string(i);
+      // Copy the data we send: the 'msg_content' variable is not a stable storage location.
+      // It will be destroyed when this actor leaves the loop, ie before the receiver gets it
+      auto* payload           = new std::string(msg_content);
+      unsigned long long size = msg_size * (i + 1);
+      XBT_INFO("Send '%s' to '%s, msg size: %llu'", msg_content.c_str(), mbox->get_cname(), size);
+
+      /* Create a communication representing the ongoing communication, and store it in pending_comms */
+      sg4::CommPtr comm = mbox->put_async(payload, size);
+      pending_comms.push_back(comm);
+    }
+
+    XBT_INFO("Done dispatching all messages");
+
+    /* Now that all message exchanges were initiated, wait for their completion in one single call */
+    sg4::Comm::wait_all(pending_comms);
+    // sphinx-doc: put-end
+
+    XBT_INFO("Goodbye now!");
+  }
+};
+
+/* Receiver actor expects 1 argument: number of messages to be received */
+class Receiver {
+  sg4::Mailbox* mbox;
+  int messages_count = 10; /* - number of messages */
+
+public:
+  explicit Receiver(int count) : messages_count(count) { mbox = sg4::Mailbox::by_name("receiver"); }
+  void operator()()
+  {
+    /* Vector in which we store all incoming msgs */
+    std::vector<std::unique_ptr<std::string*>> pending_msgs;
+    std::vector<sg4::CommPtr> pending_comms;
+
+    XBT_INFO("Wait for %d messages asynchronously", messages_count);
+    for (int i = 0; i < messages_count; i++) {
+      pending_msgs.push_back(std::make_unique<std::string*>());
+      pending_comms.emplace_back(mbox->get_async<std::string>(pending_msgs[i].get()));
+    }
+    while (not pending_comms.empty()) {
+      ssize_t index    = sg4::Comm::wait_any(pending_comms);
+      std::string* msg = *pending_msgs[index];
+      XBT_INFO("I got '%s'.", msg->c_str());
+      /* cleanup memory and remove from vectors */
+      delete msg;
+      pending_comms.erase(pending_comms.begin() + index);
+      pending_msgs.erase(pending_msgs.begin() + index);
+    }
+  }
+};
+
+/*************************************************************************************************/
+/** @brief Non-linear resource sharing for links
+ *
+ * Note that the callback is called twice in this example:
+ * 1) link UP: with the number of active flows (from 9 to 1)
+ * 2) link DOWN: with 0 active flows. A crosstraffic communication is happing
+ * in the down link, but it's not considered as an active flow.
+ */
+static double link_nonlinear(const sg4::Link* link, double capacity, int n)
+{
+  /* emulates a degradation in link according to the number of flows
+   * you probably want something more complex than that and based on real
+   * experiments */
+  capacity = std::min(capacity, capacity * (1.0 - (n - 1) / 10.0));
+  XBT_INFO("Link %s, %d active communications, new capacity %lf", link->get_cname(), n, capacity);
+  return capacity;
+}
+
+/** @brief Create a simple 2-hosts platform */
+static void load_platform()
+{
+  /* Creates the platform
+   *  ________                 __________
+   * | Sender |===============| Receiver |
+   * |________|    Link1      |__________|
+   */
+  auto* zone     = sg4::create_full_zone("Zone1");
+  auto* sender   = zone->create_host("sender", 1)->seal();
+  auto* receiver = zone->create_host("receiver", 1)->seal();
+
+  auto* link = zone->create_split_duplex_link("link1", 1e6);
+  /* setting same callbacks (could be different) for link UP/DOWN in split-duplex link */
+  link->get_link_up()->set_sharing_policy(
+      sg4::Link::SharingPolicy::NONLINEAR,
+      std::bind(&link_nonlinear, link->get_link_up(), std::placeholders::_1, std::placeholders::_2));
+  link->get_link_down()->set_sharing_policy(
+      sg4::Link::SharingPolicy::NONLINEAR,
+      std::bind(&link_nonlinear, link->get_link_down(), std::placeholders::_1, std::placeholders::_2));
+  link->set_latency(10e-6)->seal();
+
+  /* create routes between nodes */
+  zone->add_route(sender->get_netpoint(), receiver->get_netpoint(), nullptr, nullptr,
+                  {{link, sg4::LinkInRoute::Direction::UP}}, true);
+  zone->seal();
+
+  /* create actors Sender/Receiver */
+  sg4::Actor::create("receiver", receiver, Receiver(9));
+  sg4::Actor::create("sender", sender, Sender(9));
+}
+
+/*************************************************************************************************/
+int main(int argc, char* argv[])
+{
+  sg4::Engine e(&argc, argv);
+
+  /* create platform */
+  load_platform();
+
+  /* runs the simulation */
+  e.run();
+
+  return 0;
+}
diff --git a/examples/cpp/network-nonlinear/s4u-network-nonlinear.tesh b/examples/cpp/network-nonlinear/s4u-network-nonlinear.tesh
new file mode 100644 (file)
index 0000000..a4ece34
--- /dev/null
@@ -0,0 +1,42 @@
+$ ${bindir:=.}/s4u-network-nonlinear "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+>[  0.000000] (1:receiver@receiver) Wait for 9 messages asynchronously
+>[  0.000000] (2:sender@sender) Send 'Message 0' to 'receiver, msg size: 1000000'
+>[  0.000000] (2:sender@sender) Send 'Message 1' to 'receiver, msg size: 2000000'
+>[  0.000000] (2:sender@sender) Send 'Message 2' to 'receiver, msg size: 3000000'
+>[  0.000000] (2:sender@sender) Send 'Message 3' to 'receiver, msg size: 4000000'
+>[  0.000000] (2:sender@sender) Send 'Message 4' to 'receiver, msg size: 5000000'
+>[  0.000000] (2:sender@sender) Send 'Message 5' to 'receiver, msg size: 6000000'
+>[  0.000000] (2:sender@sender) Send 'Message 6' to 'receiver, msg size: 7000000'
+>[  0.000000] (2:sender@sender) Send 'Message 7' to 'receiver, msg size: 8000000'
+>[  0.000000] (2:sender@sender) Send 'Message 8' to 'receiver, msg size: 9000000'
+>[  0.000000] (2:sender@sender) Done dispatching all messages
+>[  0.000000] (0:maestro@) Link link1_UP, 0 active communications, new capacity 1000000.000000
+>[  0.000000] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[  0.000130] (0:maestro@) Link link1_UP, 9 active communications, new capacity 200000.000000
+>[  0.000130] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[ 46.391883] (1:receiver@receiver) I got 'Message 0'.
+>[ 46.391883] (0:maestro@) Link link1_UP, 8 active communications, new capacity 300000.000000
+>[ 46.391883] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[ 73.883292] (1:receiver@receiver) I got 'Message 1'.
+>[ 73.883292] (0:maestro@) Link link1_UP, 7 active communications, new capacity 400000.000000
+>[ 73.883292] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[ 91.924529] (1:receiver@receiver) I got 'Message 2'.
+>[ 91.924529] (0:maestro@) Link link1_UP, 6 active communications, new capacity 500000.000000
+>[ 91.924529] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[104.295663] (1:receiver@receiver) I got 'Message 3'.
+>[104.295663] (0:maestro@) Link link1_UP, 5 active communications, new capacity 600000.000000
+>[104.295663] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[112.886728] (1:receiver@receiver) I got 'Message 4'.
+>[112.886728] (0:maestro@) Link link1_UP, 4 active communications, new capacity 700000.000000
+>[112.886728] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[118.777744] (1:receiver@receiver) I got 'Message 5'.
+>[118.777744] (0:maestro@) Link link1_UP, 3 active communications, new capacity 800000.000000
+>[118.777744] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[122.643724] (1:receiver@receiver) I got 'Message 6'.
+>[122.643724] (0:maestro@) Link link1_UP, 2 active communications, new capacity 900000.000000
+>[122.643724] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[124.934674] (1:receiver@receiver) I got 'Message 7'.
+>[124.934674] (0:maestro@) Link link1_UP, 1 active communications, new capacity 1000000.000000
+>[124.934674] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[125.965602] (1:receiver@receiver) I got 'Message 8'.
+>[125.965602] (2:sender@sender) Goodbye now!
index 0cb06ba..980f6bd 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/env tesh
 
-$ ${bindir:=.}/s4u-network-wifi ${platfdir}/wifi.xml "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+$ ${bindir:=.}/s4u-network-wifi ${platfdir}/wifi.xml "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n" --cfg=network/model:CM02
+> [  0.000000] (0:maestro@) Configuration change: Set 'network/model' to 'CM02'
 > [  0.000000] (1:sender@Station 1) Send a message to the other station.
 > [  0.000000] (2:receiver@Station 2) Wait for a message.
 > [  3.888889] (1:sender@Station 1) Done.
index 6f3f8e3..63c655e 100644 (file)
@@ -51,7 +51,7 @@ static void test_host(const std::string& hostname)
   /* Restore the value for the next test */
   thehost->set_property(exist, "180");
 
-  auto thezone = thehost->get_englobing_zone();
+  const auto* thezone = thehost->get_englobing_zone();
   XBT_INFO("== Print the properties of the zone '%s' that contains '%s'", thezone->get_cname(), hostname.c_str());
   const std::unordered_map<std::string, std::string>* zoneprops = thezone->get_properties();
   keys.clear();
index a2df7c4..06f3d46 100644 (file)
@@ -7,62 +7,62 @@ $ ${bindir:=.}/s4u-plugin-link-load ${platfdir}/cluster_backbone.xml "--log=root
 > [  0.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (0, 0, 0, 0)
 > [  1.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (0, 0, 0, 0)
 > [  1.000000] (1:load_test@node-42.simgrid.org) Launching the transfer of 1000000000 bytes
-> [  2.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (1.27312e+08, 6.36562e+07, 0, 1.27312e+08)
-> [  3.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (2.54625e+08, 8.4875e+07, 0, 1.27312e+08)
-> [  4.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (3.81938e+08, 9.54844e+07, 0, 1.27312e+08)
-> [  5.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (5.0925e+08, 1.0185e+08, 0, 1.27312e+08)
+> [  2.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (1.3125e+08, 6.5625e+07, 0, 1.3125e+08)
+> [  3.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (2.625e+08, 8.75e+07, 0, 1.3125e+08)
+> [  4.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (3.9375e+08, 9.84375e+07, 0, 1.3125e+08)
+> [  5.000000] (2:monitor@node-51.simgrid.org) Backbone link load (cum, avg, min, max): (5.25e+08, 1.05e+08, 0, 1.3125e+08)
 > [  5.000000] (2:monitor@node-51.simgrid.org) Untracking the backbone link
-> [  5.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (4.85e+08, 9.7e+07, 0, 1.2125e+08)
-> [  5.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (4.85e+08, 9.7e+07, 0, 1.2125e+08)
+> [  5.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (5e+08, 1e+08, 0, 1.25e+08)
+> [  5.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (5e+08, 1e+08, 0, 1.25e+08)
 > [  5.000000] (2:monitor@node-51.simgrid.org) Now resetting and probing host links each second.
-> [  6.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [  6.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [  7.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [  7.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [  8.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [  8.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [  9.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [  9.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 10.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (3.09465e+07, 3.09465e+07, 0, 1.2125e+08)
-> [ 10.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (3.09465e+07, 3.09465e+07, 0, 1.2125e+08)
+> [  6.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [  6.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [  7.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [  7.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [  8.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [  8.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [  9.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [  9.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 10.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (3.19036e+07, 3.19036e+07, 0, 1.25e+08)
+> [ 10.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (3.19036e+07, 3.19036e+07, 0, 1.25e+08)
 > [ 11.000000] (1:load_test@node-42.simgrid.org) Launching the transfer of 1000000000 bytes
 > [ 11.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (0, 0, 0, 0)
 > [ 11.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (0, 0, 0, 0)
-> [ 12.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 0, 1.2125e+08)
-> [ 12.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 0, 1.2125e+08)
-> [ 13.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 13.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
+> [ 12.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 0, 1.25e+08)
+> [ 12.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 0, 1.25e+08)
+> [ 13.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 13.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
 > [ 14.000000] (1:load_test@node-42.simgrid.org) Launching the transfer of 1000000000 bytes
-> [ 14.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 14.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 15.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 15.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 16.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 16.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 17.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 17.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 18.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 18.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 19.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 19.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 20.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 20.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 21.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 21.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 22.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 22.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 23.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 23.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 24.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 24.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 25.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 25.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 26.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 26.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 27.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 27.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.2125e+08, 1.2125e+08, 1.2125e+08, 1.2125e+08)
-> [ 28.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (6.09465e+07, 6.09465e+07, 0, 1.2125e+08)
-> [ 28.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (6.09465e+07, 6.09465e+07, 0, 1.2125e+08)
+> [ 14.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 14.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 15.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 15.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 16.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 16.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 17.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 17.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 18.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 18.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 19.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 19.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 20.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 20.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 21.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 21.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 22.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 22.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 23.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 23.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 24.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 24.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 25.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 25.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 26.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 26.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 27.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 27.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (1.25e+08, 1.25e+08, 1.25e+08, 1.25e+08)
+> [ 28.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (6.28314e+07, 6.28314e+07, 0, 1.25e+08)
+> [ 28.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (6.28314e+07, 6.28314e+07, 0, 1.25e+08)
 > [ 29.000000] (2:monitor@node-51.simgrid.org) Host0_UP link load (cum, avg, min, max): (0, 0, 0, 0)
 > [ 29.000000] (2:monitor@node-51.simgrid.org) Host1_UP link load (cum, avg, min, max): (0, 0, 0, 0)
 > [ 29.000000] (0:maestro@) Total simulation time: 29.00
index 571cc0a..fc20568 100644 (file)
@@ -17,14 +17,14 @@ static void ingester(int id, simgrid::plugin::ProducerConsumerPtr<int> pc)
 {
   sg4::this_actor::sleep_for(simgrid::xbt::random::uniform_real(0, 1));
   for (int i = 0; i < 3; i++) {
-    int* data = new int(10 * id + i);
+    auto* data = new int(10 * id + i);
     pc->put(data, 1.2125e6); // last for 0.01s
     XBT_INFO("data sucessfully put: %d", *data);
     sg4::this_actor::sleep_for((3 - i) * simgrid::xbt::random::uniform_real(0, 1));
   }
 
   for (int i = 0; i < 3; i++) {
-    int* data = new int(10 * id + i);
+    auto* data = new int(10 * id + i);
     pc->put_async(data, 1.2125e6); // last for 0.01s
     XBT_INFO("data sucessfully put: %d", *data);
     sg4::this_actor::sleep_for((i + 3) * simgrid::xbt::random::uniform_real(0, 1));
@@ -63,11 +63,10 @@ int main(int argc, char* argv[])
     const auto* host = cluster->create_host(hostname, "1Gf");
 
     std::string linkname = std::string("cluster") + "_link_" + std::to_string(i);
-    auto* link_up        = cluster->create_link(linkname + "_UP", "1Gbps");
-    auto* link_down      = cluster->create_link(linkname + "_DOWN", "1Gbps");
+    const auto* link     = cluster->create_split_duplex_link(linkname, "1Gbps");
 
-    cluster->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, std::vector<sg4::Link*>{link_up}, false);
-    cluster->add_route(nullptr, host->get_netpoint(), nullptr, nullptr, std::vector<sg4::Link*>{link_down}, false);
+    cluster->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, {{link, sg4::LinkInRoute::Direction::UP}},
+                       true);
   }
 
   auto* router = cluster->create_router("cluster_router");
index 22e7c1a..09f693d 100644 (file)
@@ -27,13 +27,11 @@ int main(int argc, char* argv[])
   std::vector<simgrid::kernel::routing::DragonflyZone*> dragonfly_clusters =
       e.get_filtered_netzones<simgrid::kernel::routing::DragonflyZone>();
 
-  if (not dragonfly_clusters.empty()) {
-    for (auto d : dragonfly_clusters) {
-      XBT_INFO("%s' dragonfly topology:", d->get_cname());
-      for (int i = 0; i < d->get_host_count(); i++) {
-        const simgrid::kernel::routing::DragonflyZone::Coords coords = d->rankId_to_coords(i);
-        XBT_INFO("   %d: (%u, %u, %u, %u)", i, coords.group, coords.chassis, coords.blade, coords.node);
-      }
+  for (auto d : dragonfly_clusters) {
+    XBT_INFO("%s' dragonfly topology:", d->get_cname());
+    for (int i = 0; i < d->get_host_count(); i++) {
+      const simgrid::kernel::routing::DragonflyZone::Coords coords = d->rankId_to_coords(i);
+      XBT_INFO("   %d: (%lu, %lu, %lu, %lu)", i, coords.group, coords.chassis, coords.blade, coords.node);
     }
   }
 
diff --git a/examples/cpp/synchro-mutex/.gitignore b/examples/cpp/synchro-mutex/.gitignore
deleted file mode 100644 (file)
index 0ace5ca..0000000
+++ /dev/null
@@ -1 +0,0 @@
-s4u_actor
index d6da005..7acc1ac 100644 (file)
@@ -16,9 +16,9 @@ const char* buffer;                                                        /* Wh
 simgrid::s4u::SemaphorePtr sem_empty = simgrid::s4u::Semaphore::create(1); /* indicates whether the buffer is empty */
 simgrid::s4u::SemaphorePtr sem_full  = simgrid::s4u::Semaphore::create(0); /* indicates whether the buffer is full */
 
-static void producer(const std::vector<std::string>* args)
+static void producer(const std::vector<std::string>& args)
 {
-  for (auto const& str : *args) {
+  for (auto const& str : args) {
     sem_empty->acquire();
     XBT_INFO("Pushing '%s'", str.c_str());
     buffer = str.c_str();
@@ -45,7 +45,7 @@ int main(int argc, char **argv)
   std::vector<std::string> args({"one", "two", "three", ""});
   simgrid::s4u::Engine e(&argc, argv);
   e.load_platform("../../platforms/two_hosts.xml");
-  simgrid::s4u::Actor::create("producer", simgrid::s4u::Host::by_name("Tremblay"), producer, &args);
+  simgrid::s4u::Actor::create("producer", simgrid::s4u::Host::by_name("Tremblay"), producer, std::cref(args));
   simgrid::s4u::Actor::create("consumer", simgrid::s4u::Host::by_name("Jupiter"), consumer);
   e.run();
 
index 83f36cc..3bd30bf 100644 (file)
@@ -395,7 +395,7 @@ public class Peer extends Process {
   // Update the list of current choked and unchoked peers, using the choke algorithm
   private void updateChokedPeers() {
     round = (round + 1) % 3;
-    if (peers.size() == 0) {
+    if (peers.isEmpty()) {
       return;
     }
     //remove a peer from the list
index 1b0626d..3972847 100644 (file)
@@ -22,11 +22,11 @@ $ ${javacmd:=java} -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/..
 > [    0.000000] (0:maestro@) Using regular java threads.
 > [    0.000000] (0:maestro@) Number of hosts '2'
 > [    0.000000] (1:0@100030591) Host '0' send 'Token' to Host '1'
-> [    0.624423] (2:1@100036570) Host '1' received 'Token'
-> [    0.624423] (2:1@100036570) Host '1' send 'Token' to Host '0'
-> [    1.248846] (1:0@100030591) Host '0' received 'Token'
-> [    1.248846] (0:maestro@) Terminating the simulation...
-> [    1.248846] (0:maestro@) Simulation time 1.2488464578972847
+> [    0.625106] (2:1@100036570) Host '1' received 'Token'
+> [    0.625106] (2:1@100036570) Host '1' send 'Token' to Host '0'
+> [    1.250212] (1:0@100030591) Host '0' received 'Token'
+> [    1.250212] (0:maestro@) Terminating the simulation...
+> [    1.250212] (0:maestro@) Simulation time 1.250212042288475
 
 $ ${javacmd:=java} -classpath ${classpath:=.} app/tokenring/Main ${srcdir:=.}/../../platforms/meta_cluster.xml '--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n'
 > [  0.000000] (0:maestro@) Using regular java threads.
diff --git a/examples/deprecated/simdag/schedule-dotload/.gitignore b/examples/deprecated/simdag/schedule-dotload/.gitignore
deleted file mode 100644 (file)
index 84e2127..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-ptg_test
-dot.dot
diff --git a/examples/platforms/CMakeLists.txt b/examples/platforms/CMakeLists.txt
new file mode 100644 (file)
index 0000000..42a5073
--- /dev/null
@@ -0,0 +1,10 @@
+add_custom_target(platf_cpp COMMENT "C++ platform description")
+add_dependencies(tests platf_cpp)
+foreach (platf routing_cluster griffon)
+  add_library       (${platf} SHARED ${platf}.cpp)
+  target_link_libraries(${platf} simgrid)
+  add_dependencies(platf_cpp ${platf})
+  set_target_properties(${platf}
+      PROPERTIES SUFFIX .so
+  )
+endforeach()
diff --git a/examples/platforms/griffon.cpp b/examples/platforms/griffon.cpp
new file mode 100644 (file)
index 0000000..c50ec1b
--- /dev/null
@@ -0,0 +1,106 @@
+/* Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <numeric>
+#include <simgrid/s4u.hpp>
+namespace sg4 = simgrid::s4u;
+
+/**
+ * @brief Create a new cabinet
+ *
+ * This function creates the cabinet, adding the hosts and links properly.
+ * See figure below for more details of each cabinet
+ *
+ * @param root Root netzone
+ * @param name Cabinet name
+ * @param radicals IDs of nodes inside the cabinet
+ * @return netzone,router the created netzone and its router
+ */
+static std::pair<sg4::NetZone*, simgrid::kernel::routing::NetPoint*>
+create_cabinet(const sg4::NetZone* root, const std::string& name, const std::vector<int>& radicals)
+{
+  auto* cluster      = sg4::create_star_zone(name);
+  std::string prefix = "griffon-";
+  std::string suffix = ".nancy.grid5000.fr";
+  cluster->set_parent(root);
+
+  /* create the backbone link */
+  const sg4::Link* l_bb = cluster->create_link("backbone-" + name, "1.25GBps")->seal();
+  sg4::LinkInRoute backbone(l_bb);
+
+  /* create all hosts and connect them to outside world */
+  for (const auto& id : radicals) {
+    std::string hostname = prefix + std::to_string(id) + suffix;
+    /* create host */
+    const sg4::Host* host = cluster->create_host(hostname, "286.087kf");
+    /* create UP/DOWN link */
+    const sg4::Link* link = cluster->create_split_duplex_link(hostname, "125MBps")->set_latency("24us")->seal();
+
+    /* add link and backbone for communications from the host */
+    cluster->add_route(host->get_netpoint(), nullptr, nullptr, nullptr,
+                       {{link, sg4::LinkInRoute::Direction::UP}, backbone}, true);
+  }
+
+  /* create router */
+  auto* router = cluster->create_router(prefix + name + "-router" + suffix);
+
+  cluster->seal();
+  return std::make_pair(cluster, router);
+}
+
+/** @brief Programmatic version of griffon.xml */
+extern "C" void load_platform(const sg4::Engine& e);
+void load_platform(const sg4::Engine& /*e*/)
+{
+  /**
+   * C++ version of griffon.xml
+   * Old Grid5000 cluster (not available anymore): 3 cabinets containing homogeneous nodes connected through a backbone
+   *                                  1.25GBps shared link
+   *                          ___________________________________
+   *          1              /                |                  \
+   *                        /                 |                   \
+   *                       /                  |                    \
+   *     ________________ /             ______|__________           \_________________
+   *     |               |              |               |            |               |
+   *     | cab1 router   |              | cab2 router   |            | cab3 router   |
+   *     |_______________|              |_______________|            |_______________|
+   *     ++++++++++++++++               ++++++++++++++++             ++++++++++++++++++  <-- 1.25 backbone
+   *     / /   | |    \ \              / /    | |    \ \             / /     | |     \ \
+   *    / /    | |     \ \            / /     | |     \ \           / /      | |      \ \ <-- 125Mbps links
+   *   / /     | |      \ \          / /      | |      \ \         / /       | |       \ \
+   * host1     ...      hostN      host1      ...      hostM      host1      ...       hostQ
+   */
+
+  auto* root = sg4::create_star_zone("AS_griffon");
+  sg4::NetZone* cab_zone;
+  simgrid::kernel::routing::NetPoint* router;
+
+  /* create top link */
+  const sg4::Link* l_bb = root->create_link("backbone", "1.25GBps")->set_latency("24us")->seal();
+  sg4::LinkInRoute backbone{l_bb};
+
+  /* create cabinet1 */
+  std::vector<int> rad(32);
+  std::iota(rad.begin(), rad.end(), 1); // 1-29,58,59,60
+  rad[rad.size() - 1]        = 60;
+  rad[rad.size() - 2]        = 59;
+  rad[rad.size() - 3]        = 58;
+  std::tie(cab_zone, router) = create_cabinet(root, "cabinet1", rad);
+  root->add_route(cab_zone->get_netpoint(), nullptr, router, nullptr, {backbone});
+
+  /* create cabinet2 */
+  rad.resize(28);
+  std::iota(rad.begin(), rad.end(), 30); // 30-57
+  std::tie(cab_zone, router) = create_cabinet(root, "cabinet2", rad);
+  root->add_route(cab_zone->get_netpoint(), nullptr, router, nullptr, {backbone});
+
+  /* create cabinet3 */
+  rad.resize(32);
+  std::iota(rad.begin(), rad.end(), 61); // 61-92
+  std::tie(cab_zone, router) = create_cabinet(root, "cabinet3", rad);
+  root->add_route(cab_zone->get_netpoint(), nullptr, router, nullptr, {backbone});
+
+  root->seal();
+}
diff --git a/examples/platforms/routing_cluster.cpp b/examples/platforms/routing_cluster.cpp
new file mode 100644 (file)
index 0000000..a1be85f
--- /dev/null
@@ -0,0 +1,90 @@
+/* Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <simgrid/s4u.hpp>
+namespace sg4 = simgrid::s4u;
+
+/**
+ * @brief Create a new cluster netzone inside the root netzone
+ *
+ * This function creates the cluster, adding the hosts and links properly.
+ *
+ * @param root Root netzone
+ * @param cluster_suffix ID of the cluster being created
+ * @param host List of hostname inside the cluster
+ * @param single_link_host Hostname of "special" node
+ */
+static void create_cluster(const sg4::NetZone* root, const std::string& cluster_suffix,
+                           const std::vector<std::string>& hosts, const std::string& single_link_host)
+{
+  auto* cluster = sg4::create_star_zone("cluster" + cluster_suffix);
+  cluster->set_parent(root);
+
+  /* create the backbone link */
+  const sg4::Link* l_bb = cluster->create_link("backbone" + cluster_suffix, 2.25e9)->set_latency(5e-4)->seal();
+
+  /* create all hosts and connect them to outside world */
+  for (const auto& hostname : hosts) {
+    /* create host */
+    const sg4::Host* host = cluster->create_host(hostname, 1e9);
+    /* create UP link */
+    const sg4::Link* l_up = cluster->create_link(hostname + "_up", 1.25e8)->set_latency(0.0001)->seal();
+    /* create DOWN link, if needed */
+    const sg4::Link* l_down = l_up;
+    if (hostname != single_link_host) {
+      l_down = cluster->create_link(hostname + "_down", 1.25e8)->set_latency(0.0001)->seal();
+    }
+    sg4::LinkInRoute backbone{l_bb};
+    sg4::LinkInRoute link_up{l_up};
+    sg4::LinkInRoute link_down{l_down};
+
+    /* add link UP and backbone for communications from the host */
+    cluster->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, {link_up, backbone}, false);
+    /* add backbone and link DOWN for communications to the host */
+    cluster->add_route(nullptr, host->get_netpoint(), nullptr, nullptr, {backbone, link_down}, false);
+  }
+
+  /* create router */
+  cluster->create_router("router" + cluster_suffix);
+
+  cluster->seal();
+}
+
+/** @brief Programmatic version of routing_cluster.xml */
+extern "C" void load_platform(const sg4::Engine& e);
+void load_platform(const sg4::Engine& e)
+{
+  /**
+   *
+   * Target platform: 2 simular but irregular clusters.
+   * Nodes use full-duplex links to connect to the backbone, except one node that uses a single
+   * shared link.
+
+   *                  router1 - - - - - - link1-2 - - - - - - router2
+   *       __________________________                   _________________________
+   *       |                        |                   |                        |
+   *       |        backbone1       |                   |      backbone2         |
+   *       |________________________|                   |________________________|
+   *       / /         |          \ \                   / /         |          \ \
+   *l1_up / / l1_down  | l3   l2_up\ \ l2_down   l4_up / / l4_down  | l6   l5_up\ \ l5_down
+   *     / /           |            \ \               / /           |            \ \
+   *   host1         host3         host2           host4         host6          host5
+   */
+
+  auto* root = sg4::create_full_zone("AS0");
+
+  /* create left cluster */
+  create_cluster(root, "1", {"host1", "host2", "host3"}, "host3");
+  /* create right cluster */
+  create_cluster(root, "2", {"host4", "host5", "host6"}, "host6");
+
+  /* connect both cluster through their respective routers */
+  const sg4::Link* l = root->create_link("link1-2", 2.25e9)->set_latency(5e-4)->seal();
+  sg4::LinkInRoute link{l};
+  root->add_route(e.netpoint_by_name_or_null("cluster1"), e.netpoint_by_name_or_null("cluster2"),
+                  e.netpoint_by_name_or_null("router1"), e.netpoint_by_name_or_null("router2"), {link});
+
+  root->seal();
+}
index c7b515c..66853f3 100644 (file)
@@ -1,6 +1,7 @@
 foreach(example actor-create actor-daemon actor-join actor-kill actor-migrate actor-suspend actor-yield actor-lifetime
                 comm-wait comm-waitall comm-waitany
-                exec-async exec-basic exec-dvfs exec-remote)
+                exec-async exec-basic exec-dvfs exec-remote
+                network-nonlinear clusters-multicpu io-degradation exec-cpu-nonlinear)
   set(tesh_files    ${tesh_files}   ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.tesh)
   set(examples_src  ${examples_src} ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.py)
 
diff --git a/examples/python/clusters-multicpu/clusters-multicpu.py b/examples/python/clusters-multicpu/clusters-multicpu.py
new file mode 100644 (file)
index 0000000..8184228
--- /dev/null
@@ -0,0 +1,300 @@
+# Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+# This example shows how to build a torus cluster with multi-core hosts.
+#
+# However, each leaf in the torus is a StarZone, composed of several CPUs
+#
+# Each actor runs in a specific CPU. One sender broadcasts a message to all receivers.
+
+import simgrid
+import sys
+import typing
+
+
+class Sender:
+    """
+    Send a msg for each host in its host list
+    """
+
+    def __init__(self, hosts, msg_size=int(1e6)):
+        self.hosts = hosts
+        self.msg_size = msg_size
+
+    # Actors that are created as object will execute their __call__ method.
+    # So, the following constitutes the main function of the Sender actor.
+    def __call__(self):
+        pending_comms = []
+        mboxes = []
+
+        for host in self.hosts:
+            msg = "Hello, I'm alive and running on " + simgrid.this_actor.get_host().name
+            mbox = simgrid.Mailbox.by_name(host.name)
+            mboxes.append(mbox)
+            pending_comms.append(mbox.put_async(msg, self.msg_size))
+
+        simgrid.this_actor.info("Done dispatching all messages")
+
+        # Now that all message exchanges were initiated, wait for their completion in one single call
+        simgrid.Comm.wait_all(pending_comms)
+
+        simgrid.this_actor.info("Goodbye now!")
+
+
+class Receiver:
+    """
+    Receiver actor: wait for 1 message on the mailbox identified by the hostname
+    """
+
+    def __call__(self):
+        mbox = simgrid.Mailbox.by_name(simgrid.this_actor.get_host().name)
+        received = mbox.get()
+        simgrid.this_actor.info("I got a '%s'." % received)
+
+#####################################################################################################
+
+
+def create_hostzone(zone: simgrid.NetZone, coord: typing.List[int], ident: int) -> typing.Tuple[simgrid.NetPoint, simgrid.NetPoint]:
+    """
+    Callback to set a cluster leaf/element
+
+    In our example, each leaf if a StarZone, composed of 8 CPUs.
+    Each CPU is modeled as a host, connected to the outer world through a high-speed PCI link.
+    Obs.: CPU0 is the gateway for this zone
+
+       (outer world)
+            CPU0 (gateway)
+       up ->|   |
+            |   |<-down
+            +star+
+         /   / \   \
+        /   /   \   \<-- 100Gbs, 10us link (1 link UP and 1 link DOWN for full-duplex)
+       /   /     \   \
+      /   /       \   \
+      CPU1   ...   CPU8
+
+    :param zone: Cluster netzone being created (usefull to create the hosts/links inside it)
+    :param coord: Coordinates in the cluster
+    :param ident: Internal identifier in the torus (for information)
+    :return netpoint, gateway: the netpoint to the StarZone and CPU0 as gateway
+    """
+    num_cpus = 8     # Number of CPUs in the zone
+    speed = "1Gf"    # Speed of each CPU
+    link_bw = "100GBps"  # Link bw connecting the CPU
+    link_lat = "1ns"  # Link latency
+
+    hostname = "host" + str(ident)
+    # create the StarZone
+    host_zone = simgrid.NetZone.create_star_zone(hostname)
+    # setting my Torus parent zone
+    host_zone.set_parent(zone)
+
+    gateway = None
+    # create CPUs
+    for i in range(num_cpus):
+        cpu_name = hostname + "-cpu" + str(i)
+        host = host_zone.create_host(cpu_name, speed).seal()
+        # the first CPU is the gateway
+        if i == 0:
+            gateway = host
+        # create split-duplex link
+        link = host_zone.create_split_duplex_link("link-" + cpu_name, link_bw)
+        link.set_latency(link_lat).seal()
+        # connecting CPU to outer world
+        host_zone.add_route(host.get_netpoint(), None, None, None, [
+                            simgrid.LinkInRoute(link, simgrid.LinkInRoute.Direction.UP)], True)
+
+    # seal newly created netzone
+    host_zone.seal()
+    return host_zone.get_netpoint(), gateway.get_netpoint()
+
+#####################################################################################################
+
+
+def create_limiter(zone: simgrid.NetZone, coord: typing.List[int], ident: int) -> simgrid.Link:
+    """
+    Callback to create limiter link (1Gbs) for each netpoint
+
+    The coord parameter depends on the cluster being created:
+    - Torus: Direct translation of the Torus' dimensions, e.g. (0, 0, 0) for a 3-D Torus
+    - Fat-Tree: A pair (level in the tree, ident), e.g. (0, 0) for first leaf in the tree and (1,0) for the first switch at
+    level 1.
+    - Dragonfly: a tuple (group, chassis, blades/routers, nodes), e.g. (0, 0, 0, 0) for first node in the cluster. To
+    identify the router inside a (group, chassis, blade), we use MAX_UINT in the last parameter (e.g. 0, 0, 0,
+    4294967295).
+
+    :param zone: Torus netzone being created (usefull to create the hosts/links inside it)
+    :param coord: Coordinates in the cluster
+    :param ident: Internal identifier in the torus (for information)
+    :return: Limiter link
+    """
+    return zone.create_link("limiter-" + str(ident), [1e9]).seal()
+
+
+def create_torus_cluster():
+    """
+    Creates a TORUS cluster
+
+    Creates a TORUS cluster with dimensions 2x2x2
+
+    The cluster has 8 elements/leaves in total. Each element is a StarZone containing 8 Hosts.
+    Each pair in the torus is connected through 2 links:
+    1) limiter: a 1Gbs limiter link (set by user through the set_limiter callback)
+    2) link: 10Gbs link connecting the components (created automatically)
+
+    (Y-axis=2)
+    A
+    |
+    |   D (Z-axis=2)
+    +  / 10 Gbs
+    | +
+    |/ limiter=1Gps
+    B-----+----C (X-axis=2)
+
+    For example, a communication from A to C goes through:
+    <tt> A->limiter(A)->link(A-B)->limiter(B)->link(B-C)->limiter(C)->C </tt>
+
+    More precisely, considering that A and C are StarZones, a
+    communication from A-CPU-3 to C-CPU-7 goes through:
+    1) StarZone A: A-CPU-3 -> link-up-A-CPU-3 -> A-CPU-0
+    2) A-CPU-0->limiter(A)->link(A-B)->limiter(B)->link(B-C)->limiter(C)->C-CPU-0
+    3) StarZone C: C-CPU-0-> link-down-C-CPU-7 -> C-CPU-7
+
+    Note that we don't have limiter links inside the StarZones(A, B, C),
+    but we have limiters in the Torus that are added to the links in the path (as we can see in "2)")
+
+    More details in: <a href="https://simgrid.org/doc/latest/Platform_examples.html?highlight=torus#torus-cluster">Torus
+    Cluster</a>
+    """
+    # create the torus cluster, 10Gbs link between elements in the cluster
+    simgrid.NetZone.create_torus_zone("cluster", None, [2, 2, 2], simgrid.ClusterCallbacks(create_hostzone, None, create_limiter), 10e9, 10e-6,
+                                      simgrid.Link.SharingPolicy.SPLITDUPLEX).seal()
+
+#####################################################################################################
+
+
+def create_fat_tree_cluster():
+    """
+    Creates a Fat-Tree cluster
+
+    Creates a Fat-Tree cluster with 2 levels and 6 nodes
+    The following parameters are used to create this cluster:
+    - Levels: 2 - two-level of switches in the cluster
+    - Down links: 2, 3 - L2 routers is connected to 2 elements, L1 routers to 3 elements
+    - Up links: 1, 2 - Each node (A-F) is connected to 1 L1 router, L1 routers are connected to 2 L2
+    - Link count: 1, 1 - Use 1 link in each level
+
+    The first parameter describes how many levels we have.
+    The following ones describe the connection between the elements and must have exactly n_levels components.
+
+
+                            S3     S4                <-- Level 2 routers
+       link:limiter -      /   \  /  \
+                          +     ++    +
+       link: 10GBps -->  |     /  \    |
+        (full-duplex)    |    /    \   |
+                         +   +      +  +
+                         |  /        \ |
+                         S1           S2             <-- Level 1 routers
+      link:limiter ->    |             |
+                         +             +
+     link:10GBps  -->   /|\           /|\
+                       / | \         / | \
+                      +  +  +       +  +  +
+     link:limiter -> /   |   \     /   |   \
+                    A    B    C   D    E    F        <-- level 0 Nodes
+
+    Each element (A to F) is a StarZone containing 8 Hosts.
+    The connection uses 2 links:
+    1) limiter: a 1Gbs limiter link (set by user through the set_limiter callback)
+    2) link: 10Gbs link connecting the components (created automatically)
+
+    For example, a communication from A to C goes through:
+    <tt> A->limiter(A)->link(A-S1)->limiter(S1)->link(S1-C)->->limiter(C)->C</tt>
+
+    More precisely, considering that A and C are StarZones, a
+    communication from A-CPU-3 to C-CPU-7 goes through:
+    1) StarZone A: A-CPU-3 -> link-up-A-CPU-3 -> A-CPU-0
+    2) A-CPU-0->limiter(A)->link(A-S1)->limiter(S1)->link(S1-C)->limiter(C)->C-CPU-0
+    3) StarZone C: C-CPU-0-> link-down-C-CPU-7 -> C-CPU-7
+
+    More details in: <a href="https://simgrid.org/doc/latest/Platform_examples.html#fat-tree-cluster">Fat-Tree
+    Cluster</a>
+    """
+    # create the fat tree cluster, 10Gbs link between elements in the cluster
+    simgrid.NetZone.create_fatTree_zone("cluster", None, simgrid.FatTreeParams(2, [2, 3], [1, 2], [1, 1]), simgrid.ClusterCallbacks(create_hostzone, None, create_limiter), 10e9,
+                                        10e-6, simgrid.Link.SharingPolicy.SPLITDUPLEX).seal()
+
+#####################################################################################################
+
+
+def create_dragonfly_cluster():
+    """
+    Creates a Dragonfly cluster
+
+    Creates a Dragonfly cluster with 2 groups and 16 nodes
+    The following parameters are used to create this cluster:
+    - Groups: 2 groups, connected with 2 links (blue links)
+    - Chassis: 2 chassis, connected with a single link (black links)
+    - Routers: 2 routers, connected with 2 links (green links)
+    - Nodes: 2 leaves per router, single link
+
+    The diagram below illustrates a group in the dragonfly cluster
+
+    +------------------------------------------------+
+    |        black link(1)                           |
+    |     +------------------------+                 |
+    | +---|--------------+     +---|--------------+  |
+    | |   |  green       |     |   |  green       |  |
+    | |   |  links (2)   |     |   |  links (2)   |  |   blue links(2)
+    | |   R1 ====== R2   |     |   R3 -----  R4 ======================> "Group 2"
+    | |  /  \      /  \  |     |  /  \      /  \  |  |
+    | | A    B    C    D |     | E    F    G    H |  |
+    | +------------------+     +------------------+  |
+    |      Chassis 1                Chassis 2        |
+    +------------------------------------------------+
+     Group 1
+
+    Each element (A, B, C, etc) is a StarZone containing 8 Hosts.
+    The connection between elements (e.g. A->R1) uses 2 links:
+    1) limiter: a 1Gbs limiter link (set by user through the set_limiter callback)
+    2) link: 10Gbs link connecting the components (created automatically)
+
+    For example, a communication from A to C goes through:
+    <tt> A->limiter(A)->link(A-R1)->limiter(R1)->link(R1-R2)->limiter(R2)->link(R2-C)limiter(C)->C</tt>
+
+    More details in: <a href="https://simgrid.org/doc/latest/Platform_examples.html#dragonfly-cluster">Dragonfly
+    Cluster</a>
+    """
+    # create the dragonfly cluster, 10Gbs link between elements in the cluster
+    simgrid.NetZone.create_dragonfly_zone("cluster", None, simgrid.DragonflyParams([2, 2], [2, 1], [2, 2], 2), simgrid.ClusterCallbacks(
+        create_hostzone, None, create_limiter), 10e9, 10e-6, simgrid.Link.SharingPolicy.SPLITDUPLEX).seal()
+
+###################################################################################################
+
+
+if __name__ == '__main__':
+    e = simgrid.Engine(sys.argv)
+    platform = sys.argv[1]
+
+    # create platform
+    if platform == "torus":
+        create_torus_cluster()
+    elif platform == "fatTree":
+        create_fat_tree_cluster()
+    elif platform == "dragonfly":
+        create_dragonfly_cluster()
+    else:
+        sys.exit("invalid param")
+
+    host_list = e.get_all_hosts()
+    # create the sender actor running on first host
+    simgrid.Actor.create("sender", host_list[0], Sender(host_list))
+    # create receiver in every host
+    for host in host_list:
+        simgrid.Actor.create("receiver-" + host.name, host, Receiver())
+
+    # runs the simulation
+    e.run()
diff --git a/examples/python/clusters-multicpu/clusters-multicpu.tesh b/examples/python/clusters-multicpu/clusters-multicpu.tesh
new file mode 100644 (file)
index 0000000..fbd909f
--- /dev/null
@@ -0,0 +1,254 @@
+#!/usr/bin/env tesh
+
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${srcdir:=.}/clusters-multicpu.py torus "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:sender@host0-cpu0) Done dispatching all messages
+> [  0.000083] (9:receiver-host0-cpu7@host0-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (8:receiver-host0-cpu6@host0-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (7:receiver-host0-cpu5@host0-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (6:receiver-host0-cpu4@host0-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (5:receiver-host0-cpu3@host0-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (4:receiver-host0-cpu2@host0-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (3:receiver-host0-cpu1@host0-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (2:receiver-host0-cpu0@host0-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.045733] (34:receiver-host4-cpu0@host4-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.045733] (18:receiver-host2-cpu0@host2-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.045733] (10:receiver-host1-cpu0@host1-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (41:receiver-host4-cpu7@host4-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (40:receiver-host4-cpu6@host4-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (39:receiver-host4-cpu5@host4-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (38:receiver-host4-cpu4@host4-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (37:receiver-host4-cpu3@host4-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (36:receiver-host4-cpu2@host4-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (35:receiver-host4-cpu1@host4-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (25:receiver-host2-cpu7@host2-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (24:receiver-host2-cpu6@host2-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (23:receiver-host2-cpu5@host2-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (22:receiver-host2-cpu4@host2-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (21:receiver-host2-cpu3@host2-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (20:receiver-host2-cpu2@host2-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (19:receiver-host2-cpu1@host2-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (17:receiver-host1-cpu7@host1-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (16:receiver-host1-cpu6@host1-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (15:receiver-host1-cpu5@host1-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (14:receiver-host1-cpu4@host1-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (13:receiver-host1-cpu3@host1-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (12:receiver-host1-cpu2@host1-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.046063] (11:receiver-host1-cpu1@host1-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058223] (50:receiver-host6-cpu0@host6-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058223] (42:receiver-host5-cpu0@host5-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058223] (26:receiver-host3-cpu0@host3-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (57:receiver-host6-cpu7@host6-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (56:receiver-host6-cpu6@host6-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (55:receiver-host6-cpu5@host6-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (54:receiver-host6-cpu4@host6-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (53:receiver-host6-cpu3@host6-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (52:receiver-host6-cpu2@host6-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (51:receiver-host6-cpu1@host6-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (49:receiver-host5-cpu7@host5-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (48:receiver-host5-cpu6@host5-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (47:receiver-host5-cpu5@host5-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (46:receiver-host5-cpu4@host5-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (45:receiver-host5-cpu3@host5-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (44:receiver-host5-cpu2@host5-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (43:receiver-host5-cpu1@host5-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (33:receiver-host3-cpu7@host3-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (32:receiver-host3-cpu6@host3-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (31:receiver-host3-cpu5@host3-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (30:receiver-host3-cpu4@host3-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (29:receiver-host3-cpu3@host3-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (28:receiver-host3-cpu2@host3-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.058362] (27:receiver-host3-cpu1@host3-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060722] (58:receiver-host7-cpu0@host7-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060749] (65:receiver-host7-cpu7@host7-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060749] (64:receiver-host7-cpu6@host7-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060749] (63:receiver-host7-cpu5@host7-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060749] (62:receiver-host7-cpu4@host7-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060749] (61:receiver-host7-cpu3@host7-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060749] (60:receiver-host7-cpu2@host7-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060749] (59:receiver-host7-cpu1@host7-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.060749] (1:sender@host0-cpu0) Goodbye now!
+
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${srcdir:=.}/clusters-multicpu.py fatTree "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:sender@host0-cpu0) Done dispatching all messages
+> [  0.000083] (9:receiver-host0-cpu7@host0-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (8:receiver-host0-cpu6@host0-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (7:receiver-host0-cpu5@host0-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (6:receiver-host0-cpu4@host0-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (5:receiver-host0-cpu3@host0-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (4:receiver-host0-cpu2@host0-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (3:receiver-host0-cpu1@host0-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (2:receiver-host0-cpu0@host0-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.027921] (10:receiver-host1-cpu0@host1-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.028052] (17:receiver-host1-cpu7@host1-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.028052] (16:receiver-host1-cpu6@host1-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.028052] (15:receiver-host1-cpu5@host1-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.028052] (14:receiver-host1-cpu4@host1-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.028052] (13:receiver-host1-cpu3@host1-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.028052] (12:receiver-host1-cpu2@host1-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.028052] (11:receiver-host1-cpu1@host1-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043476] (42:receiver-host5-cpu0@host5-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043476] (34:receiver-host4-cpu0@host4-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043476] (26:receiver-host3-cpu0@host3-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043476] (18:receiver-host2-cpu0@host2-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (49:receiver-host5-cpu7@host5-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (48:receiver-host5-cpu6@host5-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (47:receiver-host5-cpu5@host5-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (46:receiver-host5-cpu4@host5-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (45:receiver-host5-cpu3@host5-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (44:receiver-host5-cpu2@host5-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (43:receiver-host5-cpu1@host5-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (41:receiver-host4-cpu7@host4-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (40:receiver-host4-cpu6@host4-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (39:receiver-host4-cpu5@host4-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (38:receiver-host4-cpu4@host4-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (37:receiver-host4-cpu3@host4-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (36:receiver-host4-cpu2@host4-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (35:receiver-host4-cpu1@host4-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (33:receiver-host3-cpu7@host3-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (32:receiver-host3-cpu6@host3-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (31:receiver-host3-cpu5@host3-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (30:receiver-host3-cpu4@host3-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (29:receiver-host3-cpu3@host3-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (28:receiver-host3-cpu2@host3-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (27:receiver-host3-cpu1@host3-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (25:receiver-host2-cpu7@host2-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (24:receiver-host2-cpu6@host2-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (23:receiver-host2-cpu5@host2-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (22:receiver-host2-cpu4@host2-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (21:receiver-host2-cpu3@host2-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (20:receiver-host2-cpu2@host2-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (19:receiver-host2-cpu1@host2-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.043559] (1:sender@host0-cpu0) Goodbye now!
+
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${srcdir:=.}/clusters-multicpu.py dragonfly "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:sender@host0-cpu0) Done dispatching all messages
+> [  0.000083] (9:receiver-host0-cpu7@host0-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (8:receiver-host0-cpu6@host0-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (7:receiver-host0-cpu5@host0-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (6:receiver-host0-cpu4@host0-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (5:receiver-host0-cpu3@host0-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (4:receiver-host0-cpu2@host0-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (3:receiver-host0-cpu1@host0-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.000083] (2:receiver-host0-cpu0@host0-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.075914] (10:receiver-host1-cpu0@host1-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.076281] (17:receiver-host1-cpu7@host1-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.076281] (16:receiver-host1-cpu6@host1-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.076281] (15:receiver-host1-cpu5@host1-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.076281] (14:receiver-host1-cpu4@host1-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.076281] (13:receiver-host1-cpu3@host1-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.076281] (12:receiver-host1-cpu2@host1-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.076281] (11:receiver-host1-cpu1@host1-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102132] (74:receiver-host3-cpu0@host3-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102132] (66:receiver-host2-cpu0@host2-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (81:receiver-host3-cpu7@host3-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (80:receiver-host3-cpu6@host3-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (79:receiver-host3-cpu5@host3-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (78:receiver-host3-cpu4@host3-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (77:receiver-host3-cpu3@host3-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (76:receiver-host3-cpu2@host3-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (75:receiver-host3-cpu1@host3-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (73:receiver-host2-cpu7@host2-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (72:receiver-host2-cpu6@host2-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (71:receiver-host2-cpu5@host2-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (70:receiver-host2-cpu4@host2-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (69:receiver-host2-cpu3@host2-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (68:receiver-host2-cpu2@host2-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102454] (67:receiver-host2-cpu1@host2-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102853] (90:receiver-host5-cpu0@host5-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.102853] (82:receiver-host4-cpu0@host4-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (97:receiver-host5-cpu7@host5-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (96:receiver-host5-cpu6@host5-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (95:receiver-host5-cpu5@host5-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (94:receiver-host5-cpu4@host5-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (93:receiver-host5-cpu3@host5-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (92:receiver-host5-cpu2@host5-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (91:receiver-host5-cpu1@host5-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (89:receiver-host4-cpu7@host4-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (88:receiver-host4-cpu6@host4-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (87:receiver-host4-cpu5@host4-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (86:receiver-host4-cpu4@host4-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (85:receiver-host4-cpu3@host4-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (84:receiver-host4-cpu2@host4-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.103113] (83:receiver-host4-cpu1@host4-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118451] (122:receiver-host9-cpu0@host9-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118451] (114:receiver-host8-cpu0@host8-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (129:receiver-host9-cpu7@host9-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (128:receiver-host9-cpu6@host9-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (127:receiver-host9-cpu5@host9-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (126:receiver-host9-cpu4@host9-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (125:receiver-host9-cpu3@host9-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (124:receiver-host9-cpu2@host9-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (123:receiver-host9-cpu1@host9-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (121:receiver-host8-cpu7@host8-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (120:receiver-host8-cpu6@host8-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (119:receiver-host8-cpu5@host8-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (118:receiver-host8-cpu4@host8-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (117:receiver-host8-cpu3@host8-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (116:receiver-host8-cpu2@host8-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118652] (115:receiver-host8-cpu1@host8-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118890] (106:receiver-host7-cpu0@host7-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.118890] (98:receiver-host6-cpu0@host6-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (113:receiver-host7-cpu7@host7-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (112:receiver-host7-cpu6@host7-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (111:receiver-host7-cpu5@host7-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (110:receiver-host7-cpu4@host7-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (109:receiver-host7-cpu3@host7-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (108:receiver-host7-cpu2@host7-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (107:receiver-host7-cpu1@host7-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (105:receiver-host6-cpu7@host6-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (104:receiver-host6-cpu6@host6-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (103:receiver-host6-cpu5@host6-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (102:receiver-host6-cpu4@host6-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (101:receiver-host6-cpu3@host6-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (100:receiver-host6-cpu2@host6-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.119044] (99:receiver-host6-cpu1@host6-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127302] (26:receiver-host11-cpu0@host11-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127302] (18:receiver-host10-cpu0@host10-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (33:receiver-host11-cpu7@host11-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (32:receiver-host11-cpu6@host11-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (31:receiver-host11-cpu5@host11-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (30:receiver-host11-cpu4@host11-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (29:receiver-host11-cpu3@host11-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (28:receiver-host11-cpu2@host11-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (27:receiver-host11-cpu1@host11-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (25:receiver-host10-cpu7@host10-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (24:receiver-host10-cpu6@host10-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (23:receiver-host10-cpu5@host10-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (22:receiver-host10-cpu4@host10-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (21:receiver-host10-cpu3@host10-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (20:receiver-host10-cpu2@host10-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127410] (19:receiver-host10-cpu1@host10-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127518] (42:receiver-host13-cpu0@host13-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127518] (34:receiver-host12-cpu0@host12-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (49:receiver-host13-cpu7@host13-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (48:receiver-host13-cpu6@host13-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (47:receiver-host13-cpu5@host13-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (46:receiver-host13-cpu4@host13-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (45:receiver-host13-cpu3@host13-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (44:receiver-host13-cpu2@host13-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (43:receiver-host13-cpu1@host13-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (41:receiver-host12-cpu7@host12-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (40:receiver-host12-cpu6@host12-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (39:receiver-host12-cpu5@host12-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (38:receiver-host12-cpu4@host12-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (37:receiver-host12-cpu3@host12-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (36:receiver-host12-cpu2@host12-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.127586] (35:receiver-host12-cpu1@host12-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130128] (58:receiver-host15-cpu0@host15-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130128] (50:receiver-host14-cpu0@host14-cpu0) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (65:receiver-host15-cpu7@host15-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (64:receiver-host15-cpu6@host15-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (63:receiver-host15-cpu5@host15-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (62:receiver-host15-cpu4@host15-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (61:receiver-host15-cpu3@host15-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (60:receiver-host15-cpu2@host15-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (59:receiver-host15-cpu1@host15-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (57:receiver-host14-cpu7@host14-cpu7) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (56:receiver-host14-cpu6@host14-cpu6) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (55:receiver-host14-cpu5@host14-cpu5) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (54:receiver-host14-cpu4@host14-cpu4) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (53:receiver-host14-cpu3@host14-cpu3) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (52:receiver-host14-cpu2@host14-cpu2) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (51:receiver-host14-cpu1@host14-cpu1) I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [  0.130157] (1:sender@host0-cpu0) Goodbye now!
+
diff --git a/examples/python/exec-cpu-nonlinear/exec-cpu-nonlinear.py b/examples/python/exec-cpu-nonlinear/exec-cpu-nonlinear.py
new file mode 100644 (file)
index 0000000..c7ed498
--- /dev/null
@@ -0,0 +1,67 @@
+# Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+# This example shows how to simulate a non-linear resource sharing for
+# CPUs.
+
+
+from simgrid import Actor, Engine, NetZone, Host, this_actor
+import sys
+import functools
+
+
+def runner():
+    computation_amount = this_actor.get_host().speed
+    n_task = 10
+
+    this_actor.info("Execute %d tasks of %g flops, should take %d second in a CPU without degradation. It will take the double here." % (
+        n_task, computation_amount, n_task))
+    tasks = [this_actor.exec_init(computation_amount).start()
+             for _ in range(n_task)]
+
+    this_actor.info("Waiting for all tasks to be done!")
+    for task in tasks:
+        task.wait()
+
+    this_actor.info("Finished executing. Goodbye now!")
+
+
+def cpu_nonlinear(host: Host, capacity: float, n: int) -> float:
+    """ Non-linear resource sharing for CPU """
+    # emulates a degradation in CPU according to the number of tasks
+    # totally unrealistic but for learning purposes
+    capacity = capacity / 2 if n > 1 else capacity
+    this_actor.info("Host %s, %d concurrent tasks, new capacity %f" %
+                    (host.name, n, capacity))
+    return capacity
+
+
+def load_platform():
+    """ Create a simple 1-host platform """
+    zone = NetZone.create_empty_zone("Zone1")
+    runner_host = zone.create_host("runner", 1e6)
+    runner_host.set_sharing_policy(
+        Host.SharingPolicy.NONLINEAR, functools.partial(cpu_nonlinear, runner_host))
+    runner_host.seal()
+    zone.seal()
+
+    # create actor runner
+    Actor.create("runner", runner_host, runner)
+
+
+if __name__ == '__main__':
+    e = Engine(sys.argv)
+
+    # create platform
+    load_platform()
+
+    # runs the simulation
+    e.run()
+
+    # explicitly deleting Engine object to avoid segfault during cleanup phase.
+    # During Engine destruction, the cleanup of std::function linked to non_linear callback is called.
+    # If we let the cleanup by itself, it fails trying on its destruction because the python main program
+    # has already freed its variables
+    del(e)
diff --git a/examples/python/exec-cpu-nonlinear/exec-cpu-nonlinear.tesh b/examples/python/exec-cpu-nonlinear/exec-cpu-nonlinear.tesh
new file mode 100644 (file)
index 0000000..0b9075b
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/env tesh
+
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${srcdir:=.}/exec-cpu-nonlinear.py "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:runner@runner) Execute 10 tasks of 1e+06 flops, should take 10 second in a CPU without degradation. It will take the double here.
+> [  0.000000] (1:runner@runner) Waiting for all tasks to be done!
+> [  0.000000] (0:maestro@) Host runner, 10 concurrent tasks, new capacity 500000.000000
+> [ 20.000000] (1:runner@runner) Finished executing. Goodbye now!
diff --git a/examples/python/io-degradation/io-degradation.py b/examples/python/io-degradation/io-degradation.py
new file mode 100644 (file)
index 0000000..626f418
--- /dev/null
@@ -0,0 +1,124 @@
+# Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+# This example shows how to simulate a non-linear resource sharing for disk
+# operations.
+#
+# It is inspired on the paper
+# "Adding Storage Simulation Capacities to the SimGridToolkit: Concepts, Models, and API"
+# Available at : https://hal.inria.fr/hal-01197128/document
+#
+# It shows how to simulate concurrent operations degrading overall performance of IO
+# operations (specifically the effects presented in Fig. 8 of the paper).
+
+
+from simgrid import Actor, Engine, NetZone, Host, Disk, this_actor
+import sys
+import functools
+
+
+def estimate_bw(disk: Disk, n_flows: int, read: bool):
+    """ Calculates the bandwidth for disk doing async operations """
+    size = 100000
+    cur_time = Engine.get_clock()
+    activities = [disk.read_async(size) if read else disk.write_async(
+        size) for _ in range(n_flows)]
+
+    for act in activities:
+        act.wait()
+
+    elapsed_time = Engine.get_clock() - cur_time
+    estimated_bw = float(size * n_flows) / elapsed_time
+    this_actor.info("Disk: %s, concurrent %s: %d, estimated bandwidth: %f" % (
+        disk.name, "read" if read else "write", n_flows, estimated_bw))
+
+
+def host():
+    # Estimating bw for each disk and considering concurrent flows
+    for n in range(1, 15, 2):
+        for disk in Host.current().get_disks():
+            estimate_bw(disk, n, True)
+            estimate_bw(disk, n, False)
+
+
+def ssd_dynamic_sharing(disk: Disk, op: str, capacity: float, n: int) -> float:
+    """
+    Non-linear resource callback for SSD disks
+
+    In this case, we have measurements for some resource sharing and directly use them to return the
+    correct value
+    :param disk: Disk on which the operation is happening (defined by the user through the std::bind)
+    :param op: read or write operation (defined by the user through the std::bind)
+    :param capacity: Resource current capacity in SimGrid
+    :param n: Number of activities sharing this resource
+    """
+    # measurements for SSD disks
+    speed = {
+        "write": {1: 131.},
+        "read": {1: 152., 2: 161., 3: 184., 4: 197., 5: 207., 6: 215., 7: 220., 8: 224., 9: 227., 10: 231., 11: 233., 12: 235., 13: 237., 14: 238., 15: 239.}
+    }
+
+    # no special bandwidth for this disk sharing N flows, just returns maximal capacity
+    if (n in speed[op]):
+        capacity = speed[op][n]
+
+    return capacity
+
+
+def sata_dynamic_sharing(disk: Disk, capacity: float, n: int) -> float:
+    """
+    Non-linear resource callback for SATA disks
+
+    In this case, the degradation for read operations is linear and we have a formula that represents it.
+
+    :param disk: Disk on which the operation is happening (defined by the user through the std::bind)
+    :param capacity: Resource current capacity in SimGrid
+    :param n: Number of activities sharing this resource
+    :return: New disk capacity
+    """
+    return 68.3 - 1.7 * n
+
+
+def create_ssd_disk(host: Host, disk_name: str):
+    """ Creates an SSD disk, setting the appropriate callback for non-linear resource sharing """
+    disk = host.create_disk(disk_name, "240MBps", "170MBps")
+    disk.set_sharing_policy(Disk.Operation.READ, Disk.SharingPolicy.NONLINEAR,
+                            functools.partial(ssd_dynamic_sharing, disk, "read"))
+    disk.set_sharing_policy(Disk.Operation.WRITE, Disk.SharingPolicy.NONLINEAR,
+                            functools.partial(ssd_dynamic_sharing, disk, "write"))
+    disk.set_sharing_policy(Disk.Operation.READWRITE,
+                            Disk.SharingPolicy.LINEAR)
+
+
+def create_sata_disk(host: Host, disk_name: str):
+    """ Same for a SATA disk, only read operation follows a non-linear resource sharing """
+    disk = host.create_disk(disk_name, "68MBps", "50MBps")
+    disk.set_sharing_policy(Disk.Operation.READ, Disk.SharingPolicy.NONLINEAR,
+                            functools.partial(sata_dynamic_sharing, disk))
+    # this is the default behavior, expliciting only to make it clearer
+    disk.set_sharing_policy(Disk.Operation.WRITE, Disk.SharingPolicy.LINEAR)
+    disk.set_sharing_policy(Disk.Operation.READWRITE,
+                            Disk.SharingPolicy.LINEAR)
+
+
+if __name__ == '__main__':
+    e = Engine(sys.argv)
+    # simple platform containing 1 host and 2 disk
+    zone = NetZone.create_full_zone("bob_zone")
+    bob = zone.create_host("bob", 1e6)
+    create_ssd_disk(bob, "Edel (SSD)")
+    create_sata_disk(bob, "Griffon (SATA II)")
+    zone.seal()
+
+    Actor.create("runner", bob, host)
+
+    e.run()
+    this_actor.info("Simulated time: %g" % Engine.get_clock())
+
+    # explicitly deleting Engine object to avoid segfault during cleanup phase.
+    # During Engine destruction, the cleanup of std::function linked to non_linear callback is called.
+    # If we let the cleanup by itself, it fails trying on its destruction because the python main program
+    # has already freed its variables
+    del(e)
diff --git a/examples/python/io-degradation/io-degradation.tesh b/examples/python/io-degradation/io-degradation.tesh
new file mode 100644 (file)
index 0000000..8755b92
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/env tesh
+
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${srcdir:=.}/io-degradation.py "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [657.894737] (1:runner@bob) Disk: Edel (SSD), concurrent read: 1, estimated bandwidth: 152.000000
+> [1421.253515] (1:runner@bob) Disk: Edel (SSD), concurrent write: 1, estimated bandwidth: 131.000000
+> [2922.755017] (1:runner@bob) Disk: Griffon (SATA II), concurrent read: 1, estimated bandwidth: 66.600000
+> [2922.757017] (1:runner@bob) Disk: Griffon (SATA II), concurrent write: 1, estimated bandwidth: 50000000.001182
+> [4553.191800] (1:runner@bob) Disk: Edel (SSD), concurrent read: 3, estimated bandwidth: 184.000000
+> [4553.193564] (1:runner@bob) Disk: Edel (SSD), concurrent write: 3, estimated bandwidth: 170000000.022058
+> [9300.029007] (1:runner@bob) Disk: Griffon (SATA II), concurrent read: 3, estimated bandwidth: 63.200000
+> [9300.035007] (1:runner@bob) Disk: Griffon (SATA II), concurrent write: 3, estimated bandwidth: 50000000.004972
+> [11715.493945] (1:runner@bob) Disk: Edel (SSD), concurrent read: 5, estimated bandwidth: 207.000000
+> [11715.496886] (1:runner@bob) Disk: Edel (SSD), concurrent write: 5, estimated bandwidth: 170000000.039581
+> [20076.700899] (1:runner@bob) Disk: Griffon (SATA II), concurrent read: 5, estimated bandwidth: 59.800000
+> [20076.710899] (1:runner@bob) Disk: Griffon (SATA II), concurrent write: 5, estimated bandwidth: 50000000.008004
+> [23258.529081] (1:runner@bob) Disk: Edel (SSD), concurrent read: 7, estimated bandwidth: 220.000000
+> [23258.533199] (1:runner@bob) Disk: Edel (SSD), concurrent write: 7, estimated bandwidth: 170000000.009542
+> [35669.880716] (1:runner@bob) Disk: Griffon (SATA II), concurrent read: 7, estimated bandwidth: 56.400000
+> [35669.894716] (1:runner@bob) Disk: Griffon (SATA II), concurrent write: 7, estimated bandwidth: 49999999.989814
+> [39634.652426] (1:runner@bob) Disk: Edel (SSD), concurrent read: 9, estimated bandwidth: 227.000000
+> [39634.657720] (1:runner@bob) Disk: Edel (SSD), concurrent write: 9, estimated bandwidth: 169999999.992853
+> [56615.789795] (1:runner@bob) Disk: Griffon (SATA II), concurrent read: 9, estimated bandwidth: 53.000000
+> [56615.807795] (1:runner@bob) Disk: Griffon (SATA II), concurrent write: 9, estimated bandwidth: 50000000.010025
+> [61336.837838] (1:runner@bob) Disk: Edel (SSD), concurrent read: 11, estimated bandwidth: 233.000000
+> [61336.844309] (1:runner@bob) Disk: Edel (SSD), concurrent write: 11, estimated bandwidth: 170000000.077813
+> [83514.263663] (1:runner@bob) Disk: Griffon (SATA II), concurrent read: 11, estimated bandwidth: 49.600000
+> [83514.285663] (1:runner@bob) Disk: Griffon (SATA II), concurrent write: 11, estimated bandwidth: 50000000.006350
+> [88999.517731] (1:runner@bob) Disk: Edel (SSD), concurrent read: 13, estimated bandwidth: 237.000000
+> [88999.525378] (1:runner@bob) Disk: Edel (SSD), concurrent write: 13, estimated bandwidth: 169999999.974881
+> [117138.053517] (1:runner@bob) Disk: Griffon (SATA II), concurrent read: 13, estimated bandwidth: 46.200000
+> [117138.079517] (1:runner@bob) Disk: Griffon (SATA II), concurrent write: 13, estimated bandwidth: 50000000.003806
+> [117138.079517] (0:maestro@) Simulated time: 117138
diff --git a/examples/python/network-nonlinear/network-nonlinear.py b/examples/python/network-nonlinear/network-nonlinear.py
new file mode 100644 (file)
index 0000000..69f39eb
--- /dev/null
@@ -0,0 +1,131 @@
+# Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+# This example shows how to simulate a non-linear resource sharing for
+# network links.
+
+from simgrid import Actor, Engine, Comm, Mailbox, NetZone, Link, LinkInRoute, this_actor
+import sys
+import functools
+
+class Sender:
+  """
+  Send a series of messages to mailbox "receiver"
+  """
+  def __init__(self, msg_count: int, msg_size=int(1e6)):
+    self.msg_count = msg_count
+    self.msg_size = msg_size
+  
+  # Actors that are created as object will execute their __call__ method.
+  # So, the following constitutes the main function of the Sender actor.
+  def __call__(self):
+    pending_comms = []
+    mbox = Mailbox.by_name("receiver")
+
+    for i in range(self.msg_count):
+      msg = "Message " + str(i)
+      size = self.msg_size * (i + 1)
+      this_actor.info("Send '%s' to '%s, msg size: %d'" % (msg, mbox.name, size))
+      comm = mbox.put_async(msg, size)
+      pending_comms.append(comm)
+
+    this_actor.info("Done dispatching all messages")
+
+    # Now that all message exchanges were initiated, wait for their completion in one single call
+    Comm.wait_all(pending_comms)
+
+    this_actor.info("Goodbye now!")
+
+class Receiver:
+  """
+  Receiver actor: wait for N messages on the mailbox "receiver"
+  """
+
+  def __init__(self, msg_count=10):
+    self.msg_count = msg_count
+
+  def __call__(self):
+    mbox = Mailbox.by_name("receiver")
+
+    pending_msgs = []
+    pending_comms = []
+
+    this_actor.info("Wait for %d messages asynchronously" % self.msg_count)
+    for _ in range(self.msg_count):
+      comm, data = mbox.get_async()
+      pending_comms.append(comm)
+      pending_msgs.append(data)
+    
+    while len(pending_comms) > 0:
+      index = Comm.wait_any(pending_comms)
+      msg = pending_msgs[index].get()
+      this_actor.info("I got '%s'." % msg)
+      del pending_comms[index]
+      del pending_msgs[index]
+
+####################################################################################################
+def link_nonlinear(link: Link, capacity: float, n: int) -> float:
+  """
+  Non-linear resource sharing for links
+
+  Note that the callback is called twice in this example:
+   1) link UP: with the number of active flows (from 9 to 1)
+   2) link DOWN: with 0 active flows. A crosstraffic communication is happing
+   in the down link, but it's not considered as an active flow.
+  """
+  # emulates a degradation in link according to the number of flows
+  # you probably want something more complex than that and based on real
+  # experiments
+  capacity = min(capacity, capacity * (1.0 - (n - 1) / 10.0))
+  this_actor.info("Link %s, %d active communications, new capacity %f" % (link.name, n, capacity))
+  return capacity
+
+def load_platform():
+  """
+  Create a simple 2-hosts platform */
+   ________                 __________
+  | Sender |===============| Receiver |
+  |________|    Link1      |__________|
+  
+  """
+  zone = NetZone.create_full_zone("Zone1")
+  sender = zone.create_host("sender", 1).seal()
+  receiver = zone.create_host("receiver", 1).seal()
+
+  link = zone.create_split_duplex_link("link1", 1e6)
+  # setting same callbacks (could be different) for link UP/DOWN in split-duplex link
+  link.get_link_up().set_sharing_policy(
+      Link.SharingPolicy.NONLINEAR,
+      functools.partial(link_nonlinear, link.get_link_up()))
+  link.get_link_down().set_sharing_policy(
+      Link.SharingPolicy.NONLINEAR,
+      functools.partial(link_nonlinear, link.get_link_down()))
+  link.set_latency(10e-6).seal()
+
+  # create routes between nodes
+  zone.add_route(sender.get_netpoint(), receiver.get_netpoint(), None, None,
+                 [LinkInRoute(link, LinkInRoute.Direction.UP)], True)
+  zone.seal()
+
+  # create actors Sender/Receiver
+  Actor.create("receiver", receiver, Receiver(9))
+  Actor.create("sender", sender, Sender(9))
+
+###################################################################################################
+
+if __name__ == '__main__':
+  e = Engine(sys.argv)
+
+  # create platform
+  load_platform()
+
+  # runs the simulation
+  e.run()
+
+  # explicitly deleting Engine object to avoid segfault during cleanup phase.
+  # During Engine destruction, the cleanup of std::function linked to link_non_linear callback is called.
+  # If we let the cleanup by itself, it fails trying on its destruction because the python main program
+  # has already freed its variables
+  del(e)
diff --git a/examples/python/network-nonlinear/network-nonlinear.tesh b/examples/python/network-nonlinear/network-nonlinear.tesh
new file mode 100644 (file)
index 0000000..a09ff00
--- /dev/null
@@ -0,0 +1,42 @@
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${srcdir:=.}/network-nonlinear.py "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+>[  0.000000] (1:receiver@receiver) Wait for 9 messages asynchronously
+>[  0.000000] (2:sender@sender) Send 'Message 0' to 'receiver, msg size: 1000000'
+>[  0.000000] (2:sender@sender) Send 'Message 1' to 'receiver, msg size: 2000000'
+>[  0.000000] (2:sender@sender) Send 'Message 2' to 'receiver, msg size: 3000000'
+>[  0.000000] (2:sender@sender) Send 'Message 3' to 'receiver, msg size: 4000000'
+>[  0.000000] (2:sender@sender) Send 'Message 4' to 'receiver, msg size: 5000000'
+>[  0.000000] (2:sender@sender) Send 'Message 5' to 'receiver, msg size: 6000000'
+>[  0.000000] (2:sender@sender) Send 'Message 6' to 'receiver, msg size: 7000000'
+>[  0.000000] (2:sender@sender) Send 'Message 7' to 'receiver, msg size: 8000000'
+>[  0.000000] (2:sender@sender) Send 'Message 8' to 'receiver, msg size: 9000000'
+>[  0.000000] (2:sender@sender) Done dispatching all messages
+>[  0.000000] (0:maestro@) Link link1_UP, 0 active communications, new capacity 1000000.000000
+>[  0.000000] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[  0.000130] (0:maestro@) Link link1_UP, 9 active communications, new capacity 200000.000000
+>[  0.000130] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[ 46.391883] (1:receiver@receiver) I got 'Message 0'.
+>[ 46.391883] (0:maestro@) Link link1_UP, 8 active communications, new capacity 300000.000000
+>[ 46.391883] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[ 73.883292] (1:receiver@receiver) I got 'Message 1'.
+>[ 73.883292] (0:maestro@) Link link1_UP, 7 active communications, new capacity 400000.000000
+>[ 73.883292] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[ 91.924529] (1:receiver@receiver) I got 'Message 2'.
+>[ 91.924529] (0:maestro@) Link link1_UP, 6 active communications, new capacity 500000.000000
+>[ 91.924529] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[104.295663] (1:receiver@receiver) I got 'Message 3'.
+>[104.295663] (0:maestro@) Link link1_UP, 5 active communications, new capacity 600000.000000
+>[104.295663] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[112.886728] (1:receiver@receiver) I got 'Message 4'.
+>[112.886728] (0:maestro@) Link link1_UP, 4 active communications, new capacity 700000.000000
+>[112.886728] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[118.777744] (1:receiver@receiver) I got 'Message 5'.
+>[118.777744] (0:maestro@) Link link1_UP, 3 active communications, new capacity 800000.000000
+>[118.777744] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[122.643724] (1:receiver@receiver) I got 'Message 6'.
+>[122.643724] (0:maestro@) Link link1_UP, 2 active communications, new capacity 900000.000000
+>[122.643724] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[124.934674] (1:receiver@receiver) I got 'Message 7'.
+>[124.934674] (0:maestro@) Link link1_UP, 1 active communications, new capacity 1000000.000000
+>[124.934674] (0:maestro@) Link link1_DOWN, 0 active communications, new capacity 1000000.000000
+>[125.965602] (1:receiver@receiver) I got 'Message 8'.
+>[125.965602] (2:sender@sender) Goodbye now!
index f3c98e7..7c46e06 100644 (file)
@@ -54,6 +54,7 @@ unset(_${x}_outdir)
 set(tesh_files    ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/energy/energy.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/trace/trace.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/simple-execute/simple-execute.tesh
+                                   ${CMAKE_CURRENT_SOURCE_DIR}/simple-execute/simple-execute-cpp-platf.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/gemm/gemm.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/trace_simple/trace_simple.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/trace_call_location/trace_call_location.tesh
@@ -69,7 +70,8 @@ set(bin_files     ${bin_files}     ${CMAKE_CURRENT_SOURCE_DIR}/hostfile
                                    ${CMAKE_CURRENT_SOURCE_DIR}/mc/hostfile_bugged2
                                    ${CMAKE_CURRENT_SOURCE_DIR}/mc/hostfile_only_send_deterministic
                                    ${CMAKE_CURRENT_SOURCE_DIR}/mc/hostfile_mutual_exclusion
-                                   ${CMAKE_CURRENT_SOURCE_DIR}/mc/hostfile_non_termination                 PARENT_SCOPE)
+                                   ${CMAKE_CURRENT_SOURCE_DIR}/mc/hostfile_non_termination
+                                   ${CMAKE_CURRENT_SOURCE_DIR}/simple-execute/hostfile_griffon             PARENT_SCOPE)
 set(txt_files     ${txt_files}     ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions0.txt
                                    ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions1.txt
                                    ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions_allreduce.txt
@@ -98,6 +100,7 @@ if(enable_smpi)
 
   ADD_TESH(smpi-tracing        --setenv bindir=${CMAKE_BINARY_DIR}/examples/smpi/trace --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/trace --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/examples/smpi/trace ${CMAKE_HOME_DIRECTORY}/examples/smpi/trace/trace.tesh)
   ADD_TESH(smpi-simple-execute       --setenv bindir=${CMAKE_BINARY_DIR}/examples/smpi/simple-execute --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/simple-execute --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/examples/smpi/simple-execute ${CMAKE_HOME_DIRECTORY}/examples/smpi/simple-execute/simple-execute.tesh)
+  ADD_TESH(smpi-simple-execute-cpp-platf       --setenv bindir=${CMAKE_BINARY_DIR}/examples/smpi/simple-execute --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/simple-execute --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv libdir=${CMAKE_BINARY_DIR}/lib --cd ${CMAKE_BINARY_DIR}/examples/smpi/simple-execute ${CMAKE_HOME_DIRECTORY}/examples/smpi/simple-execute/simple-execute-cpp-platf.tesh)
   ADD_TESH(smpi-tracing-simple --setenv bindir=${CMAKE_BINARY_DIR}/examples/smpi/trace_simple --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/trace_simple --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/examples/smpi/trace_simple ${CMAKE_HOME_DIRECTORY}/examples/smpi/trace_simple/trace_simple.tesh)
   ADD_TESH(smpi-tracing-call-location --setenv bindir=${CMAKE_BINARY_DIR}/examples/smpi/trace_call_location --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/examples/smpi/trace_call_location ${CMAKE_HOME_DIRECTORY}/examples/smpi/trace_call_location/trace_call_location.tesh)
   ADD_TESH(smpi-replay         --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/replay.tesh)
index 6126811..08f2998 100644 (file)
@@ -15,7 +15,6 @@
 int main(int argc, char *argv[])
 {
   int rank;
-  int i;
   char buf[1024];
 
   int err = MPI_Init(&argc, &argv);
@@ -31,19 +30,18 @@ int main(int argc, char *argv[])
     exit(EXIT_FAILURE);
   }
 
-  int pstates = sg_host_get_nb_pstates(sg_host_self());
+  unsigned long pstates = sg_host_get_nb_pstates(sg_host_self());
 
   char *s = buf;
   size_t sz = sizeof buf;
-  size_t x = snprintf(s, sz,
-               "[%.6f] [rank %d] Pstates: %d; Powers: %.0f",
-               MPI_Wtime(), rank, pstates, sg_host_get_pstate_speed(sg_host_self(), 0));
+  size_t x  = snprintf(s, sz, "[%.6f] [rank %d] Pstates: %lu; Powers: %.0f", MPI_Wtime(), rank, pstates,
+                      sg_host_get_pstate_speed(sg_host_self(), 0));
   if (x < sz) {
     s += x;
     sz -= x;
   } else
     sz = 0;
-  for (i = 1; i < pstates; i++) {
+  for (unsigned long i = 1; i < pstates; i++) {
     x = snprintf(s, sz, ", %.0f", sg_host_get_pstate_speed(sg_host_self(), i));
     if (x < sz) {
       s += x;
@@ -53,9 +51,9 @@ int main(int argc, char *argv[])
   }
   fprintf(stderr, "%s%s\n", buf, (sz ? "" : " [...]"));
 
-  for (i = 0; i < pstates; i++) {
+  for (unsigned long i = 0; i < pstates; i++) {
     sg_host_set_pstate(sg_host_self(), i);
-    fprintf(stderr, "[%.6f] [rank %d] Current pstate: %d; Current power: %.0f\n", MPI_Wtime(), rank, i,
+    fprintf(stderr, "[%.6f] [rank %d] Current pstate: %lu; Current power: %.0f\n", MPI_Wtime(), rank, i,
             sg_host_get_speed(sg_host_self()));
 
     SMPI_SAMPLE_FLOPS(1e9) {
index b6baeae..3e1580c 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 /*==================================================================================================*/
 /*# This file is part of the CodeVault project. The project is licensed under Apache Version 2.0.*/
 /*# CodeVault is part of the EU-project PRACE-4IP (WP7.3.C).*/
index 3978602..280152a 100644 (file)
@@ -5,13 +5,13 @@
 p Test instrumentation of SMPI
 
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ${srcdir:=.}/../hostfile -platform ${platfdir:=.}/small_platform.xml --cfg=path:${srcdir:=.}/../msg --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/host-speed:1f -np 8 ${bindir:=.}/smpi_gemm 1000 native
-> You requested to use 8 ranks, but there is only 5 processes in your hostfile...
+> [0.000000] [smpi/INFO] You requested to use 8 ranks, but there is only 5 processes in your hostfile...
 > Matrix Size : 1000x1000
 > Native mode
-> Performance= 227.29 GFlop/s, Time= 8.799 sec, Size= 2000000000 Ops
+> Performance= 220.56 GFlop/s, Time= 9.068 sec, Size= 2000000000 Ops
 
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ${srcdir:=.}/../hostfile -platform ${platfdir:=.}/small_platform.xml --cfg=path:${srcdir:=.}/../msg --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/host-speed:1f -np 8 ${bindir:=.}/smpi_gemm 1000 sampling
-> You requested to use 8 ranks, but there is only 5 processes in your hostfile...
+> [0.000000] [smpi/INFO] You requested to use 8 ranks, but there is only 5 processes in your hostfile...
 > Matrix Size : 1000x1000
 > Sampling mode
-> Performance= 227.29 GFlop/s, Time= 8.799 sec, Size= 2000000000 Ops
+> Performance= 220.56 GFlop/s, Time= 9.068 sec, Size= 2000000000 Ops
diff --git a/examples/smpi/mc/.gitignore b/examples/smpi/mc/.gitignore
deleted file mode 100644 (file)
index daf627a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-smpi_non_termination1
-smpi_non_termination2
-smpi_non_termination3
-smpi_non_termination4
-smpi_only_send_deterministic
diff --git a/examples/smpi/mc/non_deterministic.tesh b/examples/smpi/mc/non_deterministic.tesh
deleted file mode 100644 (file)
index 904088b..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env tesh
-
-! timeout 60
-$ ../../../smpi_script/bin/smpirun -wrapper ${bindir:=.}/../../../bin/simgrid-mc -hostfile ${srcdir:=.}/hostfile_non_deterministic  -platform ${srcdir:=.}/../../platforms/cluster_backbone.xml --log=xbt_cfg.thresh:warning --cfg=model-check/communications-determinism:1 --cfg=smpi/send-is-detached-thresh:0 --cfg=smpi/host-speed:1Gf ./smpi_non_deterministic
-> [0.000000] [mc_global/INFO] Check communication determinism
-> [0.000000] [mc_comm_determinism/INFO] The communications pattern of the process 1 is different! (Different communication : 1)
-> [0.000000] [mc_comm_determinism/INFO] ****************************************************
-> [0.000000] [mc_comm_determinism/INFO] ***** Non-deterministic communications pattern *****
-> [0.000000] [mc_comm_determinism/INFO] ****************************************************
-> [0.000000] [mc_comm_determinism/INFO] ** Initial communications pattern (per process): **
-> [0.000000] [mc_comm_determinism/INFO] Communications from the process 1:
-> [0.000000] [mc_comm_determinism/INFO] [(1) node-1.simgrid.org <- (2) node-2.simgrid.org] iRecv 
-> [0.000000] [mc_comm_determinism/INFO] [(1) node-1.simgrid.org -> (2) node-2.simgrid.org] iSend 
-> [0.000000] [mc_comm_determinism/INFO] [(1) node-1.simgrid.org <- (3) node-3.simgrid.org] iRecv 
-> [0.000000] [mc_comm_determinism/INFO] [(1) node-1.simgrid.org -> (3) node-3.simgrid.org] iSend 
-> [0.000000] [mc_comm_determinism/INFO] Communications from the process 2:
-> [0.000000] [mc_comm_determinism/INFO] [(2) node-2.simgrid.org -> (1) node-1.simgrid.org] iSend 
-> [0.000000] [mc_comm_determinism/INFO] [(2) node-2.simgrid.org <- (1) node-1.simgrid.org] iRecv 
-> [0.000000] [mc_comm_determinism/INFO] Communications from the process 3:
-> [0.000000] [mc_comm_determinism/INFO] [(3) node-3.simgrid.org -> (1) node-1.simgrid.org] iSend 
-> [0.000000] [mc_comm_determinism/INFO] [(3) node-3.simgrid.org <- (1) node-1.simgrid.org] iRecv 
-> [0.000000] [mc_comm_determinism/INFO] ** Communications pattern counter-example (per process): **
-> [0.000000] [mc_comm_determinism/INFO] Communications from the process 1:
-> [0.000000] [mc_comm_determinism/INFO] [(1) node-1.simgrid.org <- (3) node-3.simgrid.org] iRecv 
-> [0.000000] [mc_comm_determinism/INFO] [(1) node-1.simgrid.org -> (3) node-3.simgrid.org] iSend 
-> [0.000000] [mc_comm_determinism/INFO] [(1) node-1.simgrid.org <- (2) node-2.simgrid.org] iRecv 
-> [0.000000] [mc_comm_determinism/INFO] [(1) node-1.simgrid.org -> (2) node-2.simgrid.org] iSend 
-> [0.000000] [mc_comm_determinism/INFO] Communications from the process 2:
-> [0.000000] [mc_comm_determinism/INFO] [(2) node-2.simgrid.org -> (1) node-1.simgrid.org] iSend 
-> [0.000000] [mc_comm_determinism/INFO] [(2) node-2.simgrid.org <- (1) node-1.simgrid.org] iRecv 
-> [0.000000] [mc_comm_determinism/INFO] Communications from the process 3:
-> [0.000000] [mc_comm_determinism/INFO] [(3) node-3.simgrid.org -> (1) node-1.simgrid.org] iSend 
-> [0.000000] [mc_comm_determinism/INFO] [(3) node-3.simgrid.org <- (1) node-1.simgrid.org] iRecv 
-> [0.000000] [mc_global/INFO] Expanded states = 16037
-> [0.000000] [mc_global/INFO] Visited states = 80801
-> [0.000000] [mc_global/INFO] Executed transitions = 76048
-> [0.000000] [mc_global/INFO] Communication-deterministic : No
index 919824f..7d38b76 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2015-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include <stdio.h>
 #include <mpi.h>
 #include <simgrid/modelchecker.h>
index 031ab50..2008661 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2015-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include <stdio.h>
 #include <mpi.h>
 #include <simgrid/modelchecker.h>
index ebbbb9c..ebd539e 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2015-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include <stdio.h>
 #include <mpi.h>
 #include <simgrid/modelchecker.h>
index cd8b1a2..d867cf9 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2015-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include <stdio.h>
 #include <mpi.h>
 #include <simgrid/modelchecker.h>
index 75e8e7a..83ba491 100644 (file)
@@ -10,21 +10,21 @@ $ mkfile replay/one_trace_override
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
 > [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 bcast 5e4 0.000000
-> [Jupiter:1:(2) 0.015039] [smpi_replay/VERBOSE] 1 bcast 5e4 0.015039
-> [Fafard:2:(3) 0.015678] [smpi_replay/VERBOSE] 2 bcast 5e4 0.015678
-> [Jupiter:1:(2) 2.636409] [smpi_replay/VERBOSE] 1 compute 2e8 2.621369
+> [Jupiter:1:(2) 0.015536] [smpi_replay/VERBOSE] 1 bcast 5e4 0.015536
+> [Fafard:2:(3) 0.016118] [smpi_replay/VERBOSE] 2 bcast 5e4 0.016118
+> [Jupiter:1:(2) 2.636906] [smpi_replay/VERBOSE] 1 compute 2e8 2.621369
 > [Tremblay:0:(1) 5.097100] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
 > [Tremblay:0:(1) 5.097100] [smpi_replay/VERBOSE] 0 bcast 5e4 0.000000
-> [Jupiter:1:(2) 5.112139] [smpi_replay/VERBOSE] 1 bcast 5e4 2.475730
-> [Fafard:2:(3) 6.569102] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
-> [Fafard:2:(3) 6.584781] [smpi_replay/VERBOSE] 2 bcast 5e4 0.015678
-> [Jupiter:1:(2) 7.733508] [smpi_replay/VERBOSE] 1 compute 2e8 2.621369
+> [Jupiter:1:(2) 5.112636] [smpi_replay/VERBOSE] 1 bcast 5e4 2.475730
+> [Fafard:2:(3) 6.569541] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
+> [Fafard:2:(3) 6.585659] [smpi_replay/VERBOSE] 2 bcast 5e4 0.016118
+> [Jupiter:1:(2) 7.734005] [smpi_replay/VERBOSE] 1 compute 2e8 2.621369
 > [Tremblay:0:(1) 10.194200] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
-> [Fafard:2:(3) 13.138204] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
-> [Jupiter:1:(2) 14.286932] [smpi_replay/VERBOSE] 1 reduce 5e4 5e8 6.553424
-> [Tremblay:0:(1) 18.250982] [smpi_replay/VERBOSE] 0 reduce 5e4 5e8 8.056783
-> [Fafard:2:(3) 19.691628] [smpi_replay/VERBOSE] 2 reduce 5e4 5e8 6.553424
-> [Fafard:2:(3) 19.691628] [smpi_replay/INFO] Simulation time 19.691628
+> [Fafard:2:(3) 13.139083] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
+> [Jupiter:1:(2) 14.287429] [smpi_replay/VERBOSE] 1 reduce 5e4 5e8 6.553424
+> [Tremblay:0:(1) 18.252300] [smpi_replay/VERBOSE] 0 reduce 5e4 5e8 8.058101
+> [Fafard:2:(3) 19.692506] [smpi_replay/VERBOSE] 2 reduce 5e4 5e8 6.553424
+> [Fafard:2:(3) 19.692506] [smpi_replay/INFO] Simulation time 19.692506
 
 $ rm -f replay/one_trace_override
 
@@ -34,7 +34,7 @@ p The same with tracing activated
 $ mkfile replay/one_trace_override
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override --log=replay.thresh:critical --log=no_loc  --cfg=tracing:yes --cfg=tracing/smpi:yes --cfg=tracing/smpi/computing:yes --cfg=tracing/filename:./simgrid_override.trace  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile  --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Fafard:2:(3) 19.691628] [smpi_replay/INFO] Simulation time 19.691628
+> [Fafard:2:(3) 19.692506] [smpi_replay/INFO] Simulation time 19.692506
 
 # $ rm -f replay/one_trace_override
 
@@ -171,46 +171,46 @@ $ tail -n +3 ./simgrid_override.trace
 > 12 0.000000 2 1 7
 > 5 9 2 action_reduce "0 1 0"
 > 5 10 2 smpi_replay_run_finalize "0 1 0"
-> 13 0.015039 2 2
-> 12 0.015039 2 2 7
-> 13 0.015678 2 3
-> 12 0.015678 2 3 7
-> 13 2.636409 2 2
-> 12 2.636409 2 2 8
+> 13 0.015536 2 2
+> 12 0.015536 2 2 7
+> 13 0.016118 2 3
+> 12 0.016118 2 3 7
+> 13 2.636906 2 2
+> 12 2.636906 2 2 8
 > 13 5.097100 2 1
 > 12 5.097100 2 1 8
 > 13 5.097100 2 1
 > 12 5.097100 2 1 7
-> 13 5.112139 2 2
-> 12 5.112139 2 2 7
-> 13 6.569102 2 3
-> 12 6.569102 2 3 8
-> 13 6.584781 2 3
-> 12 6.584781 2 3 7
-> 13 7.733508 2 2
-> 12 7.733508 2 2 9
-> 12 7.733508 2 2 7
+> 13 5.112636 2 2
+> 12 5.112636 2 2 7
+> 13 6.569541 2 3
+> 12 6.569541 2 3 8
+> 13 6.585659 2 3
+> 12 6.585659 2 3 7
+> 13 7.734005 2 2
+> 12 7.734005 2 2 9
+> 12 7.734005 2 2 7
 > 13 10.194200 2 1
 > 12 10.194200 2 1 9
-> 13 13.138204 2 3
-> 12 13.138204 2 3 9
-> 12 13.138204 2 3 7
-> 12 13.153883 2 1 7
-> 13 14.286932 2 2
-> 13 14.286932 2 2
-> 12 14.286932 2 2 10
-> 13 14.286932 2 2
-> 7 14.286932 1 2
-> 13 18.250982 2 1
-> 13 18.250982 2 1
-> 12 18.250982 2 1 10
-> 13 18.250982 2 1
-> 7 18.250982 1 1
-> 13 19.691628 2 3
-> 13 19.691628 2 3
-> 12 19.691628 2 3 10
-> 13 19.691628 2 3
-> 7 19.691628 1 3
+> 13 13.139083 2 3
+> 12 13.139083 2 3 9
+> 12 13.139083 2 3 7
+> 12 13.155200 2 1 7
+> 13 14.287429 2 2
+> 13 14.287429 2 2
+> 12 14.287429 2 2 10
+> 13 14.287429 2 2
+> 7 14.287429 1 2
+> 13 18.252300 2 1
+> 13 18.252300 2 1
+> 12 18.252300 2 1 10
+> 13 18.252300 2 1
+> 7 18.252300 1 1
+> 13 19.692506 2 3
+> 13 19.692506 2 3
+> 12 19.692506 2 3 10
+> 13 19.692506 2 3
+> 7 19.692506 1 3
 
 $ rm -f ./simgrid_override.trace
 
@@ -221,15 +221,15 @@ p Another test of trace replay with SMPI (one trace per process)
 $ mkfile ./split_traces_tesh_override
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay ./split_traces_tesh_override --log=smpi_replay.thresh:verbose --log=no_loc  -np 2 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 0.167160] [smpi_replay/VERBOSE] 0 send 1 0 1e6 0.167160
-> [Jupiter:1:(2) 0.167160] [smpi_replay/VERBOSE] 1 recv 0 0 1e6 0.167160
-> [Jupiter:1:(2) 13.274007] [smpi_replay/VERBOSE] 1 compute 1e9 13.106847
-> [Jupiter:1:(2) 13.274007] [smpi_replay/VERBOSE] 1 isend 0 1 1e6 0.000000
-> [Jupiter:1:(2) 13.274007] [smpi_replay/VERBOSE] 1 irecv 0 2 1e6 0.000000
-> [Tremblay:0:(1) 13.441167] [smpi_replay/VERBOSE] 0 recv 1 1 1e6 13.274007
-> [Jupiter:1:(2) 13.608327] [smpi_replay/VERBOSE] 1 wait 0 1 2 0.334320
-> [Tremblay:0:(1) 13.608327] [smpi_replay/VERBOSE] 0 send 1 2 1e6 0.167160
-> [Jupiter:1:(2) 13.608327] [smpi_replay/INFO] Simulation time 13.608327
+> [Tremblay:0:(1) 0.171838] [smpi_replay/VERBOSE] 0 send 1 0 1e6 0.171838
+> [Jupiter:1:(2) 0.171838] [smpi_replay/VERBOSE] 1 recv 0 0 1e6 0.171838
+> [Jupiter:1:(2) 13.278685] [smpi_replay/VERBOSE] 1 compute 1e9 13.106847
+> [Jupiter:1:(2) 13.278685] [smpi_replay/VERBOSE] 1 isend 0 1 1e6 0.000000
+> [Jupiter:1:(2) 13.278685] [smpi_replay/VERBOSE] 1 irecv 0 2 1e6 0.000000
+> [Tremblay:0:(1) 13.450522] [smpi_replay/VERBOSE] 0 recv 1 1 1e6 13.278685
+> [Jupiter:1:(2) 13.622360] [smpi_replay/VERBOSE] 1 wait 0 1 2 0.343675
+> [Tremblay:0:(1) 13.622360] [smpi_replay/VERBOSE] 0 send 1 2 1e6 0.171838
+> [Jupiter:1:(2) 13.622360] [smpi_replay/INFO] Simulation time 13.622360
 
 $ rm -f ./split_traces_tesh_override
 
@@ -239,15 +239,15 @@ p Test of barrier replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace_override
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 1.518423] [smpi_replay/VERBOSE] 0 send 1 0 1e7 1.518423
-> [Jupiter:1:(2) 1.518423] [smpi_replay/VERBOSE] 1 recv 0 0 1e7 1.518423
-> [Tremblay:0:(1) 1.522406] [smpi_replay/VERBOSE] 0 barrier 0.003983
-> [Jupiter:1:(2) 1.525354] [smpi_replay/VERBOSE] 1 barrier 0.006931
-> [Fafard:2:(3) 1.526390] [smpi_replay/VERBOSE] 2 barrier 1.526390
-> [Tremblay:0:(1) 2.522406] [smpi_replay/VERBOSE] 0 compute 98095000 1.000000
-> [Jupiter:1:(2) 2.525354] [smpi_replay/VERBOSE] 1 compute 76296000 1.000000
-> [Fafard:2:(3) 2.526390] [smpi_replay/VERBOSE] 2 compute 76296000 1.000000
-> [Fafard:2:(3) 2.526390] [smpi_replay/INFO] Simulation time 2.526390
+> [Tremblay:0:(1) 1.565197] [smpi_replay/VERBOSE] 0 send 1 0 1e7 1.565197
+> [Jupiter:1:(2) 1.565197] [smpi_replay/VERBOSE] 1 recv 0 0 1e7 1.565197
+> [Tremblay:0:(1) 1.569181] [smpi_replay/VERBOSE] 0 barrier 0.003984
+> [Jupiter:1:(2) 1.572128] [smpi_replay/VERBOSE] 1 barrier 0.006931
+> [Fafard:2:(3) 1.573164] [smpi_replay/VERBOSE] 2 barrier 1.573164
+> [Tremblay:0:(1) 2.569181] [smpi_replay/VERBOSE] 0 compute 98095000 1.000000
+> [Jupiter:1:(2) 2.572128] [smpi_replay/VERBOSE] 1 compute 76296000 1.000000
+> [Fafard:2:(3) 2.573164] [smpi_replay/VERBOSE] 2 compute 76296000 1.000000
+> [Fafard:2:(3) 2.573164] [smpi_replay/INFO] Simulation time 2.573164
 
 $ rm -f replay/one_trace_override
 
@@ -261,19 +261,19 @@ $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override
 > [Jupiter:1:(2) 6.553424] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
 > [Jupiter:1:(2) 6.553524] [smpi_replay/VERBOSE] 1 test 0 1 0 0.000100
 > [Tremblay:0:(1) 10.194200] [smpi_replay/VERBOSE] 0 compute 1e9 10.194200
-> [Tremblay:0:(1) 10.361360] [smpi_replay/VERBOSE] 0 send 1 0 1e6 0.167160
+> [Tremblay:0:(1) 10.366037] [smpi_replay/VERBOSE] 0 send 1 0 1e6 0.171838
 > [Jupiter:1:(2) 13.106947] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
 > [Jupiter:1:(2) 13.106947] [smpi_replay/VERBOSE] 1 wait 0 1 0 0.000000
-> [Tremblay:0:(1) 20.555559] [smpi_replay/VERBOSE] 0 compute 1e9 10.194200
+> [Tremblay:0:(1) 20.560237] [smpi_replay/VERBOSE] 0 compute 1e9 10.194200
 > [Fafard:2:(3) 26.213694] [smpi_replay/VERBOSE] 2 compute 2e9 26.213694
 > [Fafard:2:(3) 26.213694] [smpi_replay/VERBOSE] 2 irecv 1 1 1e6 0.000000
-> [Jupiter:1:(2) 26.403862] [smpi_replay/VERBOSE] 1 send 2 1 1e6 13.296915
+> [Jupiter:1:(2) 26.408540] [smpi_replay/VERBOSE] 1 send 2 1 1e6 13.301593
 > [Fafard:2:(3) 29.490406] [smpi_replay/VERBOSE] 2 compute 2.5e8 3.276712
 > [Fafard:2:(3) 29.490606] [smpi_replay/VERBOSE] 2 test 1 2 1 0.000200
 > [Fafard:2:(3) 32.767318] [smpi_replay/VERBOSE] 2 compute 2.5e8 3.276712
 > [Fafard:2:(3) 32.767318] [smpi_replay/VERBOSE] 2 wait 1 2 1 0.000000
 > [Fafard:2:(3) 32.767318] [smpi_replay/VERBOSE] 2 isend 0 2 1e6 0.000000
-> [Tremblay:0:(1) 32.923016] [smpi_replay/VERBOSE] 0 recv 2 2 1e6 12.367457
+> [Tremblay:0:(1) 32.927150] [smpi_replay/VERBOSE] 0 recv 2 2 1e6 12.366914
 > [Fafard:2:(3) 39.320741] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
 > [Fafard:2:(3) 39.320741] [smpi_replay/INFO] Simulation time 39.320741
 
@@ -285,13 +285,13 @@ p Test of AllReduce replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace_override
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 5.112778] [smpi_replay/VERBOSE] 0 allreduce 5e4 5e8 5.112778
-> [Jupiter:1:(2) 6.584141] [smpi_replay/VERBOSE] 1 allreduce 5e4 5e8 6.584141
-> [Fafard:2:(3) 6.584781] [smpi_replay/VERBOSE] 2 allreduce 5e4 5e8 6.584781
-> [Tremblay:0:(1) 10.209878] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
-> [Jupiter:1:(2) 13.137565] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
-> [Fafard:2:(3) 13.138204] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
-> [Fafard:2:(3) 13.138204] [smpi_replay/INFO] Simulation time 13.138204
+> [Tremblay:0:(1) 5.113218] [smpi_replay/VERBOSE] 0 allreduce 5e4 5e8 5.113218
+> [Jupiter:1:(2) 6.585077] [smpi_replay/VERBOSE] 1 allreduce 5e4 5e8 6.585077
+> [Fafard:2:(3) 6.585659] [smpi_replay/VERBOSE] 2 allreduce 5e4 5e8 6.585659
+> [Tremblay:0:(1) 10.210317] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
+> [Jupiter:1:(2) 13.138501] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
+> [Fafard:2:(3) 13.139083] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
+> [Fafard:2:(3) 13.139083] [smpi_replay/INFO] Simulation time 13.139083
 
 $ rm -f replay/one_trace_override
 
@@ -301,11 +301,10 @@ p Test of AllToAll replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace_override
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 0.004047] [smpi_replay/VERBOSE] 0 alltoall 500 500 0.004047
-> [Fafard:2:(3) 0.006927] [smpi_replay/VERBOSE] 2 alltoall 500 500 0.006927
-> [Jupiter:1:(2) 0.006927] [smpi_replay/VERBOSE] 1 alltoall 500 500 0.006927
-> [Jupiter:1:(2) 0.006927] [smpi_replay/INFO] Simulation time 0.006927
-
+> [Tremblay:0:(1) 0.004253] [smpi_replay/VERBOSE] 0 alltoall 500 500 0.004253
+> [Fafard:2:(3) 0.007159] [smpi_replay/VERBOSE] 2 alltoall 500 500 0.007159
+> [Jupiter:1:(2) 0.007159] [smpi_replay/VERBOSE] 1 alltoall 500 500 0.007159
+> [Jupiter:1:(2) 0.007159] [smpi_replay/INFO] Simulation time 0.007159
 
 $ rm -f replay/one_trace_override
 
@@ -315,10 +314,10 @@ p Test of AllToAllv replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace_override
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 0.004004] [smpi_replay/VERBOSE] 0 alltoallv 100 1 40 30 1000 1 80 100 0.004004
-> [Jupiter:1:(2) 0.006939] [smpi_replay/VERBOSE] 1 alltoallv 1000 80 1 40 1000 40 1 30 0.006939
-> [Fafard:2:(3) 0.006941] [smpi_replay/VERBOSE] 2 alltoallv 1000 100 30 1 1000 30 40 1 0.006941
-> [Fafard:2:(3) 0.006941] [smpi_replay/INFO] Simulation time 0.006941
+> [Tremblay:0:(1) 0.004007] [smpi_replay/VERBOSE] 0 alltoallv 100 1 40 30 1000 1 80 100 0.004007
+> [Jupiter:1:(2) 0.006942] [smpi_replay/VERBOSE] 1 alltoallv 1000 80 1 40 1000 40 1 30 0.006942
+> [Fafard:2:(3) 0.006944] [smpi_replay/VERBOSE] 2 alltoallv 1000 100 30 1 1000 30 40 1 0.006944
+> [Fafard:2:(3) 0.006944] [smpi_replay/INFO] Simulation time 0.006944
 
 $ rm -f replay/one_trace_override
 
@@ -328,11 +327,11 @@ p Test of AllGatherv replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace_override
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 4 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 1.397272] [smpi_replay/VERBOSE] 0 allgatherv 275427 275427 275427 275427 204020 0 0 1.397272
-> [Ginette:3:(4) 1.760434] [smpi_replay/VERBOSE] 3 allgatherv 204020 275427 275427 275427 204020 0 0 1.760434
-> [Fafard:2:(3) 1.942001] [smpi_replay/VERBOSE] 2 allgatherv 275427 275427 275427 275427 204020 0 0 1.942001
-> [Jupiter:1:(2) 1.942001] [smpi_replay/VERBOSE] 1 allgatherv 275427 275427 275427 275427 204020 0 0 1.942001
-> [Jupiter:1:(2) 1.942001] [smpi_replay/INFO] Simulation time 1.942001
+> [Tremblay:0:(1) 1.440359] [smpi_replay/VERBOSE] 0 allgatherv 275427 275427 275427 275427 204020 0 0 1.440359
+> [Ginette:3:(4) 1.814751] [smpi_replay/VERBOSE] 3 allgatherv 204020 275427 275427 275427 204020 0 0 1.814751
+> [Fafard:2:(3) 2.001913] [smpi_replay/VERBOSE] 2 allgatherv 275427 275427 275427 275427 204020 0 0 2.001913
+> [Jupiter:1:(2) 2.001913] [smpi_replay/VERBOSE] 1 allgatherv 275427 275427 275427 275427 204020 0 0 2.001913
+> [Jupiter:1:(2) 2.001913] [smpi_replay/INFO] Simulation time 2.001913
 
 $ rm -f replay/one_trace_override
 
@@ -343,15 +342,15 @@ $ mkfile replay/one_trace_override
 
 ! output sort 19
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace_override --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Fafard:2:(3) 0.000000] [smpi_replay/VERBOSE] 2 irecv 1 1 3000 0.000000
-> [Fafard:2:(3) 0.000000] [smpi_replay/VERBOSE] 2 isend 0 2 3000 0.000000
-> [Fafard:2:(3) 0.006224] [smpi_replay/VERBOSE] 2 waitall 0.006224
-> [Fafard:2:(3) 0.006224] [smpi_replay/INFO] Simulation time 0.006224
+> [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 irecv 1 0 2000 0.000000
 > [Jupiter:1:(2) 0.000000] [smpi_replay/VERBOSE] 1 isend 0 0 2000 0.000000
+> [Fafard:2:(3) 0.000000] [smpi_replay/VERBOSE] 2 irecv 1 1 3000 0.000000
+> [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 irecv 2 2 3000 0.000000
 > [Jupiter:1:(2) 0.000000] [smpi_replay/VERBOSE] 1 isend 2 1 3000 0.000000
 > [Jupiter:1:(2) 0.000000] [smpi_replay/VERBOSE] 1 waitall 0.000000
-> [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 irecv 1 0 2000 0.000000
-> [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 irecv 2 2 3000 0.000000
-> [Tremblay:0:(1) 0.003790] [smpi_replay/VERBOSE] 0 waitall 0.003790
+> [Fafard:2:(3) 0.000000] [smpi_replay/VERBOSE] 2 isend 0 2 3000 0.000000
+> [Tremblay:0:(1) 0.003820] [smpi_replay/VERBOSE] 0 waitall 0.003820
+> [Fafard:2:(3) 0.006258] [smpi_replay/VERBOSE] 2 waitall 0.006258
+> [Fafard:2:(3) 0.006258] [smpi_replay/INFO] Simulation time 0.006258
 
 $ rm -f replay/one_trace_override
index a148441..df33116 100644 (file)
@@ -10,21 +10,21 @@ $ mkfile replay/one_trace
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
 > [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 bcast 5e4 0.000000
-> [Jupiter:1:(2) 0.015039] [smpi_replay/VERBOSE] 1 bcast 5e4 0.015039
-> [Fafard:2:(3) 0.015678] [smpi_replay/VERBOSE] 2 bcast 5e4 0.015678
-> [Jupiter:1:(2) 2.636409] [smpi_replay/VERBOSE] 1 compute 2e8 2.621369
+> [Jupiter:1:(2) 0.015536] [smpi_replay/VERBOSE] 1 bcast 5e4 0.015536
+> [Fafard:2:(3) 0.016118] [smpi_replay/VERBOSE] 2 bcast 5e4 0.016118
+> [Jupiter:1:(2) 2.636906] [smpi_replay/VERBOSE] 1 compute 2e8 2.621369
 > [Tremblay:0:(1) 5.097100] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
 > [Tremblay:0:(1) 5.097100] [smpi_replay/VERBOSE] 0 bcast 5e4 0.000000
-> [Jupiter:1:(2) 5.112139] [smpi_replay/VERBOSE] 1 bcast 5e4 2.475730
-> [Fafard:2:(3) 6.569102] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
-> [Fafard:2:(3) 6.584781] [smpi_replay/VERBOSE] 2 bcast 5e4 0.015678
-> [Jupiter:1:(2) 7.733508] [smpi_replay/VERBOSE] 1 compute 2e8 2.621369
+> [Jupiter:1:(2) 5.112636] [smpi_replay/VERBOSE] 1 bcast 5e4 2.475730
+> [Fafard:2:(3) 6.569541] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
+> [Fafard:2:(3) 6.585659] [smpi_replay/VERBOSE] 2 bcast 5e4 0.016118
+> [Jupiter:1:(2) 7.734005] [smpi_replay/VERBOSE] 1 compute 2e8 2.621369
 > [Tremblay:0:(1) 10.194200] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
-> [Fafard:2:(3) 13.138204] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
-> [Jupiter:1:(2) 14.286932] [smpi_replay/VERBOSE] 1 reduce 5e4 5e8 6.553424
-> [Tremblay:0:(1) 18.250982] [smpi_replay/VERBOSE] 0 reduce 5e4 5e8 8.056783
-> [Fafard:2:(3) 19.691628] [smpi_replay/VERBOSE] 2 reduce 5e4 5e8 6.553424
-> [Fafard:2:(3) 19.691628] [smpi_replay/INFO] Simulation time 19.691628
+> [Fafard:2:(3) 13.139083] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
+> [Jupiter:1:(2) 14.287429] [smpi_replay/VERBOSE] 1 reduce 5e4 5e8 6.553424
+> [Tremblay:0:(1) 18.252300] [smpi_replay/VERBOSE] 0 reduce 5e4 5e8 8.058101
+> [Fafard:2:(3) 19.692506] [smpi_replay/VERBOSE] 2 reduce 5e4 5e8 6.553424
+> [Fafard:2:(3) 19.692506] [smpi_replay/INFO] Simulation time 19.692506
 
 $ rm -f replay/one_trace
 
@@ -34,7 +34,7 @@ p The same with tracing activated
 $ mkfile replay/one_trace
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=replay.thresh:critical --log=no_loc  --cfg=tracing:yes --cfg=tracing/smpi:yes --cfg=tracing/smpi/computing:yes  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay  --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Fafard:2:(3) 19.691628] [smpi_replay/INFO] Simulation time 19.691628
+> [Fafard:2:(3) 19.692506] [smpi_replay/INFO] Simulation time 19.692506
 
 $ rm -f replay/one_trace
 
@@ -171,46 +171,46 @@ $ tail -n +3 ./simgrid.trace
 > 12 0.000000 2 1 7
 > 5 9 2 action_reduce "0 1 0"
 > 5 10 2 smpi_replay_run_finalize "0 1 0"
-> 13 0.015039 2 2
-> 12 0.015039 2 2 7
-> 13 0.015678 2 3
-> 12 0.015678 2 3 7
-> 13 2.636409 2 2
-> 12 2.636409 2 2 8
+> 13 0.015536 2 2
+> 12 0.015536 2 2 7
+> 13 0.016118 2 3
+> 12 0.016118 2 3 7
+> 13 2.636906 2 2
+> 12 2.636906 2 2 8
 > 13 5.097100 2 1
 > 12 5.097100 2 1 8
 > 13 5.097100 2 1
 > 12 5.097100 2 1 7
-> 13 5.112139 2 2
-> 12 5.112139 2 2 7
-> 13 6.569102 2 3
-> 12 6.569102 2 3 8
-> 13 6.584781 2 3
-> 12 6.584781 2 3 7
-> 13 7.733508 2 2
-> 12 7.733508 2 2 9
-> 12 7.733508 2 2 7
+> 13 5.112636 2 2
+> 12 5.112636 2 2 7
+> 13 6.569541 2 3
+> 12 6.569541 2 3 8
+> 13 6.585659 2 3
+> 12 6.585659 2 3 7
+> 13 7.734005 2 2
+> 12 7.734005 2 2 9
+> 12 7.734005 2 2 7
 > 13 10.194200 2 1
 > 12 10.194200 2 1 9
-> 13 13.138204 2 3
-> 12 13.138204 2 3 9
-> 12 13.138204 2 3 7
-> 12 13.153883 2 1 7
-> 13 14.286932 2 2
-> 13 14.286932 2 2
-> 12 14.286932 2 2 10
-> 13 14.286932 2 2
-> 7 14.286932 1 2
-> 13 18.250982 2 1
-> 13 18.250982 2 1
-> 12 18.250982 2 1 10
-> 13 18.250982 2 1
-> 7 18.250982 1 1
-> 13 19.691628 2 3
-> 13 19.691628 2 3
-> 12 19.691628 2 3 10
-> 13 19.691628 2 3
-> 7 19.691628 1 3
+> 13 13.139083 2 3
+> 12 13.139083 2 3 9
+> 12 13.139083 2 3 7
+> 12 13.155200 2 1 7
+> 13 14.287429 2 2
+> 13 14.287429 2 2
+> 12 14.287429 2 2 10
+> 13 14.287429 2 2
+> 7 14.287429 1 2
+> 13 18.252300 2 1
+> 13 18.252300 2 1
+> 12 18.252300 2 1 10
+> 13 18.252300 2 1
+> 7 18.252300 1 1
+> 13 19.692506 2 3
+> 13 19.692506 2 3
+> 12 19.692506 2 3 10
+> 13 19.692506 2 3
+> 7 19.692506 1 3
 
 $ rm -f ./simgrid.trace
 
@@ -221,15 +221,15 @@ p Another test of trace replay with SMPI (one trace per process)
 $ mkfile ./split_traces_tesh
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay ./split_traces_tesh --log=smpi_replay.thresh:verbose --log=no_loc  -np 2 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 0.167160] [smpi_replay/VERBOSE] 0 send 1 0 1e6 0.167160
-> [Jupiter:1:(2) 0.167160] [smpi_replay/VERBOSE] 1 recv 0 0 1e6 0.167160
-> [Jupiter:1:(2) 13.274007] [smpi_replay/VERBOSE] 1 compute 1e9 13.106847
-> [Jupiter:1:(2) 13.274007] [smpi_replay/VERBOSE] 1 isend 0 1 1e6 0.000000
-> [Jupiter:1:(2) 13.274007] [smpi_replay/VERBOSE] 1 irecv 0 2 1e6 0.000000
-> [Tremblay:0:(1) 13.441167] [smpi_replay/VERBOSE] 0 recv 1 1 1e6 13.274007
-> [Jupiter:1:(2) 13.608327] [smpi_replay/VERBOSE] 1 wait 0 1 2 0.334320
-> [Tremblay:0:(1) 13.608327] [smpi_replay/VERBOSE] 0 send 1 2 1e6 0.167160
-> [Jupiter:1:(2) 13.608327] [smpi_replay/INFO] Simulation time 13.608327
+> [Tremblay:0:(1) 0.171838] [smpi_replay/VERBOSE] 0 send 1 0 1e6 0.171838
+> [Jupiter:1:(2) 0.171838] [smpi_replay/VERBOSE] 1 recv 0 0 1e6 0.171838
+> [Jupiter:1:(2) 13.278685] [smpi_replay/VERBOSE] 1 compute 1e9 13.106847
+> [Jupiter:1:(2) 13.278685] [smpi_replay/VERBOSE] 1 isend 0 1 1e6 0.000000
+> [Jupiter:1:(2) 13.278685] [smpi_replay/VERBOSE] 1 irecv 0 2 1e6 0.000000
+> [Tremblay:0:(1) 13.450522] [smpi_replay/VERBOSE] 0 recv 1 1 1e6 13.278685
+> [Jupiter:1:(2) 13.622360] [smpi_replay/VERBOSE] 1 wait 0 1 2 0.343675
+> [Tremblay:0:(1) 13.622360] [smpi_replay/VERBOSE] 0 send 1 2 1e6 0.171838
+> [Jupiter:1:(2) 13.622360] [smpi_replay/INFO] Simulation time 13.622360
 
 $ rm -f ./split_traces_tesh
 
@@ -239,15 +239,15 @@ p Test of barrier replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 1.518423] [smpi_replay/VERBOSE] 0 send 1 0 1e7 1.518423
-> [Jupiter:1:(2) 1.518423] [smpi_replay/VERBOSE] 1 recv 0 0 1e7 1.518423
-> [Tremblay:0:(1) 1.522406] [smpi_replay/VERBOSE] 0 barrier 0.003983
-> [Jupiter:1:(2) 1.525354] [smpi_replay/VERBOSE] 1 barrier 0.006931
-> [Fafard:2:(3) 1.526390] [smpi_replay/VERBOSE] 2 barrier 1.526390
-> [Tremblay:0:(1) 2.522406] [smpi_replay/VERBOSE] 0 compute 98095000 1.000000
-> [Jupiter:1:(2) 2.525354] [smpi_replay/VERBOSE] 1 compute 76296000 1.000000
-> [Fafard:2:(3) 2.526390] [smpi_replay/VERBOSE] 2 compute 76296000 1.000000
-> [Fafard:2:(3) 2.526390] [smpi_replay/INFO] Simulation time 2.526390
+> [Tremblay:0:(1) 1.565197] [smpi_replay/VERBOSE] 0 send 1 0 1e7 1.565197
+> [Jupiter:1:(2) 1.565197] [smpi_replay/VERBOSE] 1 recv 0 0 1e7 1.565197
+> [Tremblay:0:(1) 1.569181] [smpi_replay/VERBOSE] 0 barrier 0.003984
+> [Jupiter:1:(2) 1.572128] [smpi_replay/VERBOSE] 1 barrier 0.006931
+> [Fafard:2:(3) 1.573164] [smpi_replay/VERBOSE] 2 barrier 1.573164
+> [Tremblay:0:(1) 2.569181] [smpi_replay/VERBOSE] 0 compute 98095000 1.000000
+> [Jupiter:1:(2) 2.572128] [smpi_replay/VERBOSE] 1 compute 76296000 1.000000
+> [Fafard:2:(3) 2.573164] [smpi_replay/VERBOSE] 2 compute 76296000 1.000000
+> [Fafard:2:(3) 2.573164] [smpi_replay/INFO] Simulation time 2.573164
 
 $ rm -f replay/one_trace
 
@@ -261,19 +261,19 @@ $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=rep
 > [Jupiter:1:(2) 6.553424] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
 > [Jupiter:1:(2) 6.553524] [smpi_replay/VERBOSE] 1 test 0 1 0 0.000100
 > [Tremblay:0:(1) 10.194200] [smpi_replay/VERBOSE] 0 compute 1e9 10.194200
-> [Tremblay:0:(1) 10.361360] [smpi_replay/VERBOSE] 0 send 1 0 1e6 0.167160
+> [Tremblay:0:(1) 10.366037] [smpi_replay/VERBOSE] 0 send 1 0 1e6 0.171838
 > [Jupiter:1:(2) 13.106947] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
 > [Jupiter:1:(2) 13.106947] [smpi_replay/VERBOSE] 1 wait 0 1 0 0.000000
-> [Tremblay:0:(1) 20.555559] [smpi_replay/VERBOSE] 0 compute 1e9 10.194200
+> [Tremblay:0:(1) 20.560237] [smpi_replay/VERBOSE] 0 compute 1e9 10.194200
 > [Fafard:2:(3) 26.213694] [smpi_replay/VERBOSE] 2 compute 2e9 26.213694
 > [Fafard:2:(3) 26.213694] [smpi_replay/VERBOSE] 2 irecv 1 1 1e6 0.000000
-> [Jupiter:1:(2) 26.403862] [smpi_replay/VERBOSE] 1 send 2 1 1e6 13.296915
+> [Jupiter:1:(2) 26.408540] [smpi_replay/VERBOSE] 1 send 2 1 1e6 13.301593
 > [Fafard:2:(3) 29.490406] [smpi_replay/VERBOSE] 2 compute 2.5e8 3.276712
 > [Fafard:2:(3) 29.490606] [smpi_replay/VERBOSE] 2 test 1 2 1 0.000200
 > [Fafard:2:(3) 32.767318] [smpi_replay/VERBOSE] 2 compute 2.5e8 3.276712
 > [Fafard:2:(3) 32.767318] [smpi_replay/VERBOSE] 2 wait 1 2 1 0.000000
 > [Fafard:2:(3) 32.767318] [smpi_replay/VERBOSE] 2 isend 0 2 1e6 0.000000
-> [Tremblay:0:(1) 32.923016] [smpi_replay/VERBOSE] 0 recv 2 2 1e6 12.367457
+> [Tremblay:0:(1) 32.927150] [smpi_replay/VERBOSE] 0 recv 2 2 1e6 12.366914
 > [Fafard:2:(3) 39.320741] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
 > [Fafard:2:(3) 39.320741] [smpi_replay/INFO] Simulation time 39.320741
 
@@ -285,13 +285,13 @@ p Test of AllReduce replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 5.112778] [smpi_replay/VERBOSE] 0 allreduce 5e4 5e8 5.112778
-> [Jupiter:1:(2) 6.584141] [smpi_replay/VERBOSE] 1 allreduce 5e4 5e8 6.584141
-> [Fafard:2:(3) 6.584781] [smpi_replay/VERBOSE] 2 allreduce 5e4 5e8 6.584781
-> [Tremblay:0:(1) 10.209878] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
-> [Jupiter:1:(2) 13.137565] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
-> [Fafard:2:(3) 13.138204] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
-> [Fafard:2:(3) 13.138204] [smpi_replay/INFO] Simulation time 13.138204
+> [Tremblay:0:(1) 5.113218] [smpi_replay/VERBOSE] 0 allreduce 5e4 5e8 5.113218
+> [Jupiter:1:(2) 6.585077] [smpi_replay/VERBOSE] 1 allreduce 5e4 5e8 6.585077
+> [Fafard:2:(3) 6.585659] [smpi_replay/VERBOSE] 2 allreduce 5e4 5e8 6.585659
+> [Tremblay:0:(1) 10.210317] [smpi_replay/VERBOSE] 0 compute 5e8 5.097100
+> [Jupiter:1:(2) 13.138501] [smpi_replay/VERBOSE] 1 compute 5e8 6.553424
+> [Fafard:2:(3) 13.139083] [smpi_replay/VERBOSE] 2 compute 5e8 6.553424
+> [Fafard:2:(3) 13.139083] [smpi_replay/INFO] Simulation time 13.139083
 
 $ rm -f replay/one_trace
 
@@ -301,10 +301,10 @@ p Test of AllToAll replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 0.004047] [smpi_replay/VERBOSE] 0 alltoall 500 500 0.004047
-> [Fafard:2:(3) 0.006927] [smpi_replay/VERBOSE] 2 alltoall 500 500 0.006927
-> [Jupiter:1:(2) 0.006927] [smpi_replay/VERBOSE] 1 alltoall 500 500 0.006927
-> [Jupiter:1:(2) 0.006927] [smpi_replay/INFO] Simulation time 0.006927
+> [Tremblay:0:(1) 0.004253] [smpi_replay/VERBOSE] 0 alltoall 500 500 0.004253
+> [Fafard:2:(3) 0.007159] [smpi_replay/VERBOSE] 2 alltoall 500 500 0.007159
+> [Jupiter:1:(2) 0.007159] [smpi_replay/VERBOSE] 1 alltoall 500 500 0.007159
+> [Jupiter:1:(2) 0.007159] [smpi_replay/INFO] Simulation time 0.007159
 
 $ rm -f replay/one_trace
 
@@ -314,10 +314,11 @@ p Test of AllToAllv replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 0.004004] [smpi_replay/VERBOSE] 0 alltoallv 100 1 40 30 1000 1 80 100 0.004004
-> [Jupiter:1:(2) 0.006939] [smpi_replay/VERBOSE] 1 alltoallv 1000 80 1 40 1000 40 1 30 0.006939
-> [Fafard:2:(3) 0.006941] [smpi_replay/VERBOSE] 2 alltoallv 1000 100 30 1 1000 30 40 1 0.006941
-> [Fafard:2:(3) 0.006941] [smpi_replay/INFO] Simulation time 0.006941
+> [Tremblay:0:(1) 0.004007] [smpi_replay/VERBOSE] 0 alltoallv 100 1 40 30 1000 1 80 100 0.004007
+> [Jupiter:1:(2) 0.006942] [smpi_replay/VERBOSE] 1 alltoallv 1000 80 1 40 1000 40 1 30 0.006942
+> [Fafard:2:(3) 0.006944] [smpi_replay/VERBOSE] 2 alltoallv 1000 100 30 1 1000 30 40 1 0.006944
+> [Fafard:2:(3) 0.006944] [smpi_replay/INFO] Simulation time 0.006944
+
 $ rm -f replay/one_trace
 
 p Test of AllGatherv replay with SMPI (one trace for all processes)
@@ -326,11 +327,11 @@ p Test of AllGatherv replay with SMPI (one trace for all processes)
 $ mkfile replay/one_trace
 
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 4 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Tremblay:0:(1) 1.397272] [smpi_replay/VERBOSE] 0 allgatherv 275427 275427 275427 275427 204020 0 0 1.397272
-> [Ginette:3:(4) 1.760434] [smpi_replay/VERBOSE] 3 allgatherv 204020 275427 275427 275427 204020 0 0 1.760434
-> [Fafard:2:(3) 1.942001] [smpi_replay/VERBOSE] 2 allgatherv 275427 275427 275427 275427 204020 0 0 1.942001
-> [Jupiter:1:(2) 1.942001] [smpi_replay/VERBOSE] 1 allgatherv 275427 275427 275427 275427 204020 0 0 1.942001
-> [Jupiter:1:(2) 1.942001] [smpi_replay/INFO] Simulation time 1.942001
+> [Tremblay:0:(1) 1.440359] [smpi_replay/VERBOSE] 0 allgatherv 275427 275427 275427 275427 204020 0 0 1.440359
+> [Ginette:3:(4) 1.814751] [smpi_replay/VERBOSE] 3 allgatherv 204020 275427 275427 275427 204020 0 0 1.814751
+> [Fafard:2:(3) 2.001913] [smpi_replay/VERBOSE] 2 allgatherv 275427 275427 275427 275427 204020 0 0 2.001913
+> [Jupiter:1:(2) 2.001913] [smpi_replay/VERBOSE] 1 allgatherv 275427 275427 275427 275427 204020 0 0 2.001913
+> [Jupiter:1:(2) 2.001913] [smpi_replay/INFO] Simulation time 2.001913
 
 $ rm -f replay/one_trace
 
@@ -341,15 +342,15 @@ $ mkfile replay/one_trace
 
 ! output sort 19
 $ ../../smpi_script/bin/smpirun -no-privatize -replay replay/one_trace --log=replay.thresh:critical --log=smpi_replay.thresh:verbose --log=no_loc  -np 3 -platform ${srcdir:=.}/../platforms/small_platform.xml -hostfile ${srcdir:=.}/hostfile ./replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [Fafard:2:(3) 0.000000] [smpi_replay/VERBOSE] 2 irecv 1 1 3000 0.000000
-> [Fafard:2:(3) 0.000000] [smpi_replay/VERBOSE] 2 isend 0 2 3000 0.000000
-> [Fafard:2:(3) 0.006224] [smpi_replay/VERBOSE] 2 waitall 0.006224
-> [Fafard:2:(3) 0.006224] [smpi_replay/INFO] Simulation time 0.006224
+> [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 irecv 1 0 2000 0.000000
 > [Jupiter:1:(2) 0.000000] [smpi_replay/VERBOSE] 1 isend 0 0 2000 0.000000
+> [Fafard:2:(3) 0.000000] [smpi_replay/VERBOSE] 2 irecv 1 1 3000 0.000000
+> [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 irecv 2 2 3000 0.000000
 > [Jupiter:1:(2) 0.000000] [smpi_replay/VERBOSE] 1 isend 2 1 3000 0.000000
 > [Jupiter:1:(2) 0.000000] [smpi_replay/VERBOSE] 1 waitall 0.000000
-> [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 irecv 1 0 2000 0.000000
-> [Tremblay:0:(1) 0.000000] [smpi_replay/VERBOSE] 0 irecv 2 2 3000 0.000000
-> [Tremblay:0:(1) 0.003790] [smpi_replay/VERBOSE] 0 waitall 0.003790
+> [Fafard:2:(3) 0.000000] [smpi_replay/VERBOSE] 2 isend 0 2 3000 0.000000
+> [Tremblay:0:(1) 0.003820] [smpi_replay/VERBOSE] 0 waitall 0.003820
+> [Fafard:2:(3) 0.006258] [smpi_replay/VERBOSE] 2 waitall 0.006258
+> [Fafard:2:(3) 0.006258] [smpi_replay/INFO] Simulation time 0.006258
 
 $ rm -f replay/one_trace
index 6faa87d..4049e42 100644 (file)
@@ -19,7 +19,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example")
 static void smpi_replay(int argc, char* argv[])
 {
   const char* instance_id = argv[1];
-  int rank                = static_cast<int>(xbt_str_parse_int(argv[2], "Cannot parse rank '%s'"));
+  int rank                = static_cast<int>(xbt_str_parse_int(argv[2], "Cannot parse rank"));
   const char* shared_trace =
       simgrid::s4u::Actor::self()->get_property("tracefile"); // Cannot use properties because this can be nullptr
   const char* private_trace = argv[3];
index c72bb9d..ec92ca2 100644 (file)
@@ -96,9 +96,9 @@ static int job_executor_process(Job* job)
 }
 
 // Executes a workload of SMPI processes
-static int workload_executor_process(const std::vector<std::unique_ptr<Job>>* workload)
+static int workload_executor_process(const std::vector<std::unique_ptr<Job>>& workload)
 {
-  for (auto const& job : *workload) {
+  for (auto const& job : workload) {
     // Let's wait until the job's waiting time if needed
     double curr_time = simgrid::s4u::Engine::get_clock();
     if (job->starting_time > curr_time) {
@@ -236,7 +236,7 @@ int main(int argc, char* argv[])
   }
 
   // Let's execute the workload
-  simgrid::s4u::Actor::create("workload", hosts[0], workload_executor_process, &jobs);
+  simgrid::s4u::Actor::create("workload", hosts[0], workload_executor_process, std::cref(jobs));
 
   e.run();
   XBT_INFO("Simulation finished! Final time: %g", simgrid::s4u::Engine::get_clock());
index d39f90d..d2e4338 100644 (file)
@@ -21,8 +21,8 @@ $ ./replay_multiple_manual ${srcdir:=.}/../../platforms/small_platform_with_rout
 > [   0.000000] (rank_1_1@Fafard) Replaying rank 1 of job 1 (smpi_app 'job1')
 > [ 155.249721] (rank_0_1@Fafard) Finished replaying rank 1 of job 0 (smpi_app 'job0')
 > [ 155.249721] (rank_1_1@Fafard) Finished replaying rank 1 of job 1 (smpi_app 'job1')
-> [ 155.256564] (rank_0_0@Bourassa) Simulation time 155.256564
 > [ 155.256564] (rank_0_0@Bourassa) Finished replaying rank 0 of job 0 (smpi_app 'job0')
+> [ 155.256564] (rank_1_0@Bourassa) Simulation time 155.256564
 > [ 155.256564] (rank_1_0@Bourassa) Finished replaying rank 0 of job 1 (smpi_app 'job1')
 > [ 156.256564] (job_0000@Bourassa) Finished job 0 (smpi_app 'job0')
 > [ 156.256564] (job_0001@Bourassa) Finished job 1 (smpi_app 'job1')
index 22ba4d5..9edbad7 100644 (file)
@@ -115,4 +115,4 @@ $ ./replay_multiple_manual ${platfdir}/small_platform_with_routers.xml ${srcdir:
 > [1738.001382] (job_0001@Bourassa) Finished job 1 (smpi_app 'job1')
 > [1738.001382] (maestro@) Simulation finished! Final time: 1738
 
-$ rm -f ${srcdir:=.}/workload_mixed2_sr
+$ rm -f ${srcdir:=.}/workload_mixed2_same_resources
diff --git a/examples/smpi/simple-execute/hostfile_griffon b/examples/smpi/simple-execute/hostfile_griffon
new file mode 100644 (file)
index 0000000..675e59c
--- /dev/null
@@ -0,0 +1,2 @@
+griffon-2.nancy.grid5000.fr
+griffon-70.nancy.grid5000.fr
diff --git a/examples/smpi/simple-execute/simple-execute-cpp-platf.tesh b/examples/smpi/simple-execute/simple-execute-cpp-platf.tesh
new file mode 100644 (file)
index 0000000..ebb74af
--- /dev/null
@@ -0,0 +1,80 @@
+p C++ interface (griffon.so) with hostfile: Simple pingpong test
+! output sort
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile_griffon -platform ${libdir:=.}/libgriffon.so -np 2 ${bindir:=.}/smpi_simple-execute --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/simulate-computation:no --log=smpi_mpi.:verbose --log=smpi_bench.thresh:debug --log=no_loc
+> [0.000000] [smpi/INFO] [rank 0] -> griffon-2.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 1] -> griffon-70.nancy.grid5000.fr
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Init
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Init
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Init
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Comm_size
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Comm_size
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Comm_rank
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Comm_rank
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Send
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Init
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Comm_size
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Comm_size
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Comm_rank
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Comm_rank
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Recv
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Send
+> [griffon-2.nancy.grid5000.fr:0:(1) 0.000000] [smpi_bench/DEBUG] Handle real computation time: 1430435.000000 flops
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000145] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Recv
+> [griffon-70.nancy.grid5000.fr:1:(2) 0.000145] [smpi_bench/DEBUG] Handle real computation time: 762960000.000000 flops
+> [griffon-2.nancy.grid5000.fr:0:(1) 5.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Recv
+> [griffon-70.nancy.grid5000.fr:1:(2) 2666.881199] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Send
+> [griffon-70.nancy.grid5000.fr:1:(2) 2666.881199] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Send
+> [griffon-70.nancy.grid5000.fr:1:(2) 2666.881199] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Finalize
+> [griffon-70.nancy.grid5000.fr:1:(2) 2666.881199] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Finalize
+> [griffon-2.nancy.grid5000.fr:0:(1) 2666.881344] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Recv
+> [griffon-2.nancy.grid5000.fr:0:(1) 2666.881344] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Finalize
+> [griffon-2.nancy.grid5000.fr:0:(1) 2666.881344] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Finalize
+> 
+>     *** Ping-pong test (MPI_Send/MPI_Recv) ***
+> 
+> [0] About to send 1st message '99' to process [1]
+> [1] Received 1st message '99' from process [0]
+> [1] After a nap, increment message's value to  '100'
+> [1] About to send back message '100' to process [0]
+> [0] Received reply message '100' from process [1]
+
+
+p C++ interface (griffon.so) without hostfile: Simple pingpong test
+! output sort
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -platform ${libdir:=.}/libgriffon.so -np 2 ${bindir:=.}/smpi_simple-execute --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/simulate-computation:no --log=smpi_mpi.:verbose --log=smpi_bench.thresh:debug --log=no_loc
+> [0.000000] [smpi/INFO] [rank 0] -> griffon-1.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 1] -> griffon-10.nancy.grid5000.fr
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Init
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Init
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Init
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Comm_size
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Comm_size
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Comm_rank
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Comm_rank
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Send
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Init
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Comm_size
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Comm_size
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Comm_rank
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Comm_rank
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Recv
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Send
+> [griffon-1.nancy.grid5000.fr:0:(1) 0.000000] [smpi_bench/DEBUG] Handle real computation time: 1430435.000000 flops
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000097] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Recv
+> [griffon-10.nancy.grid5000.fr:1:(2) 0.000097] [smpi_bench/DEBUG] Handle real computation time: 762960000.000000 flops
+> [griffon-1.nancy.grid5000.fr:0:(1) 5.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Recv
+> [griffon-10.nancy.grid5000.fr:1:(2) 2666.881151] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Send
+> [griffon-10.nancy.grid5000.fr:1:(2) 2666.881151] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Send
+> [griffon-10.nancy.grid5000.fr:1:(2) 2666.881151] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Finalize
+> [griffon-10.nancy.grid5000.fr:1:(2) 2666.881151] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Finalize
+> [griffon-1.nancy.grid5000.fr:0:(1) 2666.881247] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Recv
+> [griffon-1.nancy.grid5000.fr:0:(1) 2666.881247] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Finalize
+> [griffon-1.nancy.grid5000.fr:0:(1) 2666.881247] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Finalize
+> 
+>     *** Ping-pong test (MPI_Send/MPI_Recv) ***
+> 
+> [0] About to send 1st message '99' to process [1]
+> [1] Received 1st message '99' from process [0]
+> [1] After a nap, increment message's value to  '100'
+> [1] About to send back message '100' to process [0]
+> [0] Received reply message '100' from process [1]
index c32c0fc..4defe25 100644 (file)
@@ -1,8 +1,8 @@
 p Simple pingpong test with execute calls to demonstrate SMPI
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/../hostfile -platform ${platfdir:=.}/small_platform.xml -np 2 ${bindir:=.}/smpi_simple-execute --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/simulate-computation:no --log=smpi_mpi.:verbose --log=smpi_bench.thresh:debug --log=no_loc
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
 > [Tremblay:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Init
 > [Jupiter:1:(2) 0.000000] [smpi_mpi/VERBOSE] SMPI - Entering MPI_Init
 > [Tremblay:0:(1) 0.000000] [smpi_mpi/VERBOSE] SMPI - Leaving MPI_Init
index 2103ff5..9a0cbdc 100644 (file)
@@ -153,1195 +153,1195 @@ $ tail -n +3 ${bindir:=.}/smpi_trace.trace
 > 5 18 2 PMPI_Finalize "0 1 0"
 > 13 1.000000 2 2
 > 12 1.000000 2 2 11
-> 13 1.077076 2 1
-> 12 1.077076 2 1 12
-> 16 1.077076 3 0 PTP 2 1_2_12345_1
-> 13 1.077076 2 2
-> 12 1.077076 2 2 12
+> 13 1.078947 2 1
+> 12 1.078947 2 1 12
+> 16 1.078947 3 0 PTP 2 1_2_12345_1
+> 13 1.078947 2 2
+> 12 1.078947 2 2 12
 > 13 2.000000 2 3
 > 12 2.000000 2 3 12
-> 13 2.003983 2 1
-> 12 2.003983 2 1 13
-> 15 2.003983 3 0 PTP 1 1_2_12345_2
+> 13 2.003984 2 1
+> 12 2.003984 2 1 13
+> 15 2.003984 3 0 PTP 1 1_2_12345_2
 > 13 2.006931 2 2
 > 12 2.006931 2 2 14
 > 13 2.006931 2 2
 > 12 2.006931 2 2 10
 > 13 2.007967 2 3
 > 12 2.007967 2 3 12
-> 13 2.084007 2 1
-> 12 2.084007 2 1 12
-> 13 2.084007 2 2
-> 16 2.084007 3 0 PTP 2 1_2_12345_2
-> 12 2.084007 2 2 12
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_3
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_4
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_5
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_6
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_7
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_8
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_9
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_10
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_11
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_12
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_13
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_14
-> 13 2.087990 2 1
-> 12 2.087990 2 1 9
-> 15 2.087990 3 0 PTP 1 1_2_12345_15
-> 13 2.087990 2 1
-> 12 2.087990 2 1 10
-> 13 2.090937 2 2
-> 12 2.090937 2 2 11
-> 13 2.091973 2 3
-> 12 2.091973 2 3 12
-> 13 2.168013 2 1
-> 12 2.168013 2 1 10
-> 16 2.168013 3 0 PTP 2 1_2_12345_3
-> 13 2.168013 2 2
-> 12 2.168013 2 2 11
-> 13 2.245089 2 1
-> 12 2.245089 2 1 10
-> 16 2.245089 3 0 PTP 2 1_2_12345_4
-> 13 2.245089 2 2
-> 12 2.245089 2 2 11
-> 13 2.322165 2 1
-> 12 2.322165 2 1 10
-> 16 2.322165 3 0 PTP 2 1_2_12345_5
-> 13 2.322165 2 2
-> 12 2.322165 2 2 11
-> 13 2.399241 2 1
-> 12 2.399241 2 1 10
-> 16 2.399241 3 0 PTP 2 1_2_12345_6
-> 13 2.399241 2 2
-> 12 2.399241 2 2 11
-> 13 2.476316 2 1
-> 12 2.476316 2 1 10
-> 16 2.476316 3 0 PTP 2 1_2_12345_7
-> 13 2.476316 2 2
-> 12 2.476316 2 2 11
-> 13 2.553392 2 1
-> 12 2.553392 2 1 10
-> 16 2.553392 3 0 PTP 2 1_2_12345_8
-> 13 2.553392 2 2
-> 12 2.553392 2 2 11
-> 13 2.630468 2 1
-> 12 2.630468 2 1 10
-> 16 2.630468 3 0 PTP 2 1_2_12345_9
-> 13 2.630468 2 2
-> 12 2.630468 2 2 11
-> 13 2.707544 2 1
-> 12 2.707544 2 1 10
-> 16 2.707544 3 0 PTP 2 1_2_12345_10
-> 13 2.707544 2 2
-> 12 2.707544 2 2 11
-> 13 2.784620 2 1
-> 12 2.784620 2 1 10
-> 16 2.784620 3 0 PTP 2 1_2_12345_11
-> 13 2.784620 2 2
-> 12 2.784620 2 2 11
-> 13 2.861696 2 1
-> 12 2.861696 2 1 10
-> 16 2.861696 3 0 PTP 2 1_2_12345_12
-> 13 2.861696 2 2
-> 12 2.861696 2 2 11
-> 13 2.938772 2 1
-> 12 2.938772 2 1 10
-> 16 2.938772 3 0 PTP 2 1_2_12345_13
-> 13 2.938772 2 2
-> 12 2.938772 2 2 11
-> 13 3.015847 2 1
-> 12 3.015847 2 1 10
-> 16 3.015847 3 0 PTP 2 1_2_12345_14
-> 13 3.015847 2 2
-> 12 3.015847 2 2 11
-> 13 3.092923 2 1
-> 12 3.092923 2 1 12
-> 16 3.092923 3 0 PTP 2 1_2_12345_15
-> 13 3.092923 2 2
-> 12 3.092923 2 2 12
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_16
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_17
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_18
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_19
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_20
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_21
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_22
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_23
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_24
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_25
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_26
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_27
-> 13 3.096907 2 1
-> 12 3.096907 2 1 9
-> 15 3.096907 3 0 PTP 1 1_2_12345_28
-> 13 3.096907 2 1
-> 12 3.096907 2 1 15
-> 13 3.099854 2 2
-> 12 3.099854 2 2 11
-> 13 3.100890 2 3
-> 12 3.100890 2 3 12
-> 13 3.176930 2 1
-> 12 3.176930 2 1 15
-> 16 3.176930 3 0 PTP 2 1_2_12345_16
-> 13 3.176930 2 2
-> 12 3.176930 2 2 11
-> 13 3.254006 2 1
-> 12 3.254006 2 1 15
-> 16 3.254006 3 0 PTP 2 1_2_12345_17
-> 13 3.254006 2 2
-> 12 3.254006 2 2 11
-> 13 3.331081 2 1
-> 12 3.331081 2 1 15
-> 16 3.331081 3 0 PTP 2 1_2_12345_18
-> 13 3.331081 2 2
-> 12 3.331081 2 2 11
-> 13 3.408157 2 1
-> 12 3.408157 2 1 15
-> 16 3.408157 3 0 PTP 2 1_2_12345_19
-> 13 3.408157 2 2
-> 12 3.408157 2 2 11
-> 13 3.485233 2 1
-> 12 3.485233 2 1 15
-> 16 3.485233 3 0 PTP 2 1_2_12345_20
-> 13 3.485233 2 2
-> 12 3.485233 2 2 11
-> 13 3.562309 2 1
-> 12 3.562309 2 1 15
-> 16 3.562309 3 0 PTP 2 1_2_12345_21
-> 13 3.562309 2 2
-> 12 3.562309 2 2 11
-> 13 3.639385 2 1
-> 12 3.639385 2 1 15
-> 16 3.639385 3 0 PTP 2 1_2_12345_22
-> 13 3.639385 2 2
-> 12 3.639385 2 2 11
-> 13 3.716461 2 1
-> 12 3.716461 2 1 15
-> 16 3.716461 3 0 PTP 2 1_2_12345_23
-> 13 3.716461 2 2
-> 12 3.716461 2 2 11
-> 13 3.793537 2 1
-> 12 3.793537 2 1 15
-> 16 3.793537 3 0 PTP 2 1_2_12345_24
-> 13 3.793537 2 2
-> 12 3.793537 2 2 11
-> 13 3.870612 2 1
-> 12 3.870612 2 1 15
-> 16 3.870612 3 0 PTP 2 1_2_12345_25
-> 13 3.870612 2 2
-> 12 3.870612 2 2 11
-> 13 3.947688 2 1
-> 12 3.947688 2 1 15
-> 16 3.947688 3 0 PTP 2 1_2_12345_26
-> 13 3.947688 2 2
-> 12 3.947688 2 2 11
-> 13 4.024764 2 1
-> 12 4.024764 2 1 15
-> 16 4.024764 3 0 PTP 2 1_2_12345_27
-> 13 4.024764 2 2
-> 12 4.024764 2 2 11
-> 13 4.101840 2 1
-> 12 4.101840 2 1 12
-> 16 4.101840 3 0 PTP 2 1_2_12345_28
-> 13 4.101840 2 2
-> 12 4.101840 2 2 12
-> 13 4.105823 2 1
-> 12 4.105823 2 1 13
-> 15 4.105823 3 0 PTP 1 1_2_12345_29
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 14
-> 13 4.108771 2 2
-> 12 4.108771 2 2 10
-> 13 4.109807 2 3
-> 12 4.109807 2 3 12
-> 13 4.185847 2 1
-> 12 4.185847 2 1 13
-> 15 4.185847 3 0 PTP 1 1_2_12345_30
-> 13 4.185847 2 2
-> 16 4.185847 3 0 PTP 2 1_2_12345_29
-> 12 4.185847 2 2 10
-> 13 4.262922 2 2
-> 16 4.262922 3 0 PTP 2 1_2_12345_30
-> 12 4.262922 2 2 10
-> 13 4.262922 2 1
-> 12 4.262922 2 1 13
-> 15 4.262922 3 0 PTP 1 1_2_12345_31
-> 13 4.339998 2 2
-> 16 4.339998 3 0 PTP 2 1_2_12345_31
-> 12 4.339998 2 2 10
-> 13 4.339998 2 1
-> 12 4.339998 2 1 13
-> 15 4.339998 3 0 PTP 1 1_2_12345_32
-> 13 4.417074 2 2
-> 16 4.417074 3 0 PTP 2 1_2_12345_32
-> 12 4.417074 2 2 10
-> 13 4.417074 2 1
-> 12 4.417074 2 1 13
-> 15 4.417074 3 0 PTP 1 1_2_12345_33
-> 13 4.494150 2 2
-> 16 4.494150 3 0 PTP 2 1_2_12345_33
-> 12 4.494150 2 2 10
-> 13 4.494150 2 1
-> 12 4.494150 2 1 13
-> 15 4.494150 3 0 PTP 1 1_2_12345_34
-> 13 4.571226 2 2
-> 16 4.571226 3 0 PTP 2 1_2_12345_34
-> 12 4.571226 2 2 10
-> 13 4.571226 2 1
-> 12 4.571226 2 1 13
-> 15 4.571226 3 0 PTP 1 1_2_12345_35
-> 13 4.648302 2 2
-> 16 4.648302 3 0 PTP 2 1_2_12345_35
-> 12 4.648302 2 2 10
-> 13 4.648302 2 1
-> 12 4.648302 2 1 13
-> 15 4.648302 3 0 PTP 1 1_2_12345_36
-> 13 4.725377 2 2
-> 16 4.725377 3 0 PTP 2 1_2_12345_36
-> 12 4.725377 2 2 10
-> 13 4.725377 2 1
-> 12 4.725377 2 1 13
-> 15 4.725377 3 0 PTP 1 1_2_12345_37
-> 13 4.802453 2 2
-> 16 4.802453 3 0 PTP 2 1_2_12345_37
-> 12 4.802453 2 2 10
-> 13 4.802453 2 1
-> 12 4.802453 2 1 13
-> 15 4.802453 3 0 PTP 1 1_2_12345_38
-> 13 4.879529 2 2
-> 16 4.879529 3 0 PTP 2 1_2_12345_38
-> 12 4.879529 2 2 10
-> 13 4.879529 2 1
-> 12 4.879529 2 1 13
-> 15 4.879529 3 0 PTP 1 1_2_12345_39
-> 13 4.956605 2 2
-> 16 4.956605 3 0 PTP 2 1_2_12345_39
-> 12 4.956605 2 2 10
-> 13 4.956605 2 1
-> 12 4.956605 2 1 13
-> 15 4.956605 3 0 PTP 1 1_2_12345_40
-> 13 5.033681 2 2
-> 16 5.033681 3 0 PTP 2 1_2_12345_40
-> 12 5.033681 2 2 10
-> 13 5.033681 2 1
-> 12 5.033681 2 1 13
-> 15 5.033681 3 0 PTP 1 1_2_12345_41
-> 13 5.110757 2 2
-> 16 5.110757 3 0 PTP 2 1_2_12345_41
-> 12 5.110757 2 2 12
-> 13 5.110757 2 1
-> 12 5.110757 2 1 12
-> 13 5.114740 2 1
-> 12 5.114740 2 1 13
-> 15 5.114740 3 0 PTP 1 1_2_12345_42
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 14
-> 13 5.117687 2 2
-> 12 5.117687 2 2 15
-> 13 5.118724 2 3
-> 12 5.118724 2 3 12
-> 13 5.194763 2 1
-> 12 5.194763 2 1 13
-> 15 5.194763 3 0 PTP 1 1_2_12345_43
-> 16 5.194763 3 0 PTP 2 1_2_12345_42
-> 13 5.194763 2 2
-> 12 5.194763 2 2 15
-> 16 5.271839 3 0 PTP 2 1_2_12345_43
-> 13 5.271839 2 2
-> 12 5.271839 2 2 15
-> 13 5.271839 2 1
-> 12 5.271839 2 1 13
-> 15 5.271839 3 0 PTP 1 1_2_12345_44
-> 16 5.348915 3 0 PTP 2 1_2_12345_44
-> 13 5.348915 2 2
-> 12 5.348915 2 2 15
-> 13 5.348915 2 1
-> 12 5.348915 2 1 13
-> 15 5.348915 3 0 PTP 1 1_2_12345_45
-> 16 5.425991 3 0 PTP 2 1_2_12345_45
-> 13 5.425991 2 2
-> 12 5.425991 2 2 15
-> 13 5.425991 2 1
-> 12 5.425991 2 1 13
-> 15 5.425991 3 0 PTP 1 1_2_12345_46
-> 16 5.503067 3 0 PTP 2 1_2_12345_46
-> 13 5.503067 2 2
-> 12 5.503067 2 2 15
-> 13 5.503067 2 1
-> 12 5.503067 2 1 13
-> 15 5.503067 3 0 PTP 1 1_2_12345_47
-> 16 5.580143 3 0 PTP 2 1_2_12345_47
-> 13 5.580143 2 2
-> 12 5.580143 2 2 15
-> 13 5.580143 2 1
-> 12 5.580143 2 1 13
-> 15 5.580143 3 0 PTP 1 1_2_12345_48
-> 16 5.657218 3 0 PTP 2 1_2_12345_48
-> 13 5.657218 2 2
-> 12 5.657218 2 2 15
-> 13 5.657218 2 1
-> 12 5.657218 2 1 13
-> 15 5.657218 3 0 PTP 1 1_2_12345_49
-> 16 5.734294 3 0 PTP 2 1_2_12345_49
-> 13 5.734294 2 2
-> 12 5.734294 2 2 15
-> 13 5.734294 2 1
-> 12 5.734294 2 1 13
-> 15 5.734294 3 0 PTP 1 1_2_12345_50
-> 16 5.811370 3 0 PTP 2 1_2_12345_50
-> 13 5.811370 2 2
-> 12 5.811370 2 2 15
-> 13 5.811370 2 1
-> 12 5.811370 2 1 13
-> 15 5.811370 3 0 PTP 1 1_2_12345_51
-> 16 5.888446 3 0 PTP 2 1_2_12345_51
-> 13 5.888446 2 2
-> 12 5.888446 2 2 15
-> 13 5.888446 2 1
-> 12 5.888446 2 1 13
-> 15 5.888446 3 0 PTP 1 1_2_12345_52
-> 16 5.965522 3 0 PTP 2 1_2_12345_52
-> 13 5.965522 2 2
-> 12 5.965522 2 2 15
-> 13 5.965522 2 1
-> 12 5.965522 2 1 13
-> 15 5.965522 3 0 PTP 1 1_2_12345_53
-> 16 6.042598 3 0 PTP 2 1_2_12345_53
-> 13 6.042598 2 2
-> 12 6.042598 2 2 15
-> 13 6.042598 2 1
-> 12 6.042598 2 1 13
-> 15 6.042598 3 0 PTP 1 1_2_12345_54
-> 16 6.119673 3 0 PTP 2 1_2_12345_54
-> 13 6.119673 2 2
-> 12 6.119673 2 2 12
-> 13 6.119673 2 1
-> 12 6.119673 2 1 12
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_55
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_56
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_57
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_58
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_59
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_60
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_61
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_62
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_63
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_64
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_65
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_66
-> 13 6.123657 2 1
-> 12 6.123657 2 1 9
-> 15 6.123657 3 0 PTP 1 1_2_12345_67
-> 13 6.123657 2 1
-> 12 6.123657 2 1 16
-> 13 6.126604 2 2
-> 12 6.126604 2 2 11
-> 13 6.127640 2 3
-> 12 6.127640 2 3 12
-> 16 6.203680 3 0 PTP 2 1_2_12345_55
-> 13 6.203680 2 2
-> 12 6.203680 2 2 11
-> 16 6.280756 3 0 PTP 2 1_2_12345_56
-> 13 6.280756 2 2
-> 12 6.280756 2 2 11
-> 16 6.357832 3 0 PTP 2 1_2_12345_57
-> 13 6.357832 2 2
-> 12 6.357832 2 2 11
-> 16 6.434908 3 0 PTP 2 1_2_12345_58
-> 13 6.434908 2 2
-> 12 6.434908 2 2 11
-> 16 6.511983 3 0 PTP 2 1_2_12345_59
-> 13 6.511983 2 2
-> 12 6.511983 2 2 11
-> 16 6.589059 3 0 PTP 2 1_2_12345_60
-> 13 6.589059 2 2
-> 12 6.589059 2 2 11
-> 16 6.666135 3 0 PTP 2 1_2_12345_61
-> 13 6.666135 2 2
-> 12 6.666135 2 2 11
-> 16 6.743211 3 0 PTP 2 1_2_12345_62
-> 13 6.743211 2 2
-> 12 6.743211 2 2 11
-> 16 6.820287 3 0 PTP 2 1_2_12345_63
-> 13 6.820287 2 2
-> 12 6.820287 2 2 11
-> 16 6.897363 3 0 PTP 2 1_2_12345_64
-> 13 6.897363 2 2
-> 12 6.897363 2 2 11
-> 16 6.974439 3 0 PTP 2 1_2_12345_65
-> 13 6.974439 2 2
-> 12 6.974439 2 2 11
-> 16 7.051514 3 0 PTP 2 1_2_12345_66
-> 13 7.051514 2 2
-> 12 7.051514 2 2 11
-> 13 7.128590 2 1
-> 12 7.128590 2 1 12
-> 16 7.128590 3 0 PTP 2 1_2_12345_67
-> 13 7.128590 2 2
-> 12 7.128590 2 2 12
-> 13 7.132574 2 1
-> 12 7.132574 2 1 13
-> 15 7.132574 3 0 PTP 1 1_2_12345_68
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 14
-> 13 7.135521 2 2
-> 12 7.135521 2 2 16
-> 13 7.136557 2 3
-> 12 7.136557 2 3 12
-> 13 7.212597 2 1
-> 12 7.212597 2 1 13
-> 15 7.212597 3 0 PTP 1 1_2_12345_69
-> 13 7.289673 2 1
-> 12 7.289673 2 1 13
-> 15 7.289673 3 0 PTP 1 1_2_12345_70
-> 13 7.366748 2 1
-> 12 7.366748 2 1 13
-> 15 7.366748 3 0 PTP 1 1_2_12345_71
-> 13 7.443824 2 1
-> 12 7.443824 2 1 13
-> 15 7.443824 3 0 PTP 1 1_2_12345_72
-> 13 7.520900 2 1
-> 12 7.520900 2 1 13
-> 15 7.520900 3 0 PTP 1 1_2_12345_73
-> 13 7.597976 2 1
-> 12 7.597976 2 1 13
-> 15 7.597976 3 0 PTP 1 1_2_12345_74
-> 13 7.675052 2 1
-> 12 7.675052 2 1 13
-> 15 7.675052 3 0 PTP 1 1_2_12345_75
-> 13 7.752128 2 1
-> 12 7.752128 2 1 13
-> 15 7.752128 3 0 PTP 1 1_2_12345_76
-> 13 7.829204 2 1
-> 12 7.829204 2 1 13
-> 15 7.829204 3 0 PTP 1 1_2_12345_77
-> 13 7.906279 2 1
-> 12 7.906279 2 1 13
-> 15 7.906279 3 0 PTP 1 1_2_12345_78
-> 13 7.983355 2 1
-> 12 7.983355 2 1 13
-> 15 7.983355 3 0 PTP 1 1_2_12345_79
-> 13 8.060431 2 1
-> 12 8.060431 2 1 13
-> 15 8.060431 3 0 PTP 1 1_2_12345_80
-> 16 8.137507 3 0 PTP 2 1_2_12345_68
-> 16 8.137507 3 0 PTP 2 1_2_12345_69
-> 16 8.137507 3 0 PTP 2 1_2_12345_70
-> 16 8.137507 3 0 PTP 2 1_2_12345_71
-> 16 8.137507 3 0 PTP 2 1_2_12345_72
-> 16 8.137507 3 0 PTP 2 1_2_12345_73
-> 16 8.137507 3 0 PTP 2 1_2_12345_74
-> 16 8.137507 3 0 PTP 2 1_2_12345_75
-> 16 8.137507 3 0 PTP 2 1_2_12345_76
-> 16 8.137507 3 0 PTP 2 1_2_12345_77
-> 16 8.137507 3 0 PTP 2 1_2_12345_78
-> 16 8.137507 3 0 PTP 2 1_2_12345_79
-> 16 8.137507 3 0 PTP 2 1_2_12345_80
-> 13 8.137507 2 2
-> 12 8.137507 2 2 12
-> 13 8.137507 2 1
-> 12 8.137507 2 1 12
-> 13 8.141490 2 1
-> 12 8.141490 2 1 13
-> 15 8.141490 3 0 PTP 1 1_3_12345_81
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 14
-> 13 8.144438 2 2
-> 12 8.144438 2 2 16
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 14
-> 13 8.145474 2 3
-> 12 8.145474 2 3 15
-> 13 8.221560 2 1
-> 12 8.221560 2 1 13
-> 15 8.221560 3 0 PTP 1 1_3_12345_82
-> 16 8.221560 3 0 PTP 3 1_3_12345_81
-> 13 8.221560 2 3
-> 12 8.221560 2 3 15
-> 16 8.297645 3 0 PTP 3 1_3_12345_82
-> 13 8.297645 2 3
-> 12 8.297645 2 3 15
-> 13 8.297645 2 1
-> 12 8.297645 2 1 13
-> 15 8.297645 3 0 PTP 1 1_3_12345_83
-> 16 8.373731 3 0 PTP 3 1_3_12345_83
-> 13 8.373731 2 3
-> 12 8.373731 2 3 15
-> 13 8.373731 2 1
-> 12 8.373731 2 1 13
-> 15 8.373731 3 0 PTP 1 1_3_12345_84
-> 16 8.449816 3 0 PTP 3 1_3_12345_84
-> 13 8.449816 2 3
-> 12 8.449816 2 3 15
-> 13 8.449816 2 1
-> 12 8.449816 2 1 13
-> 15 8.449816 3 0 PTP 1 1_3_12345_85
-> 16 8.525902 3 0 PTP 3 1_3_12345_85
-> 13 8.525902 2 3
-> 12 8.525902 2 3 15
-> 13 8.525902 2 1
-> 12 8.525902 2 1 13
-> 15 8.525902 3 0 PTP 1 1_3_12345_86
-> 16 8.601988 3 0 PTP 3 1_3_12345_86
-> 13 8.601988 2 3
-> 12 8.601988 2 3 15
-> 13 8.601988 2 1
-> 12 8.601988 2 1 13
-> 15 8.601988 3 0 PTP 1 1_3_12345_87
-> 16 8.678073 3 0 PTP 3 1_3_12345_87
-> 13 8.678073 2 3
-> 12 8.678073 2 3 15
-> 13 8.678073 2 1
-> 12 8.678073 2 1 13
-> 15 8.678073 3 0 PTP 1 1_3_12345_88
-> 16 8.754159 3 0 PTP 3 1_3_12345_88
-> 13 8.754159 2 3
-> 12 8.754159 2 3 15
-> 13 8.754159 2 1
-> 12 8.754159 2 1 13
-> 15 8.754159 3 0 PTP 1 1_3_12345_89
-> 16 8.830245 3 0 PTP 3 1_3_12345_89
-> 13 8.830245 2 3
-> 12 8.830245 2 3 15
-> 13 8.830245 2 1
-> 12 8.830245 2 1 13
-> 15 8.830245 3 0 PTP 1 1_3_12345_90
-> 16 8.906330 3 0 PTP 3 1_3_12345_90
-> 13 8.906330 2 3
-> 12 8.906330 2 3 15
-> 13 8.906330 2 1
-> 12 8.906330 2 1 13
-> 15 8.906330 3 0 PTP 1 1_3_12345_91
-> 16 8.982416 3 0 PTP 3 1_3_12345_91
-> 13 8.982416 2 3
-> 12 8.982416 2 3 15
-> 13 8.982416 2 1
-> 12 8.982416 2 1 13
-> 15 8.982416 3 0 PTP 1 1_3_12345_92
-> 16 9.058502 3 0 PTP 3 1_3_12345_92
-> 13 9.058502 2 3
-> 12 9.058502 2 3 15
-> 13 9.058502 2 1
-> 12 9.058502 2 1 13
-> 15 9.058502 3 0 PTP 1 1_3_12345_93
-> 16 9.134587 3 0 PTP 3 1_3_12345_93
-> 13 9.134587 2 3
-> 12 9.134587 2 3 12
-> 13 9.134587 2 1
-> 12 9.134587 2 1 13
-> 15 9.134587 3 0 PTP 1 1_2_12345_94
-> 13 9.211663 2 1
-> 12 9.211663 2 1 13
-> 15 9.211663 3 0 PTP 1 1_2_12345_95
-> 13 9.288739 2 1
-> 12 9.288739 2 1 13
-> 15 9.288739 3 0 PTP 1 1_2_12345_96
-> 13 9.365815 2 1
-> 12 9.365815 2 1 13
-> 15 9.365815 3 0 PTP 1 1_2_12345_97
-> 13 9.442891 2 1
-> 12 9.442891 2 1 13
-> 15 9.442891 3 0 PTP 1 1_2_12345_98
-> 13 9.519966 2 1
-> 12 9.519966 2 1 13
-> 15 9.519966 3 0 PTP 1 1_2_12345_99
-> 13 9.597042 2 1
-> 12 9.597042 2 1 13
-> 15 9.597042 3 0 PTP 1 1_2_12345_100
-> 13 9.674118 2 1
-> 12 9.674118 2 1 13
-> 15 9.674118 3 0 PTP 1 1_2_12345_101
-> 13 9.751194 2 1
-> 12 9.751194 2 1 13
-> 15 9.751194 3 0 PTP 1 1_2_12345_102
-> 13 9.828270 2 1
-> 12 9.828270 2 1 13
-> 15 9.828270 3 0 PTP 1 1_2_12345_103
-> 13 9.905346 2 1
-> 12 9.905346 2 1 13
-> 15 9.905346 3 0 PTP 1 1_2_12345_104
-> 13 9.982422 2 1
-> 12 9.982422 2 1 13
-> 15 9.982422 3 0 PTP 1 1_2_12345_105
-> 13 10.059497 2 1
-> 12 10.059497 2 1 13
-> 15 10.059497 3 0 PTP 1 1_2_12345_106
-> 16 10.136573 3 0 PTP 2 1_2_12345_94
-> 16 10.136573 3 0 PTP 2 1_2_12345_95
-> 16 10.136573 3 0 PTP 2 1_2_12345_96
-> 16 10.136573 3 0 PTP 2 1_2_12345_97
-> 16 10.136573 3 0 PTP 2 1_2_12345_98
-> 16 10.136573 3 0 PTP 2 1_2_12345_99
-> 16 10.136573 3 0 PTP 2 1_2_12345_100
-> 16 10.136573 3 0 PTP 2 1_2_12345_101
-> 16 10.136573 3 0 PTP 2 1_2_12345_102
-> 16 10.136573 3 0 PTP 2 1_2_12345_103
-> 16 10.136573 3 0 PTP 2 1_2_12345_104
-> 16 10.136573 3 0 PTP 2 1_2_12345_105
-> 16 10.136573 3 0 PTP 2 1_2_12345_106
-> 13 10.136573 2 2
-> 12 10.136573 2 2 12
-> 13 10.136573 2 1
-> 12 10.136573 2 1 12
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 14
-> 13 10.140557 2 1
-> 12 10.140557 2 1 16
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_107
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_108
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_109
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_110
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_111
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_112
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_113
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_114
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_115
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_116
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_117
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_118
-> 13 10.143504 2 2
-> 12 10.143504 2 2 9
-> 15 10.143504 3 0 PTP 2 2_1_12345_119
-> 13 10.143504 2 2
-> 12 10.143504 2 2 16
-> 13 10.144540 2 3
-> 12 10.144540 2 3 13
-> 15 10.144540 3 0 PTP 3 3_1_12345_120
-> 13 10.220626 2 3
-> 12 10.220626 2 3 13
-> 15 10.220626 3 0 PTP 3 3_1_12345_121
-> 13 10.296711 2 3
-> 12 10.296711 2 3 13
-> 15 10.296711 3 0 PTP 3 3_1_12345_122
-> 13 10.372797 2 3
-> 12 10.372797 2 3 13
-> 15 10.372797 3 0 PTP 3 3_1_12345_123
-> 13 10.448883 2 3
-> 12 10.448883 2 3 13
-> 15 10.448883 3 0 PTP 3 3_1_12345_124
-> 13 10.524968 2 3
-> 12 10.524968 2 3 13
-> 15 10.524968 3 0 PTP 3 3_1_12345_125
-> 13 10.601054 2 3
-> 12 10.601054 2 3 13
-> 15 10.601054 3 0 PTP 3 3_1_12345_126
-> 13 10.677140 2 3
-> 12 10.677140 2 3 13
-> 15 10.677140 3 0 PTP 3 3_1_12345_127
-> 13 10.753225 2 3
-> 12 10.753225 2 3 13
-> 15 10.753225 3 0 PTP 3 3_1_12345_128
-> 13 10.829311 2 3
-> 12 10.829311 2 3 13
-> 15 10.829311 3 0 PTP 3 3_1_12345_129
-> 13 10.905397 2 3
-> 12 10.905397 2 3 13
-> 15 10.905397 3 0 PTP 3 3_1_12345_130
-> 13 10.941282 2 2
-> 12 10.941282 2 2 12
-> 13 10.981482 2 3
-> 12 10.981482 2 3 13
-> 15 10.981482 3 0 PTP 3 3_1_12345_131
-> 13 11.057568 2 3
-> 12 11.057568 2 3 13
-> 15 11.057568 3 0 PTP 3 3_1_12345_132
-> 16 11.133653 3 0 PTP 1 2_1_12345_107
-> 16 11.133653 3 0 PTP 1 2_1_12345_108
-> 16 11.133653 3 0 PTP 1 2_1_12345_109
-> 16 11.133653 3 0 PTP 1 2_1_12345_110
-> 16 11.133653 3 0 PTP 1 2_1_12345_111
-> 16 11.133653 3 0 PTP 1 2_1_12345_112
-> 16 11.133653 3 0 PTP 1 2_1_12345_113
-> 16 11.133653 3 0 PTP 1 2_1_12345_114
-> 16 11.133653 3 0 PTP 1 2_1_12345_115
-> 16 11.133653 3 0 PTP 1 2_1_12345_116
-> 16 11.133653 3 0 PTP 1 2_1_12345_117
-> 16 11.133653 3 0 PTP 1 2_1_12345_118
-> 16 11.133653 3 0 PTP 1 2_1_12345_119
-> 16 11.133653 3 0 PTP 1 3_1_12345_120
-> 16 11.133653 3 0 PTP 1 3_1_12345_121
-> 16 11.133653 3 0 PTP 1 3_1_12345_122
-> 16 11.133653 3 0 PTP 1 3_1_12345_123
-> 16 11.133653 3 0 PTP 1 3_1_12345_124
-> 16 11.133653 3 0 PTP 1 3_1_12345_125
-> 16 11.133653 3 0 PTP 1 3_1_12345_126
-> 16 11.133653 3 0 PTP 1 3_1_12345_127
-> 16 11.133653 3 0 PTP 1 3_1_12345_128
-> 16 11.133653 3 0 PTP 1 3_1_12345_129
-> 16 11.133653 3 0 PTP 1 3_1_12345_130
-> 16 11.133653 3 0 PTP 1 3_1_12345_131
-> 16 11.133653 3 0 PTP 1 3_1_12345_132
-> 13 11.133653 2 1
-> 12 11.133653 2 1 12
-> 13 11.133653 2 3
-> 12 11.133653 2 3 12
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_133
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_134
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_135
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_136
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_137
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_138
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_139
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_140
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_141
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_142
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_143
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_144
-> 13 11.137637 2 1
-> 12 11.137637 2 1 9
-> 15 11.137637 3 0 PTP 1 1_2_12345_145
-> 13 11.137637 2 1
-> 12 11.137637 2 1 17
-> 13 11.137737 2 1
-> 12 11.137737 2 1 17
-> 13 11.137937 2 1
-> 12 11.137937 2 1 17
-> 13 11.138237 2 1
-> 12 11.138237 2 1 17
-> 13 11.138637 2 1
-> 12 11.138637 2 1 17
-> 13 11.139137 2 1
-> 12 11.139137 2 1 17
-> 13 11.139737 2 1
-> 12 11.139737 2 1 17
-> 13 11.140437 2 1
-> 12 11.140437 2 1 17
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 14
-> 13 11.140584 2 2
-> 12 11.140584 2 2 17
-> 13 11.141237 2 1
-> 12 11.141237 2 1 17
-> 13 11.141384 2 2
-> 12 11.141384 2 2 17
-> 13 11.141620 2 3
-> 12 11.141620 2 3 12
-> 13 11.142137 2 1
-> 12 11.142137 2 1 17
-> 13 11.142384 2 2
-> 12 11.142384 2 2 17
-> 13 11.143237 2 1
-> 12 11.143237 2 1 17
-> 13 11.143584 2 2
-> 12 11.143584 2 2 17
-> 13 11.144537 2 1
-> 12 11.144537 2 1 17
-> 13 11.144984 2 2
-> 12 11.144984 2 2 17
-> 13 11.146037 2 1
-> 12 11.146037 2 1 17
-> 13 11.146584 2 2
-> 12 11.146584 2 2 17
-> 13 11.147737 2 1
-> 12 11.147737 2 1 10
-> 13 11.148384 2 2
-> 12 11.148384 2 2 17
-> 13 11.150384 2 2
-> 12 11.150384 2 2 17
-> 13 11.152484 2 2
-> 12 11.152484 2 2 17
-> 13 11.154684 2 2
-> 12 11.154684 2 2 17
-> 13 11.156984 2 2
-> 12 11.156984 2 2 17
-> 13 11.159384 2 2
-> 12 11.159384 2 2 17
-> 13 11.161884 2 2
-> 12 11.161884 2 2 17
-> 13 11.164484 2 2
-> 12 11.164484 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_133
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_134
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_135
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_136
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_137
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_138
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_139
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_140
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_141
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_142
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_143
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 10
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_144
-> 12 11.938362 2 2 10
-> 13 11.938362 2 1
-> 12 11.938362 2 1 12
-> 13 11.938362 2 2
-> 16 11.938362 3 0 PTP 2 1_2_12345_145
-> 12 11.938362 2 2 12
-> 13 11.942346 2 1
-> 12 11.942346 2 1 18
-> 13 11.942346 2 1
-> 7 11.942346 1 1
-> 13 11.945293 2 2
-> 12 11.945293 2 2 18
-> 13 11.945293 2 2
-> 7 11.945293 1 2
-> 13 11.946329 2 3
-> 12 11.946329 2 3 18
-> 13 11.946329 2 3
-> 7 11.946329 1 3
+> 13 2.085878 2 1
+> 12 2.085878 2 1 12
+> 13 2.085878 2 2
+> 16 2.085878 3 0 PTP 2 1_2_12345_2
+> 12 2.085878 2 2 12
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_3
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_4
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_5
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_6
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_7
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_8
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_9
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_10
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_11
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_12
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_13
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_14
+> 13 2.089861 2 1
+> 12 2.089861 2 1 9
+> 15 2.089861 3 0 PTP 1 1_2_12345_15
+> 13 2.089861 2 1
+> 12 2.089861 2 1 10
+> 13 2.092809 2 2
+> 12 2.092809 2 2 11
+> 13 2.093845 2 3
+> 12 2.093845 2 3 12
+> 13 2.171756 2 1
+> 12 2.171756 2 1 10
+> 16 2.171756 3 0 PTP 2 1_2_12345_3
+> 13 2.171756 2 2
+> 12 2.171756 2 2 11
+> 13 2.250703 2 1
+> 12 2.250703 2 1 10
+> 16 2.250703 3 0 PTP 2 1_2_12345_4
+> 13 2.250703 2 2
+> 12 2.250703 2 2 11
+> 13 2.329649 2 1
+> 12 2.329649 2 1 10
+> 16 2.329649 3 0 PTP 2 1_2_12345_5
+> 13 2.329649 2 2
+> 12 2.329649 2 2 11
+> 13 2.408596 2 1
+> 12 2.408596 2 1 10
+> 16 2.408596 3 0 PTP 2 1_2_12345_6
+> 13 2.408596 2 2
+> 12 2.408596 2 2 11
+> 13 2.487543 2 1
+> 12 2.487543 2 1 10
+> 16 2.487543 3 0 PTP 2 1_2_12345_7
+> 13 2.487543 2 2
+> 12 2.487543 2 2 11
+> 13 2.566490 2 1
+> 12 2.566490 2 1 10
+> 16 2.566490 3 0 PTP 2 1_2_12345_8
+> 13 2.566490 2 2
+> 12 2.566490 2 2 11
+> 13 2.645437 2 1
+> 12 2.645437 2 1 10
+> 16 2.645437 3 0 PTP 2 1_2_12345_9
+> 13 2.645437 2 2
+> 12 2.645437 2 2 11
+> 13 2.724384 2 1
+> 12 2.724384 2 1 10
+> 16 2.724384 3 0 PTP 2 1_2_12345_10
+> 13 2.724384 2 2
+> 12 2.724384 2 2 11
+> 13 2.803331 2 1
+> 12 2.803331 2 1 10
+> 16 2.803331 3 0 PTP 2 1_2_12345_11
+> 13 2.803331 2 2
+> 12 2.803331 2 2 11
+> 13 2.882278 2 1
+> 12 2.882278 2 1 10
+> 16 2.882278 3 0 PTP 2 1_2_12345_12
+> 13 2.882278 2 2
+> 12 2.882278 2 2 11
+> 13 2.961225 2 1
+> 12 2.961225 2 1 10
+> 16 2.961225 3 0 PTP 2 1_2_12345_13
+> 13 2.961225 2 2
+> 12 2.961225 2 2 11
+> 13 3.040171 2 1
+> 12 3.040171 2 1 10
+> 16 3.040171 3 0 PTP 2 1_2_12345_14
+> 13 3.040171 2 2
+> 12 3.040171 2 2 11
+> 13 3.119118 2 1
+> 12 3.119118 2 1 12
+> 16 3.119118 3 0 PTP 2 1_2_12345_15
+> 13 3.119118 2 2
+> 12 3.119118 2 2 12
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_16
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_17
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_18
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_19
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_20
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_21
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_22
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_23
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_24
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_25
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_26
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_27
+> 13 3.123102 2 1
+> 12 3.123102 2 1 9
+> 15 3.123102 3 0 PTP 1 1_2_12345_28
+> 13 3.123102 2 1
+> 12 3.123102 2 1 15
+> 13 3.126049 2 2
+> 12 3.126049 2 2 11
+> 13 3.127085 2 3
+> 12 3.127085 2 3 12
+> 13 3.204996 2 1
+> 12 3.204996 2 1 15
+> 16 3.204996 3 0 PTP 2 1_2_12345_16
+> 13 3.204996 2 2
+> 12 3.204996 2 2 11
+> 13 3.283943 2 1
+> 12 3.283943 2 1 15
+> 16 3.283943 3 0 PTP 2 1_2_12345_17
+> 13 3.283943 2 2
+> 12 3.283943 2 2 11
+> 13 3.362890 2 1
+> 12 3.362890 2 1 15
+> 16 3.362890 3 0 PTP 2 1_2_12345_18
+> 13 3.362890 2 2
+> 12 3.362890 2 2 11
+> 13 3.441837 2 1
+> 12 3.441837 2 1 15
+> 16 3.441837 3 0 PTP 2 1_2_12345_19
+> 13 3.441837 2 2
+> 12 3.441837 2 2 11
+> 13 3.520784 2 1
+> 12 3.520784 2 1 15
+> 16 3.520784 3 0 PTP 2 1_2_12345_20
+> 13 3.520784 2 2
+> 12 3.520784 2 2 11
+> 13 3.599731 2 1
+> 12 3.599731 2 1 15
+> 16 3.599731 3 0 PTP 2 1_2_12345_21
+> 13 3.599731 2 2
+> 12 3.599731 2 2 11
+> 13 3.678677 2 1
+> 12 3.678677 2 1 15
+> 16 3.678677 3 0 PTP 2 1_2_12345_22
+> 13 3.678677 2 2
+> 12 3.678677 2 2 11
+> 13 3.757624 2 1
+> 12 3.757624 2 1 15
+> 16 3.757624 3 0 PTP 2 1_2_12345_23
+> 13 3.757624 2 2
+> 12 3.757624 2 2 11
+> 13 3.836571 2 1
+> 12 3.836571 2 1 15
+> 16 3.836571 3 0 PTP 2 1_2_12345_24
+> 13 3.836571 2 2
+> 12 3.836571 2 2 11
+> 13 3.915518 2 1
+> 12 3.915518 2 1 15
+> 16 3.915518 3 0 PTP 2 1_2_12345_25
+> 13 3.915518 2 2
+> 12 3.915518 2 2 11
+> 13 3.994465 2 1
+> 12 3.994465 2 1 15
+> 16 3.994465 3 0 PTP 2 1_2_12345_26
+> 13 3.994465 2 2
+> 12 3.994465 2 2 11
+> 13 4.073412 2 1
+> 12 4.073412 2 1 15
+> 16 4.073412 3 0 PTP 2 1_2_12345_27
+> 13 4.073412 2 2
+> 12 4.073412 2 2 11
+> 13 4.152359 2 1
+> 12 4.152359 2 1 12
+> 16 4.152359 3 0 PTP 2 1_2_12345_28
+> 13 4.152359 2 2
+> 12 4.152359 2 2 12
+> 13 4.156342 2 1
+> 12 4.156342 2 1 13
+> 15 4.156342 3 0 PTP 1 1_2_12345_29
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 14
+> 13 4.159290 2 2
+> 12 4.159290 2 2 10
+> 13 4.160326 2 3
+> 12 4.160326 2 3 12
+> 13 4.238237 2 1
+> 12 4.238237 2 1 13
+> 15 4.238237 3 0 PTP 1 1_2_12345_30
+> 13 4.238237 2 2
+> 16 4.238237 3 0 PTP 2 1_2_12345_29
+> 12 4.238237 2 2 10
+> 13 4.317184 2 2
+> 16 4.317184 3 0 PTP 2 1_2_12345_30
+> 12 4.317184 2 2 10
+> 13 4.317184 2 1
+> 12 4.317184 2 1 13
+> 15 4.317184 3 0 PTP 1 1_2_12345_31
+> 13 4.396130 2 2
+> 16 4.396130 3 0 PTP 2 1_2_12345_31
+> 12 4.396130 2 2 10
+> 13 4.396130 2 1
+> 12 4.396130 2 1 13
+> 15 4.396130 3 0 PTP 1 1_2_12345_32
+> 13 4.475077 2 2
+> 16 4.475077 3 0 PTP 2 1_2_12345_32
+> 12 4.475077 2 2 10
+> 13 4.475077 2 1
+> 12 4.475077 2 1 13
+> 15 4.475077 3 0 PTP 1 1_2_12345_33
+> 13 4.554024 2 2
+> 16 4.554024 3 0 PTP 2 1_2_12345_33
+> 12 4.554024 2 2 10
+> 13 4.554024 2 1
+> 12 4.554024 2 1 13
+> 15 4.554024 3 0 PTP 1 1_2_12345_34
+> 13 4.632971 2 2
+> 16 4.632971 3 0 PTP 2 1_2_12345_34
+> 12 4.632971 2 2 10
+> 13 4.632971 2 1
+> 12 4.632971 2 1 13
+> 15 4.632971 3 0 PTP 1 1_2_12345_35
+> 13 4.711918 2 2
+> 16 4.711918 3 0 PTP 2 1_2_12345_35
+> 12 4.711918 2 2 10
+> 13 4.711918 2 1
+> 12 4.711918 2 1 13
+> 15 4.711918 3 0 PTP 1 1_2_12345_36
+> 13 4.790865 2 2
+> 16 4.790865 3 0 PTP 2 1_2_12345_36
+> 12 4.790865 2 2 10
+> 13 4.790865 2 1
+> 12 4.790865 2 1 13
+> 15 4.790865 3 0 PTP 1 1_2_12345_37
+> 13 4.869812 2 2
+> 16 4.869812 3 0 PTP 2 1_2_12345_37
+> 12 4.869812 2 2 10
+> 13 4.869812 2 1
+> 12 4.869812 2 1 13
+> 15 4.869812 3 0 PTP 1 1_2_12345_38
+> 13 4.948759 2 2
+> 16 4.948759 3 0 PTP 2 1_2_12345_38
+> 12 4.948759 2 2 10
+> 13 4.948759 2 1
+> 12 4.948759 2 1 13
+> 15 4.948759 3 0 PTP 1 1_2_12345_39
+> 13 5.027706 2 2
+> 16 5.027706 3 0 PTP 2 1_2_12345_39
+> 12 5.027706 2 2 10
+> 13 5.027706 2 1
+> 12 5.027706 2 1 13
+> 15 5.027706 3 0 PTP 1 1_2_12345_40
+> 13 5.106652 2 2
+> 16 5.106652 3 0 PTP 2 1_2_12345_40
+> 12 5.106652 2 2 10
+> 13 5.106652 2 1
+> 12 5.106652 2 1 13
+> 15 5.106652 3 0 PTP 1 1_2_12345_41
+> 13 5.185599 2 2
+> 16 5.185599 3 0 PTP 2 1_2_12345_41
+> 12 5.185599 2 2 12
+> 13 5.185599 2 1
+> 12 5.185599 2 1 12
+> 13 5.189583 2 1
+> 12 5.189583 2 1 13
+> 15 5.189583 3 0 PTP 1 1_2_12345_42
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 14
+> 13 5.192530 2 2
+> 12 5.192530 2 2 15
+> 13 5.193566 2 3
+> 12 5.193566 2 3 12
+> 13 5.271477 2 1
+> 12 5.271477 2 1 13
+> 15 5.271477 3 0 PTP 1 1_2_12345_43
+> 16 5.271477 3 0 PTP 2 1_2_12345_42
+> 13 5.271477 2 2
+> 12 5.271477 2 2 15
+> 16 5.350424 3 0 PTP 2 1_2_12345_43
+> 13 5.350424 2 2
+> 12 5.350424 2 2 15
+> 13 5.350424 2 1
+> 12 5.350424 2 1 13
+> 15 5.350424 3 0 PTP 1 1_2_12345_44
+> 16 5.429371 3 0 PTP 2 1_2_12345_44
+> 13 5.429371 2 2
+> 12 5.429371 2 2 15
+> 13 5.429371 2 1
+> 12 5.429371 2 1 13
+> 15 5.429371 3 0 PTP 1 1_2_12345_45
+> 16 5.508318 3 0 PTP 2 1_2_12345_45
+> 13 5.508318 2 2
+> 12 5.508318 2 2 15
+> 13 5.508318 2 1
+> 12 5.508318 2 1 13
+> 15 5.508318 3 0 PTP 1 1_2_12345_46
+> 16 5.587265 3 0 PTP 2 1_2_12345_46
+> 13 5.587265 2 2
+> 12 5.587265 2 2 15
+> 13 5.587265 2 1
+> 12 5.587265 2 1 13
+> 15 5.587265 3 0 PTP 1 1_2_12345_47
+> 16 5.666212 3 0 PTP 2 1_2_12345_47
+> 13 5.666212 2 2
+> 12 5.666212 2 2 15
+> 13 5.666212 2 1
+> 12 5.666212 2 1 13
+> 15 5.666212 3 0 PTP 1 1_2_12345_48
+> 16 5.745159 3 0 PTP 2 1_2_12345_48
+> 13 5.745159 2 2
+> 12 5.745159 2 2 15
+> 13 5.745159 2 1
+> 12 5.745159 2 1 13
+> 15 5.745159 3 0 PTP 1 1_2_12345_49
+> 16 5.824105 3 0 PTP 2 1_2_12345_49
+> 13 5.824105 2 2
+> 12 5.824105 2 2 15
+> 13 5.824105 2 1
+> 12 5.824105 2 1 13
+> 15 5.824105 3 0 PTP 1 1_2_12345_50
+> 16 5.903052 3 0 PTP 2 1_2_12345_50
+> 13 5.903052 2 2
+> 12 5.903052 2 2 15
+> 13 5.903052 2 1
+> 12 5.903052 2 1 13
+> 15 5.903052 3 0 PTP 1 1_2_12345_51
+> 16 5.981999 3 0 PTP 2 1_2_12345_51
+> 13 5.981999 2 2
+> 12 5.981999 2 2 15
+> 13 5.981999 2 1
+> 12 5.981999 2 1 13
+> 15 5.981999 3 0 PTP 1 1_2_12345_52
+> 16 6.060946 3 0 PTP 2 1_2_12345_52
+> 13 6.060946 2 2
+> 12 6.060946 2 2 15
+> 13 6.060946 2 1
+> 12 6.060946 2 1 13
+> 15 6.060946 3 0 PTP 1 1_2_12345_53
+> 16 6.139893 3 0 PTP 2 1_2_12345_53
+> 13 6.139893 2 2
+> 12 6.139893 2 2 15
+> 13 6.139893 2 1
+> 12 6.139893 2 1 13
+> 15 6.139893 3 0 PTP 1 1_2_12345_54
+> 16 6.218840 3 0 PTP 2 1_2_12345_54
+> 13 6.218840 2 2
+> 12 6.218840 2 2 12
+> 13 6.218840 2 1
+> 12 6.218840 2 1 12
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_55
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_56
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_57
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_58
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_59
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_60
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_61
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_62
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_63
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_64
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_65
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_66
+> 13 6.222823 2 1
+> 12 6.222823 2 1 9
+> 15 6.222823 3 0 PTP 1 1_2_12345_67
+> 13 6.222823 2 1
+> 12 6.222823 2 1 16
+> 13 6.225771 2 2
+> 12 6.225771 2 2 11
+> 13 6.226807 2 3
+> 12 6.226807 2 3 12
+> 16 6.304718 3 0 PTP 2 1_2_12345_55
+> 13 6.304718 2 2
+> 12 6.304718 2 2 11
+> 16 6.383665 3 0 PTP 2 1_2_12345_56
+> 13 6.383665 2 2
+> 12 6.383665 2 2 11
+> 16 6.462611 3 0 PTP 2 1_2_12345_57
+> 13 6.462611 2 2
+> 12 6.462611 2 2 11
+> 16 6.541558 3 0 PTP 2 1_2_12345_58
+> 13 6.541558 2 2
+> 12 6.541558 2 2 11
+> 16 6.620505 3 0 PTP 2 1_2_12345_59
+> 13 6.620505 2 2
+> 12 6.620505 2 2 11
+> 16 6.699452 3 0 PTP 2 1_2_12345_60
+> 13 6.699452 2 2
+> 12 6.699452 2 2 11
+> 16 6.778399 3 0 PTP 2 1_2_12345_61
+> 13 6.778399 2 2
+> 12 6.778399 2 2 11
+> 16 6.857346 3 0 PTP 2 1_2_12345_62
+> 13 6.857346 2 2
+> 12 6.857346 2 2 11
+> 16 6.936293 3 0 PTP 2 1_2_12345_63
+> 13 6.936293 2 2
+> 12 6.936293 2 2 11
+> 16 7.015240 3 0 PTP 2 1_2_12345_64
+> 13 7.015240 2 2
+> 12 7.015240 2 2 11
+> 16 7.094187 3 0 PTP 2 1_2_12345_65
+> 13 7.094187 2 2
+> 12 7.094187 2 2 11
+> 16 7.173133 3 0 PTP 2 1_2_12345_66
+> 13 7.173133 2 2
+> 12 7.173133 2 2 11
+> 13 7.252080 2 1
+> 12 7.252080 2 1 12
+> 16 7.252080 3 0 PTP 2 1_2_12345_67
+> 13 7.252080 2 2
+> 12 7.252080 2 2 12
+> 13 7.256064 2 1
+> 12 7.256064 2 1 13
+> 15 7.256064 3 0 PTP 1 1_2_12345_68
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 14
+> 13 7.259011 2 2
+> 12 7.259011 2 2 16
+> 13 7.260048 2 3
+> 12 7.260048 2 3 12
+> 13 7.337958 2 1
+> 12 7.337958 2 1 13
+> 15 7.337958 3 0 PTP 1 1_2_12345_69
+> 13 7.416905 2 1
+> 12 7.416905 2 1 13
+> 15 7.416905 3 0 PTP 1 1_2_12345_70
+> 13 7.495852 2 1
+> 12 7.495852 2 1 13
+> 15 7.495852 3 0 PTP 1 1_2_12345_71
+> 13 7.574799 2 1
+> 12 7.574799 2 1 13
+> 15 7.574799 3 0 PTP 1 1_2_12345_72
+> 13 7.653746 2 1
+> 12 7.653746 2 1 13
+> 15 7.653746 3 0 PTP 1 1_2_12345_73
+> 13 7.732693 2 1
+> 12 7.732693 2 1 13
+> 15 7.732693 3 0 PTP 1 1_2_12345_74
+> 13 7.811640 2 1
+> 12 7.811640 2 1 13
+> 15 7.811640 3 0 PTP 1 1_2_12345_75
+> 13 7.890586 2 1
+> 12 7.890586 2 1 13
+> 15 7.890586 3 0 PTP 1 1_2_12345_76
+> 13 7.969533 2 1
+> 12 7.969533 2 1 13
+> 15 7.969533 3 0 PTP 1 1_2_12345_77
+> 13 8.048480 2 1
+> 12 8.048480 2 1 13
+> 15 8.048480 3 0 PTP 1 1_2_12345_78
+> 13 8.127427 2 1
+> 12 8.127427 2 1 13
+> 15 8.127427 3 0 PTP 1 1_2_12345_79
+> 13 8.206374 2 1
+> 12 8.206374 2 1 13
+> 15 8.206374 3 0 PTP 1 1_2_12345_80
+> 16 8.285321 3 0 PTP 2 1_2_12345_68
+> 16 8.285321 3 0 PTP 2 1_2_12345_69
+> 16 8.285321 3 0 PTP 2 1_2_12345_70
+> 16 8.285321 3 0 PTP 2 1_2_12345_71
+> 16 8.285321 3 0 PTP 2 1_2_12345_72
+> 16 8.285321 3 0 PTP 2 1_2_12345_73
+> 16 8.285321 3 0 PTP 2 1_2_12345_74
+> 16 8.285321 3 0 PTP 2 1_2_12345_75
+> 16 8.285321 3 0 PTP 2 1_2_12345_76
+> 16 8.285321 3 0 PTP 2 1_2_12345_77
+> 16 8.285321 3 0 PTP 2 1_2_12345_78
+> 16 8.285321 3 0 PTP 2 1_2_12345_79
+> 16 8.285321 3 0 PTP 2 1_2_12345_80
+> 13 8.285321 2 2
+> 12 8.285321 2 2 12
+> 13 8.285321 2 1
+> 12 8.285321 2 1 12
+> 13 8.289304 2 1
+> 12 8.289304 2 1 13
+> 15 8.289304 3 0 PTP 1 1_3_12345_81
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 14
+> 13 8.292252 2 2
+> 12 8.292252 2 2 16
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 14
+> 13 8.293288 2 3
+> 12 8.293288 2 3 15
+> 13 8.371027 2 1
+> 12 8.371027 2 1 13
+> 15 8.371027 3 0 PTP 1 1_3_12345_82
+> 16 8.371027 3 0 PTP 3 1_3_12345_81
+> 13 8.371027 2 3
+> 12 8.371027 2 3 15
+> 16 8.448766 3 0 PTP 3 1_3_12345_82
+> 13 8.448766 2 3
+> 12 8.448766 2 3 15
+> 13 8.448766 2 1
+> 12 8.448766 2 1 13
+> 15 8.448766 3 0 PTP 1 1_3_12345_83
+> 16 8.526506 3 0 PTP 3 1_3_12345_83
+> 13 8.526506 2 3
+> 12 8.526506 2 3 15
+> 13 8.526506 2 1
+> 12 8.526506 2 1 13
+> 15 8.526506 3 0 PTP 1 1_3_12345_84
+> 16 8.604245 3 0 PTP 3 1_3_12345_84
+> 13 8.604245 2 3
+> 12 8.604245 2 3 15
+> 13 8.604245 2 1
+> 12 8.604245 2 1 13
+> 15 8.604245 3 0 PTP 1 1_3_12345_85
+> 16 8.681984 3 0 PTP 3 1_3_12345_85
+> 13 8.681984 2 3
+> 12 8.681984 2 3 15
+> 13 8.681984 2 1
+> 12 8.681984 2 1 13
+> 15 8.681984 3 0 PTP 1 1_3_12345_86
+> 16 8.759723 3 0 PTP 3 1_3_12345_86
+> 13 8.759723 2 3
+> 12 8.759723 2 3 15
+> 13 8.759723 2 1
+> 12 8.759723 2 1 13
+> 15 8.759723 3 0 PTP 1 1_3_12345_87
+> 16 8.837462 3 0 PTP 3 1_3_12345_87
+> 13 8.837462 2 3
+> 12 8.837462 2 3 15
+> 13 8.837462 2 1
+> 12 8.837462 2 1 13
+> 15 8.837462 3 0 PTP 1 1_3_12345_88
+> 16 8.915202 3 0 PTP 3 1_3_12345_88
+> 13 8.915202 2 3
+> 12 8.915202 2 3 15
+> 13 8.915202 2 1
+> 12 8.915202 2 1 13
+> 15 8.915202 3 0 PTP 1 1_3_12345_89
+> 16 8.992941 3 0 PTP 3 1_3_12345_89
+> 13 8.992941 2 3
+> 12 8.992941 2 3 15
+> 13 8.992941 2 1
+> 12 8.992941 2 1 13
+> 15 8.992941 3 0 PTP 1 1_3_12345_90
+> 16 9.070680 3 0 PTP 3 1_3_12345_90
+> 13 9.070680 2 3
+> 12 9.070680 2 3 15
+> 13 9.070680 2 1
+> 12 9.070680 2 1 13
+> 15 9.070680 3 0 PTP 1 1_3_12345_91
+> 16 9.148419 3 0 PTP 3 1_3_12345_91
+> 13 9.148419 2 3
+> 12 9.148419 2 3 15
+> 13 9.148419 2 1
+> 12 9.148419 2 1 13
+> 15 9.148419 3 0 PTP 1 1_3_12345_92
+> 16 9.226158 3 0 PTP 3 1_3_12345_92
+> 13 9.226158 2 3
+> 12 9.226158 2 3 15
+> 13 9.226158 2 1
+> 12 9.226158 2 1 13
+> 15 9.226158 3 0 PTP 1 1_3_12345_93
+> 16 9.303898 3 0 PTP 3 1_3_12345_93
+> 13 9.303898 2 3
+> 12 9.303898 2 3 12
+> 13 9.303898 2 1
+> 12 9.303898 2 1 13
+> 15 9.303898 3 0 PTP 1 1_2_12345_94
+> 13 9.382844 2 1
+> 12 9.382844 2 1 13
+> 15 9.382844 3 0 PTP 1 1_2_12345_95
+> 13 9.461791 2 1
+> 12 9.461791 2 1 13
+> 15 9.461791 3 0 PTP 1 1_2_12345_96
+> 13 9.540738 2 1
+> 12 9.540738 2 1 13
+> 15 9.540738 3 0 PTP 1 1_2_12345_97
+> 13 9.619685 2 1
+> 12 9.619685 2 1 13
+> 15 9.619685 3 0 PTP 1 1_2_12345_98
+> 13 9.698632 2 1
+> 12 9.698632 2 1 13
+> 15 9.698632 3 0 PTP 1 1_2_12345_99
+> 13 9.777579 2 1
+> 12 9.777579 2 1 13
+> 15 9.777579 3 0 PTP 1 1_2_12345_100
+> 13 9.856526 2 1
+> 12 9.856526 2 1 13
+> 15 9.856526 3 0 PTP 1 1_2_12345_101
+> 13 9.935473 2 1
+> 12 9.935473 2 1 13
+> 15 9.935473 3 0 PTP 1 1_2_12345_102
+> 13 10.014420 2 1
+> 12 10.014420 2 1 13
+> 15 10.014420 3 0 PTP 1 1_2_12345_103
+> 13 10.093367 2 1
+> 12 10.093367 2 1 13
+> 15 10.093367 3 0 PTP 1 1_2_12345_104
+> 13 10.172313 2 1
+> 12 10.172313 2 1 13
+> 15 10.172313 3 0 PTP 1 1_2_12345_105
+> 13 10.251260 2 1
+> 12 10.251260 2 1 13
+> 15 10.251260 3 0 PTP 1 1_2_12345_106
+> 16 10.330207 3 0 PTP 2 1_2_12345_94
+> 16 10.330207 3 0 PTP 2 1_2_12345_95
+> 16 10.330207 3 0 PTP 2 1_2_12345_96
+> 16 10.330207 3 0 PTP 2 1_2_12345_97
+> 16 10.330207 3 0 PTP 2 1_2_12345_98
+> 16 10.330207 3 0 PTP 2 1_2_12345_99
+> 16 10.330207 3 0 PTP 2 1_2_12345_100
+> 16 10.330207 3 0 PTP 2 1_2_12345_101
+> 16 10.330207 3 0 PTP 2 1_2_12345_102
+> 16 10.330207 3 0 PTP 2 1_2_12345_103
+> 16 10.330207 3 0 PTP 2 1_2_12345_104
+> 16 10.330207 3 0 PTP 2 1_2_12345_105
+> 16 10.330207 3 0 PTP 2 1_2_12345_106
+> 13 10.330207 2 2
+> 12 10.330207 2 2 12
+> 13 10.330207 2 1
+> 12 10.330207 2 1 12
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 14
+> 13 10.334191 2 1
+> 12 10.334191 2 1 16
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_107
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_108
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_109
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_110
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_111
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_112
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_113
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_114
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_115
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_116
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_117
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_118
+> 13 10.337138 2 2
+> 12 10.337138 2 2 9
+> 15 10.337138 3 0 PTP 2 2_1_12345_119
+> 13 10.337138 2 2
+> 12 10.337138 2 2 16
+> 13 10.338174 2 3
+> 12 10.338174 2 3 13
+> 15 10.338174 3 0 PTP 3 3_1_12345_120
+> 13 10.415914 2 3
+> 12 10.415914 2 3 13
+> 15 10.415914 3 0 PTP 3 3_1_12345_121
+> 13 10.493653 2 3
+> 12 10.493653 2 3 13
+> 15 10.493653 3 0 PTP 3 3_1_12345_122
+> 13 10.571392 2 3
+> 12 10.571392 2 3 13
+> 15 10.571392 3 0 PTP 3 3_1_12345_123
+> 13 10.649131 2 3
+> 12 10.649131 2 3 13
+> 15 10.649131 3 0 PTP 3 3_1_12345_124
+> 13 10.726870 2 3
+> 12 10.726870 2 3 13
+> 15 10.726870 3 0 PTP 3 3_1_12345_125
+> 13 10.804610 2 3
+> 12 10.804610 2 3 13
+> 15 10.804610 3 0 PTP 3 3_1_12345_126
+> 13 10.882349 2 3
+> 12 10.882349 2 3 13
+> 15 10.882349 3 0 PTP 3 3_1_12345_127
+> 13 10.960088 2 3
+> 12 10.960088 2 3 13
+> 15 10.960088 3 0 PTP 3 3_1_12345_128
+> 13 11.037827 2 3
+> 12 11.037827 2 3 13
+> 15 11.037827 3 0 PTP 3 3_1_12345_129
+> 13 11.115566 2 3
+> 12 11.115566 2 3 13
+> 15 11.115566 3 0 PTP 3 3_1_12345_130
+> 13 11.159240 2 2
+> 12 11.159240 2 2 12
+> 13 11.193305 2 3
+> 12 11.193305 2 3 13
+> 15 11.193305 3 0 PTP 3 3_1_12345_131
+> 13 11.271045 2 3
+> 12 11.271045 2 3 13
+> 15 11.271045 3 0 PTP 3 3_1_12345_132
+> 16 11.348784 3 0 PTP 1 2_1_12345_107
+> 16 11.348784 3 0 PTP 1 2_1_12345_108
+> 16 11.348784 3 0 PTP 1 2_1_12345_109
+> 16 11.348784 3 0 PTP 1 2_1_12345_110
+> 16 11.348784 3 0 PTP 1 2_1_12345_111
+> 16 11.348784 3 0 PTP 1 2_1_12345_112
+> 16 11.348784 3 0 PTP 1 2_1_12345_113
+> 16 11.348784 3 0 PTP 1 2_1_12345_114
+> 16 11.348784 3 0 PTP 1 2_1_12345_115
+> 16 11.348784 3 0 PTP 1 2_1_12345_116
+> 16 11.348784 3 0 PTP 1 2_1_12345_117
+> 16 11.348784 3 0 PTP 1 2_1_12345_118
+> 16 11.348784 3 0 PTP 1 2_1_12345_119
+> 16 11.348784 3 0 PTP 1 3_1_12345_120
+> 16 11.348784 3 0 PTP 1 3_1_12345_121
+> 16 11.348784 3 0 PTP 1 3_1_12345_122
+> 16 11.348784 3 0 PTP 1 3_1_12345_123
+> 16 11.348784 3 0 PTP 1 3_1_12345_124
+> 16 11.348784 3 0 PTP 1 3_1_12345_125
+> 16 11.348784 3 0 PTP 1 3_1_12345_126
+> 16 11.348784 3 0 PTP 1 3_1_12345_127
+> 16 11.348784 3 0 PTP 1 3_1_12345_128
+> 16 11.348784 3 0 PTP 1 3_1_12345_129
+> 16 11.348784 3 0 PTP 1 3_1_12345_130
+> 16 11.348784 3 0 PTP 1 3_1_12345_131
+> 16 11.348784 3 0 PTP 1 3_1_12345_132
+> 13 11.348784 2 1
+> 12 11.348784 2 1 12
+> 13 11.348784 2 3
+> 12 11.348784 2 3 12
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_133
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_134
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_135
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_136
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_137
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_138
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_139
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_140
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_141
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_142
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_143
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_144
+> 13 11.352767 2 1
+> 12 11.352767 2 1 9
+> 15 11.352767 3 0 PTP 1 1_2_12345_145
+> 13 11.352767 2 1
+> 12 11.352767 2 1 17
+> 13 11.352867 2 1
+> 12 11.352867 2 1 17
+> 13 11.353067 2 1
+> 12 11.353067 2 1 17
+> 13 11.353367 2 1
+> 12 11.353367 2 1 17
+> 13 11.353767 2 1
+> 12 11.353767 2 1 17
+> 13 11.354267 2 1
+> 12 11.354267 2 1 17
+> 13 11.354867 2 1
+> 12 11.354867 2 1 17
+> 13 11.355567 2 1
+> 12 11.355567 2 1 17
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 14
+> 13 11.355715 2 2
+> 12 11.355715 2 2 17
+> 13 11.356367 2 1
+> 12 11.356367 2 1 17
+> 13 11.356515 2 2
+> 12 11.356515 2 2 17
+> 13 11.356751 2 3
+> 12 11.356751 2 3 12
+> 13 11.357267 2 1
+> 12 11.357267 2 1 17
+> 13 11.357515 2 2
+> 12 11.357515 2 2 17
+> 13 11.358367 2 1
+> 12 11.358367 2 1 17
+> 13 11.358715 2 2
+> 12 11.358715 2 2 17
+> 13 11.359667 2 1
+> 12 11.359667 2 1 17
+> 13 11.360115 2 2
+> 12 11.360115 2 2 17
+> 13 11.361167 2 1
+> 12 11.361167 2 1 17
+> 13 11.361715 2 2
+> 12 11.361715 2 2 17
+> 13 11.362867 2 1
+> 12 11.362867 2 1 10
+> 13 11.363515 2 2
+> 12 11.363515 2 2 17
+> 13 11.365515 2 2
+> 12 11.365515 2 2 17
+> 13 11.367615 2 2
+> 12 11.367615 2 2 17
+> 13 11.369815 2 2
+> 12 11.369815 2 2 17
+> 13 11.372115 2 2
+> 12 11.372115 2 2 17
+> 13 11.374515 2 2
+> 12 11.374515 2 2 17
+> 13 11.377015 2 2
+> 12 11.377015 2 2 17
+> 13 11.379615 2 2
+> 12 11.379615 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_133
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_134
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_135
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_136
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_137
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_138
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_139
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_140
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_141
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_142
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_143
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 10
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_144
+> 12 12.177817 2 2 10
+> 13 12.177817 2 1
+> 12 12.177817 2 1 12
+> 13 12.177817 2 2
+> 16 12.177817 3 0 PTP 2 1_2_12345_145
+> 12 12.177817 2 2 12
+> 13 12.181800 2 1
+> 12 12.181800 2 1 18
+> 13 12.181800 2 1
+> 7 12.181800 1 1
+> 13 12.184747 2 2
+> 12 12.184747 2 2 18
+> 13 12.184747 2 2
+> 7 12.184747 1 2
+> 13 12.185784 2 3
+> 12 12.185784 2 3 18
+> 13 12.185784 2 3
+> 7 12.185784 1 3
 
 $ rm -f ${bindir:=.}/smpi_trace.trace
 
index fa3d7aa..a5b0cd9 100644 (file)
@@ -93,8 +93,8 @@ public:
   xbt::ThrowPoint const& throw_point() const { return throwpoint_; }
 
   /** Allow to carry a value (used by testany/waitany) */
-  int get_value() const { return value_; }
-  void set_value(int value) { value_ = value; }
+  ssize_t get_value() const { return value_; }
+  void set_value(ssize_t value) { value_ = value; }
 
   std::string resolve_backtrace() const { return throwpoint_.backtrace_.resolve(); }
 
@@ -105,7 +105,7 @@ public:
 
 private:
   xbt::ThrowPoint throwpoint_;
-  int value_ = 0;
+  ssize_t value_ = 0;
 };
 
 #define DECLARE_SIMGRID_EXCEPTION(AnyException, ...)                                                                   \
index af0ef34..d43239b 100644 (file)
@@ -64,11 +64,6 @@ XBT_PUBLIC void sg_actor_set_auto_restart(sg_actor_t actor, int auto_restart);
 XBT_PUBLIC void sg_actor_daemonize(sg_actor_t actor);
 XBT_PUBLIC int sg_actor_is_daemon(const_sg_actor_t actor);
 
-#ifndef DOXYGEN
-XBT_ATTRIB_DEPRECATED_v329("Please use sg_actor_set_host() instead") XBT_PUBLIC
-    void sg_actor_migrate(sg_actor_t process, sg_host_t host);
-#endif
-
 XBT_PUBLIC void sg_actor_set_host(sg_actor_t actor, sg_host_t host);
 XBT_PUBLIC void sg_actor_join(const_sg_actor_t actor, double timeout);
 XBT_PUBLIC void sg_actor_kill(sg_actor_t actor);
index 540cab4..93fffd0 100644 (file)
@@ -7,7 +7,7 @@
 #define INCLUDE_SIMGRID_COMM_H_
 
 #include <simgrid/forward.h>
-#include <xbt/dynar.h>
+#include <sys/types.h> /* ssize_t */
 
 /* C interface */
 SG_BEGIN_DECL
@@ -17,8 +17,9 @@ XBT_PUBLIC int sg_comm_test(sg_comm_t comm);
 XBT_PUBLIC sg_error_t sg_comm_wait(sg_comm_t comm);
 XBT_PUBLIC sg_error_t sg_comm_wait_for(sg_comm_t comm, double timeout);
 XBT_PUBLIC void sg_comm_wait_all(sg_comm_t* comms, size_t count);
-XBT_PUBLIC int sg_comm_wait_any_for(sg_comm_t* comms, size_t count, double timeout);
-XBT_PUBLIC int sg_comm_wait_any(sg_comm_t* comms, size_t count);
+XBT_PUBLIC size_t sg_comm_wait_all_for(sg_comm_t* comms, size_t count, double timeout);
+XBT_PUBLIC ssize_t sg_comm_wait_any_for(sg_comm_t* comms, size_t count, double timeout);
+XBT_PUBLIC ssize_t sg_comm_wait_any(sg_comm_t* comms, size_t count);
 XBT_PUBLIC void sg_comm_unref(sg_comm_t comm);
 
 SG_END_DECL
index 7418f18..be9a91e 100644 (file)
@@ -7,7 +7,6 @@
 #define INCLUDE_SIMGRID_DISK_H_
 
 #include <simgrid/forward.h>
-#include <xbt/base.h>
 
 /* C interface */
 SG_BEGIN_DECL
index b2402e0..119f946 100644 (file)
@@ -7,7 +7,7 @@
 #define INCLUDE_SIMGRID_EXEC_H_
 
 #include <simgrid/forward.h>
-#include <xbt/dynar.h>
+#include <sys/types.h> /* ssize_t */
 
 /* C interface */
 SG_BEGIN_DECL
@@ -24,8 +24,8 @@ XBT_PUBLIC void sg_exec_cancel(sg_exec_t exec);
 XBT_PUBLIC int sg_exec_test(sg_exec_t exec);
 XBT_PUBLIC sg_error_t sg_exec_wait(sg_exec_t exec);
 XBT_PUBLIC sg_error_t sg_exec_wait_for(sg_exec_t exec, double timeout);
-XBT_PUBLIC int sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout);
-XBT_PUBLIC int sg_exec_wait_any(sg_exec_t* execs, size_t count);
+XBT_PUBLIC ssize_t sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout);
+XBT_PUBLIC ssize_t sg_exec_wait_any(sg_exec_t* execs, size_t count);
 
 SG_END_DECL
 
index 32a23f4..664114e 100644 (file)
@@ -66,6 +66,7 @@ XBT_PUBLIC void intrusive_ptr_release(Io* i);
 XBT_PUBLIC void intrusive_ptr_add_ref(Io* i);
 
 class Link;
+class SplitDuplexLink;
 
 class Mailbox;
 
@@ -90,6 +91,13 @@ XBT_PUBLIC void intrusive_ptr_release(const Semaphore* m);
 XBT_PUBLIC void intrusive_ptr_add_ref(const Semaphore* m);
 
 class Disk;
+/**
+ * @brief Callback to dynamically change the resource's capacity
+ *
+ * Allows user to change resource's capacity depending on the number of concurrent activities
+ * running on the resource at a given instant
+ */
+using NonLinearResourceCb = std::function<double(double capacity, int n_activities)>;
 } // namespace s4u
 
 namespace config {
@@ -163,6 +171,8 @@ class CpuModel;
 class NetworkModel;
 class NetworkModelIntf;
 class LinkImpl;
+class SplitDuplexLinkImpl;
+class LinkImplIntf;
 class NetworkAction;
 class DiskImpl;
 class DiskModel;
@@ -271,13 +281,15 @@ typedef s4u_Link* sg_link_t;
 typedef const s4u_Link* const_sg_link_t;
 typedef s4u_Disk* sg_disk_t;
 typedef const s4u_Disk* const_sg_disk_t;
-/** Pointer to a SimGrid file object */
+/** Pointer to a SimGrid file object @ingroup plugin_filesystem */
 typedef s4u_File* sg_file_t;
-/** Constant pointer to a SimGrid file object */
+/** Constant pointer to a SimGrid file object @ingroup plugin_filesystem */
 typedef const s4u_File* const_sg_file_t;
 typedef s4u_VM* sg_vm_t;
 typedef const s4u_VM* const_sg_vm_t;
+/** Pointer to an actor object */
 typedef s4u_Actor* sg_actor_t;
+/** Pointer to a constant actor object */
 typedef const s4u_Actor* const_sg_actor_t;
 
 typedef struct s_smx_simcall* smx_simcall_t;
index d8ff8f4..f77f910 100644 (file)
@@ -38,19 +38,21 @@ XBT_PUBLIC sg_host_t sg_host_by_name(const char* name);
 /** @brief Return the name of the sg_host_t. */
 XBT_PUBLIC const char* sg_host_get_name(const_sg_host_t host);
 
-#ifndef DOXYGEN
 // ========== User Data ==============
 /** @brief Return the user data of a #sg_host_t.
  *
  * This functions returns the user data associated to @a host if any.
  */
 XBT_PUBLIC void* sg_host_get_data(const_sg_host_t host);
-XBT_ATTRIB_DEPRECATED_v330("Please use sg_host_get_data()") XBT_PUBLIC void* sg_host_data(const_sg_host_t host);
+
 /** @brief Set the user data of a #sg_host_t.
  *
  * This functions attach @a data to @a host.
  */
 XBT_PUBLIC void sg_host_set_data(sg_host_t host, void* userdata);
+
+#ifndef DOXYGEN
+XBT_ATTRIB_DEPRECATED_v330("Please use sg_host_get_data()") XBT_PUBLIC void* sg_host_data(const_sg_host_t host);
 XBT_ATTRIB_DEPRECATED_v330("Please use sg_host_set_data()") XBT_PUBLIC
     void sg_host_data_set(sg_host_t host, void* userdata);
 #endif
@@ -62,7 +64,7 @@ XBT_PUBLIC void sg_host_get_disks(const_sg_host_t host, unsigned int* disk_count
 /** @brief Return the speed of the processor (in flop/s), regardless of the current load on the machine. */
 XBT_PUBLIC double sg_host_get_speed(const_sg_host_t host);
 XBT_ATTRIB_DEPRECATED_v330("Please use sg_host_get_speed()") XBT_PUBLIC double sg_host_speed(const_sg_host_t host);
-XBT_PUBLIC double sg_host_get_pstate_speed(const_sg_host_t host, int pstate_index);
+XBT_PUBLIC double sg_host_get_pstate_speed(const_sg_host_t host, unsigned long pstate_index);
 
 XBT_PUBLIC double sg_host_get_available_speed(const_sg_host_t host);
 
@@ -87,10 +89,10 @@ XBT_PUBLIC const char* sg_host_self_get_name();
  *
  * @param  host host to test
  */
-XBT_PUBLIC int sg_host_get_nb_pstates(const_sg_host_t host);
+XBT_PUBLIC unsigned long sg_host_get_nb_pstates(const_sg_host_t host);
 
-XBT_PUBLIC int sg_host_get_pstate(const_sg_host_t host);
-XBT_PUBLIC void sg_host_set_pstate(sg_host_t host, int pstate);
+XBT_PUBLIC unsigned long sg_host_get_pstate(const_sg_host_t host);
+XBT_PUBLIC void sg_host_set_pstate(sg_host_t host, unsigned long pstate);
 
 XBT_PUBLIC void sg_host_turn_on(sg_host_t host);
 XBT_PUBLIC void sg_host_turn_off(sg_host_t host);
index b7232c1..945f561 100644 (file)
@@ -35,7 +35,7 @@ public:
   unsigned int get_id_by_name(const char* name) const { return name2id.at(name); }
 
   void add_child(Container* child);
-  void add_resources(std::vector<sg_host_t> hosts);
+  void add_resources(const std::vector<sg_host_t>& hosts);
   void create_hierarchy(const_sg_netzone_t from_as);
   std::vector<int> get_hierarchy();
   std::string get_hierarchy_as_string();
diff --git a/include/simgrid/kernel/ProfileBuilder.hpp b/include/simgrid/kernel/ProfileBuilder.hpp
new file mode 100644 (file)
index 0000000..becdd37
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef SIMGRID_KERNEL_PROFILEBUILDER_HPP
+#define SIMGRID_KERNEL_PROFILEBUILDER_HPP
+
+#include <simgrid/forward.h>
+
+namespace simgrid {
+namespace kernel {
+namespace profile {
+
+/**
+ * @brief Simple builder for Profile classes.
+ *
+ * It can be used to create profiles for links, hosts or disks.
+ */
+class XBT_PUBLIC ProfileBuilder {
+public:
+  static Profile* from_file(const std::string& path);
+  static Profile* from_string(const std::string& name, const std::string& input, double periodicity);
+};
+
+} // namespace profile
+} // namespace kernel
+} // namespace simgrid
+
+#endif /* SIMGRID_KERNEL_PROFILEBUILDER_HPP */
\ No newline at end of file
index fb24935..aac2b9e 100644 (file)
@@ -72,6 +72,7 @@ class XBT_PUBLIC Action {
   activity::ActivityImpl* activity_ = nullptr;
 
   /* LMM */
+  double factor_           = 1.0; /**< Factor for effective rate = var->get_value() * factor_ */
   double last_update_      = 0;
   double last_value_       = 0;
   lmm::Variable* variable_ = nullptr;
@@ -244,6 +245,23 @@ public:
   double get_last_update() const { return last_update_; }
   void set_last_update();
 
+  /**
+   * @brief Set a factor for this action
+   *
+   * Defines a multiplicative factor for the consumption of the underlying resource.
+   *
+   * @param factor Multiplicative factor for this action (e.g. 0.97)
+   */
+  void set_rate_factor(double factor) { factor_ = factor; }
+  /**
+   * @brief Get the effective consumption rate of the resource
+   *
+   * The rate is based on the sharing given by the maxmin system underneath.
+   * However, it depends on the factor defined for this action.
+   *
+   * So, the effective rate is equal to var->get_value() * factor_
+   */
+  double get_rate() const;
   double get_last_value() const { return last_value_; }
   void set_last_value(double val) { last_value_ = val; }
   void set_suspend_state(Action::SuspendStates state) { suspended_ = state; }
index b36fc99..afa2e1f 100644 (file)
@@ -61,12 +61,6 @@ public:
   /** @brief Set the maxmin system of the current Model */
   void set_maxmin_system(lmm::System* system);
 
-  /** @brief Get the update algorithm of the current Model */
-  XBT_ATTRIB_DEPRECATED_v329("Please use is_update_lazy()") UpdateAlgo get_update_algorithm() const
-  {
-    return update_algorithm_;
-  }
-
   /** @brief Get Action heap */
   ActionHeap& get_action_heap() { return action_heap_; }
 
@@ -80,21 +74,6 @@ public:
   virtual double next_occurring_event_lazy(double now);
   virtual double next_occurring_event_full(double now);
 
-  XBT_ATTRIB_DEPRECATED_v329("Please use next_occurring_event()") virtual double next_occuring_event(double now) final
-  {
-    return next_occurring_event(now);
-  }
-  XBT_ATTRIB_DEPRECATED_v329("Please use next_occurring_event_lazy()") virtual double next_occuring_event_lazy(
-      double now) final
-  {
-    return next_occurring_event_lazy(now);
-  }
-  XBT_ATTRIB_DEPRECATED_v329("Please use next_occurring_event_full()") virtual double next_occuring_event_full(
-      double now) final
-  {
-    return next_occurring_event_full(now);
-  }
-
 private:
   Action* extract_action(Action::StateSet* list);
 
@@ -119,12 +98,6 @@ public:
    */
   virtual bool next_occurring_event_is_idempotent() { return true; }
 
-  XBT_ATTRIB_DEPRECATED_v329(
-      "Please use next_occurring_event_is_idempotent()") virtual bool next_occuring_event_is_idempotent() final
-  {
-    return next_occurring_event_is_idempotent();
-  }
-
   /** @brief Gets the model name */
   std::string get_name() const { return name_; }
 
index 489a91a..8ed8894 100644 (file)
@@ -88,8 +88,8 @@ protected:
 class XBT_PRIVATE ClusterBase : public ClusterZone {
   /* We use a map instead of a std::vector here because that's a sparse vector. Some values may not exist */
   /* The pair is {link_up, link_down} */
-  std::unordered_map<unsigned int, std::pair<resource::LinkImpl*, resource::LinkImpl*>> private_links_;
-  std::unordered_map<unsigned int, NetPoint*> gateways_; //!< list of gateways for leafs (if they're netzones)
+  std::unordered_map<unsigned long, std::pair<resource::LinkImpl*, resource::LinkImpl*>> private_links_;
+  std::unordered_map<unsigned long, NetPoint*> gateways_; //!< list of gateways for leafs (if they're netzones)
   resource::LinkImpl* backbone_     = nullptr;
   NetPoint* router_                 = nullptr;
   bool has_limiter_                 = false;
@@ -104,8 +104,8 @@ class XBT_PRIVATE ClusterBase : public ClusterZone {
 protected:
   using ClusterZone::ClusterZone;
   void set_num_links_per_node(unsigned long num) { num_links_per_node_ = num; }
-  resource::LinkImpl* get_uplink_from(unsigned int position) const { return private_links_.at(position).first; }
-  resource::LinkImpl* get_downlink_to(unsigned int position) const { return private_links_.at(position).second; }
+  resource::LinkImpl* get_uplink_from(unsigned long position) const { return private_links_.at(position).first; }
+  resource::LinkImpl* get_downlink_to(unsigned long position) const { return private_links_.at(position).second; }
 
   double get_link_latency() const { return link_lat_; }
   double get_link_bandwidth() const { return link_bw_; }
@@ -119,11 +119,11 @@ protected:
   bool has_backbone() const { return backbone_ != nullptr; }
   void set_router(NetPoint* router) { router_ = router; }
   /** @brief Sets gateway for the leaf */
-  void set_gateway(unsigned int position, NetPoint* gateway);
+  void set_gateway(unsigned long position, NetPoint* gateway);
   /** @brief Gets gateway for the leaf or nullptr */
-  NetPoint* get_gateway(unsigned int position);
-  void add_private_link_at(unsigned int position, std::pair<resource::LinkImpl*, resource::LinkImpl*> link);
-  bool private_link_exists_at(unsigned int position) const
+  NetPoint* get_gateway(unsigned long position);
+  void add_private_link_at(unsigned long position, std::pair<resource::LinkImpl*, resource::LinkImpl*> link);
+  bool private_link_exists_at(unsigned long position) const
   {
     return private_links_.find(position) != private_links_.end();
   }
@@ -135,17 +135,17 @@ protected:
     THROW_UNIMPLEMENTED;
   };
 
-  unsigned int node_pos(int id) const { return id * num_links_per_node_; }
-  unsigned int node_pos_with_loopback(int id) const { return node_pos(id) + (has_loopback_ ? 1 : 0); }
+  unsigned long node_pos(unsigned long id) const { return id * num_links_per_node_; }
+  unsigned long node_pos_with_loopback(unsigned long id) const { return node_pos(id) + (has_loopback_ ? 1 : 0); }
 
 public:
   /** Fill the leaf retriving netpoint from a user's callback */
-  void fill_leaf_from_cb(unsigned int position, const std::vector<unsigned int>& dimensions,
+  void fill_leaf_from_cb(unsigned long position, const std::vector<unsigned long>& dimensions,
                          const s4u::ClusterCallbacks& set_callbacks, NetPoint** node_netpoint, s4u::Link** lb_link,
                          s4u::Link** limiter_link);
   /** @brief Set the characteristics of links inside a Cluster zone */
   virtual void set_link_characteristics(double bw, double lat, s4u::Link::SharingPolicy sharing_policy);
-  unsigned int node_pos_with_loopback_limiter(int id) const
+  unsigned long node_pos_with_loopback_limiter(unsigned long id) const
   {
     return node_pos_with_loopback(id) + (has_limiter_ ? 1 : 0);
   }
index ec3992f..419f2d9 100644 (file)
@@ -26,13 +26,13 @@ class XBT_PRIVATE DijkstraZone : public RoutedZone {
 
   std::unique_ptr<s_xbt_graph_t, decltype(&DijkstraZone::route_graph_delete)> route_graph_{
       xbt_graph_new_graph(1, nullptr), &DijkstraZone::route_graph_delete};
-  std::map<int, xbt_node_t> graph_node_map_;
+  std::map<unsigned long, xbt_node_t> graph_node_map_;
   bool cached_;
-  std::map<int, std::vector<int>> route_cache_;
+  std::map<unsigned long, std::vector<unsigned long>> route_cache_;
 
-  xbt_node_t route_graph_new_node(int id);
-  xbt_node_t node_map_search(int id);
-  void new_edge(int src_id, int dst_id, Route* e_route);
+  xbt_node_t route_graph_new_node(unsigned long id);
+  xbt_node_t node_map_search(unsigned long id);
+  void new_edge(unsigned long src_id, unsigned long dst_id, Route* e_route);
   void do_seal() override;
 
 public:
@@ -49,9 +49,9 @@ public:
    * After this function returns, any node in the graph
    * will have a loopback attached to it.
    */
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* route, double* lat) override;
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* route, double* lat) override;
   void add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                 const std::vector<resource::LinkImpl*>& link_list, bool symmetrical) override;
+                 const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical) override;
 };
 } // namespace routing
 } // namespace kernel
index 5e3b0a1..e798e77 100644 (file)
@@ -65,14 +65,14 @@ public:
 class XBT_PUBLIC DragonflyZone : public ClusterBase {
 public:
   struct Coords {
-    unsigned group;
-    unsigned chassis;
-    unsigned blade;
-    unsigned node;
+    unsigned long group;
+    unsigned long chassis;
+    unsigned long blade;
+    unsigned long node;
   };
 
   explicit DragonflyZone(const std::string& name);
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override;
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override;
   /**
    * @brief Parse topology parameters from string format
    *
@@ -91,9 +91,9 @@ public:
   void build_upper_levels(const s4u::ClusterCallbacks& set_callbacks);
   /** @brief Set the characteristics of links inside the Dragonfly zone */
   void set_link_characteristics(double bw, double lat, s4u::Link::SharingPolicy sharing_policy) override;
-  Coords rankId_to_coords(int rank_id) const;
+  Coords rankId_to_coords(unsigned long rank_id) const;
   XBT_ATTRIB_DEPRECATED_v330("Please use rankId_to_coords(int)") void rankId_to_coords(int rank_id,
-                                                                                       unsigned int coords[4]) const;
+                                                                                       unsigned long coords[4]) const;
 
 private:
   void generate_routers(const s4u::ClusterCallbacks& set_callbacks);
index 4b9114c..b1f820c 100644 (file)
@@ -7,6 +7,7 @@
 #define SURF_ROUTING_NONE_HPP_
 
 #include <simgrid/kernel/routing/NetZoneImpl.hpp>
+#include <xbt/asserts.h>
 
 namespace simgrid {
 namespace kernel {
@@ -23,9 +24,9 @@ class XBT_PRIVATE EmptyZone : public NetZoneImpl {
 public:
   explicit EmptyZone(const std::string& name) : NetZoneImpl(name) {}
 
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override
   {
-    /* There can't be route in an Empty zone */
+    xbt_die("There can't be route in an Empty zone");
   }
 
   void get_graph(const s_xbt_graph_t* graph, std::map<std::string, xbt_node_t, std::less<>>* /*nodes*/,
index 75f8373..a493182 100644 (file)
@@ -115,7 +115,7 @@ class XBT_PRIVATE FatTreeZone : public ClusterBase {
   std::vector<unsigned int> num_parents_per_node_;  // number of parents by node
   std::vector<unsigned int> num_port_lower_level_;  // ports between each level l and l-1
 
-  std::map<int, std::shared_ptr<FatTreeNode>> compute_nodes_;
+  std::map<unsigned long, std::shared_ptr<FatTreeNode>> compute_nodes_;
   std::vector<std::shared_ptr<FatTreeNode>> nodes_;
   std::vector<std::shared_ptr<FatTreeLink>> links_;
   std::vector<unsigned int> nodes_by_level_;
@@ -134,7 +134,7 @@ public:
   explicit FatTreeZone(const std::string& name) : ClusterBase(name){};
   FatTreeZone(const FatTreeZone&) = delete;
   FatTreeZone& operator=(const FatTreeZone&) = delete;
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override;
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override;
 
   /**
    * @brief Parse the topology parameters from string format
index 1afe574..990071a 100644 (file)
@@ -23,7 +23,7 @@ namespace routing {
  */
 class XBT_PRIVATE FloydZone : public RoutedZone {
   /* vars to compute the Floyd algorithm. */
-  std::vector<std::vector<int>> predecessor_table_;
+  std::vector<std::vector<long>> predecessor_table_;
   std::vector<std::vector<unsigned long>> cost_table_;
   std::vector<std::vector<std::unique_ptr<Route>>> link_table_;
 
@@ -35,9 +35,9 @@ public:
   FloydZone(const FloydZone&) = delete;
   FloydZone& operator=(const FloydZone&) = delete;
 
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override;
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override;
   void add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                 const std::vector<resource::LinkImpl*>& link_list, bool symmetrical) override;
+                 const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical) override;
 };
 } // namespace routing
 } // namespace kernel
index f602e81..35a9377 100644 (file)
@@ -29,9 +29,9 @@ public:
   FullZone(const FullZone&) = delete;
   FullZone& operator=(const FullZone) = delete;
 
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override;
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override;
   void add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                 const std::vector<resource::LinkImpl*>& link_list, bool symmetrical) override;
+                 const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical) override;
 };
 } // namespace routing
 } // namespace kernel
index 7b4126c..5375856 100644 (file)
@@ -31,11 +31,11 @@ public:
   NetPoint(const std::string& name, NetPoint::Type component_type);
 
   // Our rank in the vertices_ array of the netzone that contains us.
-  unsigned int id() const { return id_; }
+  unsigned long id() const { return id_; }
   const std::string& get_name() const { return name_; }
   const char* get_cname() const { return name_.c_str(); }
   /** @brief the NetZone in which this NetPoint is included */
-  NetZoneImpl* get_englobing_zone() { return englobing_zone_; }
+  NetZoneImpl* get_englobing_zone() const { return englobing_zone_; }
   /** @brief Set the NetZone in which this NetPoint is included */
   NetPoint* set_englobing_zone(NetZoneImpl* netzone_p);
   NetPoint* set_coordinates(const std::string& coords);
@@ -49,7 +49,7 @@ public:
   bool operator<(const NetPoint& rhs) const { return name_ < rhs.name_; }
 
 private:
-  unsigned int id_ = -1;
+  unsigned long id_ = -1;
   std::string name_;
   NetPoint::Type component_type_;
   NetZoneImpl* englobing_zone_ = nullptr;
index 2485bed..6acc05b 100644 (file)
@@ -83,8 +83,8 @@ class XBT_PUBLIC NetZoneImpl : public xbt::PropertyHolder {
   std::string name_;
   bool sealed_ = false; // We cannot add more content when sealed
 
-  std::map<std::pair<NetPoint*, NetPoint*>, BypassRoute*> bypass_routes_; // src x dst -> route
-  routing::NetPoint* netpoint_ = nullptr;                                 // Our representative in the father NetZone
+  std::map<std::pair<const NetPoint*, const NetPoint*>, BypassRoute*> bypass_routes_; // src x dst -> route
+  routing::NetPoint* netpoint_ = nullptr; // Our representative in the parent NetZone
 
 protected:
   explicit NetZoneImpl(const std::string& name);
@@ -100,13 +100,20 @@ protected:
    * @param into Container into which the traversed links and gateway information should be pushed
    * @param latency Accumulator in which the latencies should be added (caller must set it to 0)
    */
-  virtual void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) = 0;
+  virtual void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) = 0;
   /** @brief retrieves the list of all routes of size 1 (of type src x dst x Link) */
   /* returns whether we found a bypass path */
-  bool get_bypass_route(routing::NetPoint* src, routing::NetPoint* dst,
+  bool get_bypass_route(const routing::NetPoint* src, const routing::NetPoint* dst,
                         /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency,
                         std::unordered_set<NetZoneImpl*>& netzones);
 
+  /** @brief Get the NetZone that is represented by the netpoint */
+  const NetZoneImpl* get_netzone_recursive(const NetPoint* netpoint) const;
+
+  /** @brief Get the list of LinkImpl* to add in a route, considering split-duplex links and the direction */
+  std::vector<resource::LinkImpl*> get_link_list_impl(const std::vector<s4u::LinkInRoute>& link_list,
+                                                      bool backroute) const;
+
 public:
   enum class RoutingMode {
     base,     /**< Base case: use simple link lists for routing     */
@@ -153,18 +160,20 @@ public:
   s4u::Disk* create_disk(const std::string& name, double read_bandwidth, double write_bandwidth);
   /** @brief Make a link within that NetZone */
   virtual s4u::Link* create_link(const std::string& name, const std::vector<double>& bandwidths);
+  s4u::SplitDuplexLink* create_split_duplex_link(const std::string& name, const std::vector<double>& bandwidths);
   /** @brief Make a router within that NetZone */
   NetPoint* create_router(const std::string& name);
   /** @brief Creates a new route in this NetZone */
   virtual void add_bypass_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                                std::vector<resource::LinkImpl*>& link_list, bool symmetrical);
+                                const std::vector<s4u::LinkInRoute>& link_list);
 
   /** @brief Seal your netzone once you're done adding content, and before routing stuff through it */
   void seal();
-  virtual int add_component(kernel::routing::NetPoint* elm); /* A host, a router or a netzone, whatever */
-  virtual void add_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
-                         kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst,
-                         const std::vector<kernel::resource::LinkImpl*>& link_list, bool symmetrical);
+  /** @brief Check if netpoint is a member of this NetZone or some of the childrens */
+  bool is_component_recursive(const NetPoint* netpoint) const;
+  virtual unsigned long add_component(NetPoint* elm); /* A host, a router or a netzone, whatever */
+  virtual void add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
+                         const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical);
   /** @brief Set parent of this Netzone */
   void set_parent(NetZoneImpl* parent);
   /** @brief Set network model for this Netzone */
@@ -181,24 +190,30 @@ public:
    * @param links Accumulator in which all traversed links should be pushed (caller must empty it)
    * @param latency Accumulator in which the latencies should be added (caller must set it to 0)
    */
-  static void get_global_route(routing::NetPoint* src, routing::NetPoint* dst,
+  static void get_global_route(const NetPoint* src, const NetPoint* dst,
                                /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency);
 
   /** @brief Similar to get_global_route but get the NetZones traversed by route */
-  static void get_global_route_with_netzones(routing::NetPoint* src, routing::NetPoint* dst,
+  static void get_global_route_with_netzones(const NetPoint* src, const NetPoint* dst,
                                              /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency,
                                              std::unordered_set<NetZoneImpl*>& netzones);
 
   virtual void get_graph(const s_xbt_graph_t* graph, std::map<std::string, xbt_node_t, std::less<>>* nodes,
                          std::map<std::string, xbt_edge_t, std::less<>>* edges) = 0;
 
+  /*** Called on each newly created regular route (not on bypass routes) */
+  static xbt::signal<void(bool symmetrical, NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
+                          std::vector<resource::LinkImpl*> const& link_list)>
+      on_route_creation; // XBT_ATTRIB_DEPRECATED_v332 : should be an internal signal used by NS3.. if necessary,
+                         // callback shouldn't use LinkImpl*
+
 private:
   RoutingMode hierarchy_ = RoutingMode::base;
   std::shared_ptr<resource::NetworkModel> network_model_;
   std::shared_ptr<resource::CpuModel> cpu_model_vm_;
   std::shared_ptr<resource::CpuModel> cpu_model_pm_;
   std::shared_ptr<resource::DiskModel> disk_model_;
-  std::shared_ptr<simgrid::surf::HostModel> host_model_;
+  std::shared_ptr<surf::HostModel> host_model_;
   /** @brief Perform sealing procedure for derived classes, if necessary */
   virtual void do_seal()
   { /* obviously nothing to do by default */
index 3fcbd94..08e5c13 100644 (file)
@@ -64,9 +64,9 @@ protected:
   {
     return new_extended_route(hierarchy, gw_src, gw_dst, link_list, preserve_order);
   }
-  void get_route_check_params(NetPoint* src, NetPoint* dst) const;
+  void get_route_check_params(const NetPoint* src, const NetPoint* dst) const;
   void add_route_check_params(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                              const std::vector<resource::LinkImpl*>& link_list, bool symmetrical) const;
+                              const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical) const;
 };
 } // namespace routing
 } // namespace kernel
index 0c2f093..9327c3b 100644 (file)
@@ -64,12 +64,12 @@ class StarZone : public ClusterZone { // implements the old ClusterZone
 public:
   explicit StarZone(const std::string& name);
 
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* route, double* latency) override;
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* route, double* latency) override;
   void get_graph(const s_xbt_graph_t* graph, std::map<std::string, xbt_node_t, std::less<>>* nodes,
                  std::map<std::string, xbt_edge_t, std::less<>>* edges) override;
 
   void add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                 const std::vector<kernel::resource::LinkImpl*>& link_list, bool symmetrical) override;
+                 const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical) override;
   void do_seal() override;
 
 private:
@@ -91,7 +91,7 @@ private:
   /** @brief Auxiliary methods to check params received in add_route method */
   void check_add_route_param(const NetPoint* src, const NetPoint* dst, const NetPoint* gw_src, const NetPoint* gw_dst,
                              bool symmetrical) const;
-  std::unordered_map<unsigned int, StarRoute> routes_;
+  std::unordered_map<unsigned long, StarRoute> routes_;
 };
 } // namespace routing
 } // namespace kernel
index 329a031..36fb7bd 100644 (file)
@@ -20,16 +20,16 @@ namespace routing {
  */
 
 class XBT_PRIVATE TorusZone : public ClusterBase {
-  std::vector<unsigned int> dimensions_;
+  std::vector<unsigned long> dimensions_;
 
 public:
   explicit TorusZone(const std::string& name) : ClusterBase(name){};
-  void create_torus_links(int id, int rank, unsigned int position);
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override;
-  void set_topology(const std::vector<unsigned int>& dimensions);
+  void create_torus_links(unsigned long id, int rank, unsigned long position);
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override;
+  void set_topology(const std::vector<unsigned long>& dimensions);
 
   /** @brief Convert topology parameters from string to vector of uint */
-  static std::vector<unsigned int> parse_topo_parameters(const std::string& topo_parameters);
+  static std::vector<unsigned long> parse_topo_parameters(const std::string& topo_parameters);
 };
 
 } // namespace routing
index ffc6f2e..c8ec4cb 100644 (file)
@@ -48,7 +48,7 @@ class XBT_PRIVATE VivaldiZone : public StarZone {
 public:
   using StarZone::StarZone;
   void set_peer_link(NetPoint* netpoint, double bw_in, double bw_out);
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override;
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override;
 };
 
 namespace vivaldi {
index 2eb9f76..830779a 100644 (file)
@@ -29,7 +29,7 @@ public:
   WifiZone(const WifiZone&) = delete;
   WifiZone& operator=(const WifiZone) = delete;
 
-  void get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency) override;
+  void get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency) override;
   s4u::Link* create_link(const std::string& name, const std::vector<double>& bandwidths) override;
   NetPoint* get_access_point() const { return access_point_; }
 };
index 8e4b014..ab5db94 100644 (file)
@@ -9,7 +9,6 @@
 #define INCLUDE_SIMGRID_LINK_H_
 
 #include <simgrid/forward.h>
-#include <xbt/base.h>
 
 /* C interface */
 SG_BEGIN_DECL
index 3e0ce04..d140236 100644 (file)
@@ -7,7 +7,6 @@
 #define INCLUDE_SIMGRID_MAILBOX_H_
 
 #include <simgrid/forward.h>
-#include <xbt/base.h>
 
 /* C interface */
 SG_BEGIN_DECL
index 7304115..d64a3f5 100644 (file)
@@ -298,12 +298,6 @@ XBT_PUBLIC void MSG_create_environment(const char* file);
 /** @brief Creates the application described in the provided file */
 XBT_PUBLIC void MSG_launch_application(const char* file);
 
-#ifndef DOXYGEN
-/** @brief register functions bypassing the parser */
-XBT_ATTRIB_DEPRECATED_v329("This function will be removed. Speak up if you need it.") XBT_PUBLIC
-    void MSG_set_function(const char* host_id, const char* function_name, xbt_dynar_t arguments);
-#endif
-
 /** @brief A clock (in second). */
 XBT_PUBLIC double MSG_get_clock();
 /** @brief Returns the amount of messages sent since the simulation start */
index f446dac..02c54da 100644 (file)
@@ -9,6 +9,7 @@
 #include <simgrid/s4u/ConditionVariable.hpp>
 #include <simgrid/s4u/Mailbox.hpp>
 #include <simgrid/s4u/Mutex.hpp>
+#include <simgrid/simix.h>
 #include <xbt/asserts.h>
 #include <xbt/log.h>
 
@@ -145,7 +146,9 @@ public:
     while (size() >= max_queue_size_)
       can_put_->wait(lock);
     if (tmode_ == TransferMode::MAILBOX) {
-      comm = mbox_->put_async(data, simulated_size_in_bytes);
+      comm = mbox_->put_init(data, simulated_size_in_bytes)
+                 ->set_copy_data_callback(SIMIX_comm_copy_pointer_callback)
+                 ->start();
     } else
       queue_.push(data);
     can_get_->notify_all();
@@ -180,7 +183,10 @@ public:
     while (empty())
       can_get_->wait(lock);
     if (tmode_ == TransferMode::MAILBOX)
-      comm = mbox_->get_async<T>(data);
+      comm = mbox_->get_init()
+                 ->set_dst_data(reinterpret_cast<void**>(data), sizeof(void*))
+                 ->set_copy_data_callback(SIMIX_comm_copy_pointer_callback)
+                 ->start();
     else {
       *data = queue_.front();
       queue_.pop();
index d3bcd84..49b13a3 100644 (file)
@@ -84,7 +84,7 @@ extern template class XBT_PUBLIC xbt::Extendable<s4u::File>;
 namespace s4u {
 
 /** @brief A simulated file
- *  @addtogroup Plugin_filesystem
+ *  @ingroup plugin_filesystem
  *
  * Used to simulate the time it takes to access to a file, but does not really store any information.
  *
@@ -117,11 +117,6 @@ public:
   /** Simulates a write action. Returns the size of data actually written. */
   sg_size_t write(sg_size_t size, bool write_inside = false);
 
-  /** Allows to store user data on that host */
-  XBT_ATTRIB_DEPRECATED_v329("Please use set_data()") void set_userdata(void* data) { set_data(data); }
-  /** Retrieves the previously stored data */
-  XBT_ATTRIB_DEPRECATED_v329("Please use get_data()") void* get_userdata() { return get_data(); }
-
   sg_size_t size() const;
   void seek(sg_offset_t pos);             /** Sets the file head to the given position. */
   void seek(sg_offset_t pos, int origin); /** Sets the file head to the given position from a given origin. */
index 3e31a94..0b87eb5 100644 (file)
@@ -34,7 +34,7 @@ class XBT_PUBLIC Activity {
 
 public:
   // enum class State { ... }
-  XBT_DECLARE_ENUM_CLASS(State, INITED, STARTING, STARTED, CANCELED, FINISHED);
+  XBT_DECLARE_ENUM_CLASS(State, INITED, STARTING, STARTED, FAILED, CANCELED, FINISHED);
 
 protected:
   Activity()  = default;
index 1d2ac93..067fdd7 100644 (file)
@@ -80,10 +80,6 @@ public:
   static xbt::signal<void(Actor const&)> on_wake_up;
   /** Signal to others that an actor is has been migrated to another host **/
   static xbt::signal<void(const Actor&, const Host& previous_location)> on_host_change;
-#ifndef DOXYGEN
-  static xbt::signal<void(Actor const&)> on_migration_start; // XBT_ATTRIB_DEPRECATED_v329
-  static xbt::signal<void(Actor const&)> on_migration_end;   // XBT_ATTRIB_DEPRECATED_v329
-#endif
 
   /** Signal indicating that an actor terminated its code.
    *  @beginrst
@@ -208,9 +204,6 @@ public:
    * to take care of this yourself (only you knows which ones should be migrated).
    */
   void set_host(Host* new_host);
-#ifndef DOXYGEN
-  XBT_ATTRIB_DEPRECATED_v329("Please use set_host() instead") void migrate(Host* new_host) { set_host(new_host); }
-#endif
 
   /** Ask the actor to die.
    *
@@ -344,10 +337,6 @@ XBT_PUBLIC void execute(double flop, double priority);
 XBT_PUBLIC void parallel_execute(const std::vector<s4u::Host*>& hosts, const std::vector<double>& flops_amounts,
                                  const std::vector<double>& bytes_amounts);
 
-XBT_ATTRIB_DEPRECATED_v329("Please use exec_init(...)->wait_for(timeout)") XBT_PUBLIC
-    void parallel_execute(const std::vector<s4u::Host*>& hosts, const std::vector<double>& flops_amounts,
-                          const std::vector<double>& bytes_amounts, double timeout);
-
 /** Initialize a sequential execution that must then be started manually */
 XBT_PUBLIC ExecPtr exec_init(double flops_amounts);
 /** Initialize a parallel execution that must then be started manually */
@@ -397,9 +386,6 @@ XBT_PUBLIC void on_exit(const std::function<void(bool)>& fun);
 
 /** @brief Migrate the current actor to a new host. */
 XBT_PUBLIC void set_host(Host* new_host);
-#ifndef DOXYGEN
-XBT_ATTRIB_DEPRECATED_v329("Please use set_host() instead") XBT_PUBLIC void migrate(Host* new_host);
-#endif
 }
 
 
index 9fb2288..e45f2ae 100644 (file)
@@ -55,28 +55,42 @@ public:
    * There is really no limit on the hosts involved. In particular, the actor does not have to be on one of the involved
    * hosts.
    */
-  static CommPtr sendto_async(Host* from, Host* to, double simulated_size_in_bytes);
+  static CommPtr sendto_async(Host* from, Host* to, uint64_t simulated_size_in_bytes);
   /** Do a blocking communication between two arbitrary hosts.
    *
    * This starts a blocking communication right away, bypassing the mailbox and actors mechanism.
    * The calling actor is blocked until the end of the communication; there is really no limit on the hosts involved.
    * In particular, the actor does not have to be on one of the involved hosts. Enjoy the comfort of the simulator :)
    */
-  static void sendto(Host* from, Host* to, double simulated_size_in_bytes);
+  static void sendto(Host* from, Host* to, uint64_t simulated_size_in_bytes);
 
   static xbt::signal<void(Comm const&, bool is_sender)> on_start;
   static xbt::signal<void(Comm const&)> on_completion;
 
   /*! take a vector s4u::CommPtr and return when one of them is finished.
    * The return value is the rank of the first finished CommPtr. */
-  static int wait_any(const std::vector<CommPtr>* comms) { return wait_any_for(comms, -1); }
+  static ssize_t wait_any(const std::vector<CommPtr>& comms) { return wait_any_for(comms, -1); }
   /*! Same as wait_any, but with a timeout. Return -1 if the timeout occurs.*/
-  static int wait_any_for(const std::vector<CommPtr>* comms_in, double timeout);
+  static ssize_t wait_any_for(const std::vector<CommPtr>& comms, double timeout);
 
   /*! take a vector s4u::CommPtr and return when all of them is finished. */
-  static void wait_all(const std::vector<CommPtr>* comms);
+  static void wait_all(const std::vector<CommPtr>& comms);
+  /*! Same as wait_all, but with a timeout. Return the number of terminated comm (less than comms.size() if the timeout
+   * occurs). */
+  static size_t wait_all_for(const std::vector<CommPtr>& comms, double timeout);
   /*! take a vector s4u::CommPtr and return the rank of the first finished one (or -1 if none is done). */
-  static int test_any(const std::vector<CommPtr>* comms);
+  static ssize_t test_any(const std::vector<CommPtr>& comms);
+
+#ifndef DOXYGEN
+  XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter")
+  static int wait_any(const std::vector<CommPtr>* comms) { return static_cast<int>(wait_any_for(*comms, -1)); }
+  XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for first parameter")
+  static int wait_any_for(const std::vector<CommPtr>* comms, double timeout) { return static_cast<int>(wait_any_for(*comms, timeout)); }
+  XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter")
+  static void wait_all(const std::vector<CommPtr>* comms) { wait_all(*comms); }
+  XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter")
+  static int test_any(const std::vector<CommPtr>* comms) { return static_cast<int>(test_any(*comms)); }
+#endif
 
   Comm* start() override;
   Comm* wait_for(double timeout) override;
@@ -122,7 +136,7 @@ public:
    * :cpp:func:`simgrid::s4u::Comm::set_src_data_size`).
    * @endrst
    */
-  CommPtr set_payload_size(double bytes);
+  CommPtr set_payload_size(uint64_t bytes);
 
   /** Specify the data to send and its size (not to be mixed with set_payload_size())
    *
@@ -154,6 +168,8 @@ public:
   Actor* get_sender() const;
 
   bool is_assigned() const override { return (to_ != nullptr && from_ != nullptr) || (mailbox_ != nullptr); }
+
+  CommPtr set_copy_data_callback(void (*callback)(kernel::activity::CommImpl*, void*, size_t));
 };
 } // namespace s4u
 } // namespace simgrid
index 184c4c9..793c47c 100644 (file)
@@ -26,8 +26,10 @@ namespace s4u {
  */
 class XBT_PUBLIC ConditionVariable {
 private:
+#ifndef DOXYGEN
   friend kernel::activity::ConditionVariableImpl;
   friend void kernel::activity::intrusive_ptr_release(kernel::activity::ConditionVariableImpl* cond);
+#endif
 
   kernel::activity::ConditionVariableImpl* const pimpl_;
 
index 5f395d6..6d8e00d 100644 (file)
@@ -30,9 +30,11 @@ namespace s4u {
  */
 
 class XBT_PUBLIC Disk : public xbt::Extendable<Disk> {
+#ifndef DOXYGEN
   friend Engine;
   friend Io;
   friend kernel::resource::DiskImpl;
+#endif
 
   explicit Disk(kernel::resource::DiskImpl* pimpl) : pimpl_(pimpl) {}
   virtual ~Disk() = default;
@@ -55,6 +57,17 @@ public:
   Disk* set_write_bandwidth(double write_bw);
   double get_write_bandwidth() const;
 
+  /**
+   * @brief Set limit for read/write operations.
+   *
+   * This determines the limit for read and write operation in the same disk.
+   * Usually, it's configured to max(read_bw, write_bw).
+   * You can change this behavior using this method
+   *
+   * @param bw New bandwidth for the disk
+   */
+  Disk* set_readwrite_bandwidth(double bw);
+
   const std::unordered_map<std::string, std::string>* get_properties() const;
   const char* get_property(const std::string& key) const;
   Disk* set_property(const std::string&, const std::string& value);
@@ -75,6 +88,38 @@ public:
   IoPtr write_async(sg_size_t size) const;
   sg_size_t write(sg_size_t size) const;
 
+  /** @brief Policy for sharing the disk among activities */
+  enum class SharingPolicy { NONLINEAR = 1, LINEAR = 0 };
+  enum class Operation { READ = 2, WRITE = 1, READWRITE = 0 };
+
+  /**
+   * @brief Describes how the disk is shared between activities for each operation
+   *
+   * Disks have different bandwidths for read and write operations. This method
+   * allows you to set different sharing policies for each operation:
+   * - Read: resource sharing for read operation
+   * - Write: resource sharing for write
+   * - ReadWrite: global sharing for read and write operations
+   *
+   * @param op Operation type
+   * @param policy Sharing policy
+   * @param cb Callback for NONLINEAR policies
+   */
+  Disk* set_sharing_policy(Operation op, SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {});
+  SharingPolicy get_sharing_policy(Operation op) const;
+  /**
+   * @brief Callback to set IO factors
+   *
+   * This callback offers a flexible way to create variability in I/O operations
+   *
+   * @param size I/O operation size in bytes
+   * @param op I/O operation type: read or write
+   * @return Multiply factor
+   */
+  using IoFactorCb = double(sg_size_t size, Io::OpType op);
+  /** @brief Configure the factor callback */
+  Disk* set_factor_cb(const std::function<IoFactorCb>& cb);
+
   Disk* seal();
 
   /* The signals */
index 1519dd9..a494fa0 100644 (file)
@@ -24,7 +24,9 @@ namespace s4u {
  * This is a singleton containing all the main functions of the simulation.
  */
 class XBT_PUBLIC Engine {
+#ifndef DOXYGEN
   friend simgrid::kernel::EngineImpl;
+#endif
 
 public:
   /** Constructor, taking only the name of your main function */
@@ -119,6 +121,11 @@ public:
   std::vector<Link*> get_all_links() const;
   std::vector<Link*> get_filtered_links(const std::function<bool(Link*)>& filter) const;
   Link* link_by_name(const std::string& name) const;
+  /**
+   * @brief Find a split-duplex link from its name.
+   * @throw std::invalid_argument if the searched link does not exist.
+   */
+  SplitDuplexLink* split_duplex_link_by_name(const std::string& name) const;
   Link* link_by_name_or_null(const std::string& name) const;
 
   Mailbox* mailbox_by_name_or_create(const std::string& name) const;
@@ -145,8 +152,8 @@ public:
   /**
    * @brief Add a model to engine list
    *
-   * @param model Pointer to model
-   * @param list  List of dependencies for this model (optional)
+   * @param model        Pointer to model
+   * @param dependencies List of dependencies for this model (optional)
    */
   void add_model(std::shared_ptr<simgrid::kernel::resource::Model> model,
                  const std::vector<kernel::resource::Model*>& dependencies = {});
@@ -182,6 +189,7 @@ public:
   static void set_config(const std::string& name, double value);
   static void set_config(const std::string& name, const std::string& value);
 
+  Engine* set_default_comm_data_copy_callback(void (*callback)(kernel::activity::CommImpl*, void*, size_t));
   /** Callback fired when the platform is created (ie, the xml file parsed),
    * right before the actual simulation starts. */
   static xbt::signal<void()> on_platform_created;
index ee5be7e..c6b3898 100644 (file)
@@ -30,7 +30,10 @@ namespace s4u {
  * @endrst
  */
 class XBT_PUBLIC Exec : public Activity_T<Exec> {
+#ifndef DOXYGEN
   friend kernel::activity::ExecImpl;
+#endif
+
   bool parallel_ = false;
 
 protected:
@@ -51,9 +54,16 @@ public:
 
   /*! take a vector of s4u::ExecPtr and return when one of them is finished.
    * The return value is the rank of the first finished ExecPtr. */
-  static int wait_any(std::vector<ExecPtr>* execs) { return wait_any_for(execs, -1); }
+  static ssize_t wait_any(const std::vector<ExecPtr>& execs) { return wait_any_for(execs, -1); }
   /*! Same as wait_any, but with a timeout. If the timeout occurs, parameter last is returned.*/
-  static int wait_any_for(std::vector<ExecPtr>* execs, double timeout);
+  static ssize_t wait_any_for(const std::vector<ExecPtr>& execs, double timeout);
+
+#ifndef DOXYGEN
+  XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter")
+  static int wait_any(std::vector<ExecPtr>* execs) { return static_cast<int>(wait_any_for(*execs, -1)); }
+  XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for first parameter")
+  static int wait_any_for(std::vector<ExecPtr>* execs, double timeout) { return static_cast<int>(wait_any_for(*execs, timeout)); }
+#endif
 
   /** @brief On sequential executions, returns the amount of flops that remain to be done; This cannot be used on
    * parallel executions. */
@@ -68,7 +78,6 @@ public:
 
   ExecPtr set_bound(double bound);
   ExecPtr set_priority(double priority);
-  XBT_ATTRIB_DEPRECATED_v329("Please use exec_init(...)->wait_for(timeout)") ExecPtr set_timeout(double timeout);
 
   Host* get_host() const;
   unsigned int get_host_number() const;
index c6f580c..88d7d36 100644 (file)
@@ -45,6 +45,9 @@ class XBT_PUBLIC Host : public xbt::Extendable<Host> {
   // The private implementation, that never changes
   surf::HostImpl* const pimpl_;
 
+  kernel::resource::CpuImpl* pimpl_cpu_      = nullptr;
+  kernel::routing::NetPoint* pimpl_netpoint_ = nullptr;
+
 public:
   explicit Host(surf::HostImpl* pimpl) : pimpl_(pimpl) {}
 
@@ -83,7 +86,22 @@ public:
   /** Retrieves the name of that host as a C string */
   const char* get_cname() const;
 
+  Host* set_cpu(kernel::resource::CpuImpl* cpu);
+  kernel::resource::CpuImpl* get_cpu() const { return pimpl_cpu_; }
   kernel::routing::NetPoint* get_netpoint() const { return pimpl_netpoint_; }
+  /**
+   * @brief Callback to set CPU factor
+   *
+   * This callback offers a flexible way to create variability in CPU executions
+   *
+   * @param flops Execution size in flops
+   * @return Multiply factor
+   */
+  using CpuFactorCb = double(double flops);
+  /**
+   * @brief Configure the factor callback to the CPU associated to this host
+   */
+  Host* set_factor_cb(const std::function<CpuFactorCb>& cb);
 
   size_t get_actor_count() const;
   std::vector<ActorPtr> get_all_actors() const;
@@ -131,7 +149,7 @@ public:
    *  The amount of flops per second available for computing depends on several things:
    *    - The current pstate determines the maximal peak computing speed (use @ref get_pstate_speed() to retrieve the
    *      computing speed you would get at another pstate)
-   *    - If you declared an external load (with @ref simgrid::surf::Cpu::set_speed_profile()), you must multiply the
+   *    - If you declared an external load (with @ref set_speed_profile()), you must multiply the
    * result of get_speed() by get_available_speed() to retrieve what a new computation would get.
    *
    *  The remaining speed is then shared between the executions located on this host.
@@ -144,7 +162,7 @@ public:
   double get_speed() const;
   /** @brief Get the available speed ratio, between 0 and 1.
    *
-   * This accounts for external load (see @ref simgrid::surf::Cpu::set_speed_profile()).
+   * This accounts for external load (see @ref set_speed_profile()).
    */
   double get_available_speed() const;
 
@@ -152,6 +170,16 @@ public:
   int get_core_count() const;
   Host* set_core_count(int core_count);
 
+  enum class SharingPolicy { NONLINEAR = 1, LINEAR = 0 };
+  /**
+   * @brief Describes how the CPU is shared between concurrent tasks
+   *
+   * @param policy Sharing policy
+   * @param cb Callback for NONLINEAR policies
+   */
+  Host* set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {});
+  SharingPolicy get_sharing_policy() const;
+
   /** Returns the current computation load (in flops per second)
    *
    * The external load (coming from an availability trace) is not taken in account.
@@ -159,10 +187,10 @@ public:
    */
   double get_load() const;
 
-  int get_pstate_count() const;
-  int get_pstate() const;
-  double get_pstate_speed(int pstate_index) const;
-  Host* set_pstate(int pstate_index);
+  unsigned long get_pstate_count() const;
+  unsigned long get_pstate() const;
+  double get_pstate_speed(unsigned long pstate_index) const;
+  Host* set_pstate(unsigned long pstate_index);
   Host* set_coordinates(const std::string& coords);
 
   std::vector<Disk*> get_disks() const;
@@ -194,13 +222,11 @@ public:
 
 #ifndef DOXYGEN
   XBT_ATTRIB_DEPRECATED_v331("Please use Comm::sendto()") void sendto(Host* dest, double byte_amount);
-
   XBT_ATTRIB_DEPRECATED_v331("Please use Comm::sendto_async()") CommPtr sendto_async(Host* dest, double byte_amount);
-
   XBT_ATTRIB_DEPRECATED_v330("Please use Host::sendto()") void send_to(Host* dest, double byte_amount);
 #endif
 
-  NetZone* get_englobing_zone();
+  NetZone* get_englobing_zone() const;
   /** Block the calling actor on an execution located on the called host
    *
    * It is not a problem if the actor is not located on the called host.
@@ -214,15 +240,6 @@ public:
   /** Block the calling actor on an execution located on the called host (with explicit priority) */
   void execute(double flops, double priority) const;
   surf::HostImpl* get_impl() const { return pimpl_; }
-
-private:
-  kernel::routing::NetPoint* pimpl_netpoint_ = nullptr;
-
-public:
-#ifndef DOXYGEN
-  /** DO NOT USE DIRECTLY (@todo: these should be protected, once our code is clean) */
-  kernel::resource::CpuImpl* pimpl_cpu = nullptr;
-#endif
 };
 } // namespace s4u
 } // namespace simgrid
index cb08c3d..1e7825b 100644 (file)
@@ -20,7 +20,9 @@ namespace s4u {
  */
 
 class XBT_PUBLIC Io : public Activity_T<Io> {
+#ifndef DOXYGEN
   friend kernel::activity::IoImpl;
+#endif
 
 protected:
   explicit Io(kernel::activity::IoImplPtr pimpl);
@@ -37,9 +39,9 @@ public:
   Io* start() override;
   /*! take a vector of s4u::IoPtr and return when one of them is finished.
    * The return value is the rank of the first finished IoPtr. */
-  static int wait_any(std::vector<IoPtr>* ios) { return wait_any_for(ios, -1); }
+  static ssize_t wait_any(const std::vector<IoPtr>& ios) { return wait_any_for(ios, -1); }
   /*! Same as wait_any, but with a timeout. If the timeout occurs, parameter last is returned.*/
-  static int wait_any_for(std::vector<IoPtr>* ios, double timeout);
+  static ssize_t wait_any_for(const std::vector<IoPtr>& ios, double timeout);
 
   double get_remaining() const override;
   sg_size_t get_performed_ioops() const;
index d15da44..bcd91af 100644 (file)
@@ -30,18 +30,21 @@ namespace s4u {
  * @endrst
  */
 class XBT_PUBLIC Link : public xbt::Extendable<Link> {
+#ifndef DOXYGEN
   friend kernel::resource::LinkImpl;
+#endif
 
+protected:
   // Links are created from the NetZone, and destroyed by their private implementation when the simulation ends
-  explicit Link(kernel::resource::LinkImpl* pimpl) : pimpl_(pimpl) {}
+  explicit Link(kernel::resource::LinkImplIntf* pimpl) : pimpl_(pimpl) {}
   virtual ~Link() = default;
-  // The private implementation, that never changes
-  kernel::resource::LinkImpl* const pimpl_;
+  // The implementation that never changes
+  kernel::resource::LinkImplIntf* const pimpl_;
 
 public:
-  enum class SharingPolicy { WIFI = 3, SPLITDUPLEX = 2, SHARED = 1, FATPIPE = 0 };
+  enum class SharingPolicy { NONLINEAR = 4, WIFI = 3, SPLITDUPLEX = 2, SHARED = 1, FATPIPE = 0 };
 
-  kernel::resource::LinkImpl* get_impl() const { return pimpl_; }
+  kernel::resource::LinkImpl* get_impl() const;
 
   /** @brief Retrieve a link from its name */
   static Link* by_name(const std::string& name);
@@ -67,12 +70,16 @@ public:
   /**
    * @brief Set latency (string version)
    *
+   * Accepts values with units, such as '1s' or '7ms'.
+   *
+   * Full list of accepted units: w (week), d (day), h, s, ms, us, ns, ps.
+   *
    * @throw std::invalid_argument if latency format is incorrect.
    */
   Link* set_latency(const std::string& value);
 
   /** @brief Describes how the link is shared between flows */
-  Link* set_sharing_policy(SharingPolicy policy);
+  Link* set_sharing_policy(SharingPolicy policy, const NonLinearResourceCb& cb = {});
   SharingPolicy get_sharing_policy() const;
 
   /** Setup the profile with states events (ON or OFF). The profile must contain boolean values. */
@@ -89,6 +96,16 @@ public:
   Link* set_properties(const std::unordered_map<std::string, std::string>& properties);
   Link* set_property(const std::string& key, const std::string& value);
 
+  /**
+   * @brief Set the number of communications that can shared this link at the same time
+   *
+   * Use this method to serialize communication flows going through this link.
+   * Use -1 to set no limit.
+   *
+   * @param limit  Number of concurrent flows
+   */
+  Link* set_concurrency_limit(int limit);
+
   /** @brief Set the level of communication speed of the given host on this wifi link.
    *
    * The bandwidth of a wifi link for a given host depends on its SNR (signal to noise ratio),
@@ -137,6 +154,54 @@ public:
   static xbt::signal<void(kernel::resource::NetworkAction&, kernel::resource::Action::State)>
       on_communication_state_change;
 };
+
+/**
+ * @beginrst
+ * A SplitDuplexLink encapsulates the :cpp:class:`links <simgrid::s4u::Link>` which
+ * compose a Split-Duplex link. Remember that a Split-Duplex link is nothing more than
+ * a pair of up/down links.
+ * @endrst
+ */
+class XBT_PUBLIC SplitDuplexLink : public Link {
+public:
+  explicit SplitDuplexLink(kernel::resource::LinkImplIntf* pimpl) : Link(pimpl) {}
+  /** @brief Get the link direction up*/
+  Link* get_link_up() const;
+  /** @brief Get the link direction down */
+  Link* get_link_down() const;
+
+  /** @brief Retrieve a link from its name */
+  static SplitDuplexLink* by_name(const std::string& name);
+};
+
+/**
+ * @beginrst
+ * Another encapsulation for using links in the :cpp:func:`NetZone::add_route`
+ *
+ * When adding a route with split-duplex links, you need to specify the direction of the link
+ * so SimGrid can know exactly which physical link to insert in the route.
+ *
+ * For shared/fat-pipe links, use the :cpp:enumerator:`Direction::NONE` since they don't have
+ * the concept of UP/DOWN links.
+ * @endrst
+ */
+class XBT_PUBLIC LinkInRoute {
+public:
+  enum class Direction { UP = 2, DOWN = 1, NONE = 0 };
+
+  explicit LinkInRoute(const Link* link) : link_(link) {}
+  LinkInRoute(const Link* link, Direction d) : link_(link), direction_(d) {}
+
+  /** @brief Get direction of this link in the route: UP or DOWN */
+  Direction get_direction() const { return direction_; }
+  /** @brief Get pointer to the link */
+  const Link* get_link() const { return link_; }
+
+private:
+  const Link* link_;
+  Direction direction_ = Direction::NONE;
+};
+
 } // namespace s4u
 } // namespace simgrid
 
index 4daf375..9687ef9 100644 (file)
@@ -20,9 +20,11 @@ namespace s4u {
 
 /** @brief Mailboxes: Network rendez-vous points. */
 class XBT_PUBLIC Mailbox {
+#ifndef DOXYGEN
   friend Comm;
   friend smpi::Request;
   friend kernel::activity::MailboxImpl;
+#endif
 
   kernel::activity::MailboxImpl* const pimpl_;
 
@@ -45,7 +47,7 @@ public:
   bool empty() const;
 
   /* Returns the number of queued communications */
-  unsigned int size() const;
+  size_t size() const;
 
   /** Check if there is a communication going on in a mailbox. */
   bool listen() const;
@@ -111,18 +113,21 @@ public:
   /** Creates (but don't start) a data reception onto that mailbox */
   CommPtr get_init();
   /** Creates and start an async data reception to that mailbox */
-  XBT_ATTRIB_DEPRECATED_v331("Please use typed template Mailbox::get_async<>()") CommPtr get_async(void** data);
   template <typename T> CommPtr get_async(T** data);
 
   /** Blocking data reception */
   template <typename T> T* get();
-  XBT_ATTRIB_DEPRECATED_v331("Please use typed template Mailbox::get<>()") void* get();
   template <typename T> std::unique_ptr<T> get_unique() { return std::unique_ptr<T>(get<T>()); }
 
   /** Blocking data reception with timeout */
   template <typename T> T* get(double timeout);
-  XBT_ATTRIB_DEPRECATED_v331("Please use typed template Mailbox::get<>()") void* get(double timeout);
   template <typename T> std::unique_ptr<T> get_unique(double timeout) { return std::unique_ptr<T>(get<T>(timeout)); }
+
+#ifndef DOXYGEN
+  XBT_ATTRIB_DEPRECATED_v331("Please use typed template Mailbox::get_async<>()") CommPtr get_async(void** data);
+  XBT_ATTRIB_DEPRECATED_v331("Please use typed template Mailbox::get<>()") void* get();
+  XBT_ATTRIB_DEPRECATED_v331("Please use typed template Mailbox::get<>()") void* get(double timeout);
+#endif
 };
 
 template <typename T> CommPtr Mailbox::get_async(T** data)
@@ -146,6 +151,7 @@ template <typename T> T* Mailbox::get(double timeout)
   return res;
 }
 
+#ifndef DOXYGEN
 inline CommPtr Mailbox::get_async(void** data) // XBT_ATTRIB_DEPRECATED_v331
 {
   return get_async<void>(data);
@@ -158,7 +164,7 @@ inline void* Mailbox::get(double timeout) // XBT_ATTRIB_DEPRECATED_v331
 {
   return get<void>(timeout);
 }
-
+#endif
 } // namespace s4u
 } // namespace simgrid
 
index 4f2c486..87d4768 100644 (file)
@@ -29,9 +29,11 @@ namespace s4u {
  * @endrst
  */
 class XBT_PUBLIC Mutex {
+#ifndef DOXYGEN
   friend ConditionVariable;
   friend kernel::activity::MutexImpl;
   friend void kernel::activity::intrusive_ptr_release(kernel::activity::MutexImpl* mutex);
+#endif
 
   kernel::activity::MutexImpl* const pimpl_;
   /* refcounting */
index 9daaf7b..6c0f3e7 100644 (file)
@@ -27,11 +27,13 @@ namespace s4u {
  * s4u::Engine).
  */
 class XBT_PUBLIC NetZone {
+#ifndef DOXYGEN
+  friend kernel::routing::NetZoneImpl;
+#endif
+
   kernel::routing::NetZoneImpl* const pimpl_;
 
 protected:
-  friend kernel::routing::NetZoneImpl;
-
   explicit NetZone(kernel::routing::NetZoneImpl* impl) : pimpl_(impl) {}
 
 public:
@@ -40,9 +42,9 @@ public:
   /** @brief Retrieves the name of that netzone as a C string */
   const char* get_cname() const;
 
-  XBT_ATTRIB_DEPRECATED_v331("Please use get_parent()") NetZone* get_father();
   NetZone* get_parent() const;
   NetZone* set_parent(const NetZone* parent);
+  std::vector<NetZone*> get_children() const;
 
   std::vector<Host*> get_all_hosts() const;
   int get_host_count() const;
@@ -57,15 +59,17 @@ public:
   /** @brief Get the netpoint associated to this netzone */
   kernel::routing::NetPoint* get_netpoint();
 
-  std::vector<NetZone*> get_children() const;
+#ifndef DOXYGEN
+  XBT_ATTRIB_DEPRECATED_v331("Please use get_parent()") NetZone* get_father() const;
   XBT_ATTRIB_DEPRECATED_v332("Please use set_parent() to manage NetZone's relationship") NetZone* add_child(
       NetZone* new_zone);
+#endif
 
   void extract_xbt_graph(const s_xbt_graph_t* graph, std::map<std::string, xbt_node_t, std::less<>>* nodes,
                          std::map<std::string, xbt_edge_t, std::less<>>* edges);
 
   /* Add content to the netzone, at parsing time. It should be sealed afterward. */
-  int add_component(kernel::routing::NetPoint* elm); /* A host, a router or a netzone, whatever */
+  unsigned long add_component(kernel::routing::NetPoint* elm); /* A host, a router or a netzone, whatever */
 
   /**
    * @brief Add a route between 2 netpoints
@@ -76,26 +80,44 @@ public:
    *
    * @param src Source netzone's netpoint
    * @param dst Destination netzone' netpoint
-   * @param src_gw Netpoint of the gateway in the source netzone
-   * @param dst_gw Netpoint of the gateway in the destination netzone
-   * @param link_list List of links used in this communication
+   * @param gw_src Netpoint of the gateway in the source netzone
+   * @param gw_dst Netpoint of the gateway in the destination netzone
+   * @param link_list List of links and their direction used in this communication
    * @param symmetrical Bi-directional communication
    */
   void add_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst, kernel::routing::NetPoint* gw_src,
-                 kernel::routing::NetPoint* gw_dst, const std::vector<Link*>& link_list, bool symmetrical = true);
+                 kernel::routing::NetPoint* gw_dst, const std::vector<LinkInRoute>& link_list, bool symmetrical = true);
+
+#ifndef DOXYGEN
+  XBT_ATTRIB_DEPRECATED_v332("Please use add_route() method which uses s4u::LinkInRoute instead of "
+                             "LinkImpl") void add_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
+                                                        kernel::routing::NetPoint* gw_src,
+                                                        kernel::routing::NetPoint* gw_dst,
+                                                        const std::vector<kernel::resource::LinkImpl*>& link_list,
+                                                        bool symmetrical);
+
+  XBT_ATTRIB_DEPRECATED_v332("Please use add_bypass_route() method which uses s4u::LinkInRoute instead of "
+                             "LinkImpl") void add_bypass_route(kernel::routing::NetPoint* src,
+                                                               kernel::routing::NetPoint* dst,
+                                                               kernel::routing::NetPoint* gw_src,
+                                                               kernel::routing::NetPoint* gw_dst,
+                                                               std::vector<kernel::resource::LinkImpl*>& link_list,
+                                                               bool /*symmetrical*/);
+#endif
 
-  XBT_ATTRIB_DEPRECATED_v332("Please use add_route() method which uses s4u::Link instead of LinkImpl") void add_route(
-      kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst, kernel::routing::NetPoint* gw_src,
-      kernel::routing::NetPoint* gw_dst, const std::vector<kernel::resource::LinkImpl*>& link_list, bool symmetrical);
   void add_bypass_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
                         kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst,
-                        std::vector<kernel::resource::LinkImpl*>& link_list, bool symmetrical);
+                        const std::vector<LinkInRoute>& link_list);
 
+#ifndef DOXYGEN
   /*** Called on each newly created regular route (not on bypass routes) */
   static xbt::signal<void(bool symmetrical, kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
                           kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst,
                           std::vector<kernel::resource::LinkImpl*> const& link_list)>
-      on_route_creation;
+      on_route_creation; // XBT_ATTRIB_DEPRECATED_v332 : should not be used by users, used by ns3.. if necessary,
+                         // signal shouldn't use LinkImpl*
+#endif
+
   static xbt::signal<void(NetZone const&)> on_creation;
   static xbt::signal<void(NetZone const&)> on_seal;
 
@@ -103,7 +125,7 @@ public:
    * @brief Create a host
    *
    * @param name Host name
-   * @param speed_per_state Vector of CPU's speeds
+   * @param speed_per_pstate Vector of CPU's speeds
    */
   s4u::Host* create_host(const std::string& name, const std::vector<double>& speed_per_pstate);
   s4u::Host* create_host(const std::string& name, double speed);
@@ -129,6 +151,22 @@ public:
   s4u::Link* create_link(const std::string& name, const std::vector<std::string>& bandwidths);
   s4u::Link* create_link(const std::string& name, const std::string& bandwidth);
 
+  /**
+   * @brief Create a split-duplex link
+   *
+   * In SimGrid, split-duplex links are a composition of 2 regular (shared) links (up/down).
+   *
+   * This function eases its utilization by creating the 2 links for you. We append a suffix
+   * "_UP" and "_DOWN" to your link name to identify each of them.
+   *
+   * Both up/down links have exactly the same bandwidth
+   *
+   * @param name Name of the link
+   * @param bandwidth Speed
+   */
+  s4u::SplitDuplexLink* create_split_duplex_link(const std::string& name, const std::string& bandwidth);
+  s4u::SplitDuplexLink* create_split_duplex_link(const std::string& name, double bandwidth);
+
   kernel::resource::NetworkModelIntf* get_network_model() const;
 
   /**
@@ -142,8 +180,10 @@ public:
   NetZone* seal();
 
 private:
-  /** @brief Auxiliary function to get list of LinkImpl */
-  static std::vector<kernel::resource::LinkImpl*> get_link_list_impl(const std::vector<Link*>& link_list);
+#ifndef DOXYGEN
+  /** @brief XBT_ATTRIB_DEPRECATED_v332 Auxiliary function to convert types */
+  static std::vector<LinkInRoute> convert_to_linkInRoute(const std::vector<kernel::resource::LinkImpl*>& link_list);
+#endif
 };
 
 // External constructors so that the types (and the types of their content) remain hidden
@@ -171,7 +211,7 @@ struct ClusterCallbacks {
    * @return pair<NetPoint*, NetPoint*>: returns a pair of netpoint and gateway.
    */
   using ClusterNetPointCb = std::pair<kernel::routing::NetPoint*, kernel::routing::NetPoint*>(
-      NetZone* zone, const std::vector<unsigned int>& coord, int id);
+      NetZone* zone, const std::vector<unsigned long>& coord, unsigned long id);
   /**
    * @brief Callback used to set the links for some leaf of the cluster (Torus, FatTree, etc)
    *
@@ -187,7 +227,7 @@ struct ClusterCallbacks {
    * @param id: Internal identifier of the element
    * @return Pointer to the Link
    */
-  using ClusterLinkCb = Link*(NetZone* zone, const std::vector<unsigned int>& coord, int id);
+  using ClusterLinkCb = Link*(NetZone* zone, const std::vector<unsigned long>& coord, unsigned long id);
 
   std::function<ClusterNetPointCb> netpoint;
   std::function<ClusterLinkCb> loopback = {};
@@ -224,12 +264,12 @@ struct ClusterCallbacks {
  * @return Pointer to new netzone
  */
 XBT_PUBLIC NetZone* create_torus_zone(const std::string& name, const NetZone* parent,
-                                      const std::vector<unsigned int>& dimensions,
+                                      const std::vector<unsigned long>& dimensions,
                                       const ClusterCallbacks& set_callbacks, double bandwidth, double latency,
                                       Link::SharingPolicy sharing_policy);
 
 /** @brief Aggregates the parameters necessary to build a Fat-tree zone */
-struct FatTreeParams {
+struct XBT_PUBLIC FatTreeParams {
   unsigned int levels;
   std::vector<unsigned int> down;
   std::vector<unsigned int> up;
@@ -269,7 +309,7 @@ XBT_PUBLIC NetZone* create_fatTree_zone(const std::string& name, const NetZone*
                                         Link::SharingPolicy sharing_policy);
 
 /** @brief Aggregates the parameters necessary to build a Dragonfly zone */
-struct DragonflyParams {
+struct XBT_PUBLIC DragonflyParams {
   std::pair<unsigned int, unsigned int> groups;
   std::pair<unsigned int, unsigned int> chassis;
   std::pair<unsigned int, unsigned int> routers;
index 159d0ac..8520d61 100644 (file)
@@ -29,8 +29,10 @@ namespace s4u {
  *
  */
 class XBT_PUBLIC Semaphore {
+#ifndef DOXYGEN
   friend kernel::activity::SemaphoreImpl;
   friend void kernel::activity::intrusive_ptr_release(kernel::activity::SemaphoreImpl* sem);
+#endif
 
   kernel::activity::SemaphoreImpl* const pimpl_;
 
index ecfeb1e..76e8380 100644 (file)
@@ -42,7 +42,9 @@ public:
     SUSPENDED, /**< Suspend/resume does not involve disk I/O, so we assume there is no transition states. */
     DESTROYED
   );
+#ifndef DOXYGEN
   using state XBT_ATTRIB_DEPRECATED_v332("Please use VirtualMachine::State") = State;
+#endif
 
   vm::VirtualMachineImpl* get_vm_impl() const { return pimpl_vm_; }
   void start();
index 2f805f2..69488a2 100644 (file)
@@ -48,55 +48,19 @@ XBT_PUBLIC void SIMIX_set_maestro(void (*code)(void*), void* data);
 XBT_ATTRIB_DEPRECATED_v332("Please use EngineImpl:run()") XBT_PUBLIC void SIMIX_run();
 XBT_ATTRIB_DEPRECATED_v332("Please use simgrid_get_clock() or Engine::get_clock()") XBT_PUBLIC double SIMIX_get_clock();
 
-XBT_ATTRIB_DEPRECATED_v329("Please use simgrid::kernel::timer::Timer::set()") XBT_PUBLIC smx_timer_t
-    SIMIX_timer_set(double date, void (*function)(void*), void* arg);
-XBT_ATTRIB_DEPRECATED_v329("Please use simgrid::kernel::timer::Timer::remove()") XBT_PUBLIC
-    void SIMIX_timer_remove(smx_timer_t timer);
-XBT_ATTRIB_DEPRECATED_v329("Please use simgrid::kernel::timer::Timer::next()") XBT_PUBLIC double SIMIX_timer_next();
-XBT_ATTRIB_DEPRECATED_v329("Please use simgrid::kernel::timer::Timer::get_date()") XBT_PUBLIC
-    double SIMIX_timer_get_date(smx_timer_t timer);
-
-XBT_ATTRIB_DEPRECATED_v329("Please use simix_global->display_all_actor_status()") XBT_PUBLIC
-    void SIMIX_display_process_status();
 SG_END_DECL
 
-/******************************** Deployment **********************************/
-SG_BEGIN_DECL
-XBT_ATTRIB_DEPRECATED_v329("Please use simgrid_register_default() or Engine::register_default()") XBT_PUBLIC
-    void SIMIX_function_register_default(xbt_main_func_t code);
-XBT_ATTRIB_DEPRECATED_v329("This function will be removed") XBT_PUBLIC void SIMIX_init_application();
-
-XBT_PUBLIC void SIMIX_process_set_function(const char* process_host, const char* process_function,
-                                           xbt_dynar_t arguments, double process_start_time, double process_kill_time);
-SG_END_DECL
-
-#ifdef __cplusplus
-XBT_ATTRIB_DEPRECATED_v329("Please use simgrid_register_function() or Engine::register_function()") XBT_PUBLIC
-    void SIMIX_function_register(const std::string& name, void (*code)(std::vector<std::string>));
-XBT_ATTRIB_DEPRECATED_v329("Please use simgrid_register_function() or Engine::register_function()") XBT_PUBLIC
-    void SIMIX_function_register(const std::string& name, xbt_main_func_t code);
-XBT_ATTRIB_DEPRECATED_v329("Please use simgrid_load_deployment() or Engine::load_deployment()") XBT_PUBLIC
-    void SIMIX_launch_application(const std::string& file);
-#endif
-
 /********************************* Process ************************************/
 SG_BEGIN_DECL
-XBT_ATTRIB_DEPRECATED_v329("Please use sg_actor_count()") XBT_PUBLIC int SIMIX_process_count();
 XBT_PUBLIC smx_actor_t SIMIX_process_self();
 XBT_PUBLIC const char* SIMIX_process_self_get_name();
-XBT_ATTRIB_DEPRECATED_v329("This function will be removed") XBT_PUBLIC void SIMIX_process_self_set_data(void* data);
-XBT_ATTRIB_DEPRECATED_v329("This function will be removed") XBT_PUBLIC void* SIMIX_process_self_get_data();
 SG_END_DECL
 
-#ifdef __cplusplus
-XBT_ATTRIB_DEPRECATED_v329("This function will be removed") XBT_PUBLIC
-    void SIMIX_process_on_exit(smx_actor_t process, const std::function<void(bool /*failed*/)>& fun);
-#endif
-
 /****************************** Communication *********************************/
 #ifdef __cplusplus
-XBT_PUBLIC void SIMIX_comm_set_copy_data_callback(void (*callback)(simgrid::kernel::activity::CommImpl*, void*,
-                                                                   size_t));
+XBT_ATTRIB_DEPRECATED_v333("Please use Engine::set_default_comm_data_copy_callback()") XBT_PUBLIC
+    void SIMIX_comm_set_copy_data_callback(void (*callback)(simgrid::kernel::activity::CommImpl*, void*, size_t));
+
 XBT_PUBLIC void SIMIX_comm_copy_pointer_callback(simgrid::kernel::activity::CommImpl* comm, void* buff,
                                                  size_t buff_size);
 XBT_PUBLIC void SIMIX_comm_copy_buffer_callback(simgrid::kernel::activity::CommImpl* comm, void* buff,
@@ -126,19 +90,6 @@ XBT_ATTRIB_DEPRECATED_v330("Please use s4u::Exec::test()") XBT_PUBLIC
 
 #endif
 
-/**************************** Process simcalls ********************************/
-SG_BEGIN_DECL
-XBT_ATTRIB_DEPRECATED_v329("This function will be removed") void simcall_process_set_data(smx_actor_t process,
-                                                                                          void* data);
-XBT_ATTRIB_DEPRECATED_v329("Please use sg_actor_sleep_for()") XBT_PUBLIC
-#ifdef __cplusplus
-    simgrid::kernel::activity::State
-#else
-    enum kernel_activity_state
-#endif
-    simcall_process_sleep(double duration);
-SG_END_DECL
-
 /************************** Communication simcalls ****************************/
 
 #ifdef __cplusplus
@@ -170,13 +121,12 @@ XBT_ATTRIB_DEPRECATED_v330("Please use Mailbox::iprobe()") XBT_PUBLIC simgrid::k
 
 XBT_ATTRIB_DEPRECATED_v330("Please use a CommImpl*[] for first parameter") XBT_PUBLIC
     unsigned int simcall_comm_waitany(simgrid::kernel::activity::ActivityImplPtr comms[], size_t count, double timeout);
-XBT_PUBLIC unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count,
-                                             double timeout);
+XBT_PUBLIC ssize_t simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout);
 XBT_PUBLIC void simcall_comm_wait(simgrid::kernel::activity::ActivityImpl* comm, double timeout);
 XBT_PUBLIC bool simcall_comm_test(simgrid::kernel::activity::ActivityImpl* comm);
 XBT_ATTRIB_DEPRECATED_v330("Please use a CommImpl*[] for first parameter") XBT_PUBLIC
     int simcall_comm_testany(simgrid::kernel::activity::ActivityImplPtr comms[], size_t count);
-XBT_PUBLIC int simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count);
+XBT_PUBLIC ssize_t simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count);
 
 XBT_ATTRIB_DEPRECATED_v330("Please use an ActivityImpl* for first parameter") inline void simcall_comm_wait(
     const simgrid::kernel::activity::ActivityImplPtr& comm, double timeout)
index b9ff2c2..c15f273 100644 (file)
@@ -65,9 +65,9 @@ class SendRecvParser : public ActionArgParser {
 public:
   /* communication partner; if we send, this is the receiver and vice versa */
   int partner;
-  double size;
+  size_t size;
   int tag;
-  MPI_Datatype datatype1 = MPI_DEFAULT_TYPE;
+  MPI_Datatype datatype1;
 
   void parse(xbt::ReplayAction& action, const std::string& name) override;
 };
@@ -96,14 +96,14 @@ public:
 
 class CollCommParser : public ActionArgParser {
 public:
-  double size;
+  size_t size;
   double comp_size;
   int send_size;
   int recv_size;
   unsigned comm_size; // size of communicator
-  int root               = 0;
-  MPI_Datatype datatype1 = MPI_DEFAULT_TYPE;
-  MPI_Datatype datatype2 = MPI_DEFAULT_TYPE;
+  int root;
+  MPI_Datatype datatype1;
+  MPI_Datatype datatype2;
 };
 
 class BcastArgParser : public CollCommParser {
@@ -161,6 +161,11 @@ public:
   void parse(xbt::ReplayAction& action, const std::string& name) override;
 };
 
+class ScanArgParser : public CollCommParser {
+public:
+  void parse(xbt::ReplayAction& action, const std::string& name) override;
+};
+
 class AllToAllVArgParser : public CollCommParser {
 public:
   int recv_size_sum;
@@ -340,6 +345,12 @@ public:
   void kernel(xbt::ReplayAction& action) override;
 };
 
+class ScanAction : public ReplayAction<ScanArgParser> {
+public:
+  using ReplayAction::ReplayAction;
+  void kernel(xbt::ReplayAction& action) override;
+};
+
 class AllToAllVAction : public ReplayAction<AllToAllVArgParser> {
 public:
   explicit AllToAllVAction() : ReplayAction("alltoallv") {}
index 0da3d5e..40860db 100644 (file)
 
       parameter(MPI_BYTE=1)
       parameter(MPI_CHARACTER=2)
-      parameter(MPI_LOGICAL=3)
+      parameter(MPI_LOGICAL=18)
       parameter(MPI_INT=4)
       parameter(MPI_INTEGER=4)
       parameter(MPI_INTEGER1=5)
index dc5095e..dd94dee 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef HAVE_SMPI
 #undef malloc
 #undef calloc
+#undef realloc
 #undef free
 // Internally disable these overrides (HAVE_SMPI is only defined when building the library)
 #define malloc(nbytes) _sampi_malloc(nbytes)
index f9cba1c..6d5245e 100644 (file)
@@ -1150,10 +1150,10 @@ XBT_PUBLIC void smpi_execute_benched(double duration);
 
 XBT_PUBLIC unsigned long long smpi_rastro_resolution();
 XBT_PUBLIC unsigned long long smpi_rastro_timestamp();
-XBT_PUBLIC void smpi_sample_1(int global, const char* file, int line, int iters, double threshold);
-XBT_PUBLIC int smpi_sample_2(int global, const char* file, int line, int iter_count);
-XBT_PUBLIC void smpi_sample_3(int global, const char* file, int line);
-XBT_PUBLIC int smpi_sample_exit(int global, const char* file, int line, int iter_count);
+XBT_PUBLIC void smpi_sample_1(int global, const char* file, const char* tag, int iters, double threshold);
+XBT_PUBLIC int smpi_sample_2(int global, const char* file, const char* tag, int iter_count);
+XBT_PUBLIC void smpi_sample_3(int global, const char* file, const char* tag);
+XBT_PUBLIC int smpi_sample_exit(int global, const char* file, const char* tag, int iter_count);
 /**
  * Need a public setter for SMPI copy_callback function, so users can define
  * their own while still using default SIMIX_copy_callback for S4U copies.
@@ -1173,7 +1173,12 @@ XBT_PUBLIC void smpi_trace_set_call_location__(const char* file, const int* line
 
 #define SMPI_ITER_NAME1(line) _XBT_CONCAT(iter_count, line)
 #define SMPI_ITER_NAME(line) SMPI_ITER_NAME1(line)
-#define SMPI_SAMPLE_LOOP(loop_init, loop_end, loop_iter, global, iters, thres)                                         \
+#define SMPI_CTAG_NAME1(line) _XBT_CONCAT(ctag, line)
+#define SMPI_CTAG_NAME(line) SMPI_CTAG_NAME1(line)
+
+#define SMPI_SAMPLE_LOOP(loop_init, loop_end, loop_iter, global, iters, thres, tag)                                    \
+  char SMPI_CTAG_NAME(__LINE__) [132];                                                                                 \
+  snprintf( SMPI_CTAG_NAME(__LINE__), 132, "%s%d", tag, __LINE__);                                                           \
   int SMPI_ITER_NAME(__LINE__) = 0;                                                                                    \
   {                                                                                                                    \
     loop_init;                                                                                                         \
@@ -1182,14 +1187,20 @@ XBT_PUBLIC void smpi_trace_set_call_location__(const char* file, const int* line
       (loop_iter);                                                                                                     \
     }                                                                                                                  \
   }                                                                                                                    \
-  for (loop_init; (loop_end) ? (smpi_sample_1((global), __FILE__, __LINE__, (iters), (thres)),                         \
-                                (smpi_sample_2((global), __FILE__, __LINE__, SMPI_ITER_NAME(__LINE__))))               \
-                             : smpi_sample_exit((global), __FILE__, __LINE__, SMPI_ITER_NAME(__LINE__));               \
-       smpi_sample_3((global), __FILE__, __LINE__), (loop_iter))
+  for ( loop_init;                                                                                                     \
+         (loop_end) ? (smpi_sample_1((global), __FILE__, SMPI_CTAG_NAME(__LINE__), (iters), (thres))                   \
+                        , (smpi_sample_2((global), __FILE__, SMPI_CTAG_NAME(__LINE__), SMPI_ITER_NAME(__LINE__))))     \
+                    : smpi_sample_exit((global), __FILE__, SMPI_CTAG_NAME(__LINE__), SMPI_ITER_NAME(__LINE__));        \
+         smpi_sample_3((global), __FILE__, SMPI_CTAG_NAME(__LINE__)), (loop_iter) )
+
 #define SMPI_SAMPLE_LOCAL(loop_init, loop_end, loop_iter, iters, thres)                                                \
-  SMPI_SAMPLE_LOOP(loop_init, (loop_end), (loop_iter), 0, (iters), (thres))
+  SMPI_SAMPLE_LOOP(loop_init, (loop_end), (loop_iter), 0, (iters), (thres), "")
+#define SMPI_SAMPLE_LOCAL_TAG(loop_init, loop_end, loop_iter, iters, thres, tag)                                       \
+  SMPI_SAMPLE_LOOP(loop_init, (loop_end), (loop_iter), 0, (iters), (thres), tag)
 #define SMPI_SAMPLE_GLOBAL(loop_init, loop_end, loop_iter, iters, thres)                                               \
-  SMPI_SAMPLE_LOOP(loop_init, (loop_end), (loop_iter), 1, (iters), (thres))
+  SMPI_SAMPLE_LOOP(loop_init, (loop_end), (loop_iter), 1, (iters), (thres), "")
+#define SMPI_SAMPLE_GLOBAL_TAG(loop_init, loop_end, loop_iter, iters, thres, tag)                                      \
+  SMPI_SAMPLE_LOOP(loop_init, (loop_end), (loop_iter), 1, (iters), (thres), tag)
 #define SMPI_SAMPLE_DELAY(duration) for(smpi_execute(duration); 0; )
 #define SMPI_SAMPLE_FLOPS(flops) for(smpi_execute_flops(flops); 0; )
 XBT_PUBLIC void* smpi_shared_malloc(size_t size, const char* file, int line);
index f97d93f..7fc354a 100644 (file)
@@ -1,6 +1,12 @@
+// Copyright (c) 2016-2021. The SimGrid Team. All rights reserved.
+
+// This program is free software; you can redistribute it and/or modify it
+// under the terms of the license (GNU LGPL) which comes with this package.
+
 // This file has been automatically generated by the script
 // in tools/smpi/generate_smpi_defines.pl
 // DO NOT EDIT MANUALLY. ALL CHANGES WILL BE OVERWRITTEN!
+
 #define MPI_Init(...) (smpi_trace_set_call_location(__FILE__, __LINE__), MPI_Init(__VA_ARGS__))
 #define MPI_Finalize(...) (smpi_trace_set_call_location(__FILE__, __LINE__), MPI_Finalize(__VA_ARGS__))
 #define MPI_Finalized(...) (smpi_trace_set_call_location(__FILE__, __LINE__), MPI_Finalized(__VA_ARGS__))
index eee7535..2017464 100644 (file)
@@ -1,6 +1,12 @@
+! Copyright (c) 2016-2021. The SimGrid Team. All rights reserved.
+
+! This program is free software; you can redistribute it and/or modify it
+! under the terms of the license (GNU LGPL) which comes with this package.
+
 ! This file has been automatically generated by the script
 ! in tools/smpi/generate_smpi_defines.pl
 ! DO NOT EDIT MANUALLY. ALL CHANGES WILL BE OVERWRITTEN!
+
 #define mpi_init smpi_trace_set_call_location(__FILE__,__LINE__); call MPI_Init
 #define MPI_INIT smpi_trace_set_call_location(__FILE__,__LINE__); call MPI_Init
 #define mpi_finalize smpi_trace_set_call_location(__FILE__,__LINE__); call MPI_Finalize
index 68df20f..ef7492d 100644 (file)
@@ -35,6 +35,7 @@
 #ifndef SMPI_NO_OVERRIDE_MALLOC
 #define malloc(x) smpi_shared_malloc_intercept((x), __FILE__, __LINE__)
 #define calloc(x, y) smpi_shared_calloc_intercept((x), (y), __FILE__, __LINE__)
+#define realloc(x, y) smpi_shared_realloc_intercept((x), (y), __FILE__, __LINE__)
 #define free(x) smpi_shared_free(x)
 #endif
 #endif
index 404d1cb..25a4f70 100644 (file)
@@ -36,6 +36,7 @@ int smpi_getopt(int argc, char* const* argv, const char* options);
 
 void* smpi_shared_malloc_intercept(size_t size, const char* file, int line);
 void* smpi_shared_calloc_intercept(size_t num_elm, size_t elem_size, const char* file, int line);
+void* smpi_shared_realloc_intercept(void* data, size_t size, const char* file, int line);
 void smpi_shared_free(void* data);
 #ifdef __cplusplus
 } // extern "C"
index d764f5e..2dc3fce 100644 (file)
 #define XBT_ATTRIB_DEPRECATED(mesg) __attribute__((deprecated(mesg)))
 #endif
 
-#define XBT_ATTRIB_DEPRECATED_v329(mesg)                                                                               \
-  XBT_ATTRIB_DEPRECATED(mesg " (this compatibility wrapper will be dropped after v3.28)")
 #define XBT_ATTRIB_DEPRECATED_v330(mesg)                                                                               \
   XBT_ATTRIB_DEPRECATED(mesg " (this compatibility wrapper will be dropped after v3.29)")
 #define XBT_ATTRIB_DEPRECATED_v331(mesg)                                                                               \
   XBT_ATTRIB_DEPRECATED(mesg " (this compatibility wrapper will be dropped after v3.30)")
 #define XBT_ATTRIB_DEPRECATED_v332(mesg)                                                                               \
   XBT_ATTRIB_DEPRECATED(mesg " (this compatibility wrapper will be dropped after v3.31)")
+#define XBT_ATTRIB_DEPRECATED_v333(mesg)                                                                               \
+  XBT_ATTRIB_DEPRECATED(mesg " (this compatibility wrapper will be dropped after v3.32)")
 
 /* Work around https://github.com/microsoft/vscode-cpptools/issues/4503 */
 #ifdef __INTELLISENSE__
index 4f5ca2c..f4065f8 100644 (file)
@@ -126,7 +126,7 @@ class Task<R(Args...)> {
     move_function move;
   };
 
-  TaskUnion buffer_;
+  TaskUnion buffer_         = {};
   const TaskVtable* vtable_ = nullptr;
 
   void clear()
index 50b99cf..188944a 100644 (file)
@@ -91,9 +91,7 @@ typedef enum {
   void _XBT_LOGV_CTOR(catName)(void)                                                                                   \
   {                                                                                                                    \
     XBT_LOG_EXTERNAL_CATEGORY(catName);                                                                                \
-    if (!_XBT_LOGV(catName).initialized) {                                                                             \
-      _xbt_log_cat_init(&_XBT_LOGV(catName), xbt_log_priority_uninitialized);                                          \
-    }                                                                                                                  \
+    (void)_xbt_log_cat_init(&_XBT_LOGV(catName), xbt_log_priority_uninitialized);                                      \
   }                                                                                                                    \
   XBT_EXPORT_NO_IMPORT s_xbt_log_category_t _XBT_LOGV(catName) = {                                                     \
       &_XBT_LOGV(parent),                                                                                              \
index 88d41a7..f81c62a 100644 (file)
@@ -31,7 +31,7 @@ XBT_PUBLIC void sg_version_check(int lib_version_major, int lib_version_minor, i
  *
  * Similar to vasprintf(), but returns a pointer to the newly created string (or aborts on error).
  */
-XBT_PUBLIC char* bvprintf(const char* fmt, va_list ap);
+XBT_PUBLIC char* bvprintf(const char* fmt, va_list ap) XBT_ATTRIB_PRINTF(1, 0);
 /** @brief print to allocated string
  *
  * Similar to asprintf(), but returns a pointer to the newly created string (or aborts on error).
index 6ced941..c1e97f4 100644 (file)
@@ -8,6 +8,7 @@
 #define SIMGRID_XBT_PARSE_UNITS_HPP
 
 #include <string>
+#include <vector>
 
 double xbt_parse_get_time(const std::string& filename, int lineno, const std::string& string,
                           const std::string& entity_kind);
index a8bd317..c23e6f0 100644 (file)
@@ -31,13 +31,13 @@ namespace xbt {
  *
  * @ingroup XBT_str
  */
-XBT_PUBLIC std::string string_printf(const char* fmt, ...);
+XBT_PUBLIC std::string string_printf(const char* fmt, ...) XBT_ATTRIB_PRINTF(1, 2);
 
 /** Create a C++ string from a C-style format
  *
  * @ingroup XBT_str
  */
-XBT_PUBLIC std::string string_vprintf(const char* fmt, va_list ap);
+XBT_PUBLIC std::string string_vprintf(const char* fmt, va_list ap) XBT_ATTRIB_PRINTF(1, 0);
 
 #if SIMGRID_HAVE_MC
 
index aa333b1..c9b5fde 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,7 @@
+# Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.
 
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
 
 # python3 setup.py sdist # Build a source distrib (building binary distribs is complex on linux)
 
@@ -85,7 +88,7 @@ class CMakeBuild(build_ext):
 
 setup(
     name='simgrid',
-    version='3.27.1',
+    version='3.28.1',
     author='Da SimGrid Team',
     author_email='simgrid-devel@lists.gforge.inria.fr',
     description='Toolkit for scalable simulation of distributed applications',
index 8c4ff67..b87ed17 100644 (file)
@@ -4,7 +4,7 @@
 sonar.organization=simgrid
 sonar.projectKey=simgrid_simgrid
 sonar.projectName=SimGrid
-sonar.projectVersion=3.27.1
+sonar.projectVersion=3.28.1
 
 sonar.links.homepage=https://simgrid.org
 sonar.links.issue=https://framagit.org/simgrid/simgrid/issues
@@ -208,9 +208,6 @@ sonar.sourceEncoding=UTF-8
 sonar.java.source=8
 sonar.java.binaries=CMakeFiles/simgrid-java_jar.dir,examples/deprecated/java
 
-# Don't talk to me: travis don't like your verbosity
-# sonar.verbose=true
-
 ### NOTE: the following properties are overridden by Jenkins configuration
 ###
 #sonar.java.binaries
index 27d7957..c198186 100644 (file)
@@ -165,8 +165,8 @@ public abstract class Process implements Runnable {
        public native void resume();    
        /** Tests if a process is suspended.
         *
-        * @see #suspend()
-        * @see #resume()
+        * @see suspend()
+        * @see resume()
         */
        public native boolean isSuspended();
        
index 1df2436..31f39b9 100644 (file)
@@ -347,13 +347,12 @@ int console_add_route(lua_State *L) {
   boost::split(names, str, boost::is_any_of(", \t\r\n"));
   if (names.empty()) {
     /* unique name */
-    route.link_list.push_back(simgrid::s4u::Link::by_name(lua_tostring(L, -1))->get_impl());
+    route.link_list.emplace_back(simgrid::s4u::Link::by_name(lua_tostring(L, -1)));
   } else {
     // Several names separated by , \t\r\n
     for (auto const& name : names) {
       if (name.length() > 0) {
-        simgrid::kernel::resource::LinkImpl* link = simgrid::s4u::Link::by_name(name)->get_impl();
-        route.link_list.push_back(link);
+        route.link_list.emplace_back(simgrid::s4u::Link::by_name(name));
       }
     }
   }
@@ -413,13 +412,12 @@ int console_add_ASroute(lua_State *L) {
   boost::split(names, str, boost::is_any_of(", \t\r\n"));
   if (names.empty()) {
     /* unique name with no comma */
-    ASroute.link_list.push_back(simgrid::s4u::Link::by_name(lua_tostring(L, -1))->get_impl());
+    ASroute.link_list.emplace_back(simgrid::s4u::Link::by_name(lua_tostring(L, -1)));
   } else {
     // Several names separated by , \t\r\n
     for (auto const& name : names) {
       if (name.length() > 0) {
-        simgrid::kernel::resource::LinkImpl* link = simgrid::s4u::Link::by_name(name)->get_impl();
-        ASroute.link_list.push_back(link);
+        ASroute.link_list.emplace_back(simgrid::s4u::Link::by_name(name));
       }
     }
   }
@@ -454,7 +452,7 @@ int console_AS_open(lua_State *L) {
  simgrid::kernel::routing::ZoneCreationArgs AS;
  AS.id = id;
  AS.routing                                    = mode;
- simgrid::kernel::routing::NetZoneImpl* new_as = sg_platf_new_Zone_begin(&AS);
+ simgrid::kernel::routing::NetZoneImpl* new_as = sg_platf_new_zone_begin(&AS);
 
  /* Build a Lua representation of the new AS on the stack */
  lua_newtable(L);
@@ -471,7 +469,7 @@ int console_AS_open(lua_State *L) {
 int console_AS_seal(lua_State*)
 {
   XBT_DEBUG("Sealing AS");
-  sg_platf_new_Zone_seal();
+  sg_platf_new_zone_seal();
   return 0;
 }
 
index b1dd8a0..a35fa8c 100644 (file)
 #pragma GCC diagnostic ignored "-Wunused-value"
 #endif
 
-#include <pybind11/functional.h>
+#ifndef NDEBUG
+/* Many tests are failing after pybind11 commit ad6bf5cd39ca64b4a9bf846b84b11c4c8df1c8e1 "Adding PyGILState_Check() in
+ *  object_api<>::operator(). (#2919)".
+ * See https://github.com/pybind/pybind11/commit/ad6bf5cd39ca64b4a9bf846b84b11c4c8df1c8e1
+ *
+ * The failing tests are mostly those with boost/raw/sysv contexts. As a workaround, define NDEBUG before pybind11
+ * includes.
+ */
+#define NDEBUG
+#define NDEBUG_LOCALLY_DEFINED
+#endif
+
 #include <pybind11/pybind11.h> // Must come before our own stuff
+
+#include <pybind11/functional.h>
 #include <pybind11/stl.h>
 
+#ifdef NDEBUG_LOCALLY_DEFINED
+#undef NDEBUG_LOCALLY_DEFINED
+#undef NDEBUG
+#endif
+
 #if defined(__GNUG__)
 #pragma GCC diagnostic pop
 #endif
 
+#include "simgrid/kernel/routing/NetPoint.hpp"
 #include "src/kernel/context/Context.hpp"
 #include <simgrid/Exception.hpp>
 #include <simgrid/s4u/Actor.hpp>
 #include <simgrid/s4u/Comm.hpp>
+#include <simgrid/s4u/Disk.hpp>
 #include <simgrid/s4u/Engine.hpp>
 #include <simgrid/s4u/Exec.hpp>
 #include <simgrid/s4u/Host.hpp>
+#include <simgrid/s4u/Link.hpp>
 #include <simgrid/s4u/Mailbox.hpp>
+#include <simgrid/s4u/NetZone.hpp>
 #include <simgrid/version.h>
 
 #include <algorithm>
@@ -56,6 +78,14 @@ std::string get_simgrid_version()
   return simgrid::xbt::string_printf("%i.%i.%i", major, minor, patch);
 }
 
+/** @brief Wrap for mailbox::get_async */
+class PyGetAsync {
+  std::unique_ptr<PyObject*> data = std::make_unique<PyObject*>();
+
+public:
+  PyObject** get() const { return data.get(); }
+};
+
 /* Classes GilScopedAcquire and GilScopedRelease have the same purpose as pybind11::gil_scoped_acquire and
  * pybind11::gil_scoped_release.  Refer to the manual of pybind11 for details:
  * https://pybind11.readthedocs.io/en/stable/advanced/misc.html#global-interpreter-lock-gil
@@ -192,11 +222,92 @@ PYBIND11_MODULE(simgrid, m)
           },
           "Registers the main function of an actor");
 
+  /* Class Netzone */
+  py::class_<simgrid::s4u::NetZone, std::unique_ptr<simgrid::s4u::NetZone, py::nodelete>> netzone(m, "NetZone",
+                                                                                                  "Networking Zones");
+  netzone.def_static("create_full_zone", &simgrid::s4u::create_full_zone, "Creates a zone of type FullZone")
+      .def_static("create_torus_zone", &simgrid::s4u::create_torus_zone, "Creates a cluster of type Torus")
+      .def_static("create_fatTree_zone", &simgrid::s4u::create_fatTree_zone, "Creates a cluster of type Fat-Tree")
+      .def_static("create_dragonfly_zone", &simgrid::s4u::create_dragonfly_zone, "Creates a cluster of type Dragonfly")
+      .def_static("create_star_zone", &simgrid::s4u::create_star_zone, "Creates a zone of type Star")
+      .def_static("create_floyd_zone", &simgrid::s4u::create_floyd_zone, "Creates a zone of type Floyd")
+      .def_static("create_dijkstra_zone", &simgrid::s4u::create_floyd_zone, "Creates a zone of type Dijkstra")
+      .def_static("create_vivaldi_zone", &simgrid::s4u::create_vivaldi_zone, "Creates a zone of type Vivaldi")
+      .def_static("create_empty_zone", &simgrid::s4u::create_empty_zone, "Creates a zone of type Empty")
+      .def_static("create_wifi_zone", &simgrid::s4u::create_wifi_zone, "Creates a zone of type Wi-Fi")
+      .def("add_route",
+           py::overload_cast<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*,
+                             simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*,
+                             const std::vector<simgrid::s4u::LinkInRoute>&, bool>(&simgrid::s4u::NetZone::add_route),
+           "Add a route between 2 netpoints")
+      .def("create_host", py::overload_cast<const std::string&, double>(&simgrid::s4u::NetZone::create_host),
+           "Creates a host")
+      .def("create_host",
+           py::overload_cast<const std::string&, const std::string&>(&simgrid::s4u::NetZone::create_host),
+           "Creates a host")
+      .def("create_host",
+           py::overload_cast<const std::string&, const std::vector<double>&>(&simgrid::s4u::NetZone::create_host),
+           "Creates a host")
+      .def("create_host",
+           py::overload_cast<const std::string&, const std::vector<std::string>&>(&simgrid::s4u::NetZone::create_host),
+           "Creates a host")
+      .def("create_link", py::overload_cast<const std::string&, double>(&simgrid::s4u::NetZone::create_link),
+           "Creates a network link")
+      .def("create_link",
+           py::overload_cast<const std::string&, const std::string&>(&simgrid::s4u::NetZone::create_link),
+           "Creates a network link")
+      .def("create_link",
+           py::overload_cast<const std::string&, const std::vector<double>&>(&simgrid::s4u::NetZone::create_link),
+           "Creates a network link")
+      .def("create_link",
+           py::overload_cast<const std::string&, const std::vector<std::string>&>(&simgrid::s4u::NetZone::create_link),
+           "Creates a network link")
+      .def("create_split_duplex_link",
+           py::overload_cast<const std::string&, double>(&simgrid::s4u::NetZone::create_split_duplex_link),
+           "Creates a split-duplex link")
+      .def("create_split_duplex_link",
+           py::overload_cast<const std::string&, const std::string&>(&simgrid::s4u::NetZone::create_split_duplex_link),
+           "Creates a split-duplex link")
+      .def("create_router", &simgrid::s4u::NetZone::create_router, "Create a router")
+      .def("set_parent", &simgrid::s4u::NetZone::set_parent, "Set the parent of this zone")
+      .def("set_property", &simgrid::s4u::NetZone::set_property, "Add a property to this zone")
+      .def("get_netpoint", &simgrid::s4u::NetZone::get_netpoint, "Retrieve the netpoint associated to this zone")
+      .def("seal", &simgrid::s4u::NetZone::seal, "Seal this NetZone")
+      .def_property_readonly(
+          "name", [](const simgrid::s4u::NetZone* self) { return self->get_name(); }, "The name of this network zone");
+
+  /* Class ClusterCallbacks */
+  py::class_<simgrid::s4u::ClusterCallbacks>(m, "ClusterCallbacks", "Callbacks used to create cluster zones")
+      .def(py::init<const std::function<simgrid::s4u::ClusterCallbacks::ClusterNetPointCb>&,
+                    const std::function<simgrid::s4u::ClusterCallbacks::ClusterLinkCb>&,
+                    const std::function<simgrid::s4u::ClusterCallbacks::ClusterLinkCb>&>());
+
+  /* Class FatTreeParams */
+  py::class_<simgrid::s4u::FatTreeParams>(m, "FatTreeParams", "Parameters to create a Fat-Tree zone")
+      .def(py::init<unsigned int, const std::vector<unsigned int>&, const std::vector<unsigned int>&,
+                    const std::vector<unsigned int>&>());
+
+  /* Class DragonflyParams */
+  py::class_<simgrid::s4u::DragonflyParams>(m, "DragonflyParams", "Parameters to create a Dragonfly zone")
+      .def(py::init<const std::pair<unsigned int, unsigned int>&, const std::pair<unsigned int, unsigned int>&,
+                    const std::pair<unsigned int, unsigned int>&, unsigned int>());
+
   /* Class Host */
-  py::class_<simgrid::s4u::Host, std::unique_ptr<Host, py::nodelete>>(m, "Host", "Simulated host")
-      .def("by_name", &Host::by_name, "Retrieves a host from its name, or die")
+  py::class_<simgrid::s4u::Host, std::unique_ptr<Host, py::nodelete>> host(m, "Host", "Simulated host");
+  host.def("by_name", &Host::by_name, "Retrieves a host from its name, or die")
       .def("get_pstate_count", &Host::get_pstate_count, "Retrieve the count of defined pstate levels")
       .def("get_pstate_speed", &Host::get_pstate_speed, "Retrieve the maximal speed at the given pstate")
+      .def("get_netpoint", &Host::get_netpoint, "Retrieve the netpoint associated to this host")
+      .def("get_disks", &Host::get_disks, "Retrieve the list of disks in this host")
+      .def("set_core_count", &Host::set_core_count, "Set the number of cores in the CPU")
+      .def("set_coordinates", &Host::set_coordinates, "Set the coordinates of this host")
+      .def("set_sharing_policy", &simgrid::s4u::Host::set_sharing_policy, "Describe how the CPU is shared",
+           py::arg("policy"), py::arg("cb") = simgrid::s4u::NonLinearResourceCb())
+      .def("create_disk", py::overload_cast<const std::string&, double, double>(&Host::create_disk), "Create a disk")
+      .def("create_disk",
+           py::overload_cast<const std::string&, const std::string&, const std::string&>(&Host::create_disk),
+           "Create a disk")
+      .def("seal", &Host::seal, "Seal this host")
       .def_property(
           "pstate", &Host::get_pstate,
           [](Host* h, int i) {
@@ -219,6 +330,75 @@ PYBIND11_MODULE(simgrid, m)
           "speed", &Host::get_speed,
           "The peak computing speed in flops/s at the current pstate, taking the external load into account. "
           "This is the max potential speed.");
+  py::enum_<simgrid::s4u::Host::SharingPolicy>(host, "SharingPolicy")
+      .value("NONLINEAR", simgrid::s4u::Host::SharingPolicy::NONLINEAR)
+      .value("LINEAR", simgrid::s4u::Host::SharingPolicy::LINEAR)
+      .export_values();
+
+  /* Class Disk */
+  py::class_<simgrid::s4u::Disk, std::unique_ptr<simgrid::s4u::Disk, py::nodelete>> disk(m, "Disk", "Simulated disk");
+  disk.def("read", &simgrid::s4u::Disk::read, py::call_guard<GilScopedRelease>(), "Read data from disk")
+      .def("write", &simgrid::s4u::Disk::write, py::call_guard<GilScopedRelease>(), "Write data in disk")
+      .def("read_async", &simgrid::s4u::Disk::read_async, "Non-blocking read data from disk")
+      .def("write_async", &simgrid::s4u::Disk::write_async, "Non-blocking write data in disk")
+      .def("set_sharing_policy", &simgrid::s4u::Disk::set_sharing_policy, "Set sharing policy for this disk",
+           py::arg("op"), py::arg("policy"), py::arg("cb") = simgrid::s4u::NonLinearResourceCb())
+      .def("seal", &simgrid::s4u::Disk::seal, "Seal this disk")
+      .def_property_readonly(
+          "name", [](const simgrid::s4u::Disk* self) { return self->get_name(); }, "The name of this disk");
+  py::enum_<simgrid::s4u::Disk::SharingPolicy>(disk, "SharingPolicy")
+      .value("NONLINEAR", simgrid::s4u::Disk::SharingPolicy::NONLINEAR)
+      .value("LINEAR", simgrid::s4u::Disk::SharingPolicy::LINEAR)
+      .export_values();
+  py::enum_<simgrid::s4u::Disk::Operation>(disk, "Operation")
+      .value("READ", simgrid::s4u::Disk::Operation::READ)
+      .value("WRITE", simgrid::s4u::Disk::Operation::WRITE)
+      .value("READWRITE", simgrid::s4u::Disk::Operation::READWRITE)
+      .export_values();
+
+  /* Class NetPoint */
+  py::class_<simgrid::kernel::routing::NetPoint, std::unique_ptr<simgrid::kernel::routing::NetPoint, py::nodelete>>
+      netpoint(m, "NetPoint", "NetPoint object");
+
+  /* Class Link */
+  py::class_<simgrid::s4u::Link, std::unique_ptr<simgrid::s4u::Link, py::nodelete>> link(m, "Link", "Network link");
+  link.def("set_latency", py::overload_cast<const std::string&>(&simgrid::s4u::Link::set_latency), "Set the latency")
+      .def("set_latency", py::overload_cast<double>(&simgrid::s4u::Link::set_latency), "Set the latency")
+      .def("set_sharing_policy", &simgrid::s4u::Link::set_sharing_policy, "Set sharing policy for this link")
+      .def("set_concurrency_limit", &simgrid::s4u::Link::set_concurrency_limit, "Set concurrency limit for this link")
+      .def("set_host_wifi_rate", &simgrid::s4u::Link::set_host_wifi_rate,
+           "Set level of communication speed of given host on this Wi-Fi link")
+      .def("seal", &simgrid::s4u::Link::seal, "Seal this link")
+      .def_property_readonly(
+          "name",
+          [](const simgrid::s4u::Link* self) {
+            return std::string(self->get_name().c_str()); // Convert from xbt::string because of MC
+          },
+          "The name of this link");
+  py::enum_<simgrid::s4u::Link::SharingPolicy>(link, "SharingPolicy")
+      .value("NONLINEAR", simgrid::s4u::Link::SharingPolicy::NONLINEAR)
+      .value("WIFI", simgrid::s4u::Link::SharingPolicy::WIFI)
+      .value("SPLITDUPLEX", simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX)
+      .value("SHARED", simgrid::s4u::Link::SharingPolicy::SHARED)
+      .value("FATPIPE", simgrid::s4u::Link::SharingPolicy::FATPIPE)
+      .export_values();
+
+  /* Class LinkInRoute */
+  py::class_<simgrid::s4u::LinkInRoute> linkinroute(m, "LinkInRoute", "Abstraction to add link in routes");
+  linkinroute.def(py::init<const simgrid::s4u::Link*>());
+  linkinroute.def(py::init<const simgrid::s4u::Link*, simgrid::s4u::LinkInRoute::Direction>());
+  py::enum_<simgrid::s4u::LinkInRoute::Direction>(linkinroute, "Direction")
+      .value("UP", simgrid::s4u::LinkInRoute::Direction::UP)
+      .value("DOWN", simgrid::s4u::LinkInRoute::Direction::DOWN)
+      .value("NONE", simgrid::s4u::LinkInRoute::Direction::NONE)
+      .export_values();
+
+  /* Class Split-Duplex Link */
+  py::class_<simgrid::s4u::SplitDuplexLink, simgrid::s4u::Link,
+             std::unique_ptr<simgrid::s4u::SplitDuplexLink, py::nodelete>>(m, "SplitDuplexLink",
+                                                                           "Network split-duplex link")
+      .def("get_link_up", &simgrid::s4u::SplitDuplexLink::get_link_up, "Get link direction up")
+      .def("get_link_down", &simgrid::s4u::SplitDuplexLink::get_link_down, "Get link direction down");
 
   /* Class Mailbox */
   py::class_<simgrid::s4u::Mailbox, std::unique_ptr<Mailbox, py::nodelete>>(m, "Mailbox", "Mailbox")
@@ -254,12 +434,25 @@ PYBIND11_MODULE(simgrid, m)
             return data;
           },
           py::call_guard<GilScopedRelease>(), "Blocking data reception")
-      .def("set_receiver",
-        [](Mailbox* self, ActorPtr actor) {
-          self->set_receiver(actor);
-        },
-        py::call_guard<GilScopedRelease>(),
-        "Sets the actor as permanent receiver");
+      .def(
+          "get_async",
+          [](Mailbox* self) -> std::tuple<simgrid::s4u::CommPtr, PyGetAsync> {
+            PyGetAsync wrap;
+            auto comm = self->get_async(wrap.get());
+            return std::make_tuple(std::move(comm), std::move(wrap));
+          },
+          py::call_guard<GilScopedRelease>(),
+          "Non-blocking data reception. Use data.get() to get the python object after the communication has finished")
+      .def(
+          "set_receiver", [](Mailbox* self, ActorPtr actor) { self->set_receiver(actor); },
+          py::call_guard<GilScopedRelease>(), "Sets the actor as permanent receiver");
+
+  /* Class PyGetAsync */
+  py::class_<PyGetAsync>(m, "PyGetAsync", "Wrapper for async get communications")
+      .def(py::init<>())
+      .def(
+          "get", [](const PyGetAsync* self) { return py::reinterpret_steal<py::object>(*(self->get())); },
+          "Get python object after async communication in receiver side");
 
   /* Class Comm */
   py::class_<simgrid::s4u::Comm, simgrid::s4u::CommPtr>(m, "Comm", "Communication")
@@ -267,10 +460,25 @@ PYBIND11_MODULE(simgrid, m)
            "Test whether the communication is terminated.")
       .def("wait", &simgrid::s4u::Comm::wait, py::call_guard<GilScopedRelease>(),
            "Block until the completion of that communication.")
-      .def("wait_all", &simgrid::s4u::Comm::wait_all, py::call_guard<GilScopedRelease>(),
-           "Block until the completion of all communications in the list.")
-      .def("wait_any", &simgrid::s4u::Comm::wait_any, py::call_guard<GilScopedRelease>(),
-           "Block until the completion of any communication in the list and return the index of the terminated one.");
+      // use py::overload_cast for wait_all/wait_any, until the overload marked XBT_ATTRIB_DEPRECATED_v332 is removed
+      .def_static("wait_all",
+                  py::overload_cast<const std::vector<simgrid::s4u::CommPtr>&>(&simgrid::s4u::Comm::wait_all),
+                  py::call_guard<GilScopedRelease>(), "Block until the completion of all communications in the list.")
+      .def_static(
+          "wait_any", py::overload_cast<const std::vector<simgrid::s4u::CommPtr>&>(&simgrid::s4u::Comm::wait_any),
+          py::call_guard<GilScopedRelease>(),
+          "Block until the completion of any communication in the list and return the index of the terminated one.");
+
+  /* Class Io */
+  py::class_<simgrid::s4u::Io, simgrid::s4u::IoPtr>(m, "Io", "I/O activities")
+      .def("test", &simgrid::s4u::Io::test, py::call_guard<GilScopedRelease>(), "Test whether the I/O is terminated.")
+      .def("wait", &simgrid::s4u::Io::wait, py::call_guard<GilScopedRelease>(),
+           "Block until the completion of that I/O operation")
+      .def_static(
+          "wait_any_for", &simgrid::s4u::Io::wait_any_for, py::call_guard<GilScopedRelease>(),
+          "Block until the completion of any I/O in the list (or timeout) and return the index of the terminated one.")
+      .def_static("wait_any", &simgrid::s4u::Io::wait_any, py::call_guard<GilScopedRelease>(),
+                  "Block until the completion of any I/O in the list and return the index of the terminated one.");
 
   /* Class Exec */
   py::class_<simgrid::s4u::Exec, simgrid::s4u::ExecPtr>(m, "Exec", "Execution")
@@ -304,10 +512,10 @@ PYBIND11_MODULE(simgrid, m)
                                             "application")
       .def(
           "create",
-          [](py::str name, Host* host, py::object fun, py::args args) {
+          [](py::str name, Host* h, py::object fun, py::args args) {
             fun.inc_ref();  // FIXME: why is this needed for tests like exec-async, exec-dvfs and exec-remote?
             args.inc_ref(); // FIXME: why is this needed for tests like actor-migrate?
-            return simgrid::s4u::Actor::create(name, host, [fun, args]() {
+            return simgrid::s4u::Actor::create(name, h, [fun, args]() {
               GilScopedAcquire py_context;
               try {
                 fun(*args);
index bd70114..3323594 100644 (file)
@@ -41,11 +41,9 @@ XBT_PUBLIC void* mrealloc(xbt_mheap_t md, void* ptr, size_t size);
 /* Free a block allocated by `mmalloc', `mrealloc' or `mcalloc'.  */
 XBT_PUBLIC void mfree(xbt_mheap_t md, void* ptr);
 
-XBT_PUBLIC xbt_mheap_t xbt_mheap_new(int fd, void* baseaddr);
-
 #define XBT_MHEAP_OPTION_MEMSET 1
 
-XBT_PUBLIC xbt_mheap_t xbt_mheap_new_options(int fd, void* baseaddr, int options);
+XBT_PUBLIC xbt_mheap_t xbt_mheap_new(void* baseaddr, int options);
 
 XBT_PUBLIC void xbt_mheap_destroy_no_free(xbt_mheap_t md);
 
index a8df9b1..3c22b9b 100644 (file)
@@ -234,7 +234,7 @@ static void on_container_creation_paje(const Container& c)
             timestamp);
 
   stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::CreateContainer << " ";
-  stream << timestamp << " " << c.get_id() << " " << c.type_->get_id() << " " << c.father_->get_id() << " \"";
+  stream << timestamp << " " << c.get_id() << " " << c.get_type()->get_id() << " " << c.get_parent()->get_id() << " \"";
   if (c.get_name().find("rank-") != 0)
     stream << c.get_name() << "\"";
   else
@@ -256,7 +256,7 @@ static void on_container_destruction_paje(const Container& c)
               timestamp);
 
     stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::DestroyContainer << " ";
-    stream << timestamp << " " << c.type_->get_id() << " " << c.get_id();
+    stream << timestamp << " " << c.get_type()->get_id() << " " << c.get_id();
     XBT_DEBUG("Dump %s", stream.str().c_str());
     tracing_file << stream.str() << std::endl;
   }
@@ -306,7 +306,7 @@ static void on_entity_value_creation(const EntityValue& value)
   std::stringstream stream;
   XBT_DEBUG("%s: event_type=%u", __func__, static_cast<unsigned>(PajeEventType::DefineEntityValue));
   stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::DefineEntityValue;
-  stream << " " << value.get_id() << " " << value.get_father()->get_id() << " " << value.get_name();
+  stream << " " << value.get_id() << " " << value.get_parent()->get_id() << " " << value.get_name();
   if (not value.get_color().empty())
     stream << " \"" << value.get_color() << "\"";
   XBT_DEBUG("Dump %s", stream.str().c_str());
@@ -342,7 +342,7 @@ static void on_type_creation(const Type& type, PajeEventType event_type)
   std::stringstream stream;
   stream << std::fixed << std::setprecision(trace_precision);
   XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, static_cast<unsigned>(event_type), trace_precision, 0.);
-  stream << event_type << " " << type.get_id() << " " << type.get_father()->get_id() << " " << type.get_name();
+  stream << event_type << " " << type.get_id() << " " << type.get_parent()->get_id() << " " << type.get_name();
   if (type.is_colored())
     stream << " \"" << type.get_color() << "\"";
   XBT_DEBUG("Dump %s", stream.str().c_str());
@@ -354,7 +354,7 @@ static void on_link_type_creation(const Type& type, const Type& source, const Ty
   std::stringstream stream;
   XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, static_cast<unsigned>(PajeEventType::DefineLinkType),
             trace_precision, 0.);
-  stream << PajeEventType::DefineLinkType << " " << type.get_id() << " " << type.get_father()->get_id();
+  stream << PajeEventType::DefineLinkType << " " << type.get_id() << " " << type.get_parent()->get_id();
   stream << " " << source.get_id() << " " << dest.get_id() << " " << type.get_name();
   XBT_DEBUG("Dump %s", stream.str().c_str());
   tracing_file << stream.str() << std::endl;
@@ -423,7 +423,7 @@ static void on_simulation_end()
   last_timestamp_to_dump = surf_get_clock();
   dump_buffer(true);
 
-  const Type* root_type = Container::get_root()->type_;
+  const Type* root_type = Container::get_root()->get_type();
   /* destroy all data structures of tracing (and free) */
   delete Container::get_root();
   delete root_type;
index 245e609..a1b6da9 100644 (file)
@@ -147,7 +147,7 @@ void TRACE_declare_mark(const char *mark_type)
   }
 
   XBT_DEBUG("MARK,declare %s", mark_type);
-  simgrid::instr::Container::get_root()->type_->by_name_or_create<simgrid::instr::EventType>(mark_type);
+  simgrid::instr::Container::get_root()->get_type()->by_name_or_create<simgrid::instr::EventType>(mark_type);
   declared_marks.emplace(mark_type);
 }
 
@@ -175,8 +175,8 @@ void TRACE_declare_mark_value_with_color (const char *mark_type, const char *mar
   xbt_assert(mark_type, "mark_type is nullptr");
   xbt_assert(mark_value, "mark_value is nullptr");
 
-  simgrid::instr::EventType* type =
-      static_cast<simgrid::instr::EventType*>(simgrid::instr::Container::get_root()->type_->by_name(mark_type));
+  auto* type =
+      static_cast<simgrid::instr::EventType*>(simgrid::instr::Container::get_root()->get_type()->by_name(mark_type));
   if (not type) {
     throw simgrid::TracingError(XBT_THROW_POINT,
                                 simgrid::xbt::string_printf("mark_type with name (%s) is not declared", mark_type));
@@ -230,8 +230,8 @@ void TRACE_mark(const char *mark_type, const char *mark_value)
   xbt_assert(mark_value, "mark_value is nullptr");
 
   //check if mark_type is already declared
-  simgrid::instr::EventType* type =
-      static_cast<simgrid::instr::EventType*>(simgrid::instr::Container::get_root()->type_->by_name(mark_type));
+  auto* type =
+      static_cast<simgrid::instr::EventType*>(simgrid::instr::Container::get_root()->get_type()->by_name(mark_type));
   if (not type) {
     throw simgrid::TracingError(XBT_THROW_POINT,
                                 simgrid::xbt::string_printf("mark_type with name (%s) is not declared", mark_type));
@@ -257,7 +257,7 @@ xbt_dynar_t TRACE_get_marks ()
   return instr_set_to_dynar(declared_marks);
 }
 
-static void instr_user_variable(double time, const char* resource, const char* variable_name, const char* father_type,
+static void instr_user_variable(double time, const char* resource, const char* variable_name, const char* parent_type,
                                 double value, InstrUserVariable what, const char* color,
                                 std::set<std::string, std::less<>>* filter)
 {
@@ -270,7 +270,7 @@ static void instr_user_variable(double time, const char* resource, const char* v
   if (what == InstrUserVariable::DECLARE) {
     if (created == filter->end()) { // not declared yet
       filter->insert(variable_name);
-      instr_new_user_variable_type(father_type, variable_name, color == nullptr ? "" : color);
+      instr_new_user_variable_type(parent_type, variable_name, color == nullptr ? "" : color);
     }
   }else{
     if (created != filter->end()) { // declared, let's work
@@ -293,19 +293,19 @@ static void instr_user_variable(double time, const char* resource, const char* v
   }
 }
 
-static void instr_user_srcdst_variable(double time, const char *src, const char *dst, const char *variable,
-                              const char *father_type, double value, InstrUserVariable what)
+static void instr_user_srcdst_variable(double time, const char* src, const char* dst, const char* variable,
+                                       const char* parent_type, double value, InstrUserVariable what)
 {
-  simgrid::kernel::routing::NetPoint* src_elm = sg_netpoint_by_name_or_null(src);
+  const simgrid::kernel::routing::NetPoint* src_elm = sg_netpoint_by_name_or_null(src);
   xbt_assert(src_elm, "Element '%s' not found!", src);
 
-  simgrid::kernel::routing::NetPoint* dst_elm = sg_netpoint_by_name_or_null(dst);
+  const simgrid::kernel::routing::NetPoint* dst_elm = sg_netpoint_by_name_or_null(dst);
   xbt_assert(dst_elm, "Element '%s' not found!", dst);
 
   std::vector<simgrid::kernel::resource::LinkImpl*> route;
   simgrid::kernel::routing::NetZoneImpl::get_global_route(src_elm, dst_elm, route, nullptr);
   for (auto const& link : route)
-    instr_user_variable(time, link->get_cname(), variable, father_type, value, what, nullptr, &user_link_variables);
+    instr_user_variable(time, link->get_cname(), variable, parent_type, value, what, nullptr, &user_link_variables);
 }
 
 /** @ingroup TRACE_API
index f97d975..8442abd 100644 (file)
@@ -16,14 +16,14 @@ namespace instr {
 Container* Container::root_container_ = nullptr;              /* the root container */
 std::map<std::string, Container*, std::less<>> Container::all_containers_; /* all created containers indexed by name */
 
-NetZoneContainer::NetZoneContainer(const std::string& name, unsigned int level, NetZoneContainer* father)
-    : Container::Container(name, "", father)
+NetZoneContainer::NetZoneContainer(const std::string& name, unsigned int level, NetZoneContainer* parent)
+    : Container::Container(name, "", parent)
 {
   xbt_assert(s4u::Engine::get_instance()->netpoint_by_name_or_null(get_name()), "Element '%s' not found", get_cname());
-  if (father_) {
+  if (parent_) {
     std::string type_name = std::string("L") + std::to_string(level);
-    type_                 = father_->type_->by_name_or_create<ContainerType>(type_name);
-    father_->children_.insert({get_name(), this});
+    type_                 = parent_->type_->by_name_or_create<ContainerType>(type_name);
+    parent_->children_.insert({get_name(), this});
     on_creation(*this);
   } else {
     type_         = new ContainerType("0");
@@ -31,33 +31,33 @@ NetZoneContainer::NetZoneContainer(const std::string& name, unsigned int level,
   }
 }
 
-RouterContainer::RouterContainer(const std::string& name, Container* father)
-    : Container::Container(name, "ROUTER", father)
+RouterContainer::RouterContainer(const std::string& name, Container* parent)
+    : Container::Container(name, "ROUTER", parent)
 {
-  xbt_assert(father, "Only the Root container has no father");
+  xbt_assert(parent, "Only the Root container has no parent");
   xbt_assert(s4u::Engine::get_instance()->netpoint_by_name_or_null(get_name()), "Element '%s' not found", get_cname());
 }
 
-HostContainer::HostContainer(s4u::Host const& host, NetZoneContainer* father)
-    : Container::Container(host.get_name(), "HOST", father)
+HostContainer::HostContainer(s4u::Host const& host, NetZoneContainer* parent)
+    : Container::Container(host.get_name(), "HOST", parent)
 {
-  xbt_assert(father, "Only the Root container has no father");
+  xbt_assert(parent, "Only the Root container has no parent");
   xbt_assert(host.get_netpoint(), "Element '%s' not found", host.get_cname());
 }
 
-Container::Container(const std::string& name, const std::string& type_name, Container* father)
-    : name_(name), father_(father)
+Container::Container(const std::string& name, const std::string& type_name, Container* parent)
+    : name_(name), parent_(parent)
 {
   static long long int container_id = 0;
   id_                               = container_id; // id (or alias) of the container
   container_id++;
 
-  if (father_) {
-    XBT_DEBUG("new container %s, child of %s", get_cname(), father->get_cname());
+  if (parent_) {
+    XBT_DEBUG("new container %s, child of %s", get_cname(), parent->get_cname());
 
     if (not type_name.empty()) {
-      type_ = father_->type_->by_name_or_create<ContainerType>(type_name);
-      father_->children_.insert({name_, this});
+      type_ = parent_->type_->by_name_or_create<ContainerType>(type_name);
+      parent_->children_.insert({name_, this});
       on_creation(*this);
     }
   }
@@ -108,9 +108,9 @@ Container* Container::by_name(const std::string& name)
 
 void Container::remove_from_parent()
 {
-  if (father_) {
-    XBT_DEBUG("removeChildContainer (%s) FromContainer (%s) ", get_cname(), father_->get_cname());
-    father_->children_.erase(name_);
+  if (parent_) {
+    XBT_DEBUG("removeChildContainer (%s) FromContainer (%s) ", get_cname(), parent_->get_cname());
+    parent_->children_.erase(name_);
   }
   delete this;
 }
@@ -130,8 +130,8 @@ VariableType* Container::get_variable(const std::string& name)
   return static_cast<VariableType*>(type_->by_name(name)->set_calling_container(this));
 }
 
-EntityValue::EntityValue(const std::string& name, const std::string& color, Type* father)
-    : name_(name), color_(color), father_(father)
+EntityValue::EntityValue(const std::string& name, const std::string& color, Type* parent)
+    : name_(name), color_(color), parent_(parent)
 {
   on_creation(*this);
 }
index 3ab8fe8..8ce3d7f 100644 (file)
@@ -17,11 +17,15 @@ class StateType;
 class VariableType;
 
 class Container {
+  friend class NetZoneContainer;
   static Container* root_container_;
   static std::map<std::string, Container*, std::less<>> all_containers_;
 
   long long int id_;
   std::string name_; /* Unique name of this container */
+  Type* type_;       /* Type of this container */
+  Container* parent_;
+  std::map<std::string, Container*, std::less<>> children_;
 
 protected:
   static void set_root(Container* root) { root_container_ = root; }
@@ -30,14 +34,11 @@ public:
   static xbt::signal<void(Container const&)> on_creation;
   static xbt::signal<void(Container const&)> on_destruction;
 
-  explicit Container(const std::string& name, const std::string& type_name, Container* father);
+  explicit Container(const std::string& name, const std::string& type_name, Container* parent);
   Container(const Container&) = delete;
   Container& operator=(const Container&) = delete;
   virtual ~Container();
 
-  Type* type_; /* Type of this container */
-  Container* father_;
-  std::map<std::string, Container*, std::less<>> children_;
 
   static Container* by_name_or_null(const std::string& name);
   static Container* by_name(const std::string& name);
@@ -46,26 +47,29 @@ public:
   long long int get_id() const { return id_; }
   void remove_from_parent();
 
+  Container* get_parent() const { return parent_; }
+  Type* get_type() const { return type_; }
   StateType* get_state(const std::string& name);
   LinkType* get_link(const std::string& name);
   VariableType* get_variable(const std::string& name);
   void create_child(const std::string& name, const std::string& type_name);
+  Container* get_child_by_name(const std::string& name) const { return children_.at(name); }
   static Container* get_root() { return root_container_; }
 };
 
 class NetZoneContainer : public Container {
 public:
-  NetZoneContainer(const std::string& name, unsigned int level, NetZoneContainer* father);
+  NetZoneContainer(const std::string& name, unsigned int level, NetZoneContainer* parent);
 };
 
 class RouterContainer : public Container {
 public:
-  RouterContainer(const std::string& name, Container* father);
+  RouterContainer(const std::string& name, Container* parent);
 };
 
 class HostContainer : public Container {
 public:
-  HostContainer(s4u::Host const& host, NetZoneContainer* father);
+  HostContainer(s4u::Host const& host, NetZoneContainer* parent);
 };
 } // namespace instr
 } // namespace simgrid
index 26658b9..41f66c9 100644 (file)
@@ -19,15 +19,15 @@ long long int new_paje_id()
 }
 
 Type::Type(PajeEventType event_type, const std::string& name, const std::string& alias, const std::string& color,
-           Type* father)
-    : name_(name), color_(color), father_(father)
+           Type* parent)
+    : name_(name), color_(color), parent_(parent)
 {
   if (name_.empty() || alias.empty())
     throw TracingError(XBT_THROW_POINT, "can't create a new type with no name or alias");
 
-  if (father != nullptr){
-    father->children_[alias].reset(this);
-    XBT_DEBUG("new type %s, child of %s", get_cname(), father->get_cname());
+  if (parent != nullptr) {
+    parent->children_[alias].reset(this);
+    XBT_DEBUG("new type %s, child of %s", get_cname(), parent->get_cname());
     on_creation(*this, event_type);
   }
 }
@@ -119,7 +119,7 @@ Type* Type::by_name(const std::string& name)
     }
   }
   if (ret == nullptr)
-    throw TracingError(XBT_THROW_POINT, xbt::string_printf("type with name (%s) not found in father type (%s)",
+    throw TracingError(XBT_THROW_POINT, xbt::string_printf("type with name (%s) not found in parent type (%s)",
                                                            name.c_str(), get_cname()));
   return ret;
 }
@@ -145,7 +145,7 @@ EntityValue* ValueType::get_entity_value(const std::string& name)
 {
   auto ret = values_.find(name);
   if (ret == values_.end()) {
-    throw TracingError(XBT_THROW_POINT, xbt::string_printf("value with name (%s) not found in father type (%s)",
+    throw TracingError(XBT_THROW_POINT, xbt::string_printf("value with name (%s) not found in parent type (%s)",
                                                            name.c_str(), get_cname()));
   }
   return &ret->second;
index a5e31d4..b30eb76 100644 (file)
@@ -22,7 +22,7 @@ class Type {
   long long int id_ = new_paje_id();
   std::string name_;
   std::string color_;
-  Type* father_;
+  Type* parent_;
   std::map<std::string, std::unique_ptr<Type>, std::less<>> children_;
   Container* issuer_ = nullptr;
 
@@ -33,14 +33,14 @@ public:
   static xbt::signal<void(Type const&, PajeEventType event_type)> on_creation;
 
   Type(PajeEventType event_type, const std::string& name, const std::string& alias, const std::string& color,
-       Type* father);
+       Type* parent);
   virtual ~Type() = default;
 
   long long int get_id() const { return id_; }
   const std::string& get_name() const { return name_; }
   const char* get_cname() const { return name_.c_str(); }
   const std::string& get_color() const { return color_; }
-  Type* get_father() const { return father_; }
+  Type* get_parent() const { return parent_; }
   const std::map<std::string, std::unique_ptr<Type>, std::less<>>& get_children() const { return children_; }
   bool is_colored() const { return not color_.empty(); }
 
@@ -64,15 +64,15 @@ public:
 class ContainerType : public Type {
 public:
   explicit ContainerType(const std::string& name) : Type(PajeEventType::DefineContainerType, name, name, "", nullptr){};
-  ContainerType(const std::string& name, Type* father)
-      : Type(PajeEventType::DefineContainerType, name, name, "", father){};
+  ContainerType(const std::string& name, Type* parent)
+      : Type(PajeEventType::DefineContainerType, name, name, "", parent){};
 };
 
 class VariableType : public Type {
   std::vector<VariableEvent*> events_;
 public:
-  VariableType(const std::string& name, const std::string& color, Type* father)
-      : Type(PajeEventType::DefineVariableType, name, name, color, father)
+  VariableType(const std::string& name, const std::string& color, Type* parent)
+      : Type(PajeEventType::DefineVariableType, name, name, color, parent)
   {
   }
   void instr_event(double now, double delta, const char* resource, double value);
@@ -84,10 +84,10 @@ public:
 class ValueType : public Type {
 public:
   std::map<std::string, EntityValue, std::less<>> values_;
-  ValueType(PajeEventType event_type, const std::string& name, const std::string& alias, Type* father)
-      : Type(event_type, name, alias, "", father){};
-  ValueType(PajeEventType event_type, const std::string& name, Type* father)
-      : Type(event_type, name, name, "", father){};
+  ValueType(PajeEventType event_type, const std::string& name, const std::string& alias, Type* parent)
+      : Type(event_type, name, alias, "", parent){};
+  ValueType(PajeEventType event_type, const std::string& name, Type* parent)
+      : Type(event_type, name, name, "", parent){};
   void add_entity_value(const std::string& name, const std::string& color);
   void add_entity_value(const std::string& name);
   EntityValue* get_entity_value(const std::string& name);
@@ -96,8 +96,8 @@ public:
 class LinkType : public ValueType {
 public:
   static xbt::signal<void(LinkType const&, Type const&, Type const&)> on_creation;
-  LinkType(const std::string& name, const Type* source, const Type* dest, const std::string& alias, Type* father)
-      : ValueType(PajeEventType::DefineLinkType, name, alias, father)
+  LinkType(const std::string& name, const Type* source, const Type* dest, const std::string& alias, Type* parent)
+      : ValueType(PajeEventType::DefineLinkType, name, alias, parent)
   {
     on_creation(*this, *source, *dest);
   }
@@ -108,13 +108,13 @@ public:
 
 class EventType : public ValueType {
 public:
-  EventType(const std::string& name, Type* father) : ValueType(PajeEventType::DefineEventType, name, father) {}
+  EventType(const std::string& name, Type* parent) : ValueType(PajeEventType::DefineEventType, name, parent) {}
 };
 
 class StateType : public ValueType {
   std::vector<StateEvent*> events_;
 public:
-  StateType(const std::string& name, Type* father) : ValueType(PajeEventType::DefineStateType, name, father) {}
+  StateType(const std::string& name, Type* parent) : ValueType(PajeEventType::DefineStateType, name, parent) {}
   void set_event(const std::string& value_name);
   void push_event(const std::string& value_name);
   void push_event(const std::string& value_name, TIData* extra);
index 9b3fa1e..ee9d3f9 100644 (file)
@@ -16,17 +16,17 @@ class EntityValue {
   long long int id_ = new_paje_id();
   std::string name_;
   std::string color_;
-  Type* father_;
+  Type* parent_;
 
 public:
   static xbt::signal<void(const EntityValue&)> on_creation;
-  explicit EntityValue(const std::string& name, const std::string& color, Type* father);
+  explicit EntityValue(const std::string& name, const std::string& color, Type* parent);
 
   long long int get_id() const { return id_; }
   std::string get_name() const { return name_; }
   const char* get_cname() const { return name_.c_str(); }
   std::string get_color() const { return color_; }
-  Type* get_father() const { return father_; }
+  Type* get_parent() const { return parent_; }
 };
 } // namespace instr
 } // namespace simgrid
index 3d81743..81e64bb 100644 (file)
@@ -33,17 +33,17 @@ static simgrid::instr::Container* lowestCommonAncestor(const simgrid::instr::Con
                                                        const simgrid::instr::Container* a2)
 {
   // this is only an optimization (since most of a1 and a2 share the same parent)
-  if (a1->father_ == a2->father_)
-    return a1->father_;
+  if (a1->get_parent() == a2->get_parent())
+    return a1->get_parent();
 
   // create an array with all ancestors of a1
   std::vector<simgrid::instr::Container*> ancestors_a1;
-  for (auto* p = a1->father_; p != nullptr; p = p->father_)
+  for (auto* p = a1->get_parent(); p != nullptr; p = p->get_parent())
     ancestors_a1.push_back(p);
 
   // create an array with all ancestors of a2
   std::vector<simgrid::instr::Container*> ancestors_a2;
-  for (auto* p = a2->father_; p != nullptr; p = p->father_)
+  for (auto* p = a2->get_parent(); p != nullptr; p = p->get_parent())
     ancestors_a2.push_back(p);
 
   // find the lowest ancestor
@@ -73,9 +73,9 @@ static void linkContainers(simgrid::instr::Container* src, simgrid::instr::Conta
     return;
   }
 
-  // find common father
-  simgrid::instr::Container* father = lowestCommonAncestor(src, dst);
-  xbt_assert(father, "common father unknown, this is a tracing problem");
+  // find common parent
+  simgrid::instr::Container* parent = lowestCommonAncestor(src, dst);
+  xbt_assert(parent, "common parent unknown, this is a tracing problem");
 
   // check if we already register this pair (we only need one direction)
   std::string aux1 = src->get_name() + dst->get_name();
@@ -94,11 +94,12 @@ static void linkContainers(simgrid::instr::Container* src, simgrid::instr::Conta
   filter->insert(aux2);
 
   // declare type
-  std::string link_typename = father->type_->get_name() + "-" + src->type_->get_name() +
-                              std::to_string(src->type_->get_id()) + "-" + dst->type_->get_name() +
-                              std::to_string(dst->type_->get_id());
-  simgrid::instr::LinkType* link = father->type_->by_name_or_create(link_typename, src->type_, dst->type_);
-  link->set_calling_container(father);
+  std::string link_typename = parent->get_type()->get_name() + "-" + src->get_type()->get_name() +
+                              std::to_string(src->get_type()->get_id()) + "-" + dst->get_type()->get_name() +
+                              std::to_string(dst->get_type()->get_id());
+  simgrid::instr::LinkType* link =
+      parent->get_type()->by_name_or_create(link_typename, src->get_type(), dst->get_type());
+  link->set_calling_container(parent);
 
   // create the link
   static long long counter = 0;
@@ -112,7 +113,7 @@ static void linkContainers(simgrid::instr::Container* src, simgrid::instr::Conta
   XBT_DEBUG("  linkContainers %s <-> %s", src->get_cname(), dst->get_cname());
 }
 
-static void recursiveGraphExtraction(const simgrid::s4u::NetZone* netzone, simgrid::instr::Container* container,
+static void recursiveGraphExtraction(const simgrid::s4u::NetZone* netzone, const simgrid::instr::Container* container,
                                      std::set<std::string, std::less<>>* filter)
 {
   if (not TRACE_platform_topology()) {
@@ -120,12 +121,11 @@ static void recursiveGraphExtraction(const simgrid::s4u::NetZone* netzone, simgr
     return;
   }
   XBT_DEBUG("Graph extraction for NetZone = %s", netzone->get_cname());
-  if (not netzone->get_children().empty()) {
-    // bottom-up recursion
-    for (auto const& nz_son : netzone->get_children()) {
-      simgrid::instr::Container* child_container = container->children_.at(nz_son->get_name());
-      recursiveGraphExtraction(nz_son, child_container, filter);
-    }
+
+  // bottom-up recursion
+  for (auto const& nz_son : netzone->get_children()) {
+    const simgrid::instr::Container* child_container = container->get_child_by_name(nz_son->get_name());
+    recursiveGraphExtraction(nz_son, child_container, filter);
   }
 
   auto* graph = xbt_graph_new_graph(0, nullptr);
@@ -160,38 +160,38 @@ static void recursiveNewVariableType(const std::string& new_typename, const std:
 
 void instr_new_variable_type(const std::string& new_typename, const std::string& color)
 {
-  recursiveNewVariableType(new_typename, color, simgrid::instr::Container::get_root()->type_);
+  recursiveNewVariableType(new_typename, color, simgrid::instr::Container::get_root()->get_type());
 }
 
-static void recursiveNewUserVariableType(const std::string& father_type, const std::string& new_typename,
+static void recursiveNewUserVariableType(const std::string& parent_type, const std::string& new_typename,
                                          const std::string& color, simgrid::instr::Type* root)
 {
-  if (root->get_name() == father_type) {
+  if (root->get_name() == parent_type) {
     root->by_name_or_create(new_typename, color);
   }
   for (auto const& elm : root->get_children())
-    recursiveNewUserVariableType(father_type, new_typename, color, elm.second.get());
+    recursiveNewUserVariableType(parent_type, new_typename, color, elm.second.get());
 }
 
-void instr_new_user_variable_type(const std::string& father_type, const std::string& new_typename,
+void instr_new_user_variable_type(const std::string& parent_type, const std::string& new_typename,
                                   const std::string& color)
 {
-  recursiveNewUserVariableType(father_type, new_typename, color, simgrid::instr::Container::get_root()->type_);
+  recursiveNewUserVariableType(parent_type, new_typename, color, simgrid::instr::Container::get_root()->get_type());
 }
 
-static void recursiveNewUserStateType(const std::string& father_type, const std::string& new_typename,
+static void recursiveNewUserStateType(const std::string& parent_type, const std::string& new_typename,
                                       simgrid::instr::Type* root)
 {
-  if (root->get_name() == father_type)
+  if (root->get_name() == parent_type)
     root->by_name_or_create<simgrid::instr::StateType>(new_typename);
 
   for (auto const& elm : root->get_children())
-    recursiveNewUserStateType(father_type, new_typename, elm.second.get());
+    recursiveNewUserStateType(parent_type, new_typename, elm.second.get());
 }
 
-void instr_new_user_state_type(const std::string& father_type, const std::string& new_typename)
+void instr_new_user_state_type(const std::string& parent_type, const std::string& new_typename)
 {
-  recursiveNewUserStateType(father_type, new_typename, simgrid::instr::Container::get_root()->type_);
+  recursiveNewUserStateType(parent_type, new_typename, simgrid::instr::Container::get_root()->get_type());
 }
 
 static void recursiveNewValueForUserStateType(const std::string& type_name, const char* val, const std::string& color,
@@ -206,7 +206,7 @@ static void recursiveNewValueForUserStateType(const std::string& type_name, cons
 
 void instr_new_value_for_user_state_type(const std::string& type_name, const char* value, const std::string& color)
 {
-  recursiveNewValueForUserStateType(type_name, value, color, simgrid::instr::Container::get_root()->type_);
+  recursiveNewValueForUserStateType(type_name, value, color, simgrid::instr::Container::get_root()->get_type());
 }
 
 namespace simgrid {
@@ -260,11 +260,11 @@ static void on_netzone_creation(s4u::NetZone const& netzone)
     xbt_assert(Container::get_root() == root);
 
     if (TRACE_smpi_is_enabled()) {
-      auto* mpi = root->type_->by_name_or_create<ContainerType>("MPI");
+      auto* mpi = root->get_type()->by_name_or_create<ContainerType>("MPI");
       if (not TRACE_smpi_is_grouped())
         mpi->by_name_or_create<StateType>("MPI_STATE");
-      root->type_->by_name_or_create("MPI_LINK", mpi, mpi);
-      root->type_->by_name_or_create("MIGRATE_LINK", mpi, mpi);
+      root->get_type()->by_name_or_create("MPI_LINK", mpi, mpi);
+      root->get_type()->by_name_or_create("MIGRATE_LINK", mpi, mpi);
       mpi->by_name_or_create<StateType>("MIGRATE_STATE");
     }
 
@@ -289,16 +289,16 @@ static void on_link_creation(s4u::Link const& link)
   auto* container = new Container(link.get_name(), "LINK", currentContainer.back());
 
   if ((TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) && (not TRACE_disable_link())) {
-    VariableType* bandwidth = container->type_->by_name_or_create("bandwidth", "");
+    VariableType* bandwidth = container->get_type()->by_name_or_create("bandwidth", "");
     bandwidth->set_calling_container(container);
     bandwidth->set_event(0, link.get_bandwidth());
-    VariableType* latency = container->type_->by_name_or_create("latency", "");
+    VariableType* latency = container->get_type()->by_name_or_create("latency", "");
     latency->set_calling_container(container);
     latency->set_event(0, link.get_latency());
   }
 
   if (TRACE_uncategorized()) {
-    container->type_->by_name_or_create("bandwidth_used", "0.5 0.5 0.5");
+    container->get_type()->by_name_or_create("bandwidth_used", "0.5 0.5 0.5");
   }
 }
 
@@ -311,22 +311,22 @@ static void on_host_creation(s4u::Host const& host)
   const Container* root = Container::get_root();
 
   if ((TRACE_categorized() || TRACE_uncategorized() || TRACE_platform()) && (not TRACE_disable_speed())) {
-    VariableType* speed = container->type_->by_name_or_create("speed", "");
+    VariableType* speed = container->get_type()->by_name_or_create("speed", "");
     speed->set_calling_container(container);
     speed->set_event(0, host.get_speed());
 
-    VariableType* cores = container->type_->by_name_or_create("core_count", "");
+    VariableType* cores = container->get_type()->by_name_or_create("core_count", "");
     cores->set_calling_container(container);
     cores->set_event(0, host.get_core_count());
   }
 
   if (TRACE_uncategorized())
-    container->type_->by_name_or_create("speed_used", "0.5 0.5 0.5");
+    container->get_type()->by_name_or_create("speed_used", "0.5 0.5 0.5");
 
   if (TRACE_smpi_is_enabled() && TRACE_smpi_is_grouped()) {
-    auto* mpi = container->type_->by_name_or_create<ContainerType>("MPI");
+    auto* mpi = container->get_type()->by_name_or_create<ContainerType>("MPI");
     mpi->by_name_or_create<StateType>("MPI_STATE");
-    root->type_->by_name_or_create("MIGRATE_LINK", mpi, mpi);
+    root->get_type()->by_name_or_create("MIGRATE_LINK", mpi, mpi);
     mpi->by_name_or_create<StateType>("MIGRATE_STATE");
   }
 }
@@ -337,7 +337,7 @@ static void on_action_state_change(kernel::resource::Action const& action,
   auto n = static_cast<unsigned>(action.get_variable()->get_number_of_constraint());
 
   for (unsigned i = 0; i < n; i++) {
-    double value = action.get_variable()->get_value() * action.get_variable()->get_constraint_weight(i);
+    double value = action.get_rate() * action.get_variable()->get_constraint_weight(i);
     /* Beware of composite actions: ptasks put links and cpus together. Extra pb: we cannot dynamic_cast from void* */
     kernel::resource::Resource* resource = action.get_variable()->get_constraint(i)->get_id();
     const kernel::resource::CpuImpl* cpu = dynamic_cast<kernel::resource::CpuImpl*>(resource);
@@ -371,14 +371,14 @@ static void on_actor_creation(s4u::Actor const& actor)
   std::string container_name = instr_pid(actor);
 
   container->create_child(container_name, "ACTOR");
-  auto* actor_type = container->type_->by_name_or_create<ContainerType>("ACTOR");
+  auto* actor_type = container->get_type()->by_name_or_create<ContainerType>("ACTOR");
   auto* state      = actor_type->by_name_or_create<StateType>("ACTOR_STATE");
   state->add_entity_value("suspend", "1 0 1");
   state->add_entity_value("sleep", "1 1 0");
   state->add_entity_value("receive", "1 0 0");
   state->add_entity_value("send", "0 0 1");
   state->add_entity_value("execute", "0 1 1");
-  root->type_->by_name_or_create("ACTOR_LINK", actor_type, actor_type);
+  root->get_type()->by_name_or_create("ACTOR_LINK", actor_type, actor_type);
 
   actor.on_exit([container_name](bool failed) {
     if (failed)
@@ -408,15 +408,15 @@ static void on_vm_creation(s4u::Host const& host)
 {
   const Container* container = new HostContainer(host, currentContainer.back());
   const Container* root      = Container::get_root();
-  auto* vm                   = container->type_->by_name_or_create<ContainerType>("VM");
+  auto* vm                   = container->get_type()->by_name_or_create<ContainerType>("VM");
   auto* state                = vm->by_name_or_create<StateType>("VM_STATE");
   state->add_entity_value("suspend", "1 0 1");
   state->add_entity_value("sleep", "1 1 0");
   state->add_entity_value("receive", "1 0 0");
   state->add_entity_value("send", "0 0 1");
   state->add_entity_value("execute", "0 1 1");
-  root->type_->by_name_or_create("VM_LINK", vm, vm);
-  root->type_->by_name_or_create("VM_ACTOR_LINK", vm, vm);
+  root->get_type()->by_name_or_create("VM_LINK", vm, vm);
+  root->get_type()->by_name_or_create("VM_ACTOR_LINK", vm, vm);
 }
 
 void define_callbacks()
index 41f0467..f860972 100644 (file)
@@ -154,16 +154,16 @@ public:
 // VarCollTI: gatherv, scatterv, allgatherv, alltoallv (+ reducescatter out of laziness)
 class VarCollTIData : public TIData {
   int root_;
-  size_t send_size_;
+  long int send_size_;
   std::shared_ptr<std::vector<int>> sendcounts_;
-  size_t recv_size_;
+  long int recv_size_;
   std::shared_ptr<std::vector<int>> recvcounts_;
   std::string send_type_;
   std::string recv_type_;
 
 public:
-  VarCollTIData(const std::string& name, int root, size_t send_size, std::shared_ptr<std::vector<int>> sendcounts,
-                size_t recv_size, std::shared_ptr<std::vector<int>> recvcounts, const std::string& send_type,
+  VarCollTIData(const std::string& name, int root, long int send_size, std::shared_ptr<std::vector<int>> sendcounts,
+                long int recv_size, std::shared_ptr<std::vector<int>> recvcounts, const std::string& send_type,
                 const std::string& recv_type)
       : TIData(name)
       , root_(root)
@@ -178,12 +178,12 @@ public:
   {
     std::stringstream stream;
     stream << get_name() << " ";
-    if (send_size_ > 0)
+    if (send_size_ > -1)
       stream << send_size_ << " ";
     if (sendcounts_ != nullptr)
       for (auto count : *sendcounts_)
         stream << count << " ";
-    if (recv_size_ > 0)
+    if (recv_size_ > -1)
       stream << recv_size_ << " ";
     if (recvcounts_ != nullptr)
       for (auto count : *recvcounts_)
@@ -265,9 +265,9 @@ XBT_PUBLIC bool TRACE_smpi_view_internals();
 
 /* instr_paje.c */
 void instr_new_variable_type(const std::string& new_typename, const std::string& color);
-void instr_new_user_variable_type(const std::string& father_type, const std::string& new_typename,
+void instr_new_user_variable_type(const std::string& parent_type, const std::string& new_typename,
                                   const std::string& color);
-void instr_new_user_state_type(const std::string& father_type, const std::string& new_typename);
+void instr_new_user_state_type(const std::string& parent_type, const std::string& new_typename);
 void instr_new_value_for_user_state_type(const std::string& new_typename, const char* value, const std::string& color);
 
 XBT_PRIVATE void TRACE_help();
index 05a7b40..00f78da 100644 (file)
@@ -36,7 +36,7 @@ void Container::add_child(jed_container_t child)
   child->set_parent(this);
 }
 
-void Container::add_resources(std::vector<sg_host_t> hosts)
+void Container::add_resources(const std::vector<sg_host_t>& hosts)
 {
   children_.clear();
   last_id_ = 0;
@@ -144,7 +144,7 @@ void Container::print(FILE* jed_file)
 } // namespace jedule
 } // namespace simgrid
 
-static void add_subsets_to(std::vector<simgrid::jedule::Subset>& subset_list, std::vector<const char*> hostgroup,
+static void add_subsets_to(std::vector<simgrid::jedule::Subset>& subset_list, const std::vector<const char*>& hostgroup,
                            jed_container_t parent)
 {
   // get ids for each host
index 2b9f234..5fcf594 100644 (file)
 #include "src/surf/network_interface.hpp"
 #include "src/surf/xml/platf.hpp" // FIXME: KILLME. There must be a better way than mimicking XML here
 
+#include <boost/algorithm/string/predicate.hpp>
+#ifndef _WIN32
+#include <dlfcn.h>
+#endif /* _WIN32 */
+
 XBT_LOG_NEW_DEFAULT_CATEGORY(ker_engine, "Logging specific to Engine (kernel)");
 
 namespace simgrid {
@@ -109,6 +114,32 @@ EngineImpl::~EngineImpl()
   xbt_dynar_free(&actors_vector_);
   xbt_dynar_free(&dead_actors_vector_);
 #endif
+  /* clear models before freeing handle, network models can use external callback defined in the handle */
+  models_prio_.clear();
+}
+
+void EngineImpl::load_platform(const std::string& platf)
+{
+  double start = xbt_os_time();
+  if (boost::algorithm::ends_with(platf, ".so") or boost::algorithm::ends_with(platf, ".dylib")) {
+#ifdef _WIN32
+    xbt_die("loading platform through shared library isn't supported on windows");
+#else
+    void* handle = dlopen(platf.c_str(), RTLD_LAZY);
+    xbt_assert(handle, "Impossible to open platform file: %s", platf.c_str());
+    platf_handle_           = std::unique_ptr<void, std::function<int(void*)>>(handle, dlclose);
+    using load_fct_t = void (*)(const simgrid::s4u::Engine&);
+    auto callable           = (load_fct_t)dlsym(platf_handle_.get(), "load_platform");
+    const char* dlsym_error = dlerror();
+    xbt_assert(not dlsym_error, "Error: %s", dlsym_error);
+    callable(*simgrid::s4u::Engine::get_instance());
+#endif /* _WIN32 */
+  } else {
+    parse_platform_file(platf);
+  }
+
+  double end = xbt_os_time();
+  XBT_DEBUG("PARSE TIME: %g", (end - start));
 }
 
 void EngineImpl::load_deployment(const std::string& file) const
@@ -144,6 +175,11 @@ void EngineImpl::add_model(std::shared_ptr<resource::Model> model, const std::ve
   models_prio_[model_name] = std::move(model);
 }
 
+void EngineImpl::add_split_duplex_link(const std::string& name, std::unique_ptr<resource::SplitDuplexLinkImpl> link)
+{
+  split_duplex_links_[name] = std::move(link);
+}
+
 /** Wake up all actors waiting for a Surf action to finish */
 void EngineImpl::wake_all_waiting_actors() const
 {
@@ -194,11 +230,10 @@ actor::ActorImpl* EngineImpl::get_actor_by_pid(aid_t pid)
 /** Execute all the tasks that are queued, e.g. `.then()` callbacks of futures. */
 bool EngineImpl::execute_tasks()
 {
-  xbt_assert(tasksTemp.empty());
-
   if (tasks.empty())
     return false;
 
+  std::vector<xbt::Task<void()>> tasksTemp;
   do {
     // We don't want the callbacks to modify the vector we are iterating over:
     tasks.swap(tasksTemp);
@@ -289,6 +324,7 @@ void EngineImpl::run()
 {
   if (MC_record_replay_is_active()) {
     mc::replay(MC_record_path());
+    empty_trash();
     return;
   }
 
index 3a32bc9..a775191 100644 (file)
@@ -19,6 +19,7 @@
 #include "src/kernel/activity/SleepImpl.hpp"
 #include "src/kernel/activity/SynchroRaw.hpp"
 #include "src/kernel/actor/ActorImpl.hpp"
+#include "src/surf/SplitDuplexLinkImpl.hpp"
 
 #include <boost/intrusive/list.hpp>
 #include <map>
@@ -34,6 +35,9 @@ namespace kernel {
 class EngineImpl {
   std::map<std::string, s4u::Host*, std::less<>> hosts_;
   std::map<std::string, resource::LinkImpl*, std::less<>> links_;
+  /* save split-duplex links separately, keep links_ with only LinkImpl* seen by the user
+   * members of a split-duplex are saved in the links_ */
+  std::map<std::string, std::unique_ptr<resource::SplitDuplexLinkImpl>, std::less<>> split_duplex_links_;
   std::unordered_map<std::string, routing::NetPoint*> netpoints_;
   std::unordered_map<std::string, activity::MailboxImpl*> mailboxes_;
 
@@ -64,11 +68,11 @@ class EngineImpl {
 #endif
 
   std::vector<xbt::Task<void()>> tasks;
-  std::vector<xbt::Task<void()>> tasksTemp;
 
   std::mutex mutex_;
   static EngineImpl* instance_;
 
+  std::unique_ptr<void, std::function<int(void*)>> platf_handle_; //!< handle for platform library
   friend s4u::Engine;
 
 public:
@@ -82,6 +86,7 @@ public:
   static void shutdown();
 #endif
 
+  void load_platform(const std::string& platf);
   void load_deployment(const std::string& file) const;
   void register_function(const std::string& name, const actor::ActorCodeFactory& code);
   void register_default(const actor::ActorCodeFactory& code);
@@ -122,6 +127,7 @@ public:
   actor::ActorImpl* get_actor_by_pid(aid_t pid);
   void add_actor(aid_t pid, actor::ActorImpl* actor) { actor_list_[pid] = actor; }
   void remove_actor(aid_t pid) { actor_list_.erase(pid); }
+  void add_split_duplex_link(const std::string& name, std::unique_ptr<resource::SplitDuplexLinkImpl> link);
 
 #if SIMGRID_HAVE_MC
   xbt_dynar_t get_actors_vector() const { return actors_vector_; }
index edd3e5f..b6726fa 100644 (file)
@@ -55,11 +55,11 @@ XBT_PRIVATE simgrid::kernel::activity::ActivityImplPtr simcall_HANDLER_comm_isen
   if (not other_comm) {
     other_comm = std::move(this_comm);
 
-    if (mbox->permanent_receiver_ != nullptr) {
+    if (mbox->is_permanent()) {
       // this mailbox is for small messages, which have to be sent right now
       other_comm->state_     = simgrid::kernel::activity::State::READY;
-      other_comm->dst_actor_ = mbox->permanent_receiver_.get();
-      mbox->done_comm_queue_.push_back(other_comm);
+      other_comm->dst_actor_ = mbox->get_permanent_receiver().get();
+      mbox->push_done(other_comm);
       XBT_DEBUG("pushing a message into the permanent receive list %p, comm %p", mbox, other_comm.get());
 
     } else {
@@ -119,7 +119,7 @@ simcall_HANDLER_comm_irecv(smx_simcall_t /*simcall*/, smx_actor_t receiver, smx_
 
   simgrid::kernel::activity::CommImplPtr other_comm;
   // communication already done, get it inside the list of completed comms
-  if (mbox->permanent_receiver_ != nullptr && not mbox->done_comm_queue_.empty()) {
+  if (mbox->is_permanent() && mbox->has_some_done_comm()) {
     XBT_DEBUG("We have a comm that has probably already been received, trying to match it, to skip the communication");
     // find a match in the list of already received comms
     other_comm = mbox->find_matching_comm(simgrid::kernel::activity::CommImpl::Type::SEND, match_fun, data,
@@ -150,7 +150,7 @@ simcall_HANDLER_comm_irecv(smx_simcall_t /*simcall*/, smx_actor_t receiver, smx_
                                           /*remove_matching*/ true);
 
     if (other_comm == nullptr) {
-      XBT_DEBUG("Receive pushed first (%zu comm enqueued so far)", mbox->comm_queue_.size());
+      XBT_DEBUG("Receive pushed first (%zu comm enqueued so far)", mbox->size());
       other_comm = std::move(this_synchro);
       mbox->push(other_comm);
     } else {
@@ -190,7 +190,7 @@ bool simcall_HANDLER_comm_test(smx_simcall_t, simgrid::kernel::activity::CommImp
   return comm->test();
 }
 
-int simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count)
+ssize_t simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comms[], size_t count)
 {
   std::vector<simgrid::kernel::activity::CommImpl*> comms_vec(comms, comms + count);
   return simgrid::kernel::activity::CommImpl::test_any(simcall->issuer_, comms_vec);
@@ -306,9 +306,9 @@ CommImpl* CommImpl::start()
     from_ = from_ != nullptr ? from_ : src_actor_->get_host();
     to_   = to_ != nullptr ? to_ : dst_actor_->get_host();
 
-    /* FIXME[donassolo]: getting the network_model from the origin host
-     * Soon we need to change this function to first get the routes and later
-     * create the respective surf actions */
+    /* Getting the network_model from the origin host
+     * Valid while we have a single network model, otherwise we would need to change this function to first get the
+     * routes and later create the respective surf actions */
     auto net_model = from_->get_netpoint()->get_englobing_zone()->get_network_model();
 
     surf_action_ = net_model->communicate(from_, to_, size_, rate_);
@@ -412,7 +412,7 @@ void CommImpl::wait_for(actor::ActorImpl* issuer, double timeout)
   if (state_ != State::WAITING && state_ != State::RUNNING) {
     finish();
   } else { /* we need a sleep action (even when there is no timeout) to be notified of host failures */
-    resource::Action* sleep = issuer->get_host()->pimpl_cpu->sleep(timeout);
+    resource::Action* sleep = issuer->get_host()->get_cpu()->sleep(timeout);
     sleep->set_activity(this);
 
     if (issuer == src_actor_)
@@ -422,7 +422,7 @@ void CommImpl::wait_for(actor::ActorImpl* issuer, double timeout)
   }
 }
 
-int CommImpl::test_any(const actor::ActorImpl* issuer, const std::vector<CommImpl*>& comms)
+ssize_t CommImpl::test_any(const actor::ActorImpl* issuer, const std::vector<CommImpl*>& comms)
 {
   if (MC_is_active() || MC_record_replay_is_active()) {
     int idx = issuer->simcall_.mc_value_;
@@ -580,7 +580,7 @@ void CommImpl::finish()
       }
       if (not MC_is_active() && not MC_record_replay_is_active()) {
         CommImpl** element = std::find(comms, comms + count, this);
-        int rank           = (element != comms + count) ? element - comms : -1;
+        ssize_t rank       = (element != comms + count) ? element - comms : -1;
         simcall_comm_waitany__set__result(simcall, rank);
       }
     }
@@ -591,6 +591,10 @@ void CommImpl::finish()
       simcall->issuer_->context_->set_wannadie();
     } else {
       switch (state_) {
+        case State::FAILED:
+          simcall->issuer_->exception_ =
+              std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
+          break;
         case State::SRC_TIMEOUT:
           simcall->issuer_->exception_ = std::make_exception_ptr(
               TimeoutException(XBT_THROW_POINT, "Communication timeouted because of the sender"));
@@ -604,17 +608,21 @@ void CommImpl::finish()
         case State::SRC_HOST_FAILURE:
           if (simcall->issuer_ == src_actor_)
             simcall->issuer_->context_->set_wannadie();
-          else
+          else {
+            state_ = kernel::activity::State::FAILED;
             simcall->issuer_->exception_ =
                 std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
+          }
           break;
 
         case State::DST_HOST_FAILURE:
           if (simcall->issuer_ == dst_actor_)
             simcall->issuer_->context_->set_wannadie();
-          else
+          else {
+            state_ = kernel::activity::State::FAILED;
             simcall->issuer_->exception_ =
                 std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
+          }
           break;
 
         case State::LINK_FAILURE:
@@ -630,6 +638,7 @@ void CommImpl::finish()
           } else {
             XBT_DEBUG("I'm neither source nor dest");
           }
+          state_ = kernel::activity::State::FAILED;
           simcall->issuer_->throw_exception(
               std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Link failure")));
           break;
@@ -664,7 +673,7 @@ void CommImpl::finish()
         count = simcall_comm_testany__get__count(simcall);
       }
       CommImpl** element = std::find(comms, comms + count, this);
-      int rank           = (element != comms + count) ? element - comms : -1;
+      ssize_t rank       = (element != comms + count) ? element - comms : -1;
       // In order to modify the exception we have to rethrow it:
       try {
         std::rethrow_exception(simcall->issuer_->exception_);
index 6f8770a..475eda9 100644 (file)
@@ -52,7 +52,7 @@ public:
 
   bool test() override;
   void wait_for(actor::ActorImpl* issuer, double timeout) override;
-  static int test_any(const actor::ActorImpl* issuer, const std::vector<CommImpl*>& comms);
+  static ssize_t test_any(const actor::ActorImpl* issuer, const std::vector<CommImpl*>& comms);
   static void wait_any_for(actor::ActorImpl* issuer, const std::vector<CommImpl*>& comms, double timeout);
 
   CommImpl* start();
index a687d1d..3b55aff 100644 (file)
@@ -48,7 +48,7 @@ ExecImpl& ExecImpl::set_hosts(const std::vector<s4u::Host*>& hosts)
 ExecImpl& ExecImpl::set_timeout(double timeout)
 {
   if (timeout >= 0 && not MC_is_active() && not MC_record_replay_is_active()) {
-    timeout_detector_.reset(hosts_.front()->pimpl_cpu->sleep(timeout));
+    timeout_detector_.reset(hosts_.front()->get_cpu()->sleep(timeout));
     timeout_detector_->set_activity(this);
   }
   return *this;
@@ -78,16 +78,11 @@ ExecImpl* ExecImpl::start()
   state_ = State::RUNNING;
   if (not MC_is_active() && not MC_record_replay_is_active()) {
     if (hosts_.size() == 1) {
-      surf_action_ = hosts_.front()->pimpl_cpu->execution_start(flops_amounts_.front());
+      surf_action_ = hosts_.front()->get_cpu()->execution_start(flops_amounts_.front(), bound_);
       surf_action_->set_sharing_penalty(sharing_penalty_);
       surf_action_->set_category(get_tracing_category());
-
-      if (bound_ > 0) {
-        surf_action_->set_bound(bound_);
-        surf_action_->set_user_bound(bound_);
-      }
     } else {
-      // FIXME[donassolo]: verify if all hosts belongs to the same netZone?
+      // get the model from first host since we have only 1 by now
       auto host_model = hosts_.front()->get_netpoint()->get_englobing_zone()->get_host_model();
       surf_action_    = host_model->execute_parallel(hosts_, flops_amounts_.data(), bytes_amounts_.data(), -1);
     }
@@ -189,10 +184,11 @@ void ExecImpl::finish()
     }
     switch (state_) {
       case State::FAILED:
-        simcall->issuer_->context_->set_wannadie();
+        piface_->complete(s4u::Activity::State::FAILED);
         if (simcall->issuer_->get_host()->is_on())
           simcall->issuer_->exception_ = std::make_exception_ptr(HostFailureException(XBT_THROW_POINT, "Host failed"));
-        /* else, the actor will be killed with no possibility to survive */
+        else /* else, the actor will be killed with no possibility to survive */
+          simcall->issuer_->context_->set_wannadie();
         break;
 
       case State::CANCELED:
@@ -221,7 +217,7 @@ ActivityImpl* ExecImpl::migrate(s4u::Host* to)
 {
   if (not MC_is_active() && not MC_record_replay_is_active()) {
     resource::Action* old_action = this->surf_action_;
-    resource::Action* new_action = to->pimpl_cpu->execution_start(old_action->get_cost());
+    resource::Action* new_action = to->get_cpu()->execution_start(old_action->get_cost(), old_action->get_user_bound());
     new_action->set_remains(old_action->get_remains());
     new_action->set_activity(this);
     new_action->set_sharing_penalty(old_action->get_sharing_penalty());
@@ -254,7 +250,6 @@ void ExecImpl::wait_any_for(actor::ActorImpl* issuer, const std::vector<ExecImpl
   for (auto* exec : execs) {
     /* associate this simcall to the the synchro */
     exec->simcalls_.push_back(&issuer->simcall_);
-
     /* see if the synchro is already finished */
     if (exec->state_ != State::WAITING && exec->state_ != State::RUNNING) {
       exec->finish();
index 6f77d52..5cd665c 100644 (file)
@@ -30,7 +30,7 @@ IoImpl::IoImpl()
 IoImpl& IoImpl::set_timeout(double timeout)
 {
   const s4u::Host* host = get_disk()->get_host();
-  timeout_detector_ = host->pimpl_cpu->sleep(timeout);
+  timeout_detector_     = host->get_cpu()->sleep(timeout);
   timeout_detector_->set_activity(this);
   return *this;
 }
@@ -129,6 +129,7 @@ void IoImpl::finish()
     switch (state_) {
       case State::FAILED:
         simcall->issuer_->context_->set_wannadie();
+        piface_->complete(s4u::Activity::State::FAILED);
         simcall->issuer_->exception_ =
             std::make_exception_ptr(StorageFailureException(XBT_THROW_POINT, "Storage failed"));
         break;
index 14a03d3..61bbb4d 100644 (file)
@@ -25,10 +25,14 @@ class MailboxImpl {
 
   s4u::Mailbox piface_;
   xbt::string name_;
+  actor::ActorImplPtr permanent_receiver_; // actor to which the mailbox is attached
+  boost::circular_buffer_space_optimized<CommImplPtr> comm_queue_{MAX_MAILBOX_SIZE};
+  // messages already received in the permanent receive mode
+  boost::circular_buffer_space_optimized<CommImplPtr> done_comm_queue_{MAX_MAILBOX_SIZE};
 
   friend s4u::Engine;
-  friend s4u::Mailbox* s4u::Engine::mailbox_by_name_or_create(const std::string& name) const;
   friend s4u::Mailbox;
+  friend s4u::Mailbox* s4u::Engine::mailbox_by_name_or_create(const std::string& name) const;
   friend s4u::Mailbox* s4u::Mailbox::by_name(const std::string& name);
   friend mc::CommunicationDeterminismChecker;
 
@@ -43,15 +47,18 @@ public:
   const char* get_cname() const { return name_.c_str(); }
   void set_receiver(s4u::ActorPtr actor);
   void push(CommImplPtr comm);
+  void push_done(CommImplPtr done_comm) { done_comm_queue_.push_back(done_comm); }
   void remove(const CommImplPtr& comm);
   CommImplPtr iprobe(int type, bool (*match_fun)(void*, void*, CommImpl*), void* data);
   CommImplPtr find_matching_comm(CommImpl::Type type, bool (*match_fun)(void*, void*, CommImpl*), void* this_user_data,
                                  const CommImplPtr& my_synchro, bool done, bool remove_matching);
-
-  actor::ActorImplPtr permanent_receiver_; // actor to which the mailbox is attached
-  boost::circular_buffer_space_optimized<CommImplPtr> comm_queue_{MAX_MAILBOX_SIZE};
-  // messages already received in the permanent receive mode
-  boost::circular_buffer_space_optimized<CommImplPtr> done_comm_queue_{MAX_MAILBOX_SIZE};
+  bool is_permanent() const { return permanent_receiver_ != nullptr; }
+  actor::ActorImplPtr get_permanent_receiver() const { return permanent_receiver_; }
+  bool empty() const { return comm_queue_.empty(); }
+  size_t size() const { return comm_queue_.size(); }
+  CommImplPtr front() const { return comm_queue_.front(); }
+  bool has_some_done_comm() const { return not done_comm_queue_.empty(); }
+  CommImplPtr done_front() const { return done_comm_queue_.front(); }
 };
 } // namespace activity
 } // namespace kernel
index 1b504a8..6316b12 100644 (file)
@@ -32,7 +32,7 @@ SleepImpl& SleepImpl::set_duration(double duration)
 
 SleepImpl* SleepImpl::start()
 {
-  surf_action_ = host_->pimpl_cpu->sleep(duration_);
+  surf_action_ = host_->get_cpu()->sleep(duration_);
   surf_action_->set_activity(this);
   XBT_DEBUG("Create sleep synchronization %p", this);
   return this;
index 96c5f43..2fe2082 100644 (file)
@@ -33,7 +33,7 @@ RawImpl& RawImpl::set_timeout(double timeout)
 
 RawImpl* RawImpl::start()
 {
-  surf_action_ = host_->pimpl_cpu->sleep(timeout_);
+  surf_action_ = host_->get_cpu()->sleep(timeout_);
   surf_action_->set_activity(this);
   return this;
 }
index 78f5be7..587e847 100644 (file)
@@ -3,9 +3,9 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include "simgrid/s4u/Actor.hpp"
 #include "mc/mc.h"
 #include "simgrid/Exception.hpp"
-#include "simgrid/s4u/Actor.hpp"
 #include "simgrid/s4u/Exec.hpp"
 #include "src/kernel/EngineImpl.hpp"
 #include "src/kernel/activity/CommImpl.hpp"
@@ -16,6 +16,9 @@
 #include "src/mc/mc_replay.hpp"
 #include "src/mc/remote/AppSide.hpp"
 #include "src/simix/smx_private.hpp"
+#if HAVE_SMPI
+#include "src/smpi/include/private.hpp"
+#endif
 #include "src/surf/HostImpl.hpp"
 #include "src/surf/cpu_interface.hpp"
 
@@ -96,7 +99,7 @@ ActorImplPtr ActorImpl::attach(const std::string& name, void* data, s4u::Host* h
 
   auto* actor = new ActorImpl(xbt::string(name), host);
   /* Actor data */
-  actor->set_user_data(data);
+  actor->piface_.set_data(data);
   actor->code_ = nullptr;
 
   XBT_VERB("Create context %s", actor->get_cname());
@@ -307,9 +310,10 @@ void ActorImpl::yield()
     }
   }
 
-  if (SMPI_switch_data_segment && not finished_) {
-    SMPI_switch_data_segment(get_iface());
-  }
+#if HAVE_SMPI
+  if (not finished_)
+    smpi_switch_data_segment(get_iface());
+#endif
 }
 
 /** This actor will be terminated automatically when the last non-daemon actor finishes */
@@ -496,7 +500,7 @@ ActorImplPtr ActorImpl::create(const std::string& name, const ActorCode& code, v
     actor = self()->init(xbt::string(name), host);
 
   /* actor data */
-  actor->set_user_data(data);
+  actor->piface_.set_data(data);
 
   actor->start(code);
 
@@ -522,26 +526,6 @@ void create_maestro(const std::function<void()>& code)
 } // namespace kernel
 } // namespace simgrid
 
-int SIMIX_process_count() // XBT_ATTRIB_DEPRECATED_v329
-{
-  return simgrid::kernel::EngineImpl::get_instance()->get_actor_list().size();
-}
-
-void* SIMIX_process_self_get_data() // XBT_ATTRIB_DEPRECATED_v329
-{
-  smx_actor_t self = simgrid::kernel::actor::ActorImpl::self();
-
-  if (self == nullptr) {
-    return nullptr;
-  }
-  return self->get_user_data();
-}
-
-void SIMIX_process_self_set_data(void* data) // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid::kernel::actor::ActorImpl::self()->set_user_data(data);
-}
-
 /* needs to be public and without simcall because it is called
    by exceptions and logging events */
 const char* SIMIX_process_self_get_name()
@@ -550,19 +534,7 @@ const char* SIMIX_process_self_get_name()
 }
 
 /** @brief Returns the process from PID. */
-smx_actor_t SIMIX_process_from_PID(aid_t pid)
+smx_actor_t SIMIX_process_from_PID(aid_t pid) // XBT_ATTRIB_DEPRECATD_v331
 {
   return simgrid::kernel::actor::ActorImpl::by_pid(pid);
 }
-
-void SIMIX_process_on_exit(smx_actor_t actor,
-                           const std::function<void(bool /*failed*/)>& fun) // XBT_ATTRIB_DEPRECATED_v329
-{
-  xbt_assert(actor, "current process not found: are you in maestro context ?");
-  actor->on_exit->emplace_back(fun);
-}
-
-void simcall_process_set_data(smx_actor_t process, void* data) // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid::kernel::actor::simcall([process, data] { process->set_user_data(data); });
-}
index 289e3ae..e9c6e4b 100644 (file)
@@ -22,7 +22,6 @@ namespace actor {
 
 class XBT_PUBLIC ActorImpl : public xbt::PropertyHolder {
   s4u::Host* host_   = nullptr; /* the host on which the actor is running */
-  void* userdata_    = nullptr; /* XBT_ATTRIB_DEPRECATED_v329 kept for compatibility, should be replaced with moddata */
   aid_t pid_         = 0;
   aid_t ppid_        = -1;
   bool daemon_       = false; /* Daemon actors are automatically killed when the last non-daemon leaves */
@@ -52,8 +51,6 @@ public:
   // Accessors to private fields
   s4u::Host* get_host() { return host_; }
   void set_host(s4u::Host* dest);
-  void* get_user_data() { return userdata_; }          // XBT_ATTRIB_DEPRECATED_v329
-  void set_user_data(void* data) { userdata_ = data; } // XBT_ATTRIB_DEPRECATED_v329
   aid_t get_pid() const { return pid_; }
   aid_t get_ppid() const { return ppid_; }
   void set_ppid(aid_t ppid) { ppid_ = ppid; }
@@ -182,7 +179,7 @@ public:
   explicit ProcessArg(s4u::Host* host, ActorImpl* actor)
       : name(actor->get_name())
       , code(actor->code_)
-      , data(actor->get_user_data())
+      , data(actor->get_ciface()->get_data())
       , host(host)
       , kill_time(actor->get_kill_time())
       , auto_restart(actor->has_to_auto_restart())
@@ -205,6 +202,4 @@ XBT_PUBLIC unsigned long* get_maxpid_addr(); // In MC mode, the application send
 } // namespace kernel
 } // namespace simgrid
 
-extern void (*SMPI_switch_data_segment)(simgrid::s4u::ActorPtr actor);
-
 #endif
index ccc4c7b..6f0e143 100644 (file)
@@ -180,7 +180,7 @@ public:
   double get_timeout() const { return timeout_; }
 };
 
-class ExecutionWaitanySimcall : public ResultingSimcall<int> {
+class ExecutionWaitanySimcall : public ResultingSimcall<ssize_t> {
   const std::vector<activity::ExecImpl*>& execs_;
   const double timeout_;
 
@@ -197,7 +197,7 @@ public:
   double get_timeout() const { return timeout_; }
 };
 
-class IoWaitanySimcall : public ResultingSimcall<int> {
+class IoWaitanySimcall : public ResultingSimcall<ssize_t> {
   const std::vector<activity::IoImpl*>& ios_;
   const double timeout_;
 
index 65d170f..5c9f34b 100644 (file)
@@ -207,7 +207,7 @@ void SwappedContext::swap_into(SwappedContext* to)
 /** Maestro wants to run all ready actors */
 void SwappedContextFactory::run_all()
 {
-  auto* engine = EngineImpl::get_instance();
+  const auto* engine = EngineImpl::get_instance();
   /* This function is called by maestro at the beginning of a scheduling round to get all working threads executing some
    * stuff It is much easier to understand what happens if you see the working threads as bodies that swap their soul
    * for the ones of the simulated processes that must run.
@@ -288,7 +288,7 @@ void SwappedContext::suspend()
       // When given that soul, the body will wait for the next scheduling round
     }
   } else { // sequential execution
-    auto* engine = EngineImpl::get_instance();
+    const auto* engine = EngineImpl::get_instance();
     /* determine the next context */
     unsigned long int i = factory_.process_index_;
     factory_.process_index_++;
index 98397a6..17647ff 100644 (file)
@@ -68,7 +68,7 @@ void simgrid::kernel::lmm::FairBottleneck::bottleneck_solve()
           nb++;
       }
       XBT_DEBUG("\tThere are %d variables", nb);
-      if (nb > 0 && cnst.sharing_policy_ == s4u::Link::SharingPolicy::FATPIPE)
+      if (nb > 0 && cnst.sharing_policy_ == Constraint::SharingPolicy::FATPIPE)
         nb = 1;
       if (nb == 0) {
         cnst.remaining_ = 0.0;
@@ -102,7 +102,7 @@ void simgrid::kernel::lmm::FairBottleneck::bottleneck_solve()
     for (auto iter = std::begin(cnst_list); iter != std::end(cnst_list);) {
       Constraint& cnst = *iter;
       XBT_DEBUG("Updating cnst %p ", &cnst);
-      if (cnst.sharing_policy_ != s4u::Link::SharingPolicy::FATPIPE) {
+      if (cnst.sharing_policy_ != Constraint::SharingPolicy::FATPIPE) {
         for (const Element& elem : cnst.enabled_element_set_) {
           xbt_assert(elem.variable->sharing_penalty_ > 0);
           XBT_DEBUG("\tUpdate constraint %p (%g) with variable %p by %g", &cnst, cnst.remaining_, elem.variable,
index 4866585..80d0519 100644 (file)
@@ -117,8 +117,7 @@ void System::var_free(Variable* var)
       simgrid::xbt::intrusive_erase(elem.constraint->disabled_element_set_, elem);
     if (elem.active_element_set_hook.is_linked())
       simgrid::xbt::intrusive_erase(elem.constraint->active_element_set_, elem);
-    int nelements = elem.constraint->enabled_element_set_.size() + elem.constraint->disabled_element_set_.size();
-    if (nelements == 0)
+    if (elem.constraint->enabled_element_set_.empty() && elem.constraint->disabled_element_set_.empty())
       make_constraint_inactive(elem.constraint);
     else
       on_disabled_var(elem.constraint);
@@ -277,7 +276,7 @@ void System::expand_add(Constraint* cnst, Variable* var, double value)
     if (var->sharing_penalty_ != 0.0)
       elem.decrease_concurrency();
 
-    if (cnst->sharing_policy_ != s4u::Link::SharingPolicy::FATPIPE)
+    if (cnst->sharing_policy_ != Constraint::SharingPolicy::FATPIPE)
       elem.consumption_weight += value;
     else
       elem.consumption_weight = std::max(elem.consumption_weight, value);
@@ -336,7 +335,7 @@ Variable* Constraint::get_variable(const Element** elem) const
 
 // if we modify the list between calls, normal version may loop forever
 // this safe version ensures that we browse the list elements only once
-Variable* Constraint::get_variable_safe(const Element** elem, const Element** nextelem, int* numelem) const
+Variable* Constraint::get_variable_safe(const Element** elem, const Element** nextelem, size_t* numelem) const
 {
   if (*elem == nullptr) {
     *numelem = enabled_element_set_.size() + disabled_element_set_.size() - 1;
@@ -403,14 +402,14 @@ static inline void saturated_variable_set_update(const ConstraintLight* cnst_lig
 }
 
 template <class ElemList>
-static void format_element_list(const ElemList& elem_list, s4u::Link::SharingPolicy sharing_policy, double& sum,
+static void format_element_list(const ElemList& elem_list, Constraint::SharingPolicy sharing_policy, double& sum,
                                 std::string& buf)
 {
   for (Element const& elem : elem_list) {
     buf += std::to_string(elem.consumption_weight) + ".'" + std::to_string(elem.variable->rank_) + "'(" +
            std::to_string(elem.variable->value_) + ")" +
-           (sharing_policy != s4u::Link::SharingPolicy::FATPIPE ? " + " : " , ");
-    if (sharing_policy != s4u::Link::SharingPolicy::FATPIPE)
+           (sharing_policy != Constraint::SharingPolicy::FATPIPE ? " + " : " , ");
+    if (sharing_policy != Constraint::SharingPolicy::FATPIPE)
       sum += elem.consumption_weight * elem.variable->value_;
     else
       sum = std::max(sum, elem.consumption_weight * elem.variable->value_);
@@ -434,14 +433,14 @@ void System::print() const
     double sum            = 0.0;
     // Show  the enabled variables
     buf += "\t";
-    buf += cnst.sharing_policy_ != s4u::Link::SharingPolicy::FATPIPE ? "(" : "max(";
+    buf += cnst.sharing_policy_ != Constraint::SharingPolicy::FATPIPE ? "(" : "max(";
     format_element_list(cnst.enabled_element_set_, cnst.sharing_policy_, sum, buf);
     // TODO: Adding disabled elements only for test compatibility, but do we really want them to be printed?
     format_element_list(cnst.disabled_element_set_, cnst.sharing_policy_, sum, buf);
 
     buf += "0) <= " + std::to_string(cnst.bound_) + " ('" + std::to_string(cnst.rank_) + "')";
 
-    if (cnst.sharing_policy_ == s4u::Link::SharingPolicy::FATPIPE) {
+    if (cnst.sharing_policy_ == Constraint::SharingPolicy::FATPIPE) {
       buf += " [MAX-Constraint]";
     }
     XBT_DEBUG("%s", buf.c_str());
@@ -491,15 +490,19 @@ template <class CnstList> void System::lmm_solve(CnstList& cnst_list)
   for (Constraint& cnst : cnst_list) {
     /* INIT: Collect constraints that actually need to be saturated (i.e remaining  and usage are strictly positive)
      * into cnst_light_tab. */
-    cnst.remaining_ = cnst.bound_;
-    if (not double_positive(cnst.remaining_, cnst.bound_ * sg_maxmin_precision))
+    cnst.dynamic_bound_ = cnst.bound_;
+    if (cnst.get_sharing_policy() == Constraint::SharingPolicy::NONLINEAR && cnst.dyn_constraint_cb_) {
+      cnst.dynamic_bound_ = cnst.dyn_constraint_cb_(cnst.bound_, cnst.concurrency_current_);
+    }
+    cnst.remaining_ = cnst.dynamic_bound_;
+    if (not double_positive(cnst.remaining_, cnst.dynamic_bound_ * sg_maxmin_precision))
       continue;
     cnst.usage_ = 0;
     for (Element& elem : cnst.enabled_element_set_) {
       xbt_assert(elem.variable->sharing_penalty_ > 0.0);
       elem.variable->value_ = 0.0;
       if (elem.consumption_weight > 0) {
-        if (cnst.sharing_policy_ != s4u::Link::SharingPolicy::FATPIPE)
+        if (cnst.sharing_policy_ != Constraint::SharingPolicy::FATPIPE)
           cnst.usage_ += elem.consumption_weight / elem.variable->sharing_penalty_;
         else if (cnst.usage_ < elem.consumption_weight / elem.variable->sharing_penalty_)
           cnst.usage_ = elem.consumption_weight / elem.variable->sharing_penalty_;
@@ -572,17 +575,18 @@ template <class CnstList> void System::lmm_solve(CnstList& cnst_list)
       /* Update the usage of constraints where this variable is involved */
       for (Element& elem : var.cnsts_) {
         Constraint* cnst = elem.constraint;
-        if (cnst->sharing_policy_ != s4u::Link::SharingPolicy::FATPIPE) {
+        if (cnst->sharing_policy_ != Constraint::SharingPolicy::FATPIPE) {
           // Remember: shared constraints require that sum(elem.value * var.value) < cnst->bound
-          double_update(&(cnst->remaining_), elem.consumption_weight * var.value_, cnst->bound_ * sg_maxmin_precision);
+          double_update(&(cnst->remaining_), elem.consumption_weight * var.value_,
+                        cnst->dynamic_bound_ * sg_maxmin_precision);
           double_update(&(cnst->usage_), elem.consumption_weight / var.sharing_penalty_, sg_maxmin_precision);
           // If the constraint is saturated, remove it from the set of active constraints (light_tab)
           if (not double_positive(cnst->usage_, sg_maxmin_precision) ||
-              not double_positive(cnst->remaining_, cnst->bound_ * sg_maxmin_precision)) {
+              not double_positive(cnst->remaining_, cnst->dynamic_bound_ * sg_maxmin_precision)) {
             if (cnst->cnst_light_) {
-              int index = (cnst->cnst_light_ - cnst_light_tab);
-              XBT_DEBUG("index: %d \t cnst_light_num: %d \t || usage: %f remaining: %f bound: %f  ", index,
-                        cnst_light_num, cnst->usage_, cnst->remaining_, cnst->bound_);
+              size_t index = (cnst->cnst_light_ - cnst_light_tab);
+              XBT_DEBUG("index: %zu \t cnst_light_num: %d \t || usage: %f remaining: %f bound: %f  ", index,
+                        cnst_light_num, cnst->usage_, cnst->remaining_, cnst->dynamic_bound_);
               cnst_light_tab[index]                  = cnst_light_tab[cnst_light_num - 1];
               cnst_light_tab[index].cnst->cnst_light_ = &cnst_light_tab[index];
               cnst_light_num--;
@@ -607,13 +611,13 @@ template <class CnstList> void System::lmm_solve(CnstList& cnst_list)
           }
           // If the constraint is saturated, remove it from the set of active constraints (light_tab)
           if (not double_positive(cnst->usage_, sg_maxmin_precision) ||
-              not double_positive(cnst->remaining_, cnst->bound_ * sg_maxmin_precision)) {
+              not double_positive(cnst->remaining_, cnst->dynamic_bound_ * sg_maxmin_precision)) {
             if (cnst->cnst_light_) {
-              int index = (cnst->cnst_light_ - cnst_light_tab);
-              XBT_DEBUG("index: %d \t cnst_light_num: %d \t || \t cnst: %p \t cnst->cnst_light: %p "
+              size_t index = (cnst->cnst_light_ - cnst_light_tab);
+              XBT_DEBUG("index: %zu \t cnst_light_num: %d \t || \t cnst: %p \t cnst->cnst_light: %p "
                         "\t cnst_light_tab: %p usage: %f remaining: %f bound: %f  ",
                         index, cnst_light_num, cnst, cnst->cnst_light_, cnst_light_tab, cnst->usage_, cnst->remaining_,
-                        cnst->bound_);
+                        cnst->dynamic_bound_);
               cnst_light_tab[index]                  = cnst_light_tab[cnst_light_num - 1];
               cnst_light_tab[index].cnst->cnst_light_ = &cnst_light_tab[index];
               cnst_light_num--;
@@ -678,7 +682,7 @@ void System::update_variable_bound(Variable* var, double bound)
 }
 
 void Variable::initialize(resource::Action* id_value, double sharing_penalty, double bound_value,
-                          int number_of_constraints, unsigned visited_value)
+                          size_t number_of_constraints, unsigned visited_value)
 {
   id_     = id_value;
   rank_   = next_rank_++;
@@ -774,8 +778,8 @@ void System::on_disabled_var(Constraint* cnstr)
   if (cnstr->get_concurrency_limit() < 0)
     return;
 
-  int numelem = cnstr->disabled_element_set_.size();
-  if (not numelem)
+  size_t numelem = cnstr->disabled_element_set_.size();
+  if (numelem == 0)
     return;
 
   Element* elem = &cnstr->disabled_element_set_.front();
@@ -813,7 +817,6 @@ void System::on_disabled_var(Constraint* cnstr)
 void System::update_variable_penalty(Variable* var, double penalty)
 {
   xbt_assert(penalty >= 0, "Variable penalty should not be negative!");
-
   if (penalty == var->sharing_penalty_)
     return;
 
@@ -915,7 +918,7 @@ void System::remove_all_modified_set()
 double Constraint::get_usage() const
 {
   double result              = 0.0;
-  if (sharing_policy_ != s4u::Link::SharingPolicy::FATPIPE) {
+  if (sharing_policy_ != SharingPolicy::FATPIPE) {
     for (Element const& elem : enabled_element_set_)
       if (elem.consumption_weight > 0)
         result += elem.consumption_weight * elem.variable->value_;
@@ -933,6 +936,14 @@ int Constraint::get_variable_amount() const
                                         [](const Element& elem) { return elem.consumption_weight > 0; }));
 }
 
+void Constraint::set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb)
+{
+  xbt_assert(policy == SharingPolicy::NONLINEAR || not cb,
+             "Invalid sharing policy for constraint. Callback should be used with NONLINEAR sharing policy");
+  sharing_policy_    = policy;
+  dyn_constraint_cb_ = cb;
+}
+
 } // namespace lmm
 } // namespace kernel
 } // namespace simgrid
index 2ad066c..8d8c01c 100644 (file)
@@ -7,6 +7,7 @@
 #define SURF_MAXMIN_HPP
 
 #include "simgrid/kernel/resource/Action.hpp"
+#include "simgrid/kernel/resource/Model.hpp"
 #include "simgrid/s4u/Link.hpp"
 #include "src/surf/surf_interface.hpp"
 #include "xbt/asserts.h"
@@ -187,16 +188,18 @@ public:
  */
 class XBT_PUBLIC Constraint {
 public:
+  enum class SharingPolicy { NONLINEAR = 2, SHARED = 1, FATPIPE = 0 };
+
   Constraint() = delete;
   Constraint(resource::Resource* id_value, double bound_value);
 
   /** @brief Unshare a constraint. */
-  void unshare() { sharing_policy_ = s4u::Link::SharingPolicy::FATPIPE; }
+  void unshare() { sharing_policy_ = SharingPolicy::FATPIPE; }
 
   /** @brief Set how a constraint is shared  */
-  void set_sharing_policy(s4u::Link::SharingPolicy policy) { sharing_policy_ = policy; }
+  void set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb);
   /** @brief Check how a constraint is shared  */
-  s4u::Link::SharingPolicy get_sharing_policy() const { return sharing_policy_; }
+  SharingPolicy get_sharing_policy() const { return sharing_policy_; }
 
   /** @brief Get the usage of the constraint after the last lmm solve */
   double get_usage() const;
@@ -249,7 +252,7 @@ public:
    * @param numelem parameter representing the number of elements to go
    * @return A variable associated to a constraint
    */
-  Variable* get_variable_safe(const Element** elem, const Element** nextelem, int* numelem) const;
+  Variable* get_variable_safe(const Element** elem, const Element** nextelem, size_t* numelem) const;
 
   /**
    * @brief Get the data associated to a constraint
@@ -274,16 +277,18 @@ public:
   double remaining_ = 0.0;
   double usage_     = 0.0;
   double bound_;
+  double dynamic_bound_ = 0.0; //!< dynamic bound for this constraint, defined by user's callback
   // TODO MARTIN Check maximum value across resources at the end of simulation and give a warning is more than e.g. 500
   int concurrency_current_ = 0; /* The current concurrency */
   int concurrency_maximum_ = 0; /* The maximum number of (enabled and disabled) variables associated to the constraint
                                  * at any given time (essentially for tracing)*/
 
-  s4u::Link::SharingPolicy sharing_policy_ = s4u::Link::SharingPolicy::SHARED;
+  SharingPolicy sharing_policy_ = SharingPolicy::SHARED;
   int rank_; // Only used in debug messages to identify the constraint
   double lambda_               = 0.0;
   double new_lambda_           = 0.0;
   ConstraintLight* cnst_light_ = nullptr;
+  s4u::NonLinearResourceCb dyn_constraint_cb_;
 
 private:
   static int next_rank_;  // To give a separate rank_ to each constraint
@@ -300,7 +305,7 @@ private:
  */
 class XBT_PUBLIC Variable {
 public:
-  void initialize(resource::Action* id_value, double sharing_penalty, double bound_value, int number_of_constraints,
+  void initialize(resource::Action* id_value, double sharing_penalty, double bound_value, size_t number_of_constraints,
                   unsigned visited_value);
 
   /** @brief Get the value of the variable after the last lmm solve */
index bb802fe..5d754ad 100644 (file)
@@ -280,3 +280,147 @@ TEST_CASE("kernel::lmm Single constraint unshared systems", "[kernel-lmm-unshare
 
   Sys.variable_free_all();
 }
+
+TEST_CASE("kernel::lmm dynamic constraint shared systems", "[kernel-lmm-shared-single-sys]")
+{
+  auto cb = [](double bound, int flows) -> double {
+    // decrease 10 % for each extra flow sharing this resource
+    return bound - (flows - 1) * .10 * bound;
+  };
+  lmm::System Sys(false);
+  lmm::Constraint* sys_cnst = Sys.constraint_new(nullptr, 10);
+  sys_cnst->set_sharing_policy(lmm::Constraint::SharingPolicy::NONLINEAR, cb);
+
+  SECTION("1 activity, 100% C")
+  {
+    /*
+     * A single variable gets all the share
+     *
+     * In details:
+     *   o System:  a1 * p1 * \rho1 < C
+     *   o consumption_weight: a1=1
+     *   o sharing_penalty:    p1=1
+     *
+     * Expectations
+     *   o rho1 = C (because all weights are 1)
+     */
+
+    lmm::Variable* rho_1      = Sys.variable_new(nullptr, 1);
+
+    Sys.expand(sys_cnst, rho_1, 1);
+    Sys.solve();
+
+    REQUIRE(double_equals(rho_1->get_value(), 10, sg_maxmin_precision));
+  }
+
+  SECTION("2 activities, but ignore crosstraffic 100% C")
+  {
+    /*
+     * Ignore small activities (e.g. crosstraffic)
+     *
+     * In details:
+     *   o System:  a1 * p1 * \rho1  +  a2 * p2 * \rho2 < C
+     *   o consumption_weight: a1=1 ; a2=0.05
+     *   o sharing_penalty:    p1=1 ; p2=1
+     *
+     * Expectations
+     *   o rho1 = C/1.05
+     *   o rho2 = C/1.05
+     *   o rho1 = rho2 (because rho1 and rho2 has the same penalty)
+     */
+
+    lmm::Variable* rho_1      = Sys.variable_new(nullptr, 1);
+    lmm::Variable* rho_2      = Sys.variable_new(nullptr, 1);
+
+    Sys.expand(sys_cnst, rho_1, 1);
+    Sys.expand(sys_cnst, rho_2, 0.05);
+    Sys.solve();
+
+    REQUIRE(double_equals(rho_1->get_value(), 10 / 1.05, sg_maxmin_precision));
+    REQUIRE(double_equals(rho_1->get_value(), rho_2->get_value(), sg_maxmin_precision));
+  }
+
+  SECTION("2 activities, 1 inactive 100% C")
+  {
+    /*
+     * 2 activities but 1 is inactive (sharing_penalty = 0)
+     *
+     * In details:
+     *   o System:  a1 * p1 * \rho1  +  a2 * p2 * \rho2 < C
+     *   o consumption_weight: a1=1 ; a2=1
+     *   o sharing_penalty:    p1=1 ; p2=0
+     *
+     * Expectations
+     *   o rho1 = C
+     *   o rho2 = 0
+     */
+
+    lmm::Variable* rho_1      = Sys.variable_new(nullptr, 1);
+    lmm::Variable* rho_2      = Sys.variable_new(nullptr, 0);
+
+    Sys.expand(sys_cnst, rho_1, 1);
+    Sys.expand(sys_cnst, rho_2, 1);
+    Sys.solve();
+
+    REQUIRE(double_equals(rho_1->get_value(), 10, sg_maxmin_precision));
+    REQUIRE(double_equals(rho_2->get_value(), 0, sg_maxmin_precision));
+  }
+
+  SECTION("2 activity, 90% C")
+  {
+    /*
+     * 2 similar variables degrades performance, but get same share
+     *
+     * In details:
+     *   o System:  a1 * p1 * \rho1  +  a2 * p2 * \rho2 < .9C
+     *   o consumption_weight: a1=1 ; a2=1
+     *   o sharing_penalty:    p1=1 ; p2=1
+     *
+     * Expectations
+     *   o rho1 = rho2
+     *   o rho1 + rho2 = C (because all weights are 1)
+     */
+
+    lmm::Variable* rho_1      = Sys.variable_new(nullptr, 1);
+    lmm::Variable* rho_2      = Sys.variable_new(nullptr, 1);
+
+    Sys.expand(sys_cnst, rho_1, 1);
+    Sys.expand(sys_cnst, rho_2, 1);
+    Sys.solve();
+
+    REQUIRE(double_equals(rho_1->get_value(), 4.5, sg_maxmin_precision));
+    REQUIRE(double_equals(rho_1->get_value(), 4.5, sg_maxmin_precision));
+  }
+
+  SECTION("3 activity, 80% C")
+  {
+    /*
+     * 3 similar variables degrades performance, sharing proportional to penalty
+     *
+     * In details:
+     *   o System:  a1 * p1 * \rho1  +  a2 * p2 * \rho2 + a3 * p3 * \rho3 < .8C
+     *   o consumption_weight: a1=1 ; a2=1 ; a3=1
+     *   o sharing_penalty:    p1=1 ; p2=3 ; p3=4
+     *
+     * Expectations
+     *   o rho1 = 2*rho2 = 2*rho3
+     *   0 rho1 = 4, rho2 = 2, rho3 = 2
+     *   o rho1 + rho2 + rho3 = .8C (because all weights are 1)
+     */
+
+    lmm::Variable* rho_1      = Sys.variable_new(nullptr, 1);
+    lmm::Variable* rho_2      = Sys.variable_new(nullptr, 2);
+    lmm::Variable* rho_3      = Sys.variable_new(nullptr, 2);
+
+    Sys.expand(sys_cnst, rho_1, 1);
+    Sys.expand(sys_cnst, rho_2, 1);
+    Sys.expand(sys_cnst, rho_3, 1);
+    Sys.solve();
+
+    REQUIRE(double_equals(rho_1->get_value(), 4, sg_maxmin_precision));
+    REQUIRE(double_equals(rho_2->get_value(), 2, sg_maxmin_precision));
+    REQUIRE(double_equals(rho_3->get_value(), 2, sg_maxmin_precision));
+  }
+
+  Sys.variable_free_all();
+}
\ No newline at end of file
index 338a5ab..825578b 100644 (file)
@@ -96,6 +96,11 @@ double Action::get_bound() const
   return variable_ ? variable_->get_bound() : 0;
 }
 
+double Action::get_rate() const
+{
+  return variable_ ? variable_->get_value() * factor_ : 0;
+}
+
 void Action::set_bound(double bound)
 {
   XBT_IN("(%p,%g)", this, bound);
index fda3775..fe2e269 100644 (file)
@@ -113,14 +113,59 @@ void DiskImpl::seal()
 
   xbt_assert(this->get_model(), "Cannot seal Disk (%s) without setting the model first", get_cname());
   lmm::System* maxmin_system = get_model()->get_maxmin_system();
+  /* set readwrite constraint if not configured by user */
+  if (readwrite_bw_ == -1) {
+    readwrite_bw_ = std::max(read_bw_.peak, write_bw_.peak);
+  }
   this->set_read_constraint(maxmin_system->constraint_new(this, read_bw_.peak * read_bw_.scale))
       ->set_write_constraint(maxmin_system->constraint_new(this, write_bw_.peak * write_bw_.scale))
-      ->set_constraint(maxmin_system->constraint_new(this, std::max(read_bw_.peak, write_bw_.peak)));
+      ->set_constraint(maxmin_system->constraint_new(this, readwrite_bw_));
+  apply_sharing_policy_cfg();
   XBT_DEBUG("Create resource with read_bw '%f' write_bw '%f'", read_bw_.peak, write_bw_.peak);
   Resource::seal();
   turn_on();
 }
 
+constexpr kernel::lmm::Constraint::SharingPolicy to_maxmin_policy(s4u::Disk::SharingPolicy policy)
+{
+  kernel::lmm::Constraint::SharingPolicy lmm_policy = kernel::lmm::Constraint::SharingPolicy::SHARED;
+  if (policy == s4u::Disk::SharingPolicy::NONLINEAR)
+    lmm_policy = kernel::lmm::Constraint::SharingPolicy::NONLINEAR;
+  return lmm_policy;
+}
+
+void DiskImpl::set_sharing_policy(s4u::Disk::Operation op, s4u::Disk::SharingPolicy policy,
+                                  const s4u::NonLinearResourceCb& cb)
+{
+  sharing_policy_[op]    = policy;
+  sharing_policy_cb_[op] = cb;
+  apply_sharing_policy_cfg();
+}
+
+s4u::Disk::SharingPolicy DiskImpl::get_sharing_policy(s4u::Disk::Operation op) const
+{
+  return sharing_policy_.at(op);
+}
+
+void DiskImpl::apply_sharing_policy_cfg()
+{
+  if (get_constraint())
+    get_constraint()->set_sharing_policy(to_maxmin_policy(sharing_policy_[s4u::Disk::Operation::READWRITE]),
+                                         sharing_policy_cb_[s4u::Disk::Operation::READWRITE]);
+  if (constraint_read_)
+    constraint_read_->set_sharing_policy(to_maxmin_policy(sharing_policy_[s4u::Disk::Operation::READ]),
+                                         sharing_policy_cb_[s4u::Disk::Operation::READ]);
+  if (constraint_write_)
+    constraint_write_->set_sharing_policy(to_maxmin_policy(sharing_policy_[s4u::Disk::Operation::WRITE]),
+                                          sharing_policy_cb_[s4u::Disk::Operation::WRITE]);
+}
+
+void DiskImpl::set_factor_cb(const std::function<s4u::Disk::IoFactorCb>& cb)
+{
+  xbt_assert(not is_sealed(), "Cannot set I/O factor callback in an already sealed disk(%s)", get_cname());
+  factor_cb_ = cb;
+}
+
 /**********
  * Action *
  **********/
index 694972b..0351e1d 100644 (file)
@@ -51,6 +51,14 @@ class DiskImpl : public Resource_T<DiskImpl>, public xbt::PropertyHolder {
   s4u::Host* host_                   = nullptr;
   lmm::Constraint* constraint_write_ = nullptr; /* Constraint for maximum write bandwidth*/
   lmm::Constraint* constraint_read_  = nullptr; /* Constraint for maximum read bandwidth*/
+  std::unordered_map<s4u::Disk::Operation, s4u::Disk::SharingPolicy> sharing_policy_ = {
+      {s4u::Disk::Operation::READ, s4u::Disk::SharingPolicy::LINEAR},
+      {s4u::Disk::Operation::WRITE, s4u::Disk::SharingPolicy::LINEAR},
+      {s4u::Disk::Operation::READWRITE, s4u::Disk::SharingPolicy::LINEAR}};
+  std::unordered_map<s4u::Disk::Operation, s4u::NonLinearResourceCb> sharing_policy_cb_ = {};
+  std::function<s4u::Disk::IoFactorCb> factor_cb_                                       = {};
+
+  void apply_sharing_policy_cfg();
 
 protected:
   ~DiskImpl() override = default; // Disallow direct deletion. Call destroy() instead.
@@ -58,6 +66,7 @@ protected:
 public:
   Metric read_bw_  = {0.0, 0, nullptr};
   Metric write_bw_ = {0.0, 0, nullptr};
+  double readwrite_bw_ = -1; /* readwrite constraint bound, usually max(read, write) */
 
   explicit DiskImpl(const std::string& name, double read_bandwidth, double write_bandwidth);
   DiskImpl(const DiskImpl&) = delete;
@@ -75,6 +84,8 @@ public:
   virtual void set_write_bandwidth(double write_bw) = 0;
   double get_write_bandwidth() const { return write_bw_.peak * write_bw_.scale; }
 
+  virtual void set_readwrite_bandwidth(double bw) = 0;
+
   DiskImpl* set_read_constraint(lmm::Constraint* constraint_read);
   lmm::Constraint* get_read_constraint() const { return constraint_read_; }
 
@@ -84,6 +95,12 @@ public:
   DiskImpl* set_read_bandwidth_profile(profile::Profile* profile);
   DiskImpl* set_write_bandwidth_profile(profile::Profile* profile);
 
+  void set_sharing_policy(s4u::Disk::Operation op, s4u::Disk::SharingPolicy policy, const s4u::NonLinearResourceCb& cb);
+  s4u::Disk::SharingPolicy get_sharing_policy(s4u::Disk::Operation op) const;
+
+  void set_factor_cb(const std::function<s4u::Disk::IoFactorCb>& cb);
+  const std::function<s4u::Disk::IoFactorCb>& get_factor_cb() const { return factor_cb_; }
+
   /** @brief Check if the Disk is used (if an action currently uses its resources) */
   bool is_used() const override;
   void turn_on() override;
@@ -103,8 +120,6 @@ public:
 
   using Action::Action;
   void set_state(simgrid::kernel::resource::Action::State state) override;
-
-  double sharing_penalty_ = {};
 };
 
 } // namespace resource
index b37c3b8..905ac2d 100644 (file)
@@ -68,7 +68,7 @@ double Model::next_occurring_event_lazy(double now)
     action->update_remains_lazy(now);
 
     double min   = -1;
-    double share = action->get_variable()->get_value();
+    double share = action->get_rate();
 
     if (share > 0) {
       double time_to_completion;
@@ -117,7 +117,7 @@ double Model::next_occurring_event_full(double /*now*/)
   double min = -1;
 
   for (Action& action : *get_started_action_set()) {
-    double value = action.get_variable()->get_value();
+    double value = action.get_rate();
     if (value > 0) {
       if (action.get_remains() > 0)
         value = action.get_remains_no_update() / value;
index e7c8460..418cc54 100644 (file)
@@ -8,6 +8,7 @@
 #include "simgrid/kernel/resource/NetworkModelIntf.hpp"
 #include "simgrid/s4u/Engine.hpp"
 #include "simgrid/sg_config.hpp"
+#include "src/internal_config.h" // HAVE_SMPI
 
 static double factor_cb(double, const simgrid::s4u::Host*, const simgrid::s4u::Host*,
                         const std::vector<simgrid::s4u::Link*>&, const std::unordered_set<simgrid::s4u::NetZone*>&)
@@ -17,7 +18,13 @@ static double factor_cb(double, const simgrid::s4u::Host*, const simgrid::s4u::H
 
 TEST_CASE("kernel::resource::NetworkModelIntf: Factors invalid callbacks: exception", "")
 {
-  for (const auto& model : std::vector<std::string>{"LV08", "SMPI", "IB", "CM02"}) {
+  std::vector<std::string> models{"LV08", "CM02"};
+#if HAVE_SMPI
+  models.emplace_back("SMPI");
+  models.emplace_back("IB");
+#endif
+
+  for (const auto& model : models) {
     _sg_cfg_init_status = 0; /* HACK: clear config global to be able to do set_config in UTs */
     simgrid::s4u::Engine e("test");
     simgrid::s4u::Engine::set_config("network/model:" + model);
@@ -53,6 +60,7 @@ TEST_CASE("kernel::resource::NetworkModelIntf: Invalid network/latency-factor an
   }
 }
 
+#if HAVE_SMPI
 TEST_CASE("kernel::resource::NetworkModelIntf: Invalid smpi/lat-factor and smpi/bw-factor", "")
 {
   for (const auto& model : std::vector<std::string>{"SMPI", "IB"}) {
@@ -72,3 +80,4 @@ TEST_CASE("kernel::resource::NetworkModelIntf: Invalid smpi/lat-factor and smpi/
     }
   }
 }
+#endif
index 7174d92..b6167c4 100644 (file)
@@ -129,7 +129,7 @@ Profile* Profile::from_string(const std::string& name, const std::string& input,
       std::vector<std::string> splittedval((std::istream_iterator<std::string>(iss)),
                                            std::istream_iterator<std::string>());
 
-      xbt_assert(splittedval.size() > 0, "Invalid profile line");
+      xbt_assert(not splittedval.empty(), "Invalid profile line");
 
       if (splittedval[0] == "DET") {
         stochevent.date_law = Distribution::DET;
diff --git a/src/kernel/resource/profile/ProfileBuilder.cpp b/src/kernel/resource/profile/ProfileBuilder.cpp
new file mode 100644 (file)
index 0000000..02fbf9e
--- /dev/null
@@ -0,0 +1,25 @@
+/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "simgrid/kernel/ProfileBuilder.hpp"
+#include "src/kernel/resource/profile/Profile.hpp"
+
+namespace simgrid {
+namespace kernel {
+namespace profile {
+
+Profile* ProfileBuilder::from_string(const std::string& name, const std::string& input, double periodicity)
+{
+  return Profile::from_string(name, input, periodicity);
+}
+
+Profile* ProfileBuilder::from_file(const std::string& path)
+{
+  return Profile::from_file(path);
+}
+
+} // namespace profile
+} // namespace kernel
+} // namespace simgrid
\ No newline at end of file
index 5b30278..8405293 100644 (file)
@@ -40,19 +40,19 @@ void ClusterBase::set_link_characteristics(double bw, double lat, s4u::Link::Sha
   link_lat_            = lat;
 }
 
-void ClusterBase::add_private_link_at(unsigned int position, std::pair<resource::LinkImpl*, resource::LinkImpl*> link)
+void ClusterBase::add_private_link_at(unsigned long position, std::pair<resource::LinkImpl*, resource::LinkImpl*> link)
 {
   private_links_.insert({position, link});
 }
 
-void ClusterBase::set_gateway(unsigned int position, NetPoint* gateway)
+void ClusterBase::set_gateway(unsigned long position, NetPoint* gateway)
 {
   xbt_assert(not gateway || not gateway->is_netzone(), "ClusterBase: gateway cannot be another netzone %s",
              gateway->get_cname());
   gateways_[position] = gateway;
 }
 
-NetPoint* ClusterBase::get_gateway(unsigned int position)
+NetPoint* ClusterBase::get_gateway(unsigned long position)
 {
   NetPoint* res = nullptr;
   auto it       = gateways_.find(position);
@@ -62,7 +62,7 @@ NetPoint* ClusterBase::get_gateway(unsigned int position)
   return res;
 }
 
-void ClusterBase::fill_leaf_from_cb(unsigned int position, const std::vector<unsigned int>& dimensions,
+void ClusterBase::fill_leaf_from_cb(unsigned long position, const std::vector<unsigned long>& dimensions,
                                     const s4u::ClusterCallbacks& set_callbacks, NetPoint** node_netpoint,
                                     s4u::Link** lb_link, s4u::Link** limiter_link)
 {
@@ -73,13 +73,13 @@ void ClusterBase::fill_leaf_from_cb(unsigned int position, const std::vector<uns
   *limiter_link = nullptr;
 
   // auxiliary function to get dims from index
-  auto index_to_dims = [&dimensions](int index) {
-    std::vector<unsigned int> dims_array(dimensions.size());
+  auto index_to_dims = [&dimensions](unsigned long index) {
+    std::vector<unsigned long> dims_array(dimensions.size());
     for (auto i = static_cast<int>(dimensions.size() - 1); i >= 0; --i) {
       if (index <= 0) {
         break;
       }
-      unsigned int value = index % dimensions[i];
+      unsigned long value = index % dimensions[i];
       dims_array[i]      = value;
       index              = (index / dimensions[i]);
     }
@@ -90,10 +90,10 @@ void ClusterBase::fill_leaf_from_cb(unsigned int position, const std::vector<uns
   kernel::routing::NetPoint* gw       = nullptr;
   auto dims                           = index_to_dims(position);
   std::tie(netpoint, gw)              = set_callbacks.netpoint(get_iface(), dims, position);
-  xbt_assert(netpoint, "set_netpoint(elem=%u): Invalid netpoint (nullptr)", position);
+  xbt_assert(netpoint, "set_netpoint(elem=%lu): Invalid netpoint (nullptr)", position);
   if (netpoint->is_netzone()) {
     xbt_assert(gw && not gw->is_netzone(),
-               "set_netpoint(elem=%u): Netpoint (%s) is a netzone, but gateway (%s) is invalid", position,
+               "set_netpoint(elem=%lu): Netpoint (%s) is a netzone, but gateway (%s) is invalid", position,
                netpoint->get_cname(), gw ? gw->get_cname() : "nullptr");
   } else {
     xbt_assert(not gw, "set_netpoint: Netpoint (%s) isn't netzone, gateway must be nullptr", netpoint->get_cname());
@@ -103,7 +103,7 @@ void ClusterBase::fill_leaf_from_cb(unsigned int position, const std::vector<uns
 
   if (set_callbacks.loopback) {
     s4u::Link* loopback = set_callbacks.loopback(get_iface(), dims, position);
-    xbt_assert(loopback, "set_loopback: Invalid loopback link (nullptr) for element %u", position);
+    xbt_assert(loopback, "set_loopback: Invalid loopback link (nullptr) for element %lu", position);
     set_loopback();
     add_private_link_at(node_pos(netpoint->id()), {loopback->get_impl(), loopback->get_impl()});
     *lb_link = loopback;
@@ -111,7 +111,7 @@ void ClusterBase::fill_leaf_from_cb(unsigned int position, const std::vector<uns
 
   if (set_callbacks.limiter) {
     s4u::Link* limiter = set_callbacks.limiter(get_iface(), dims, position);
-    xbt_assert(limiter, "set_limiter: Invalid limiter link (nullptr) for element %u", position);
+    xbt_assert(limiter, "set_limiter: Invalid limiter link (nullptr) for element %lu", position);
     set_limiter();
     add_private_link_at(node_pos_with_loopback(netpoint->id()), {limiter->get_impl(), limiter->get_impl()});
     *limiter_link = limiter;
index 374536c..d47dc4d 100644 (file)
@@ -21,8 +21,8 @@ namespace routing {
 
 class GraphNodeData {
 public:
-  explicit GraphNodeData(int id) : id_(id) {}
-  int id_;
+  explicit GraphNodeData(unsigned long id) : id_(id) {}
+  unsigned long id_;
   unsigned long graph_id_ = UINT_MAX; /* used for caching internal graph id's */
 };
 
@@ -68,7 +68,7 @@ void DijkstraZone::do_seal()
   }
 }
 
-xbt_node_t DijkstraZone::route_graph_new_node(int id)
+xbt_node_t DijkstraZone::route_graph_new_node(unsigned long id)
 {
   xbt_node_t node = xbt_graph_new_node(route_graph_.get(), new GraphNodeData(id));
   graph_node_map_.emplace(id, node);
@@ -76,7 +76,7 @@ xbt_node_t DijkstraZone::route_graph_new_node(int id)
   return node;
 }
 
-xbt_node_t DijkstraZone::node_map_search(int id)
+xbt_node_t DijkstraZone::node_map_search(unsigned long id)
 {
   auto ret = graph_node_map_.find(id);
   return ret == graph_node_map_.end() ? nullptr : ret->second;
@@ -84,11 +84,11 @@ xbt_node_t DijkstraZone::node_map_search(int id)
 
 /* Parsing */
 
-void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, double* lat)
+void DijkstraZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* route, double* lat)
 {
   get_route_check_params(src, dst);
-  int src_id = src->id();
-  int dst_id = dst->id();
+  unsigned long src_id = src->id();
+  unsigned long dst_id = dst->id();
 
   const_xbt_dynar_t nodes = xbt_graph_get_nodes(route_graph_.get());
 
@@ -96,8 +96,8 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, d
   const s_xbt_node_t* src_elm = node_map_search(src_id);
   const s_xbt_node_t* dst_elm = node_map_search(dst_id);
 
-  unsigned int src_node_id = static_cast<GraphNodeData*>(xbt_graph_node_get_data(src_elm))->graph_id_;
-  unsigned int dst_node_id = static_cast<GraphNodeData*>(xbt_graph_node_get_data(dst_elm))->graph_id_;
+  unsigned long src_node_id = static_cast<GraphNodeData*>(xbt_graph_node_get_data(src_elm))->graph_id_;
+  unsigned long dst_node_id = static_cast<GraphNodeData*>(xbt_graph_node_get_data(dst_elm))->graph_id_;
 
   /* if the src and dst are the same */
   if (src_node_id == dst_node_id) {
@@ -110,21 +110,17 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, d
 
     const Route* e_route = static_cast<Route*>(xbt_graph_edge_get_data(edge));
 
-    for (auto const& link : e_route->link_list_) {
-      route->link_list_.insert(route->link_list_.begin(), link);
-      if (lat)
-        *lat += link->get_latency();
-    }
+    insert_link_latency(route->link_list_, e_route->link_list_, lat);
   }
 
-  auto elm                   = route_cache_.emplace(src_id, std::vector<int>());
-  std::vector<int>& pred_arr = elm.first->second;
+  auto elm                             = route_cache_.emplace(src_id, std::vector<unsigned long>());
+  std::vector<unsigned long>& pred_arr = elm.first->second;
 
   if (elm.second) { /* new element was inserted (not cached mode, or cache miss) */
     unsigned long nr_nodes = xbt_dynar_length(nodes);
     std::vector<unsigned long> cost_arr(nr_nodes); /* link cost from src to other hosts */
     pred_arr.resize(nr_nodes);              /* predecessors in path from src */
-    using Qelt = std::pair<double, int>;
+    using Qelt = std::pair<double, unsigned long>;
     std::priority_queue<Qelt, std::vector<Qelt>, std::greater<>> pqueue;
 
     /* initialize */
@@ -143,7 +139,7 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, d
 
     /* apply dijkstra using the indexes from the graph's node array */
     while (not pqueue.empty()) {
-      int v_id = pqueue.top().second;
+      unsigned long v_id = pqueue.top().second;
       pqueue.pop();
       const s_xbt_node_t* v_node = xbt_dynar_get_as(nodes, v_id, xbt_node_t);
       xbt_edge_t edge            = nullptr;
@@ -152,7 +148,7 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, d
       xbt_dynar_foreach (xbt_graph_node_get_outedges(v_node), cursor, edge) {
         const s_xbt_node_t* u_node           = xbt_graph_edge_get_target(edge);
         const GraphNodeData* data            = static_cast<GraphNodeData*>(xbt_graph_node_get_data(u_node));
-        int u_id                             = data->graph_id_;
+        unsigned long u_id                   = data->graph_id_;
         const Route* tmp_e_route             = static_cast<Route*>(xbt_graph_edge_get_data(edge));
         unsigned long cost_v_u               = tmp_e_route->link_list_.size(); /* count of links, old model assume 1 */
 
@@ -169,7 +165,7 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, d
   NetPoint* gw_src   = nullptr;
   NetPoint* first_gw = nullptr;
 
-  for (unsigned int v = dst_node_id; v != src_node_id; v = pred_arr[v]) {
+  for (unsigned long v = dst_node_id; v != src_node_id; v = pred_arr[v]) {
     const s_xbt_node_t* node_pred_v = xbt_dynar_get_as(nodes, pred_arr[v], xbt_node_t);
     const s_xbt_node_t* node_v      = xbt_dynar_get_as(nodes, v, xbt_node_t);
     const s_xbt_edge_t* edge        = xbt_graph_get_edge(route_graph_.get(), node_pred_v, node_v);
@@ -190,23 +186,14 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, d
         gw_dst->get_name() != prev_gw_src->get_name()) {
       std::vector<resource::LinkImpl*> e_route_as_to_as;
 
-      NetPoint* gw_dst_net_elm      = nullptr;
-      NetPoint* prev_gw_src_net_elm = nullptr;
+      const NetPoint* gw_dst_net_elm      = nullptr;
+      const NetPoint* prev_gw_src_net_elm = nullptr;
       get_global_route(gw_dst_net_elm, prev_gw_src_net_elm, e_route_as_to_as, nullptr);
-      auto pos = route->link_list_.begin();
-      for (auto const& link : e_route_as_to_as) {
-        route->link_list_.insert(pos, link);
-        if (lat)
-          *lat += link->get_latency();
-        pos++;
-      }
+      std::reverse(begin(e_route_as_to_as), end(e_route_as_to_as));
+      insert_link_latency(route->link_list_, e_route_as_to_as, lat);
     }
 
-    for (auto const& link : e_route->link_list_) {
-      route->link_list_.insert(route->link_list_.begin(), link);
-      if (lat)
-        *lat += link->get_latency();
-    }
+    insert_link_latency(route->link_list_, e_route->link_list_, lat);
   }
 
   if (get_hierarchy() == RoutingMode::recursive) {
@@ -219,19 +206,21 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, d
 }
 
 void DijkstraZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                             const std::vector<resource::LinkImpl*>& link_list_, bool symmetrical)
+                             const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical)
 {
-  add_route_check_params(src, dst, gw_src, gw_dst, link_list_, symmetrical);
+  add_route_check_params(src, dst, gw_src, gw_dst, link_list, symmetrical);
 
-  new_edge(src->id(), dst->id(), new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list_, true));
+  new_edge(src->id(), dst->id(),
+           new_extended_route(get_hierarchy(), gw_src, gw_dst, get_link_list_impl(link_list, false), true));
 
   if (symmetrical)
-    new_edge(dst->id(), src->id(), new_extended_route(get_hierarchy(), gw_dst, gw_src, link_list_, false));
+    new_edge(dst->id(), src->id(),
+             new_extended_route(get_hierarchy(), gw_dst, gw_src, get_link_list_impl(link_list, true), false));
 }
 
-void DijkstraZone::new_edge(int src_id, int dst_id, Route* route)
+void DijkstraZone::new_edge(unsigned long src_id, unsigned long dst_id, Route* route)
 {
-  XBT_DEBUG("Create Route from '%d' to '%d'", src_id, dst_id);
+  XBT_DEBUG("Create Route from '%lu' to '%lu'", src_id, dst_id);
 
   // Get the extremities, or create them if they don't exist yet
   xbt_node_t src = node_map_search(src_id);
index 9689c18..6fbbd30 100644 (file)
@@ -25,12 +25,12 @@ TEST_CASE("kernel::routing::DijkstraZone: mix new routes and hosts", "")
   simgrid::s4u::Engine e("test");
   auto* zone = simgrid::s4u::create_dijkstra_zone("test", false);
 
-  const simgrid::s4u::Host* nic = zone->create_host("nic", 1e9)->seal();
-  simgrid::s4u::Link* link      = zone->create_link("my_link", 1e6)->seal();
+  const simgrid::s4u::Host* nic  = zone->create_host("nic", 1e9)->seal();
+  const simgrid::s4u::Link* link = zone->create_link("my_link", 1e6)->seal();
   for (int i = 0; i < 10; i++) {
     std::string cpu_name          = "CPU" + std::to_string(i);
     const simgrid::s4u::Host* cpu = zone->create_host(cpu_name, 1e9)->seal();
     REQUIRE_NOTHROW(zone->add_route(cpu->get_netpoint(), nic->get_netpoint(), nullptr, nullptr,
-                                    std::vector<simgrid::s4u::Link*>{link}, true));
+                                    {simgrid::s4u::LinkInRoute(link)}, true));
   }
 }
index f9781e4..5b7054c 100644 (file)
@@ -20,7 +20,7 @@ namespace routing {
 
 DragonflyZone::DragonflyZone(const std::string& name) : ClusterBase(name) {}
 
-DragonflyZone::Coords DragonflyZone::rankId_to_coords(int rankId) const
+DragonflyZone::Coords DragonflyZone::rankId_to_coords(unsigned long rankId) const
 {
   // coords : group, chassis, blade, node
   Coords coords;
@@ -33,7 +33,7 @@ DragonflyZone::Coords DragonflyZone::rankId_to_coords(int rankId) const
   return coords;
 }
 
-void DragonflyZone::rankId_to_coords(int rankId, unsigned int coords[4]) const // XBT_ATTRIB_DEPRECATED_v330
+void DragonflyZone::rankId_to_coords(int rankId, unsigned long coords[4]) const // XBT_ATTRIB_DEPRECATED_v330
 {
   const auto s_coords = rankId_to_coords(rankId);
   coords[0]           = s_coords.group;
@@ -150,7 +150,7 @@ void DragonflyZone::build_upper_levels(const s4u::ClusterCallbacks& set_callback
 
 void DragonflyZone::generate_routers(const s4u::ClusterCallbacks& set_callbacks)
 {
-  int id = 0;
+  unsigned long id = 2 * num_groups_ * num_chassis_per_group_ * num_blades_per_chassis_ * num_nodes_per_blade_;
   /* get limiter for this router */
   auto get_limiter = [this, &id, &set_callbacks](unsigned int i, unsigned int j,
                                                  unsigned int k) -> resource::LinkImpl* {
@@ -166,7 +166,7 @@ void DragonflyZone::generate_routers(const s4u::ClusterCallbacks& set_callbacks)
     return limiter;
   };
 
-  routers_.reserve(num_groups_ * num_chassis_per_group_ * num_blades_per_chassis_);
+  routers_.reserve(static_cast<size_t>(num_groups_) * num_chassis_per_group_ * num_blades_per_chassis_);
   for (unsigned int i = 0; i < num_groups_; i++) {
     for (unsigned int j = 0; j < num_chassis_per_group_; j++) {
       for (unsigned int k = 0; k < num_blades_per_chassis_; k++) {
@@ -183,19 +183,14 @@ void DragonflyZone::generate_link(const std::string& id, int numlinks, resource:
   *linkup   = nullptr;
   *linkdown = nullptr;
   if (get_link_sharing_policy() == s4u::Link::SharingPolicy::SPLITDUPLEX) {
-    *linkup = create_link(id + "_UP", std::vector<double>{get_link_bandwidth() * numlinks})
-                  ->set_latency(get_link_latency())
-                  ->seal()
-                  ->get_impl();
-    *linkdown = create_link(id + "_DOWN", std::vector<double>{get_link_bandwidth() * numlinks})
+    *linkup =
+        create_link(id + "_UP", {get_link_bandwidth() * numlinks})->set_latency(get_link_latency())->seal()->get_impl();
+    *linkdown = create_link(id + "_DOWN", {get_link_bandwidth() * numlinks})
                     ->set_latency(get_link_latency())
                     ->seal()
                     ->get_impl();
   } else {
-    *linkup = create_link(id, std::vector<double>{get_link_bandwidth() * numlinks})
-                  ->set_latency(get_link_latency())
-                  ->seal()
-                  ->get_impl();
+    *linkup   = create_link(id, {get_link_bandwidth() * numlinks})->set_latency(get_link_latency())->seal()->get_impl();
     *linkdown = *linkup;
   }
 }
@@ -211,7 +206,7 @@ void DragonflyZone::generate_links()
   // Links from routers to their local nodes.
   for (unsigned int i = 0; i < numRouters; i++) {
     // allocate structures
-    routers_[i].my_nodes_.resize(num_links_per_link_ * num_nodes_per_blade_);
+    routers_[i].my_nodes_.resize(static_cast<size_t>(num_links_per_link_) * num_nodes_per_blade_);
     routers_[i].green_links_.resize(num_blades_per_chassis_);
     routers_[i].black_links_.resize(num_chassis_per_group_);
 
@@ -281,7 +276,7 @@ void DragonflyZone::generate_links()
   }
 }
 
-void DragonflyZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, double* latency)
+void DragonflyZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* route, double* latency)
 {
   // Minimal routing version.
   // TODO : non-minimal random one, and adaptive ?
@@ -289,23 +284,21 @@ void DragonflyZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route,
   if (dst->is_router() || src->is_router())
     return;
 
-  XBT_VERB("dragonfly getLocalRoute from '%s'[%u] to '%s'[%u]", src->get_cname(), src->id(), dst->get_cname(),
+  XBT_VERB("dragonfly getLocalRoute from '%s'[%lu] to '%s'[%lu]", src->get_cname(), src->id(), dst->get_cname(),
            dst->id());
 
   if ((src->id() == dst->id()) && has_loopback()) {
     resource::LinkImpl* uplink = get_uplink_from(node_pos(src->id()));
 
-    route->link_list_.push_back(uplink);
-    if (latency)
-      *latency += uplink->get_latency();
+    add_link_latency(route->link_list_, uplink, latency);
     return;
   }
 
   const auto myCoords     = rankId_to_coords(src->id());
   const auto targetCoords = rankId_to_coords(dst->id());
-  XBT_DEBUG("src : %u group, %u chassis, %u blade, %u node", myCoords.group, myCoords.chassis, myCoords.blade,
+  XBT_DEBUG("src : %lu group, %lu chassis, %lu blade, %lu node", myCoords.group, myCoords.chassis, myCoords.blade,
             myCoords.node);
-  XBT_DEBUG("dst : %u group, %u chassis, %u blade, %u node", targetCoords.group, targetCoords.chassis,
+  XBT_DEBUG("dst : %lu group, %lu chassis, %lu blade, %lu node", targetCoords.group, targetCoords.chassis,
             targetCoords.blade, targetCoords.node);
 
   DragonflyRouter* myRouter      = &routers_[myCoords.group * (num_chassis_per_group_ * num_blades_per_chassis_) +
@@ -319,9 +312,7 @@ void DragonflyZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route,
   }
 
   // node->router local link
-  route->link_list_.push_back(myRouter->my_nodes_[myCoords.node * num_links_per_link_]);
-  if (latency)
-    *latency += myRouter->my_nodes_[myCoords.node * num_links_per_link_]->get_latency();
+  add_link_latency(route->link_list_, myRouter->my_nodes_[myCoords.node * num_links_per_link_], latency);
 
   if (targetRouter != myRouter) {
     // are we on a different group ?
@@ -331,9 +322,7 @@ void DragonflyZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route,
         if (currentRouter->limiter_)
           route->link_list_.push_back(currentRouter->limiter_);
         // go to the nth router in our chassis
-        route->link_list_.push_back(currentRouter->green_links_[targetCoords.group]);
-        if (latency)
-          *latency += currentRouter->green_links_[targetCoords.group]->get_latency();
+        add_link_latency(route->link_list_, currentRouter->green_links_[targetCoords.group], latency);
         currentRouter = &routers_[myCoords.group * (num_chassis_per_group_ * num_blades_per_chassis_) +
                                   myCoords.chassis * num_blades_per_chassis_ + targetCoords.group];
       }
@@ -342,19 +331,15 @@ void DragonflyZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route,
         // go to the first chassis of our group
         if (currentRouter->limiter_)
           route->link_list_.push_back(currentRouter->limiter_);
-        route->link_list_.push_back(currentRouter->black_links_[0]);
-        if (latency)
-          *latency += currentRouter->black_links_[0]->get_latency();
+        add_link_latency(route->link_list_, currentRouter->black_links_[0], latency);
         currentRouter =
             &routers_[myCoords.group * (num_chassis_per_group_ * num_blades_per_chassis_) + targetCoords.group];
       }
 
       // go to destination group - the only optical hop
-      route->link_list_.push_back(currentRouter->blue_link_);
+      add_link_latency(route->link_list_, currentRouter->blue_link_, latency);
       if (currentRouter->limiter_)
         route->link_list_.push_back(currentRouter->limiter_);
-      if (latency)
-        *latency += currentRouter->blue_link_->get_latency();
       currentRouter =
           &routers_[targetCoords.group * (num_chassis_per_group_ * num_blades_per_chassis_) + myCoords.group];
     }
@@ -363,9 +348,7 @@ void DragonflyZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route,
     if (targetRouter->blade_ != currentRouter->blade_) {
       if (currentRouter->limiter_)
         route->link_list_.push_back(currentRouter->limiter_);
-      route->link_list_.push_back(currentRouter->green_links_[targetCoords.blade]);
-      if (latency)
-        *latency += currentRouter->green_links_[targetCoords.blade]->get_latency();
+      add_link_latency(route->link_list_, currentRouter->green_links_[targetCoords.blade], latency);
       currentRouter =
           &routers_[targetCoords.group * (num_chassis_per_group_ * num_blades_per_chassis_) + targetCoords.blade];
     }
@@ -374,21 +357,15 @@ void DragonflyZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route,
     if (targetRouter->chassis_ != currentRouter->chassis_) {
       if (currentRouter->limiter_)
         route->link_list_.push_back(currentRouter->limiter_);
-      route->link_list_.push_back(currentRouter->black_links_[targetCoords.chassis]);
-      if (latency)
-        *latency += currentRouter->black_links_[targetCoords.chassis]->get_latency();
+      add_link_latency(route->link_list_, currentRouter->black_links_[targetCoords.chassis], latency);
     }
   }
 
   // router->node local link
   if (targetRouter->limiter_)
     route->link_list_.push_back(targetRouter->limiter_);
-  route->link_list_.push_back(
-      targetRouter->my_nodes_[targetCoords.node * num_links_per_link_ + num_links_per_link_ - 1]);
-
-  if (latency)
-    *latency +=
-        targetRouter->my_nodes_[targetCoords.node * num_links_per_link_ + num_links_per_link_ - 1]->get_latency();
+  add_link_latency(route->link_list_,
+                   targetRouter->my_nodes_[targetCoords.node * num_links_per_link_ + num_links_per_link_ - 1], latency);
 
   if (has_limiter()) { // limiter for receiver
     route->link_list_.push_back(get_downlink_to(node_pos_with_loopback(dst->id())));
@@ -444,8 +421,8 @@ NetZone* create_dragonfly_zone(const std::string& name, const NetZone* parent, c
   zone->set_link_characteristics(bandwidth, latency, sharing_policy);
 
   /* populating it */
-  std::vector<unsigned int> dimensions = {params.groups.first, params.chassis.first, params.routers.first,
-                                          params.nodes};
+  std::vector<unsigned long> dimensions = {params.groups.first, params.chassis.first, params.routers.first,
+                                           params.nodes};
   int tot_elements                     = std::accumulate(dimensions.begin(), dimensions.end(), 1, std::multiplies<>());
   for (int i = 0; i < tot_elements; i++) {
     kernel::routing::NetPoint* netpoint;
@@ -454,7 +431,6 @@ NetZone* create_dragonfly_zone(const std::string& name, const NetZone* parent, c
     zone->fill_leaf_from_cb(i, dimensions, set_callbacks, &netpoint, &loopback, &limiter);
   }
   zone->build_upper_levels(set_callbacks);
-
   return zone->get_iface();
 }
 } // namespace s4u
index 02a2a96..f90dd3d 100644 (file)
@@ -5,25 +5,14 @@
 
 #include "catch.hpp"
 
+#include "NetZone_test.hpp" // CreateHost callback
 #include "simgrid/kernel/routing/DragonflyZone.hpp"
-#include "simgrid/kernel/routing/NetPoint.hpp"
 #include "simgrid/s4u/Engine.hpp"
-#include "simgrid/s4u/Host.hpp"
-#include "simgrid/s4u/NetZone.hpp"
-
-namespace {
-std::pair<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*>
-create_host(simgrid::s4u::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
-{
-  const simgrid::s4u::Host* host = zone->create_host(std::to_string(id), 1e9)->seal();
-  return std::make_pair(host->get_netpoint(), nullptr);
-}
-} // namespace
 
 TEST_CASE("kernel::routing::DragonflyZone: Creating Zone", "")
 {
   simgrid::s4u::Engine e("test");
-  simgrid::s4u::ClusterCallbacks callbacks(create_host);
+  simgrid::s4u::ClusterCallbacks callbacks(CreateHost{});
   REQUIRE(create_dragonfly_zone("test", e.get_netzone_root(), {{3, 4}, {4, 3}, {5, 1}, 2}, callbacks, 1e9, 10,
                                 simgrid::s4u::Link::SharingPolicy::SHARED));
 }
@@ -31,7 +20,7 @@ TEST_CASE("kernel::routing::DragonflyZone: Creating Zone", "")
 TEST_CASE("kernel::routing::DragonflyZone: Invalid params", "")
 {
   simgrid::s4u::Engine e("test");
-  simgrid::s4u::ClusterCallbacks callbacks(create_host);
+  simgrid::s4u::ClusterCallbacks callbacks(CreateHost{});
 
   SECTION("0 nodes")
   {
index e33e1af..256bc97 100644 (file)
@@ -18,7 +18,7 @@ namespace routing {
 void EmptyZone::get_graph(const s_xbt_graph_t* /*graph*/, std::map<std::string, xbt_node_t, std::less<>>* /*nodes*/,
                           std::map<std::string, xbt_edge_t, std::less<>>* /*edges*/)
 {
-  XBT_ERROR("No routing no graph");
+  xbt_die("No routing no graph");
 }
 } // namespace routing
 } // namespace kernel
index 046349e..8f62513 100644 (file)
@@ -43,30 +43,28 @@ bool FatTreeZone::is_in_sub_tree(const FatTreeNode* root, const FatTreeNode* nod
   return true;
 }
 
-void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, Route* into, double* latency)
+void FatTreeZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* into, double* latency)
 {
   if (dst->is_router() || src->is_router())
     return;
 
   /* Let's find the source and the destination in our internal structure */
   auto searchedNode = this->compute_nodes_.find(src->id());
-  xbt_assert(searchedNode != this->compute_nodes_.end(), "Could not find the source %s [%u] in the fat tree",
+  xbt_assert(searchedNode != this->compute_nodes_.end(), "Could not find the source %s [%lu] in the fat tree",
              src->get_cname(), src->id());
   const FatTreeNode* source = searchedNode->second.get();
 
   searchedNode = this->compute_nodes_.find(dst->id());
-  xbt_assert(searchedNode != this->compute_nodes_.end(), "Could not find the destination %s [%u] in the fat tree",
+  xbt_assert(searchedNode != this->compute_nodes_.end(), "Could not find the destination %s [%lu] in the fat tree",
              dst->get_cname(), dst->id());
   const FatTreeNode* destination = searchedNode->second.get();
 
-  XBT_VERB("Get route and latency from '%s' [%u] to '%s' [%u] in a fat tree", src->get_cname(), src->id(),
+  XBT_VERB("Get route and latency from '%s' [%lu] to '%s' [%lu] in a fat tree", src->get_cname(), src->id(),
            dst->get_cname(), dst->id());
 
   /* In case destination is the source, and there is a loopback, let's use it instead of going up to a switch */
   if (source->id == destination->id && has_loopback()) {
-    into->link_list_.push_back(source->loopback_);
-    if (latency)
-      *latency += source->loopback_->get_latency();
+    add_link_latency(into->link_list_, source->loopback_, latency);
     return;
   }
 
@@ -85,10 +83,7 @@ void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, Route* into, dou
     if (currentNode->limiter_link_)
       into->link_list_.push_back(currentNode->limiter_link_);
 
-    into->link_list_.push_back(currentNode->parents[d]->up_link_);
-
-    if (latency)
-      *latency += currentNode->parents[d]->up_link_->get_latency();
+    add_link_latency(into->link_list_, currentNode->parents[d]->up_link_, latency);
 
     currentNode = currentNode->parents[d]->up_node_;
   }
@@ -100,13 +95,11 @@ void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, Route* into, dou
   while (currentNode != destination) {
     for (unsigned int i = 0; i < currentNode->children.size(); i++) {
       if (i % this->num_children_per_node_[currentNode->level - 1] == destination->label[currentNode->level - 1]) {
-        into->link_list_.push_back(currentNode->children[i]->down_link_);
+        add_link_latency(into->link_list_, currentNode->children[i]->down_link_, latency);
 
         if (currentNode->limiter_link_)
           into->link_list_.push_back(currentNode->limiter_link_);
 
-        if (latency)
-          *latency += currentNode->children[i]->down_link_->get_latency();
         currentNode = currentNode->children[i]->down_node_;
         XBT_DEBUG("%d(%u,%u) is accessible through %d(%u,%u)", destination->id, destination->level,
                   destination->position, currentNode->id, currentNode->level, currentNode->position);
@@ -255,7 +248,7 @@ void FatTreeZone::generate_switches(const s4u::ClusterCallbacks& set_callbacks)
   }
 
   /* get limiter for this router */
-  auto get_limiter = [this, &set_callbacks](unsigned int i, unsigned int j, int id) -> resource::LinkImpl* {
+  auto get_limiter = [this, &set_callbacks](unsigned long i, unsigned long j, long id) -> resource::LinkImpl* {
     kernel::resource::LinkImpl* limiter = nullptr;
     if (set_callbacks.limiter) {
       const auto* s4u_link = set_callbacks.limiter(get_iface(), {i + 1, j}, id);
@@ -266,15 +259,16 @@ void FatTreeZone::generate_switches(const s4u::ClusterCallbacks& set_callbacks)
     return limiter;
   };
   // Create the switches
-  int k = 0;
-  for (unsigned int i = 0; i < this->levels_; i++) {
-    for (unsigned int j = 0; j < this->nodes_by_level_[i + 1]; j++) {
+  unsigned long k = 2 * nodes_.size();
+  for (unsigned long i = 0; i < this->levels_; i++) {
+    for (unsigned long j = 0; j < this->nodes_by_level_[i + 1]; j++) {
       k--;
       auto newNode = std::make_shared<FatTreeNode>(k, i + 1, j, get_limiter(i, j, k), nullptr);
       XBT_DEBUG("We create the switch %d(%u,%u)", newNode->id, newNode->level, newNode->position);
-      newNode->children.resize(this->num_children_per_node_[i] * this->num_port_lower_level_[i]);
+      newNode->children.resize(static_cast<size_t>(this->num_children_per_node_[i]) * this->num_port_lower_level_[i]);
       if (i != this->levels_ - 1) {
-        newNode->parents.resize(this->num_parents_per_node_[i + 1] * this->num_port_lower_level_[i + 1]);
+        newNode->parents.resize(static_cast<size_t>(this->num_parents_per_node_[i + 1]) *
+                                this->num_port_lower_level_[i + 1]);
       }
       newNode->label.resize(this->levels_);
       this->nodes_.emplace_back(newNode);
@@ -344,7 +338,7 @@ void FatTreeZone::add_processing_node(int id, resource::LinkImpl* limiter, resou
   static int position = 0;
   auto newNode = std::make_shared<FatTreeNode>(id, 0, position, limiter, loopback);
   position++;
-  newNode->parents.resize(this->num_parents_per_node_[0] * this->num_port_lower_level_[0]);
+  newNode->parents.resize(static_cast<size_t>(this->num_parents_per_node_[0]) * this->num_port_lower_level_[0]);
   newNode->label.resize(this->levels_);
   this->compute_nodes_.insert(make_pair(id, newNode));
   this->nodes_.emplace_back(newNode);
@@ -359,12 +353,10 @@ void FatTreeZone::add_link(FatTreeNode* parent, unsigned int parentPort, FatTree
       "link_from_" + std::to_string(child->id) + "_" + std::to_string(parent->id) + "_" + std::to_string(uniqueId);
 
   if (get_link_sharing_policy() == s4u::Link::SharingPolicy::SPLITDUPLEX) {
-    linkup =
-        create_link(id + "_UP", std::vector<double>{get_link_bandwidth()})->set_latency(get_link_latency())->seal();
-    linkdown =
-        create_link(id + "_DOWN", std::vector<double>{get_link_bandwidth()})->set_latency(get_link_latency())->seal();
+    linkup   = create_link(id + "_UP", {get_link_bandwidth()})->set_latency(get_link_latency())->seal();
+    linkdown = create_link(id + "_DOWN", {get_link_bandwidth()})->set_latency(get_link_latency())->seal();
   } else {
-    linkup   = create_link(id, std::vector<double>{get_link_bandwidth()})->set_latency(get_link_latency())->seal();
+    linkup   = create_link(id, {get_link_bandwidth()})->set_latency(get_link_latency())->seal();
     linkdown = linkup;
   }
   uniqueId++;
index 18f3e9e..ebf1153 100644 (file)
@@ -5,25 +5,14 @@
 
 #include "catch.hpp"
 
+#include "NetZone_test.hpp" // CreateHost callback
 #include "simgrid/kernel/routing/FatTreeZone.hpp"
-#include "simgrid/kernel/routing/NetPoint.hpp"
 #include "simgrid/s4u/Engine.hpp"
-#include "simgrid/s4u/Host.hpp"
-#include "simgrid/s4u/NetZone.hpp"
-
-namespace {
-std::pair<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*>
-create_host(simgrid::s4u::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
-{
-  const simgrid::s4u::Host* host = zone->create_host(std::to_string(id), 1e9)->seal();
-  return std::make_pair(host->get_netpoint(), nullptr);
-}
-} // namespace
 
 TEST_CASE("kernel::routing::FatTreeZone: Creating Zone", "")
 {
   simgrid::s4u::Engine e("test");
-  simgrid::s4u::ClusterCallbacks callbacks(create_host);
+  simgrid::s4u::ClusterCallbacks callbacks(CreateHost{});
   REQUIRE(create_fatTree_zone("test", e.get_netzone_root(), {2, {4, 4}, {1, 2}, {1, 2}}, callbacks, 1e9, 10,
                               simgrid::s4u::Link::SharingPolicy::SHARED));
 }
@@ -31,7 +20,7 @@ TEST_CASE("kernel::routing::FatTreeZone: Creating Zone", "")
 TEST_CASE("kernel::routing::FatTreeZone: Invalid params", "")
 {
   simgrid::s4u::Engine e("test");
-  simgrid::s4u::ClusterCallbacks callbacks(create_host);
+  simgrid::s4u::ClusterCallbacks callbacks(CreateHost{});
 
   SECTION("0 levels")
   {
index 5cc4e80..8de2e8c 100644 (file)
@@ -33,15 +33,15 @@ void FloydZone::init_tables(unsigned int table_size)
   }
 }
 
-void FloydZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, double* lat)
+void FloydZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* route, double* lat)
 {
   get_route_check_params(src, dst);
 
   /* create a result route */
   std::vector<Route*> route_stack;
-  unsigned int cur = dst->id();
+  unsigned long cur = dst->id();
   do {
-    int pred = predecessor_table_[src->id()][cur];
+    long pred = predecessor_table_[src->id()][cur];
     if (pred == -1)
       throw std::invalid_argument(xbt::string_printf("No route from '%s' to '%s'", src->get_cname(), dst->get_cname()));
     route_stack.push_back(link_table_[pred][cur].get());
@@ -53,7 +53,7 @@ void FloydZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
     route->gw_dst_ = route_stack.front()->gw_dst_;
   }
 
-  NetPoint* prev_dst_gw = nullptr;
+  const NetPoint* prev_dst_gw = nullptr;
   while (not route_stack.empty()) {
     const Route* e_route = route_stack.back();
     route_stack.pop_back();
@@ -62,24 +62,20 @@ void FloydZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
       get_global_route(prev_dst_gw, e_route->gw_src_, route->link_list_, lat);
     }
 
-    for (auto const& link : e_route->link_list_) {
-      route->link_list_.push_back(link);
-      if (lat)
-        *lat += link->get_latency();
-    }
+    add_link_latency(route->link_list_, e_route->link_list_, lat);
 
     prev_dst_gw = e_route->gw_dst_;
   }
 }
 
 void FloydZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                          const std::vector<resource::LinkImpl*>& link_list_, bool symmetrical)
+                          const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical)
 {
   /* set the size of table routing */
   unsigned int table_size = get_table_size();
   init_tables(table_size);
 
-  add_route_check_params(src, dst, gw_src, gw_dst, link_list_, symmetrical);
+  add_route_check_params(src, dst, gw_src, gw_dst, link_list, symmetrical);
 
   /* Check that the route does not already exist */
   if (gw_dst && gw_src) // netzone route (to adapt the error message, if any)
@@ -91,8 +87,8 @@ void FloydZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoi
                "The route between %s and %s already exists (Rq: routes are symmetrical by default).", src->get_cname(),
                dst->get_cname());
 
-  link_table_[src->id()][dst->id()] =
-      std::unique_ptr<Route>(new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list_, true));
+  link_table_[src->id()][dst->id()] = std::unique_ptr<Route>(
+      new_extended_route(get_hierarchy(), gw_src, gw_dst, get_link_list_impl(link_list, false), true));
   predecessor_table_[src->id()][dst->id()] = src->id();
   cost_table_[src->id()][dst->id()]        = link_table_[src->id()][dst->id()]->link_list_.size();
 
@@ -119,8 +115,8 @@ void FloydZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoi
       XBT_DEBUG("Load NetzoneRoute from \"%s(%s)\" to \"%s(%s)\"", dst->get_cname(), gw_src->get_cname(),
                 src->get_cname(), gw_dst->get_cname());
 
-    link_table_[dst->id()][src->id()] =
-        std::unique_ptr<Route>(new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list_, false));
+    link_table_[dst->id()][src->id()] = std::unique_ptr<Route>(
+        new_extended_route(get_hierarchy(), gw_src, gw_dst, get_link_list_impl(link_list, true), false));
     predecessor_table_[dst->id()][src->id()] = dst->id();
     cost_table_[dst->id()][src->id()] =
         link_table_[dst->id()][src->id()]->link_list_.size(); /* count of links, old model assume 1 */
index 7727d39..0d36328 100644 (file)
@@ -24,12 +24,12 @@ TEST_CASE("kernel::routing::FloydZone: mix new routes and hosts", "")
   simgrid::s4u::Engine e("test");
   auto* zone = simgrid::s4u::create_floyd_zone("test");
 
-  const simgrid::s4u::Host* nic = zone->create_host("nic", 1e9)->seal();
-  simgrid::s4u::Link* link      = zone->create_link("my_link", 1e6)->seal();
+  const simgrid::s4u::Host* nic  = zone->create_host("nic", 1e9)->seal();
+  const simgrid::s4u::Link* link = zone->create_link("my_link", 1e6)->seal();
   for (int i = 0; i < 10; i++) {
     std::string cpu_name          = "CPU" + std::to_string(i);
     const simgrid::s4u::Host* cpu = zone->create_host(cpu_name, 1e9)->seal();
     REQUIRE_NOTHROW(zone->add_route(cpu->get_netpoint(), nic->get_netpoint(), nullptr, nullptr,
-                                    std::vector<simgrid::s4u::Link*>{link}, true));
+                                    {simgrid::s4u::LinkInRoute(link)}, true));
   }
 }
index 4c47c46..6ec3408 100644 (file)
@@ -41,25 +41,21 @@ void FullZone::do_seal()
   }
 }
 
-void FullZone::get_local_route(NetPoint* src, NetPoint* dst, Route* res, double* lat)
+void FullZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* res, double* lat)
 {
-  XBT_DEBUG("full getLocalRoute from %s[%u] to %s[%u]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
+  XBT_DEBUG("full getLocalRoute from %s[%lu] to %s[%lu]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
 
   const auto& e_route = routing_table_[src->id()][dst->id()];
 
   if (e_route != nullptr) {
     res->gw_src_ = e_route->gw_src_;
     res->gw_dst_ = e_route->gw_dst_;
-    for (auto const& link : e_route->link_list_) {
-      res->link_list_.push_back(link);
-      if (lat)
-        *lat += link->get_latency();
-    }
+    add_link_latency(res->link_list_, e_route->link_list_, lat);
   }
 }
 
 void FullZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                         const std::vector<resource::LinkImpl*>& link_list, bool symmetrical)
+                         const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical)
 {
   add_route_check_params(src, dst, gw_src, gw_dst, link_list, symmetrical);
 
@@ -76,8 +72,8 @@ void FullZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoin
                dst->get_cname());
 
   /* Add the route to the base */
-  routing_table_[src->id()][dst->id()] =
-      std::unique_ptr<Route>(new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list, true));
+  routing_table_[src->id()][dst->id()] = std::unique_ptr<Route>(
+      new_extended_route(get_hierarchy(), gw_src, gw_dst, get_link_list_impl(link_list, false), true));
 
   if (symmetrical && src != dst) {
     if (gw_dst && gw_src) {
@@ -95,8 +91,8 @@ void FullZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoin
                  "The route between %s and %s already exists. You should not declare the reverse path as symmetrical.",
                  dst->get_cname(), src->get_cname());
 
-    routing_table_[dst->id()][src->id()] =
-        std::unique_ptr<Route>(new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list, false));
+    routing_table_[dst->id()][src->id()] = std::unique_ptr<Route>(
+        new_extended_route(get_hierarchy(), gw_src, gw_dst, get_link_list_impl(link_list, true), false));
   }
 }
 } // namespace routing
index f630fdc..ef1407f 100644 (file)
@@ -24,12 +24,12 @@ TEST_CASE("kernel::routing::FullZone: mix new routes and hosts", "[bug]")
   simgrid::s4u::Engine e("test");
   auto* zone = simgrid::s4u::create_full_zone("test");
 
-  const simgrid::s4u::Host* nic = zone->create_host("nic", 1e9)->seal();
-  simgrid::s4u::Link* link      = zone->create_link("my_link", 1e6)->seal();
+  const simgrid::s4u::Host* nic  = zone->create_host("nic", 1e9)->seal();
+  const simgrid::s4u::Link* link = zone->create_link("my_link", 1e6)->seal();
   for (int i = 0; i < 10; i++) {
     std::string cpu_name          = "CPU" + std::to_string(i);
     const simgrid::s4u::Host* cpu = zone->create_host(cpu_name, 1e9)->seal();
     REQUIRE_NOTHROW(zone->add_route(cpu->get_netpoint(), nic->get_netpoint(), nullptr, nullptr,
-                                    std::vector<simgrid::s4u::Link*>{link}, true));
+                                    {simgrid::s4u::LinkInRoute(link)}, true));
   }
 }
index ef69fde..bd320c8 100644 (file)
@@ -11,6 +11,7 @@
 #include "src/kernel/EngineImpl.hpp"
 #include "src/kernel/resource/DiskImpl.hpp"
 #include "src/surf/HostImpl.hpp"
+#include "src/surf/SplitDuplexLinkImpl.hpp"
 #include "src/surf/cpu_interface.hpp"
 #include "src/surf/network_interface.hpp"
 #include "surf/surf.hpp"
@@ -64,6 +65,11 @@ static void surf_config_models_setup()
   disk_model->model_init_preparse();
 }
 
+xbt::signal<void(bool symmetrical, kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
+                 kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst,
+                 std::vector<kernel::resource::LinkImpl*> const& link_list)>
+    NetZoneImpl::on_route_creation;
+
 NetZoneImpl::NetZoneImpl(const std::string& name) : piface_(this), name_(name)
 {
   /* workaroud: first netzoneImpl will be the root netzone.
@@ -88,7 +94,7 @@ NetZoneImpl::NetZoneImpl(const std::string& name) : piface_(this), name_(name)
   xbt_assert(nullptr == s4u::Engine::get_instance()->netpoint_by_name_or_null(get_name()),
              "Refusing to create a second NetZone called '%s'.", get_cname());
   netpoint_ = new NetPoint(name_, NetPoint::Type::NetZone);
-  XBT_DEBUG("NetZone '%s' created with the id '%u'", get_cname(), netpoint_->id());
+  XBT_DEBUG("NetZone '%s' created with the id '%lu'", get_cname(), netpoint_->id());
   _sg_cfg_init_status = 2; /* HACK: direct access to the global controlling the level of configuration to prevent
                             * any further config now that we created some real content */
   simgrid::s4u::NetZone::on_creation(piface_); // notify the signal
@@ -108,7 +114,7 @@ NetZoneImpl::~NetZoneImpl()
 void NetZoneImpl::add_child(NetZoneImpl* new_zone)
 {
   xbt_assert(not sealed_, "Cannot add a new child to the sealed zone %s", get_cname());
-  /* set the father behavior */
+  /* set the parent behavior */
   hierarchy_ = RoutingMode::recursive;
   children_.push_back(new_zone);
 }
@@ -161,6 +167,17 @@ s4u::Link* NetZoneImpl::create_link(const std::string& name, const std::vector<d
   return network_model_->create_link(name, bandwidths)->get_iface();
 }
 
+s4u::SplitDuplexLink* NetZoneImpl::create_split_duplex_link(const std::string& name,
+                                                            const std::vector<double>& bandwidths)
+{
+  auto* link_up                  = network_model_->create_link(name + "_UP", bandwidths);
+  auto* link_down                = network_model_->create_link(name + "_DOWN", bandwidths);
+  auto link                      = std::make_unique<resource::SplitDuplexLinkImpl>(name, link_up, link_down);
+  auto* link_iface               = link->get_iface();
+  EngineImpl::get_instance()->add_split_duplex_link(name, std::move(link));
+  return link_iface;
+}
+
 s4u::Disk* NetZoneImpl::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
 {
   xbt_assert(disk_model_,
@@ -178,33 +195,71 @@ NetPoint* NetZoneImpl::create_router(const std::string& name)
 
   return (new NetPoint(name, NetPoint::Type::Router))->set_englobing_zone(this);
 }
-int NetZoneImpl::add_component(NetPoint* elm)
+
+unsigned long NetZoneImpl::add_component(NetPoint* elm)
 {
   vertices_.push_back(elm);
   return vertices_.size() - 1; // The rank of the newly created object
 }
 
+std::vector<resource::LinkImpl*> NetZoneImpl::get_link_list_impl(const std::vector<s4u::LinkInRoute>& link_list,
+                                                                 bool backroute) const
+{
+  std::vector<resource::LinkImpl*> links;
+
+  for (const auto& link : link_list) {
+    if (link.get_link()->get_sharing_policy() != s4u::Link::SharingPolicy::SPLITDUPLEX) {
+      links.push_back(link.get_link()->get_impl());
+      continue;
+    }
+    // split-duplex links
+    const auto* sd_link = dynamic_cast<const s4u::SplitDuplexLink*>(link.get_link());
+    xbt_assert(sd_link,
+               "Add_route: cast to SpliDuplexLink impossible. This should not happen, please contact SimGrid team");
+    resource::LinkImpl* link_impl;
+    switch (link.get_direction()) {
+      case s4u::LinkInRoute::Direction::UP:
+        if (backroute)
+          link_impl = sd_link->get_link_down()->get_impl();
+        else
+          link_impl = sd_link->get_link_up()->get_impl();
+        break;
+      case s4u::LinkInRoute::Direction::DOWN:
+        if (backroute)
+          link_impl = sd_link->get_link_up()->get_impl();
+        else
+          link_impl = sd_link->get_link_down()->get_impl();
+        break;
+      default:
+        throw std::invalid_argument("Invalid add_route. Split-Duplex link without a direction: " +
+                                    link.get_link()->get_name());
+    }
+    links.push_back(link_impl);
+  }
+  return links;
+}
+
 void NetZoneImpl::add_route(NetPoint* /*src*/, NetPoint* /*dst*/, NetPoint* /*gw_src*/, NetPoint* /*gw_dst*/,
-                            const std::vector<resource::LinkImpl*>& /*link_list_*/, bool /*symmetrical*/)
+                            const std::vector<s4u::LinkInRoute>& /*link_list_*/, bool /*symmetrical*/)
 {
   xbt_die("NetZone '%s' does not accept new routes (wrong class).", get_cname());
 }
 
 void NetZoneImpl::add_bypass_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                                   std::vector<resource::LinkImpl*>& link_list_, bool /* symmetrical */)
+                                   const std::vector<s4u::LinkInRoute>& link_list)
 {
   /* Argument validity checks */
   if (gw_dst) {
     XBT_DEBUG("Load bypassNetzoneRoute from %s@%s to %s@%s", src->get_cname(), gw_src->get_cname(), dst->get_cname(),
               gw_dst->get_cname());
-    xbt_assert(not link_list_.empty(), "Bypass route between %s@%s and %s@%s cannot be empty.", src->get_cname(),
+    xbt_assert(not link_list.empty(), "Bypass route between %s@%s and %s@%s cannot be empty.", src->get_cname(),
                gw_src->get_cname(), dst->get_cname(), gw_dst->get_cname());
     xbt_assert(bypass_routes_.find({src, dst}) == bypass_routes_.end(),
                "The bypass route between %s@%s and %s@%s already exists.", src->get_cname(), gw_src->get_cname(),
                dst->get_cname(), gw_dst->get_cname());
   } else {
     XBT_DEBUG("Load bypassRoute from %s to %s", src->get_cname(), dst->get_cname());
-    xbt_assert(not link_list_.empty(), "Bypass route between %s and %s cannot be empty.", src->get_cname(),
+    xbt_assert(not link_list.empty(), "Bypass route between %s and %s cannot be empty.", src->get_cname(),
                dst->get_cname());
     xbt_assert(bypass_routes_.find({src, dst}) == bypass_routes_.end(),
                "The bypass route between %s and %s already exists.", src->get_cname(), dst->get_cname());
@@ -212,8 +267,8 @@ void NetZoneImpl::add_bypass_route(NetPoint* src, NetPoint* dst, NetPoint* gw_sr
 
   /* Build a copy that will be stored in the dict */
   auto* newRoute = new BypassRoute(gw_src, gw_dst);
-  for (auto const& link : link_list_)
-    newRoute->links.push_back(link);
+  auto converted_list = get_link_list_impl(link_list, false);
+  newRoute->links.insert(newRoute->links.end(), begin(converted_list), end(converted_list));
 
   /* Store it */
   bypass_routes_.insert({{src, dst}, newRoute});
@@ -269,7 +324,7 @@ void NetZoneImpl::add_bypass_route(NetPoint* src, NetPoint* dst, NetPoint* gw_sr
  *                 dst
  *  @endverbatim
  */
-static void find_common_ancestors(NetPoint* src, NetPoint* dst,
+static void find_common_ancestors(const NetPoint* src, const NetPoint* dst,
                                   /* OUT */ NetZoneImpl** common_ancestor, NetZoneImpl** src_ancestor,
                                   NetZoneImpl** dst_ancestor)
 {
@@ -304,32 +359,32 @@ static void find_common_ancestors(NetPoint* src, NetPoint* dst,
     current = current->get_parent();
   }
 
-  /* (3) find the common father.
+  /* (3) find the common parent.
    * Before that, index_src and index_dst may be different, they both point to nullptr in path_src/path_dst
    * So we move them down simultaneously as long as they point to the same content.
    *
    * This works because all SimGrid platform have a unique root element (that is the last element of both paths).
    */
-  NetZoneImpl* father = nullptr; // the netzone we dropped on the previous loop iteration
+  NetZoneImpl* parent = nullptr; // the netzone we dropped on the previous loop iteration
   while (path_src.size() > 1 && path_dst.size() > 1 && path_src.back() == path_dst.back()) {
-    father = path_src.back();
+    parent = path_src.back();
     path_src.pop_back();
     path_dst.pop_back();
   }
 
   /* (4) we found the difference at least. Finalize the returned values */
-  *src_ancestor = path_src.back();                  /* the first different father of src */
-  *dst_ancestor = path_dst.back();                  /* the first different father of dst */
+  *src_ancestor = path_src.back();                  /* the first different parent of src */
+  *dst_ancestor = path_dst.back();                  /* the first different parent of dst */
   if (*src_ancestor == *dst_ancestor) {             // src is the ancestor of dst, or the contrary
     *common_ancestor = *src_ancestor;
   } else {
-    xbt_assert(father != nullptr);
-    *common_ancestor = father;
+    xbt_assert(parent != nullptr);
+    *common_ancestor = parent;
   }
 }
 
 /* PRECONDITION: this is the common ancestor of src and dst */
-bool NetZoneImpl::get_bypass_route(NetPoint* src, NetPoint* dst,
+bool NetZoneImpl::get_bypass_route(const NetPoint* src, const NetPoint* dst,
                                    /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency,
                                    std::unordered_set<NetZoneImpl*>& netzones)
 {
@@ -341,11 +396,7 @@ bool NetZoneImpl::get_bypass_route(NetPoint* src, NetPoint* dst,
   if (dst->get_englobing_zone() == this && src->get_englobing_zone() == this) {
     if (bypass_routes_.find({src, dst}) != bypass_routes_.end()) {
       const BypassRoute* bypassedRoute = bypass_routes_.at({src, dst});
-      for (resource::LinkImpl* const& link : bypassedRoute->links) {
-        links.push_back(link);
-        if (latency)
-          *latency += link->get_latency();
-      }
+      add_link_latency(links, bypassedRoute->links, latency);
       XBT_DEBUG("Found a bypass route from '%s' to '%s' with %zu links", src->get_cname(), dst->get_cname(),
                 bypassedRoute->links.size());
       return true;
@@ -370,7 +421,7 @@ bool NetZoneImpl::get_bypass_route(NetPoint* src, NetPoint* dst,
     current = current->parent_;
   }
 
-  /* (2) find the common father */
+  /* (2) find the common parent */
   while (path_src.size() > 1 && path_dst.size() > 1 && path_src.back() == path_dst.back()) {
     path_src.pop_back();
     path_dst.pop_back();
@@ -408,11 +459,7 @@ bool NetZoneImpl::get_bypass_route(NetPoint* src, NetPoint* dst,
               src->get_cname(), dst->get_cname(), bypassedRoute->links.size());
     if (src != key.first)
       get_global_route_with_netzones(src, bypassedRoute->gw_src, links, latency, netzones);
-    for (resource::LinkImpl* const& link : bypassedRoute->links) {
-      links.push_back(link);
-      if (latency)
-        *latency += link->get_latency();
-    }
+    add_link_latency(links, bypassedRoute->links, latency);
     if (dst != key.second)
       get_global_route_with_netzones(bypassedRoute->gw_dst, dst, links, latency, netzones);
     return true;
@@ -421,14 +468,14 @@ bool NetZoneImpl::get_bypass_route(NetPoint* src, NetPoint* dst,
   return false;
 }
 
-void NetZoneImpl::get_global_route(NetPoint* src, NetPoint* dst,
+void NetZoneImpl::get_global_route(const NetPoint* src, const NetPoint* dst,
                                    /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency)
 {
   std::unordered_set<NetZoneImpl*> netzones;
   get_global_route_with_netzones(src, dst, links, latency, netzones);
 }
 
-void NetZoneImpl::get_global_route_with_netzones(NetPoint* src, NetPoint* dst,
+void NetZoneImpl::get_global_route_with_netzones(const NetPoint* src, const NetPoint* dst,
                                                  /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency,
                                                  std::unordered_set<NetZoneImpl*>& netzones)
 {
@@ -441,8 +488,8 @@ void NetZoneImpl::get_global_route_with_netzones(NetPoint* src, NetPoint* dst,
   NetZoneImpl* src_ancestor;
   NetZoneImpl* dst_ancestor;
   find_common_ancestors(src, dst, &common_ancestor, &src_ancestor, &dst_ancestor);
-  XBT_DEBUG("elements_father: common ancestor '%s' src ancestor '%s' dst ancestor '%s'", common_ancestor->get_cname(),
-            src_ancestor->get_cname(), dst_ancestor->get_cname());
+  XBT_DEBUG("find_common_ancestors: common ancestor '%s' src ancestor '%s' dst ancestor '%s'",
+            common_ancestor->get_cname(), src_ancestor->get_cname(), dst_ancestor->get_cname());
 
   netzones.insert(src->get_englobing_zone());
   netzones.insert(dst->get_englobing_zone());
@@ -539,6 +586,32 @@ void NetZoneImpl::set_host_model(std::shared_ptr<surf::HostModel> host_model)
   host_model_ = std::move(host_model);
 }
 
+const NetZoneImpl* NetZoneImpl::get_netzone_recursive(const NetPoint* netpoint) const
+{
+  xbt_assert(netpoint && netpoint->is_netzone(), "Netpoint %s must be of the type NetZone",
+             netpoint ? netpoint->get_cname() : "nullptr");
+
+  if (netpoint == netpoint_)
+    return this;
+
+  for (const auto* children : children_) {
+    const NetZoneImpl* netzone = children->get_netzone_recursive(netpoint);
+    if (netzone)
+      return netzone;
+  }
+  return nullptr;
+}
+
+bool NetZoneImpl::is_component_recursive(const NetPoint* netpoint) const
+{
+  /* check direct components */
+  if (std::any_of(begin(vertices_), end(vertices_), [netpoint](const auto* elem) { return elem == netpoint; }))
+    return true;
+
+  /* check childrens */
+  return std::any_of(begin(children_), end(children_),
+                     [netpoint](const auto* child) { return child->is_component_recursive(netpoint); });
+}
 } // namespace routing
 } // namespace kernel
 } // namespace simgrid
diff --git a/src/kernel/routing/NetZone_test.hpp b/src/kernel/routing/NetZone_test.hpp
new file mode 100644 (file)
index 0000000..e0a047a
--- /dev/null
@@ -0,0 +1,23 @@
+/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved.               */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef NETZONE_TEST_HPP
+#define NETZONE_TEST_HPP
+
+#include "simgrid/kernel/routing/NetPoint.hpp"
+#include "simgrid/s4u/Host.hpp"
+#include "simgrid/s4u/NetZone.hpp"
+
+// Callback function common to several routing unit tests
+struct CreateHost {
+  std::pair<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*>
+  operator()(simgrid::s4u::NetZone* zone, const std::vector<unsigned long>& /*coord*/, unsigned long id) const
+  {
+    const simgrid::s4u::Host* host = zone->create_host(std::to_string(id), 1e9)->seal();
+    return std::make_pair(host->get_netpoint(), nullptr);
+  }
+};
+
+#endif
index 8be4dfe..7bbddf9 100644 (file)
@@ -131,7 +131,7 @@ Route* RoutedZone::new_extended_route(RoutingMode hierarchy, NetPoint* gw_src, N
   return result;
 }
 
-void RoutedZone::get_route_check_params(NetPoint* src, NetPoint* dst) const
+void RoutedZone::get_route_check_params(const NetPoint* src, const NetPoint* dst) const
 {
   xbt_assert(src, "Cannot find a route from nullptr to %s", dst->get_cname());
   xbt_assert(dst, "Cannot find a route from %s to nullptr", src->get_cname());
@@ -149,7 +149,7 @@ void RoutedZone::get_route_check_params(NetPoint* src, NetPoint* dst) const
              src->get_cname(), dst->get_cname(), src_as->get_cname(), dst_as->get_cname(), get_cname());
 }
 void RoutedZone::add_route_check_params(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                                        const std::vector<resource::LinkImpl*>& link_list, bool symmetrical) const
+                                        const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical) const
 {
   const char* srcName = src->get_cname();
   const char* dstName = dst->get_cname();
@@ -165,7 +165,8 @@ void RoutedZone::add_route_check_params(NetPoint* src, NetPoint* dst, NetPoint*
     xbt_assert(not dst->is_netzone(),
                "When defining a route, dst cannot be a netzone such as '%s'. Did you meant to have a NetzoneRoute?",
                dstName);
-    s4u::NetZone::on_route_creation(symmetrical, src, dst, gw_src, gw_dst, link_list);
+    s4u::NetZone::on_route_creation(symmetrical, src, dst, gw_src, gw_dst, get_link_list_impl(link_list, false));
+    NetZoneImpl::on_route_creation(symmetrical, src, dst, gw_src, gw_dst, get_link_list_impl(link_list, false));
   } else {
     XBT_DEBUG("Load NetzoneRoute from %s@%s to %s@%s", srcName, gw_src->get_cname(), dstName, gw_dst->get_cname());
     xbt_assert(src->is_netzone(), "When defining a NetzoneRoute, src must be a netzone but '%s' is not", srcName);
@@ -184,7 +185,19 @@ void RoutedZone::add_route_check_params(NetPoint* src, NetPoint* dst, NetPoint*
                gw_dst->get_cname(), dstName);
     xbt_assert(not link_list.empty(), "Empty route (between %s@%s and %s@%s) forbidden.", srcName, gw_src->get_cname(),
                dstName, gw_dst->get_cname());
-    s4u::NetZone::on_route_creation(symmetrical, gw_src, gw_dst, gw_src, gw_dst, link_list);
+    const auto* netzone_src = get_netzone_recursive(src);
+    xbt_assert(netzone_src->is_component_recursive(gw_src),
+               "Invalid NetzoneRoute from %s@%s to %s@%s: gw_src %s belongs to %s, not to %s.", srcName,
+               gw_src->get_cname(), dstName, gw_dst->get_cname(), gw_src->get_cname(),
+               gw_src->get_englobing_zone()->get_cname(), srcName);
+
+    const auto* netzone_dst = get_netzone_recursive(dst);
+    xbt_assert(netzone_dst->is_component_recursive(gw_dst),
+               "Invalid NetzoneRoute from %s@%s to %s@%s: gw_dst %s belongs to %s, not to %s.", srcName,
+               gw_src->get_cname(), dstName, gw_dst->get_cname(), gw_dst->get_cname(),
+               gw_dst->get_englobing_zone()->get_cname(), dst->get_cname());
+    s4u::NetZone::on_route_creation(symmetrical, gw_src, gw_dst, gw_src, gw_dst, get_link_list_impl(link_list, false));
+    NetZoneImpl::on_route_creation(symmetrical, gw_src, gw_dst, gw_src, gw_dst, get_link_list_impl(link_list, false));
   }
 }
 } // namespace routing
index 724c711..c30a638 100644 (file)
@@ -23,15 +23,13 @@ void StarZone::add_links_to_route(const std::vector<resource::LinkImpl*>& links,
     /* do not add duplicated links in route->link_list_ */
     if (not added_links.insert(link).second)
       continue;
-    if (latency)
-      *latency += link->get_latency();
-    route->link_list_.push_back(link);
+    add_link_latency(route->link_list_, link, latency);
   }
 }
 
-void StarZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, double* latency)
+void StarZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* route, double* latency)
 {
-  XBT_VERB("StarZone getLocalRoute from '%s'[%u] to '%s'[%u]", src->get_cname(), src->id(), dst->get_cname(),
+  XBT_VERB("StarZone getLocalRoute from '%s'[%lu] to '%s'[%lu]", src->get_cname(), src->id(), dst->get_cname(),
            dst->id());
 
   const auto& src_route = routes_.at(src->id());
@@ -111,6 +109,12 @@ void StarZone::check_add_route_param(const NetPoint* src, const NetPoint* dst, c
       throw std::invalid_argument(
           xbt::string_printf("StarZone::add_route(): src(%s) is a netzone, gw_src(%s) cannot be a netzone",
                              src->get_cname(), gw_src->get_cname()));
+
+    const auto* netzone_src = get_netzone_recursive(src);
+    if (not netzone_src->is_component_recursive(gw_src))
+      throw std::invalid_argument(xbt::string_printf(
+          "Invalid NetzoneRoute from %s@%s to %s: gw_src %s belongs to %s, not to %s.", src_name, gw_src->get_cname(),
+          dst_name, gw_src->get_cname(), gw_src->get_englobing_zone()->get_cname(), src_name));
   }
 
   if (dst && dst->is_netzone()) {
@@ -121,36 +125,41 @@ void StarZone::check_add_route_param(const NetPoint* src, const NetPoint* dst, c
       throw std::invalid_argument(
           xbt::string_printf("StarZone::add_route(): dst(%s) is a netzone, gw_dst(%s) cannot be a netzone",
                              dst->get_cname(), gw_dst->get_cname()));
+
+    const auto* netzone_dst = get_netzone_recursive(dst);
+    if (not netzone_dst->is_component_recursive(gw_dst))
+      throw std::invalid_argument(xbt::string_printf(
+          "Invalid NetzoneRoute from %s@%s to %s: gw_dst %s belongs to %s, not to %s.", dst_name, gw_dst->get_cname(),
+          src_name, gw_dst->get_cname(), gw_dst->get_englobing_zone()->get_cname(), dst_name));
   }
 }
 
 void StarZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
-                         const std::vector<kernel::resource::LinkImpl*>& link_list_, bool symmetrical)
+                         const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical)
 {
   check_add_route_param(src, dst, gw_src, gw_dst, symmetrical);
 
-  s4u::NetZone::on_route_creation(symmetrical, src, dst, gw_src, gw_dst, link_list_);
-
   /* loopback */
   if (src == dst) {
-    routes_[src->id()].loopback = link_list_;
+    routes_[src->id()].loopback = get_link_list_impl(link_list, false);
   } else {
     /* src to everyone */
     if (src) {
       auto& route        = routes_[src->id()];
-      route.links_up     = link_list_;
+      route.links_up     = get_link_list_impl(link_list, false);
       route.gateway      = gw_src;
       route.links_up_set = true;
       if (symmetrical) {
+        auto links_down = get_link_list_impl(link_list, true);
         /* reverse it for down/symmetrical links */
-        route.links_down.assign(link_list_.rbegin(), link_list_.rend());
+        route.links_down.assign(links_down.rbegin(), links_down.rend());
         route.links_down_set = true;
       }
     }
     /* dst to everyone */
     if (dst) {
       auto& route          = routes_[dst->id()];
-      route.links_down     = link_list_;
+      route.links_down     = get_link_list_impl(link_list, false);
       route.gateway        = gw_dst;
       route.links_down_set = true;
     }
index 41c481f..afc79b6 100644 (file)
@@ -19,6 +19,21 @@ TEST_CASE("kernel::routing::StarZone: Creating Zone", "[creation]")
   REQUIRE(simgrid::s4u::create_star_zone("test"));
 }
 
+TEST_CASE("kernel::routing::StarZone: Create links: exceptions", "")
+{
+  simgrid::s4u::Engine e("test");
+  auto* zone = simgrid::s4u::create_star_zone("test");
+  SECTION("create_link: invalid bandwidth")
+  {
+    REQUIRE_THROWS_AS(zone->create_link("link", "speed"), std::invalid_argument);
+  }
+
+  SECTION("split-duplex create_link: invalid bandwidth")
+  {
+    REQUIRE_THROWS_AS(zone->create_split_duplex_link("link", "speed"), std::invalid_argument);
+  }
+}
+
 TEST_CASE("kernel::routing::StarZone: Adding routes (hosts): exception", "")
 {
   simgrid::s4u::Engine e("test");
@@ -50,6 +65,8 @@ TEST_CASE("kernel::routing::StarZone: Adding routes (netzones): exception", "")
       new simgrid::kernel::routing::NetPoint("netpoint1", simgrid::kernel::routing::NetPoint::Type::NetZone);
   auto* netpoint2 =
       new simgrid::kernel::routing::NetPoint("netpoint2", simgrid::kernel::routing::NetPoint::Type::NetZone);
+  auto zone3      = std::make_unique<simgrid::kernel::routing::StarZone>("test3");
+  auto* netpoint3 = zone3->create_router("netpoint3");
 
   SECTION("src: is a netzone and gw_src: nullptr")
   {
@@ -70,6 +87,18 @@ TEST_CASE("kernel::routing::StarZone: Adding routes (netzones): exception", "")
   {
     REQUIRE_THROWS_AS(zone->add_route(nullptr, netpoint2, nullptr, netpoint1, {}, false), std::invalid_argument);
   }
+
+  SECTION("issue71: gw_src isn't member of the src netzone")
+  {
+    REQUIRE_THROWS_AS(zone->add_route(zone->get_netpoint(), nullptr, netpoint3, nullptr, {}, false),
+                      std::invalid_argument);
+  }
+
+  SECTION("issue71: gw_dst isn't member of the dst netzone")
+  {
+    REQUIRE_THROWS_AS(zone->add_route(nullptr, zone->get_netpoint(), nullptr, netpoint3, {}, false),
+                      std::invalid_argument);
+  }
 }
 
 // One day we may be able to test contracts and asserts with catch2
@@ -81,10 +110,10 @@ TEST_CASE("kernel::routing::StarZone: Get routes: assert", "[.][assert]")
 
   const auto* host1 = zone->create_host("netpoint1", {100});
   const auto* host2 = zone->create_host("netpoint2", {100});
-  std::vector<simgrid::kernel::resource::LinkImpl*> links;
-  links.push_back(zone->create_link("link1", {100})->get_impl());
-  std::vector<simgrid::kernel::resource::LinkImpl*> links2;
-  links2.push_back(zone->create_link("link2", {100})->get_impl());
+  std::vector<simgrid::s4u::LinkInRoute> links;
+  links.emplace_back(zone->create_link("link1", {100}));
+  std::vector<simgrid::s4u::LinkInRoute> links2;
+  links2.emplace_back(zone->create_link("link2", {100}));
 
   SECTION("Get route: no UP link")
   {
@@ -151,10 +180,10 @@ TEST_CASE("kernel::routing::StarZone: Get routes (hosts)", "")
 
   SECTION("Get route: no shared link")
   {
-    std::vector<simgrid::kernel::resource::LinkImpl*> links;
-    links.push_back(zone->create_link("link1", {100})->set_latency(10)->get_impl());
-    std::vector<simgrid::kernel::resource::LinkImpl*> links2;
-    links2.push_back(zone->create_link("link2", {200})->set_latency(20)->get_impl());
+    std::vector<simgrid::s4u::LinkInRoute> links;
+    links.emplace_back(zone->create_link("link1", {100})->set_latency(10));
+    std::vector<simgrid::s4u::LinkInRoute> links2;
+    links2.emplace_back(zone->create_link("link2", {200})->set_latency(20));
     zone->add_route(host1->get_netpoint(), nullptr, nullptr, nullptr, links, true);
     zone->add_route(host2->get_netpoint(), nullptr, nullptr, nullptr, links2, true);
     zone->seal();
@@ -172,13 +201,13 @@ TEST_CASE("kernel::routing::StarZone: Get routes (hosts)", "")
 
   SECTION("Get route: shared link(backbone)")
   {
-    auto* backbone = zone->create_link("backbone", {1000})->set_latency(100)->get_impl();
-    std::vector<simgrid::kernel::resource::LinkImpl*> links;
-    links.push_back(zone->create_link("link1", {100})->set_latency(10)->get_impl());
-    links.push_back(backbone);
-    std::vector<simgrid::kernel::resource::LinkImpl*> links2;
-    links2.push_back(zone->create_link("link2", {200})->set_latency(20)->get_impl());
-    links2.push_back(backbone);
+    auto* backbone = zone->create_link("backbone", {1000})->set_latency(100);
+    std::vector<simgrid::s4u::LinkInRoute> links;
+    links.emplace_back(zone->create_link("link1", {100})->set_latency(10));
+    links.emplace_back(backbone);
+    std::vector<simgrid::s4u::LinkInRoute> links2;
+    links2.emplace_back(zone->create_link("link2", {200})->set_latency(20));
+    links2.emplace_back(backbone);
 
     zone->add_route(host1->get_netpoint(), nullptr, nullptr, nullptr, links, true);
     zone->add_route(host2->get_netpoint(), nullptr, nullptr, nullptr, links2, true);
@@ -196,10 +225,10 @@ TEST_CASE("kernel::routing::StarZone: Get routes (hosts)", "")
 
   SECTION("Get route: loopback")
   {
-    auto* backbone = zone->create_link("backbone", {1000})->set_latency(100)->get_impl();
-    std::vector<simgrid::kernel::resource::LinkImpl*> links;
-    links.push_back(zone->create_link("link1", {100})->set_latency(10)->get_impl());
-    links.push_back(backbone);
+    auto* backbone = zone->create_link("backbone", {1000})->set_latency(100);
+    std::vector<simgrid::s4u::LinkInRoute> links;
+    links.emplace_back(zone->create_link("link1", {100})->set_latency(10));
+    links.emplace_back(backbone);
 
     zone->add_route(host1->get_netpoint(), host1->get_netpoint(), nullptr, nullptr, links, true);
     zone->seal();
@@ -219,28 +248,27 @@ TEST_CASE("kernel::routing::StarZone: Get routes (netzones)", "")
   simgrid::s4u::Engine e("test");
   auto* zone = new simgrid::kernel::routing::StarZone("test");
 
-  auto* subzone1 =
-      (new simgrid::kernel::routing::NetPoint("subzone1", simgrid::kernel::routing::NetPoint::Type::NetZone))
-          ->set_englobing_zone(zone);
-  auto* subzone2 =
-      (new simgrid::kernel::routing::NetPoint("subzone2", simgrid::kernel::routing::NetPoint::Type::NetZone))
-          ->set_englobing_zone(zone);
-  auto* router1 = new simgrid::kernel::routing::NetPoint("router1", simgrid::kernel::routing::NetPoint::Type::Router);
-  auto* router2 = new simgrid::kernel::routing::NetPoint("router2", simgrid::kernel::routing::NetPoint::Type::Router);
+  auto* subzone1 = new simgrid::kernel::routing::StarZone("subzone1");
+  subzone1->set_parent(zone);
+  auto* subzone2 = new simgrid::kernel::routing::StarZone("subzone2");
+  subzone2->set_parent(zone);
+
+  auto* router1 = subzone1->create_router("router1");
+  auto* router2 = subzone2->create_router("router2");
 
   SECTION("Get route: netzone")
   {
-    std::vector<simgrid::kernel::resource::LinkImpl*> links;
-    links.push_back(zone->create_link("link1", {100})->set_latency(10)->get_impl());
-    std::vector<simgrid::kernel::resource::LinkImpl*> links2;
-    links2.push_back(zone->create_link("link2", {200})->set_latency(20)->get_impl());
-    zone->add_route(subzone1, nullptr, router1, nullptr, links, true);
-    zone->add_route(subzone2, nullptr, router2, nullptr, links2, true);
+    std::vector<simgrid::s4u::LinkInRoute> links;
+    links.emplace_back(zone->create_link("link1", {100})->set_latency(10));
+    std::vector<simgrid::s4u::LinkInRoute> links2;
+    links2.emplace_back(zone->create_link("link2", {200})->set_latency(20));
+    zone->add_route(subzone1->get_netpoint(), nullptr, router1, nullptr, links, true);
+    zone->add_route(subzone2->get_netpoint(), nullptr, router2, nullptr, links2, true);
     zone->seal();
 
     double lat = 0.0;
     simgrid::kernel::routing::Route route;
-    zone->get_local_route(subzone1, subzone2, &route, &lat);
+    zone->get_local_route(subzone1->get_netpoint(), subzone2->get_netpoint(), &route, &lat);
     REQUIRE(lat == 30);
     REQUIRE(route.gw_src_ == router1);
     REQUIRE(route.gw_dst_ == router2);
@@ -255,11 +283,11 @@ TEST_CASE("kernel::routing::StarZone: mix new routes and hosts", "")
   simgrid::s4u::Engine e("test");
   auto* zone = simgrid::s4u::create_star_zone("test");
 
-  simgrid::s4u::Link* link = zone->create_link("my_link", 1e6)->seal();
+  const simgrid::s4u::Link* link = zone->create_link("my_link", 1e6)->seal();
   for (int i = 0; i < 10; i++) {
     std::string cpu_name          = "CPU" + std::to_string(i);
     const simgrid::s4u::Host* cpu = zone->create_host(cpu_name, 1e9)->seal();
     REQUIRE_NOTHROW(
-        zone->add_route(cpu->get_netpoint(), nullptr, nullptr, nullptr, std::vector<simgrid::s4u::Link*>{link}, true));
+        zone->add_route(cpu->get_netpoint(), nullptr, nullptr, nullptr, {simgrid::s4u::LinkInRoute(link)}, true));
   }
 }
index b7c7001..fe93efd 100644 (file)
@@ -20,32 +20,29 @@ namespace simgrid {
 namespace kernel {
 namespace routing {
 
-void TorusZone::create_torus_links(int id, int rank, unsigned int position)
+void TorusZone::create_torus_links(unsigned long id, int rank, unsigned long position)
 {
   /* Create all links that exist in the torus. Each rank creates @a dimensions-1 links */
   int dim_product = 1; // Needed to calculate the next neighbor_id
 
-  for (unsigned int j = 0; j < dimensions_.size(); j++) {
-    int current_dimension = dimensions_[j]; // which dimension are we currently in?
-                                            // we need to iterate over all dimensions and create all links there
+  for (unsigned long j = 0; j < dimensions_.size(); j++) {
+    unsigned long current_dimension =
+        dimensions_[j]; // which dimension are we currently in?
+                        // we need to iterate over all dimensions and create all links there
     // The other node the link connects
-    int neighbor_rank_id = ((rank / dim_product) % current_dimension == current_dimension - 1)
-                               ? rank - (current_dimension - 1) * dim_product
-                               : rank + dim_product;
+    unsigned long neighbor_rank_id = ((rank / dim_product) % current_dimension == current_dimension - 1)
+                                         ? rank - (current_dimension - 1) * dim_product
+                                         : rank + dim_product;
     // name of neighbor is not right for non contiguous cluster radicals (as id != rank in this case)
     std::string link_id = get_name() + "_link_from_" + std::to_string(id) + "_to_" + std::to_string(neighbor_rank_id);
     const s4u::Link* linkup;
     const s4u::Link* linkdown;
     if (get_link_sharing_policy() == s4u::Link::SharingPolicy::SPLITDUPLEX) {
-      linkup = create_link(link_id + "_UP", std::vector<double>{get_link_bandwidth()})
-                   ->set_latency(get_link_latency())
-                   ->seal();
-      linkdown = create_link(link_id + "_DOWN", std::vector<double>{get_link_bandwidth()})
-                     ->set_latency(get_link_latency())
-                     ->seal();
+      linkup   = create_link(link_id + "_UP", {get_link_bandwidth()})->set_latency(get_link_latency())->seal();
+      linkdown = create_link(link_id + "_DOWN", {get_link_bandwidth()})->set_latency(get_link_latency())->seal();
 
     } else {
-      linkup = create_link(link_id, std::vector<double>{get_link_bandwidth()})->set_latency(get_link_latency())->seal();
+      linkup   = create_link(link_id, {get_link_bandwidth()})->set_latency(get_link_latency())->seal();
       linkdown = linkup;
     }
     /*
@@ -58,33 +55,32 @@ void TorusZone::create_torus_links(int id, int rank, unsigned int position)
   }
 }
 
-std::vector<unsigned int> TorusZone::parse_topo_parameters(const std::string& topo_parameters)
+std::vector<unsigned long> TorusZone::parse_topo_parameters(const std::string& topo_parameters)
 {
   std::vector<std::string> dimensions_str;
   boost::split(dimensions_str, topo_parameters, boost::is_any_of(","));
-  std::vector<unsigned int> dimensions;
+  std::vector<unsigned long> dimensions;
+
+  /* We are in a torus cluster
+   * Parse attribute dimensions="dim1,dim2,dim3,...,dimN" and save them into a vector.
+   * Additionally, we need to know how many ranks we have in total
+   */
+  std::transform(begin(dimensions_str), end(dimensions_str), std::back_inserter(dimensions),
+                 [](const std::string& s) { return std::stoi(s); });
 
-  if (not dimensions_str.empty()) {
-    /* We are in a torus cluster
-     * Parse attribute dimensions="dim1,dim2,dim3,...,dimN" and save them into a vector.
-     * Additionally, we need to know how many ranks we have in total
-     */
-    std::transform(begin(dimensions_str), end(dimensions_str), std::back_inserter(dimensions),
-                   [](const std::string& s) { return std::stoi(s); });
-  }
   return dimensions;
 }
 
-void TorusZone::set_topology(const std::vector<unsigned int>& dimensions)
+void TorusZone::set_topology(const std::vector<unsigned long>& dimensions)
 {
   xbt_assert(not dimensions.empty(), "Torus dimensions cannot be empty");
   dimensions_ = dimensions;
   set_num_links_per_node(dimensions_.size());
 }
 
-void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, double* lat)
+void TorusZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* route, double* lat)
 {
-  XBT_VERB("torus getLocalRoute from '%s'[%u] to '%s'[%u]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
+  XBT_VERB("torus getLocalRoute from '%s'[%lu] to '%s'[%lu]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
 
   if (dst->is_router() || src->is_router())
     return;
@@ -92,9 +88,7 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
   if (src->id() == dst->id() && has_loopback()) {
     resource::LinkImpl* uplink = get_uplink_from(node_pos(src->id()));
 
-    route->link_list_.push_back(uplink);
-    if (lat)
-      *lat += uplink->get_latency();
+    add_link_latency(route->link_list_, uplink, lat);
     return;
   }
 
@@ -108,11 +102,11 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
    * both arrays, we can easily assess whether we need to route into this dimension or not.
    */
   const unsigned long dsize = dimensions_.size();
-  std::vector<unsigned int> myCoords(dsize);
-  std::vector<unsigned int> targetCoords(dsize);
+  std::vector<unsigned long> myCoords(dsize);
+  std::vector<unsigned long> targetCoords(dsize);
   unsigned int dim_size_product = 1;
   for (unsigned long i = 0; i < dsize; i++) {
-    unsigned cur_dim_size = dimensions_[i];
+    unsigned long cur_dim_size = dimensions_[i];
     myCoords[i]           = (src->id() / dim_size_product) % cur_dim_size;
     targetCoords[i]       = (dst->id() / dim_size_product) % cur_dim_size;
     dim_size_product *= cur_dim_size;
@@ -122,15 +116,15 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
    * linkOffset describes the offset where the link we want to use is stored(+1 is added because each node has a link
    * from itself to itself, which can only be the case if src->m_id == dst->m_id -- see above for this special case)
    */
-  int linkOffset = (dsize + 1) * src->id();
+  unsigned long linkOffset = (dsize + 1) * src->id();
 
   bool use_lnk_up = false; // Is this link of the form "cur -> next" or "next -> cur"? false means: next -> cur
-  unsigned int current_node = src->id();
+  unsigned long current_node = src->id();
   while (current_node != dst->id()) {
-    unsigned int next_node   = 0;
-    unsigned int dim_product = 1; // First, we will route in x-dimension
-    for (unsigned j = 0; j < dsize; j++) {
-      const unsigned cur_dim = dimensions_[j];
+    unsigned long next_node   = 0;
+    unsigned long dim_product = 1; // First, we will route in x-dimension
+    for (unsigned long j = 0; j < dsize; j++) {
+      const unsigned long cur_dim = dimensions_[j];
       // current_node/dim_product = position in current dimension
       if ((current_node / dim_product) % cur_dim != (dst->id() / dim_product) % cur_dim) {
         if ((targetCoords[j] > myCoords[j] &&
@@ -146,7 +140,6 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
           // HERE: We use *CURRENT* node for calculation (as opposed to next_node)
           linkOffset = node_pos_with_loopback_limiter(current_node) + j;
           use_lnk_up = true;
-          assert(linkOffset >= 0);
         } else { // Route to the left
           if ((current_node / dim_product) % cur_dim == 0)
             next_node = (current_node - dim_product + dim_product * cur_dim);
@@ -156,10 +149,8 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
           // HERE: We use *next* node for calculation (as opposed to current_node!)
           linkOffset = node_pos_with_loopback_limiter(next_node) + j;
           use_lnk_up = false;
-
-          assert(linkOffset >= 0);
         }
-        XBT_DEBUG("torus_get_route_and_latency - current_node: %u, next_node: %u, linkOffset is %i", current_node,
+        XBT_DEBUG("torus_get_route_and_latency - current_node: %lu, next_node: %lu, linkOffset is %lu", current_node,
                   next_node, linkOffset);
         break;
       }
@@ -177,9 +168,7 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
     else
       lnk = get_downlink_to(linkOffset);
 
-    route->link_list_.push_back(lnk);
-    if (lat)
-      *lat += lnk->get_latency();
+    add_link_latency(route->link_list_, lnk, lat);
 
     current_node = next_node;
   }
@@ -196,7 +185,7 @@ void TorusZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, doub
 
 namespace s4u {
 
-NetZone* create_torus_zone(const std::string& name, const NetZone* parent, const std::vector<unsigned int>& dimensions,
+NetZone* create_torus_zone(const std::string& name, const NetZone* parent, const std::vector<unsigned long>& dimensions,
                            const ClusterCallbacks& set_callbacks, double bandwidth, double latency,
                            Link::SharingPolicy sharing_policy)
 {
index a33a15c..cdaf198 100644 (file)
@@ -5,25 +5,14 @@
 
 #include "catch.hpp"
 
-#include "simgrid/kernel/routing/NetPoint.hpp"
+#include "NetZone_test.hpp" // CreateHost callback
 #include "simgrid/kernel/routing/TorusZone.hpp"
 #include "simgrid/s4u/Engine.hpp"
-#include "simgrid/s4u/Host.hpp"
-#include "simgrid/s4u/NetZone.hpp"
-
-namespace {
-std::pair<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*>
-create_host(simgrid::s4u::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
-{
-  const simgrid::s4u::Host* host = zone->create_host(std::to_string(id), 1e9)->seal();
-  return std::make_pair(host->get_netpoint(), nullptr);
-}
-} // namespace
 
 TEST_CASE("kernel::routing::TorusZone: Creating Zone", "")
 {
   simgrid::s4u::Engine e("test");
-  simgrid::s4u::ClusterCallbacks callbacks(create_host);
+  simgrid::s4u::ClusterCallbacks callbacks(CreateHost{});
   REQUIRE(create_torus_zone("test", e.get_netzone_root(), {3, 3, 3}, callbacks, 1e9, 10,
                             simgrid::s4u::Link::SharingPolicy::SHARED));
 }
@@ -31,7 +20,7 @@ TEST_CASE("kernel::routing::TorusZone: Creating Zone", "")
 TEST_CASE("kernel::routing::TorusZone: Invalid params", "")
 {
   simgrid::s4u::Engine e("test");
-  simgrid::s4u::ClusterCallbacks callbacks(create_host);
+  simgrid::s4u::ClusterCallbacks callbacks(CreateHost{});
 
   SECTION("Empty dimensions")
   {
index eceb3f7..d15f521 100644 (file)
@@ -49,7 +49,7 @@ static inline double euclidean_dist_comp(double src_coord, double dst_coord)
   return (src_coord - dst_coord) * (src_coord - dst_coord);
 }
 
-static const std::vector<double>& netpoint_get_coords(NetPoint* np)
+static const std::vector<double>& netpoint_get_coords(const NetPoint* np)
 {
   const auto* coords = np->extension<vivaldi::Coords>();
   xbt_assert(coords, "Please specify the Vivaldi coordinates of %s %s (%p)",
@@ -64,15 +64,15 @@ void VivaldiZone::set_peer_link(NetPoint* netpoint, double bw_in, double bw_out)
 
   std::string link_up        = "link_" + netpoint->get_name() + "_UP";
   std::string link_down      = "link_" + netpoint->get_name() + "_DOWN";
-  const auto* linkUp         = create_link(link_up, std::vector<double>{bw_out})->seal();
-  const auto* linkDown       = create_link(link_down, std::vector<double>{bw_in})->seal();
-  add_route(netpoint, nullptr, nullptr, nullptr, {linkUp->get_impl()}, false);
-  add_route(nullptr, netpoint, nullptr, nullptr, {linkDown->get_impl()}, false);
+  const auto* linkUp         = create_link(link_up, {bw_out})->seal();
+  const auto* linkDown       = create_link(link_down, {bw_in})->seal();
+  add_route(netpoint, nullptr, nullptr, nullptr, {s4u::LinkInRoute(linkUp)}, false);
+  add_route(nullptr, netpoint, nullptr, nullptr, {s4u::LinkInRoute(linkDown)}, false);
 }
 
-void VivaldiZone::get_local_route(NetPoint* src, NetPoint* dst, Route* route, double* lat)
+void VivaldiZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* route, double* lat)
 {
-  XBT_DEBUG("vivaldi getLocalRoute from '%s'[%u] '%s'[%u]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
+  XBT_DEBUG("vivaldi getLocalRoute from '%s'[%lu] '%s'[%lu]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
 
   if (src->is_netzone()) {
     std::string srcName = "router_" + src->get_name();
index 95f3c16..2acdb0e 100644 (file)
@@ -28,9 +28,9 @@ void WifiZone::do_seal()
   }
 }
 
-void WifiZone::get_local_route(NetPoint* src, NetPoint* dst, Route* res, double* lat)
+void WifiZone::get_local_route(const NetPoint* src, const NetPoint* dst, Route* res, double* lat)
 {
-  XBT_DEBUG("full getLocalRoute from %s[%u] to %s[%u]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
+  XBT_DEBUG("full getLocalRoute from %s[%lu] to %s[%lu]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
 
   if (wifi_link_ != nullptr) {
     // If src and dst are nodes, not access_point, we need to traverse the link twice
@@ -38,15 +38,11 @@ void WifiZone::get_local_route(NetPoint* src, NetPoint* dst, Route* res, double*
 
     if (src != access_point_) {
       XBT_DEBUG("src %s is not our gateway", src->get_cname());
-      res->link_list_.push_back(wifi_link_);
-      if (lat)
-        *lat += wifi_link_->get_latency();
+      add_link_latency(res->link_list_, wifi_link_, lat);
     }
     if (dst != access_point_) {
       XBT_DEBUG("dst %s is not our gateway", dst->get_cname());
-      res->link_list_.push_back(wifi_link_);
-      if (lat)
-        *lat += wifi_link_->get_latency();
+      add_link_latency(res->link_list_, wifi_link_, lat);
     }
   }
 }
@@ -57,7 +53,7 @@ s4u::Link* WifiZone::create_link(const std::string& name, const std::vector<doub
              "WIFI netzone %s contains more than one link. Please only declare one, the wifi link.", get_cname());
 
   wifi_link_ = get_network_model()->create_wifi_link(name, bandwidths);
-  wifi_link_->set_sharing_policy(s4u::Link::SharingPolicy::WIFI);
+  wifi_link_->set_sharing_policy(s4u::Link::SharingPolicy::WIFI, {});
   return wifi_link_->get_iface();
 }
 } // namespace routing
index feab1c3..f44ed02 100644 (file)
@@ -40,23 +40,25 @@ ModelChecker::ModelChecker(std::unique_ptr<RemoteProcess> remote_simulation, int
 
 void ModelChecker::start()
 {
-  checker_side_.start([](evutil_socket_t sig, short events, void* arg) {
-    auto mc = static_cast<simgrid::mc::ModelChecker*>(arg);
-    if (events == EV_READ) {
-      std::array<char, MC_MESSAGE_LENGTH> buffer;
-      ssize_t size = mc->checker_side_.get_channel().receive(buffer.data(), buffer.size(), false);
-      if (size == -1 && errno != EAGAIN)
-        throw simgrid::xbt::errno_error();
-
-      if (not mc->handle_message(buffer.data(), size))
-        mc->checker_side_.break_loop();
-    } else if (events == EV_SIGNAL) {
-      if (sig == SIGCHLD)
-        mc->handle_waitpid();
-    } else {
-      xbt_die("Unexpected event");
-    }
-  });
+  checker_side_.start(
+      [](evutil_socket_t sig, short events, void* arg) {
+        auto mc = static_cast<simgrid::mc::ModelChecker*>(arg);
+        if (events == EV_READ) {
+          std::array<char, MC_MESSAGE_LENGTH> buffer;
+          ssize_t size = mc->checker_side_.get_channel().receive(buffer.data(), buffer.size(), false);
+          if (size == -1 && errno != EAGAIN)
+            throw simgrid::xbt::errno_error();
+
+          if (not mc->handle_message(buffer.data(), size))
+            mc->checker_side_.break_loop();
+        } else if (events == EV_SIGNAL) {
+          if (sig == SIGCHLD)
+            mc->handle_waitpid();
+        } else {
+          xbt_die("Unexpected event");
+        }
+      },
+      this);
 
   XBT_DEBUG("Waiting for the model-checked process");
   int status;
index 796dd33..b477078 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2020-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "api.hpp"
 
 #include "src/kernel/activity/MailboxImpl.hpp"
@@ -103,42 +108,37 @@ static inline smx_simcall_t MC_state_choose_request_for_process(const RemoteProc
 
   smx_simcall_t req = nullptr;
   if (actor->simcall_.observer_ != nullptr) {
-    state->transition_.times_considered_ = procstate->times_considered;
-    procstate->times_considered++;
-    if (actor->simcall_.mc_max_consider_ <= procstate->times_considered)
+    state->transition_.times_considered_ = procstate->get_times_considered_and_inc();
+    if (actor->simcall_.mc_max_consider_ <= procstate->get_times_considered())
       procstate->set_done();
     req = &actor->simcall_;
   } else
     switch (actor->simcall_.call_) {
       case Simcall::COMM_WAITANY:
-        state->transition_.times_considered_ = -1;
-        while (procstate->times_considered < simcall_comm_waitany__get__count(&actor->simcall_)) {
-          if (simgrid::mc::request_is_enabled_by_idx(process, &actor->simcall_, procstate->times_considered)) {
-            state->transition_.times_considered_ = procstate->times_considered;
-            ++procstate->times_considered;
+        while (procstate->get_times_considered() < simcall_comm_waitany__get__count(&actor->simcall_)) {
+          if (simgrid::mc::request_is_enabled_by_idx(process, &actor->simcall_, procstate->get_times_considered())) {
+            state->transition_.times_considered_ = procstate->get_times_considered_and_inc();
             break;
           }
-          ++procstate->times_considered;
+          procstate->get_times_considered_and_inc();
         }
 
-        if (procstate->times_considered >= simcall_comm_waitany__get__count(&actor->simcall_))
+        if (procstate->get_times_considered() >= simcall_comm_waitany__get__count(&actor->simcall_))
           procstate->set_done();
         if (state->transition_.times_considered_ != -1)
           req = &actor->simcall_;
         break;
 
       case Simcall::COMM_TESTANY:
-        state->transition_.times_considered_ = -1;
-        while (procstate->times_considered < simcall_comm_testany__get__count(&actor->simcall_)) {
-          if (simgrid::mc::request_is_enabled_by_idx(process, &actor->simcall_, procstate->times_considered)) {
-            state->transition_.times_considered_ = procstate->times_considered;
-            ++procstate->times_considered;
+        while (procstate->get_times_considered() < simcall_comm_testany__get__count(&actor->simcall_)) {
+          if (simgrid::mc::request_is_enabled_by_idx(process, &actor->simcall_, procstate->get_times_considered())) {
+            state->transition_.times_considered_ = procstate->get_times_considered_and_inc();
             break;
           }
-          ++procstate->times_considered;
+          procstate->get_times_considered_and_inc();
         }
 
-        if (procstate->times_considered >= simcall_comm_testany__get__count(&actor->simcall_))
+        if (procstate->get_times_considered() >= simcall_comm_testany__get__count(&actor->simcall_))
           procstate->set_done();
         if (state->transition_.times_considered_ != -1)
           req = &actor->simcall_;
@@ -155,8 +155,6 @@ static inline smx_simcall_t MC_state_choose_request_for_process(const RemoteProc
         else if (act->src_actor_.get() == nullptr && act->state_ == simgrid::kernel::activity::State::READY &&
                  act->detached())
           state->transition_.times_considered_ = 0; // OK
-        else
-          state->transition_.times_considered_ = -1; // timeout
         procstate->set_done();
         req = &actor->simcall_;
         break;
index 548bbe8..23b9043 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2020-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #ifndef SIMGRID_MC_API_HPP
 #define SIMGRID_MC_API_HPP
 
index 1b7953a..6456c08 100644 (file)
@@ -46,13 +46,8 @@ static bool evaluate_label(const xbt_automaton_exp_label* l, std::vector<int> co
       && evaluate_label(l->u.or_and.right_exp, values);
   case xbt_automaton_exp_label::AUT_NOT:
     return not evaluate_label(l->u.exp_not, values);
-  case xbt_automaton_exp_label::AUT_PREDICAT:{
-      auto cursor = api::get().compare_automaton_exp_label(l);
-      if(cursor >= 0)
-        return values[cursor] != 0;
-      xbt_die("Missing predicate");
-      break;
-    }
+  case xbt_automaton_exp_label::AUT_PREDICAT:
+    return values.at(api::get().compare_automaton_exp_label(l)) != 0;
   case xbt_automaton_exp_label::AUT_ONE:
     return true;
   default:
index ac21b5f..fb87859 100644 (file)
@@ -89,7 +89,11 @@ void SafetyChecker::run()
 
     // Backtrack if we reached the maximum depth
     if (stack_.size() > (std::size_t)_sg_mc_max_depth) {
-      XBT_WARN("/!\\ Max depth reached ! /!\\ ");
+      if (reductionMode_ == ReductionMode::dpor) {
+        XBT_ERROR("/!\\ Max depth reached! THIS WILL PROBABLY BREAK the dpor reduction /!\\");
+        XBT_ERROR("/!\\ If bad things happen, disable dpor with --cfg=model-check/reduction:none /!\\");
+      } else
+        XBT_WARN("/!\\ Max depth reached ! /!\\ ");
       this->backtrack();
       continue;
     }
index 47d39a5..f2a09f4 100644 (file)
@@ -239,7 +239,7 @@ static bool mmalloc_heap_differ(const RemoteProcess& process, StateComparator& s
 
     xbt_assert(heapinfo1->type >= 0, "Unknown mmalloc block type: %d", heapinfo1->type);
 
-    void* addr_block1 = ((void*)(((ADDR2UINT(i1)) - 1) * BLOCKSIZE + (char*)state.std_heap_copy.heapbase));
+    void* addr_block1 = (ADDR2UINT(i1) - 1) * BLOCKSIZE + (char*)state.std_heap_copy.heapbase;
 
     if (heapinfo1->type == MMALLOC_TYPE_UNFRAGMENTED) { /* Large block */
       if (is_stack(process, addr_block1)) {
@@ -880,7 +880,7 @@ static bool heap_area_differ(const RemoteProcess& process, StateComparator& stat
     }
 
     // Check if the blocks are already matched together:
-    if (state.equals_to_<1>(block1, frag1).valid_ && state.equals_to_<2>(block2, frag2).valid_ && offset1 == offset2 &&
+    if (state.equals_to_<1>(block1, frag1).valid_ && state.equals_to_<2>(block2, frag2).valid_ &&
         state.fragmentsEqual(block1, frag1, block2, frag2)) {
       if (match_pairs)
         state.match_equals(previous);
index 20e7761..52a6370 100644 (file)
@@ -78,7 +78,7 @@ void execute(const Dwarf_Op* ops, std::size_t n, const ExpressionContext& contex
 
         // Pop/drop the top of the stack:
       case DW_OP_drop:
-        stack.pop();
+        (void)stack.pop();
         break;
 
       case DW_OP_swap:
index 2299d30..a3447bf 100644 (file)
@@ -22,8 +22,6 @@ void* resolve_member(const void* base, const simgrid::mc::Type* /*type*/, const
                      const simgrid::mc::AddressSpace* address_space)
 {
   ExpressionContext state;
-  state.frame_base    = nullptr;
-  state.cursor        = nullptr;
   state.address_space = address_space;
 
   ExpressionStack stack;
index 79bcd24..bb26c9d 100644 (file)
@@ -67,23 +67,25 @@ class ActorState {
   };
 
   /** Exploration control information */
-  InterleavingType state = InterleavingType::disabled;
+  InterleavingType state_ = InterleavingType::disabled;
 
-public:
   /** Number of times that the process was considered to be executed */
-  // TODO, make this private
-  unsigned int times_considered = 0;
+  unsigned int times_considered_ = 0;
+
+public:
+  unsigned int get_times_considered() const { return times_considered_; }
+  unsigned int get_times_considered_and_inc() { return times_considered_++; }
 
-  bool is_disabled() const { return this->state == InterleavingType::disabled; }
-  bool is_done() const { return this->state == InterleavingType::done; }
-  bool is_todo() const { return this->state == InterleavingType::todo; }
+  bool is_disabled() const { return this->state_ == InterleavingType::disabled; }
+  bool is_done() const { return this->state_ == InterleavingType::done; }
+  bool is_todo() const { return this->state_ == InterleavingType::todo; }
   /** Mark that we should try executing this process at some point in the future of the checker algorithm */
   void mark_todo()
   {
-    this->state            = InterleavingType::todo;
-    this->times_considered = 0;
+    this->state_            = InterleavingType::todo;
+    this->times_considered_ = 0;
   }
-  void set_done() { this->state = InterleavingType::done; }
+  void set_done() { this->state_ = InterleavingType::done; }
 };
 
 } // namespace mc
index cc216b8..e503049 100644 (file)
@@ -52,7 +52,6 @@ static void MC_process_refresh_simix_actor_dynar(const simgrid::mc::RemoteProces
     simgrid::mc::ActorInformation info;
 
     info.address  = simgrid::mc::RemotePtr<simgrid::kernel::actor::ActorImpl>(data[i]);
-    info.hostname = nullptr;
     process->read_bytes(&info.copy, sizeof(info.copy), remote(data[i]));
     target.push_back(std::move(info));
   }
index 27b560d..2938475 100644 (file)
@@ -49,7 +49,7 @@ AppSide* AppSide::initialize()
 
   // Fetch socket from MC_ENV_SOCKET_FD:
   const char* fd_env = std::getenv(MC_ENV_SOCKET_FD);
-  int fd = xbt_str_parse_int(fd_env, "Variable '" MC_ENV_SOCKET_FD "' should contain a number but contains '%s'");
+  int fd             = xbt_str_parse_int(fd_env, "Not a number in variable '" MC_ENV_SOCKET_FD "'");
   XBT_DEBUG("Model-checked application found socket FD %i", fd);
 
   // Check the socket type/validity:
@@ -85,15 +85,9 @@ AppSide* AppSide::initialize()
 void AppSide::handle_deadlock_check(const s_mc_message_t*) const
 {
   const auto& actor_list = kernel::EngineImpl::get_instance()->get_actor_list();
-  bool deadlock = false;
-  if (not actor_list.empty()) {
-    deadlock = true;
-    for (auto const& kv : actor_list)
-      if (mc::actor_is_enabled(kv.second)) {
-        deadlock = false;
-        break;
-      }
-  }
+  bool deadlock = not actor_list.empty() && std::none_of(begin(actor_list), end(actor_list), [](const auto& kv) {
+    return mc::actor_is_enabled(kv.second);
+  });
 
   // Send result:
   s_mc_message_int_t answer{MessageType::DEADLOCK_CHECK_REPLY, deadlock};
@@ -113,7 +107,7 @@ void AppSide::handle_actor_enabled(const s_mc_message_actor_enabled_t* msg) cons
 {
   bool res = mc::actor_is_enabled(kernel::actor::ActorImpl::by_pid(msg->aid));
   s_mc_message_int_t answer{MessageType::ACTOR_ENABLED_REPLY, res};
-  channel_.send(answer);
+  xbt_assert(channel_.send(answer) == 0, "Could not send ACTOR_ENABLED_REPLY");
 }
 
 #define assert_msg_size(_name_, _type_)                                                                                \
index 013526c..c95c839 100644 (file)
 namespace simgrid {
 namespace mc {
 
-CheckerSide::~CheckerSide()
+void CheckerSide::start(void (*handler)(int, short, void*), ModelChecker* mc)
 {
-  if (socket_event_ != nullptr)
-    event_free(socket_event_);
-  if (signal_event_ != nullptr)
-    event_free(signal_event_);
-  if (base_ != nullptr)
-    event_base_free(base_);
-}
-
-void CheckerSide::start(void (*handler)(int, short, void*))
-{
-  base_ = event_base_new();
+  auto* base = event_base_new();
+  base_.reset(base);
 
-  socket_event_ = event_new(base_, get_channel().get_socket(), EV_READ | EV_PERSIST, handler, this);
-  event_add(socket_event_, nullptr);
+  auto* socket_event = event_new(base, get_channel().get_socket(), EV_READ | EV_PERSIST, handler, mc);
+  event_add(socket_event, nullptr);
+  socket_event_.reset(socket_event);
 
-  signal_event_ = event_new(base_, SIGCHLD, EV_SIGNAL | EV_PERSIST, handler, this);
-  event_add(signal_event_, nullptr);
+  auto* signal_event = event_new(base, SIGCHLD, EV_SIGNAL | EV_PERSIST, handler, mc);
+  event_add(signal_event, nullptr);
+  signal_event_.reset(signal_event);
 }
 
-void CheckerSide::dispatch()
+void CheckerSide::dispatch() const
 {
-  event_base_dispatch(base_);
+  event_base_dispatch(base_.get());
 }
 
-void CheckerSide::break_loop()
+void CheckerSide::break_loop() const
 {
-  event_base_loopbreak(base_);
+  event_base_loopbreak(base_.get());
 }
 
 } // namespace mc
index ad87d31..2fa66f0 100644 (file)
@@ -6,24 +6,25 @@
 #ifndef SIMGRID_MC_REMOTE_EVENTLOOP_HPP
 #define SIMGRID_MC_REMOTE_EVENTLOOP_HPP
 
+#include "src/mc/mc_forward.hpp"
 #include "src/mc/remote/Channel.hpp"
 
 #include <event2/event.h>
 #include <functional>
+#include <memory>
 
 namespace simgrid {
 namespace mc {
 
 class CheckerSide {
-  struct event_base* base_    = nullptr;
-  struct event* socket_event_ = nullptr;
-  struct event* signal_event_ = nullptr;
+  std::unique_ptr<event_base, decltype(&event_base_free)> base_{nullptr, &event_base_free};
+  std::unique_ptr<event, decltype(&event_free)> socket_event_{nullptr, &event_free};
+  std::unique_ptr<event, decltype(&event_free)> signal_event_{nullptr, &event_free};
 
   Channel channel_;
 
 public:
   explicit CheckerSide(int sockfd) : channel_(sockfd) {}
-  ~CheckerSide();
 
   // No copy:
   CheckerSide(CheckerSide const&) = delete;
@@ -33,9 +34,9 @@ public:
   Channel const& get_channel() const { return channel_; }
   Channel& get_channel() { return channel_; }
 
-  void start(void (*handler)(int, short, void*));
-  void dispatch();
-  void break_loop();
+  void start(void (*handler)(int, short, void*), ModelChecker* mc);
+  void dispatch() const;
+  void break_loop() const;
 };
 
 } // namespace mc
index fcf0c77..ddf1f30 100644 (file)
@@ -35,6 +35,7 @@ namespace mc {
 static const std::vector<std::string> filtered_libraries = {
 #ifdef __linux__
     "ld",
+    "ld-linux-x86",
 #elif defined __FreeBSD__
     "ld-elf",
     "ld-elf32",
index 65d0435..a183c93 100644 (file)
@@ -270,7 +270,7 @@ public:
    *  (with simgrid::mc::Process* / simgrid::mc::AddressSpace*
    *  and unw_context_t).
    */
-  unw_addr_space_t unw_addr_space;
+  unw_addr_space_t unw_addr_space = nullptr;
 
   /** Underlying libunwind address-space
    *
@@ -278,11 +278,11 @@ public:
    *  operations of the native MC address space is currently delegated
    *  to this address space (either the local or a ptrace unwinder).
    */
-  unw_addr_space_t unw_underlying_addr_space;
+  unw_addr_space_t unw_underlying_addr_space = nullptr;
 
   /** The corresponding context
    */
-  void* unw_underlying_context;
+  void* unw_underlying_context = nullptr;
 };
 
 /** Open a FD to a remote process memory (`/dev/$pid/mem`) */
index 2846455..85f0790 100644 (file)
@@ -64,11 +64,13 @@ public:
   }
   ChunkedData& operator=(ChunkedData&& that) noexcept
   {
-    this->clear();
-    store_      = that.store_;
-    that.store_ = nullptr;
-    pagenos_    = std::move(that.pagenos_);
-    that.pagenos_.clear();
+    if (this != &that) {
+      this->clear();
+      store_      = that.store_;
+      that.store_ = nullptr;
+      pagenos_    = std::move(that.pagenos_);
+      that.pagenos_.clear();
+    }
     return *this;
   }
 
index 6219b84..48a7a4e 100644 (file)
@@ -37,7 +37,7 @@ void Region::restore() const
   xbt_assert(simgrid::mc::mmu::chunk_count(size()) == get_chunks().page_count());
 
   for (size_t i = 0; i != get_chunks().page_count(); ++i) {
-    void* target_page       = (void*)simgrid::mc::mmu::join(i, (std::uintptr_t)(void*)start().address());
+    auto* target_page       = (void*)simgrid::mc::mmu::join(i, (std::uintptr_t)(void*)start().address());
     const void* source_page = get_chunks().page(i);
     mc_model_checker->get_remote_process().write_bytes(source_page, xbt_pagesize, remote(target_page));
   }
@@ -76,7 +76,7 @@ void* Region::read(void* target, const void* addr, std::size_t size) const
   // Read each page:
   while (simgrid::mc::mmu::split((std::uintptr_t)addr).first != page_end) {
     const void* snapshot_addr = mc_translate_address_region((uintptr_t)addr, this);
-    void* next_page     = (void*)simgrid::mc::mmu::join(simgrid::mc::mmu::split((std::uintptr_t)addr).first + 1, 0);
+    auto* next_page     = (void*)simgrid::mc::mmu::join(simgrid::mc::mmu::split((std::uintptr_t)addr).first + 1, 0);
     size_t readable     = (char*)next_page - (const char*)addr;
     memcpy(dest, snapshot_addr, readable);
     addr = (const char*)addr + readable;
index fd36e6e..91f56b0 100644 (file)
@@ -84,7 +84,7 @@ int MSG_comm_test(msg_comm_t comm)
  */
 int MSG_comm_testany(const_xbt_dynar_t comms)
 {
-  int finished_index = -1;
+  ssize_t finished_index = -1;
 
   /* Create the equivalent array with SIMIX objects: */
   std::vector<simgrid::kernel::activity::CommImpl*> s_comms;
@@ -120,7 +120,7 @@ int MSG_comm_testany(const_xbt_dynar_t comms)
     }
   }
 
-  return finished_index;
+  return static_cast<int>(finished_index);
 }
 
 /** @brief Destroys the provided communication. */
@@ -161,7 +161,7 @@ void MSG_comm_waitall(msg_comm_t* comm, int nb_elem, double timeout)
  */
 int MSG_comm_waitany(const_xbt_dynar_t comms)
 {
-  int finished_index = -1;
+  ssize_t finished_index = -1;
 
   /* Create the equivalent array with SIMIX objects: */
   std::vector<simgrid::kernel::activity::CommImpl*> s_comms;
@@ -197,7 +197,7 @@ int MSG_comm_waitany(const_xbt_dynar_t comms)
     (*comm->task_received)->set_not_used();
   }
 
-  return finished_index;
+  return static_cast<int>(finished_index);
 }
 
 /**
index d927e44..f1610fe 100644 (file)
@@ -74,9 +74,3 @@ unsigned long int MSG_get_sent_msg()
 {
   return msg_global->sent_msg;
 }
-
-/** @brief register functions bypassing the parser */
-void MSG_set_function(const char* host_id, const char* function_name, xbt_dynar_t arguments)
-{
-  SIMIX_process_set_function(host_id, function_name, arguments, -1, -1);
-}
index 7cd74c2..0d35d73 100644 (file)
@@ -221,7 +221,7 @@ msg_task_t MSG_task_create(const char *name, double flop_amount, double message_
  * A constructor for #msg_task_t taking six arguments.
  *
  * @beginrst
- * See :cpp:func:`void simgrid::s4u::this_actor::parallel_execute(int, s4u::Host**, double*, double*)` for
+ * See :ref:`simgrid::s4u::this_actor::parallel_execute() <API_s4u_parallel_execute>` for
  * the exact semantic of the parameters.
  * @endrst
  *
@@ -778,7 +778,7 @@ void MSG_task_set_bound(msg_task_t task, double bound)
  * (or with #TRACE_category_with_color).
  *
  * @beginrst
- * See :ref:`outcomes_vizu` for details on how to trace the (categorized) resource utilization.
+ * See :ref:`outcome_vizu` for details on how to trace the (categorized) resource utilization.
  * @endrst
  *
  * @param task the task that is going to be categorized
index 12dd673..d0c365c 100644 (file)
@@ -152,6 +152,7 @@ sg_size_t File::read(sg_size_t size)
  * @ingroup plugin_filesystem
  *
  * @param size of the file to write
+ * @param write_inside
  * @return the number of bytes successfully write or -1 if an error occurred
  */
 sg_size_t File::write(sg_size_t size, bool write_inside)
index 5becbc1..bb830cf 100644 (file)
@@ -89,8 +89,8 @@ namespace dvfs {
 class Governor {
   simgrid::s4u::Host* const host_;
   double sampling_rate_;
-  int min_pstate = cfg_min_pstate; //< Never use a pstate less than this one
-  int max_pstate = cfg_max_pstate; //< Never use a pstate larger than this one
+  unsigned long min_pstate = cfg_min_pstate; //< Never use a pstate less than this one
+  unsigned long max_pstate = cfg_max_pstate; //< Never use a pstate larger than this one
 
 public:
   explicit Governor(simgrid::s4u::Host* ptr)
@@ -103,8 +103,8 @@ public:
   virtual ~Governor() = default;
   virtual std::string get_name() const = 0;
   simgrid::s4u::Host* get_host() const { return host_; }
-  int get_min_pstate() const { return min_pstate; }
-  int get_max_pstate() const { return max_pstate; }
+  unsigned long get_min_pstate() const { return min_pstate; }
+  unsigned long get_max_pstate() const { return max_pstate; }
 
   void init()
   {
@@ -116,16 +116,15 @@ public:
     }
     const char* local_min_pstate_config = host_->get_property(cfg_min_pstate.get_name());
     if (local_min_pstate_config != nullptr) {
-      min_pstate = std::stoi(local_min_pstate_config);
+      min_pstate = std::stoul(local_min_pstate_config);
     }
 
     const char* local_max_pstate_config = host_->get_property(cfg_max_pstate.get_name());
     if (local_max_pstate_config != nullptr) {
-      max_pstate = std::stoi(local_max_pstate_config);
+      max_pstate = std::stoul(local_max_pstate_config);
     }
     xbt_assert(max_pstate <= host_->get_pstate_count() - 1, "Value for max_pstate too large!");
     xbt_assert(min_pstate <= max_pstate, "min_pstate is larger than max_pstate!");
-    xbt_assert(0 <= min_pstate, "min_pstate is negative!");
   }
 
   virtual void update()         = 0;
@@ -195,7 +194,7 @@ public:
 
     if (load > freq_up_threshold_) {
       get_host()->set_pstate(get_min_pstate()); /* Run at max. performance! */
-      XBT_INFO("Load: %f > threshold: %f --> changed to pstate %i", load, freq_up_threshold_, get_min_pstate());
+      XBT_INFO("Load: %f > threshold: %f --> changed to pstate %lu", load, freq_up_threshold_, get_min_pstate());
     } else {
       /* The actual implementation uses a formula here: (See Kernel file cpufreq_ondemand.c:158)
        *
@@ -206,12 +205,12 @@ public:
        */
       // Load is now < freq_up_threshold; exclude pstate 0 (the fastest)
       // because pstate 0 can only be selected if load > freq_up_threshold_
-      int new_pstate = static_cast<int>(get_max_pstate() - load * (get_max_pstate() + 1));
+      auto new_pstate = get_max_pstate() - static_cast<unsigned long>(load) * (get_max_pstate() + 1);
       if (new_pstate < get_min_pstate())
         new_pstate = get_min_pstate();
       get_host()->set_pstate(new_pstate);
 
-      XBT_DEBUG("Load: %f < threshold: %f --> changed to pstate %i", load, freq_up_threshold_, new_pstate);
+      XBT_DEBUG("Load: %f < threshold: %f --> changed to pstate %lu", load, freq_up_threshold_, new_pstate);
     }
   }
 };
@@ -239,24 +238,24 @@ public:
   void update() override
   {
     double load = get_host()->get_core_count() * sg_host_get_avg_load(get_host());
-    int pstate  = get_host()->get_pstate();
+    unsigned long pstate = get_host()->get_pstate();
     sg_host_load_reset(get_host()); // Only consider the period between two calls to this method!
 
     if (load > freq_up_threshold_) {
       if (pstate != get_min_pstate()) {
         get_host()->set_pstate(pstate - 1);
-        XBT_INFO("Load: %f > threshold: %f -> increasing performance to pstate %d", load, freq_up_threshold_,
+        XBT_INFO("Load: %f > threshold: %f -> increasing performance to pstate %lu", load, freq_up_threshold_,
                  pstate - 1);
       } else {
-        XBT_DEBUG("Load: %f > threshold: %f -> but cannot speed up even more, already in highest pstate %d", load,
+        XBT_DEBUG("Load: %f > threshold: %f -> but cannot speed up even more, already in highest pstate %lu", load,
                   freq_up_threshold_, pstate);
       }
     } else if (load < freq_down_threshold_) {
       if (pstate != get_max_pstate()) { // Are we in the slowest pstate already?
         get_host()->set_pstate(pstate + 1);
-        XBT_INFO("Load: %f < threshold: %f -> slowing down to pstate %d", load, freq_down_threshold_, pstate + 1);
+        XBT_INFO("Load: %f < threshold: %f -> slowing down to pstate %lu", load, freq_down_threshold_, pstate + 1);
       } else {
-        XBT_DEBUG("Load: %f < threshold: %f -> cannot slow down even more, already in slowest pstate %d", load,
+        XBT_DEBUG("Load: %f < threshold: %f -> cannot slow down even more, already in slowest pstate %lu", load,
                   freq_down_threshold_, pstate);
       }
     }
@@ -265,11 +264,10 @@ public:
 
 #if HAVE_SMPI
 class Adagio : public Governor {
-private:
-  int best_pstate     = 0;
-  double start_time   = 0;
-  double comp_counter = 0;
-  double comp_timer   = 0;
+  unsigned long best_pstate = 0;
+  double start_time         = 0;
+  double comp_counter       = 0;
+  double comp_timer         = 0;
 
   std::vector<std::vector<double>> rates; // Each host + all frequencies of that host
 
@@ -328,7 +326,7 @@ public:
     if (rates[task_id][best_pstate] == 0)
       best_pstate = 0;
     get_host()->set_pstate(best_pstate); // Load our schedule
-    XBT_DEBUG("Set pstate to %i", best_pstate);
+    XBT_DEBUG("Set pstate to %lu", best_pstate);
   }
 
   void post_task()
@@ -341,12 +339,12 @@ public:
     bool is_initialized         = rates[task_id][best_pstate] != 0;
     rates[task_id][best_pstate] = computed_flops / comp_timer;
     if (not is_initialized) {
-      for (int i = 1; i < get_host()->get_pstate_count(); i++) {
+      for (unsigned long i = 1; i < get_host()->get_pstate_count(); i++) {
         rates[task_id][i] = rates[task_id][0] * (get_host()->get_pstate_speed(i) / get_host()->get_speed());
       }
     }
 
-    for (int pstate = get_host()->get_pstate_count() - 1; pstate >= 0; pstate--) {
+    for (unsigned long pstate = get_host()->get_pstate_count() - 1; pstate != 0; pstate--) {
       if (computed_flops / rates[task_id][pstate] <= target_time) {
         // We just found the pstate we want to use!
         best_pstate = pstate;
index 6ace54b..7917c2d 100644 (file)
@@ -131,6 +131,7 @@ class HostEnergy {
   simgrid::s4u::Host* host_ = nullptr;
   /*< List of (idle_power, epsilon_power, max_power) tuple corresponding to each cpu pstate */
   std::vector<PowerRange> power_range_watts_list_;
+  bool has_pstate_power_values_ = false; /*< Whether power consumption values were provided for all pstates */
 
   /* We need to keep track of what pstate has been used, as we will sometimes be notified only *after* a pstate has been
    * used (but we need to update the energy consumption with the old pstate!)
@@ -155,6 +156,8 @@ public:
   explicit HostEnergy(simgrid::s4u::Host* ptr);
   ~HostEnergy();
 
+  bool has_pstate_power_values() const;
+
   double get_current_watts_value();
   double get_current_watts_value(double cpu_load) const;
   double get_consumed_energy();
@@ -168,6 +171,11 @@ public:
 
 simgrid::xbt::Extension<simgrid::s4u::Host, HostEnergy> HostEnergy::EXTENSION_ID;
 
+/* Returns whether power consumption values were provided for all pstates. */
+bool HostEnergy::has_pstate_power_values() const {
+  return has_pstate_power_values_;
+}
+
 /* Computes the consumption so far. Called lazily on need. */
 void HostEnergy::update()
 {
@@ -221,29 +229,29 @@ HostEnergy::~HostEnergy() = default;
 
 double HostEnergy::get_watt_idle_at(int pstate) const
 {
-  xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
-             host_->get_cname());
+  if (not has_pstate_power_values_)
+    return 0.0;
   return power_range_watts_list_[pstate].idle_;
 }
 
 double HostEnergy::get_watt_min_at(int pstate) const
 {
-  xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
-             host_->get_cname());
+  if (not has_pstate_power_values_)
+    return 0.0;
   return power_range_watts_list_[pstate].epsilon_;
 }
 
 double HostEnergy::get_watt_max_at(int pstate) const
 {
-  xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
-             host_->get_cname());
+  if (not has_pstate_power_values_)
+    return 0.0;
   return power_range_watts_list_[pstate].max_;
 }
 
 double HostEnergy::get_power_range_slope_at(int pstate) const
 {
-  xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
-             host_->get_cname());
+  if (not has_pstate_power_values_)
+    return 0.0;
   return power_range_watts_list_[pstate].slope_;
 }
 
@@ -285,8 +293,8 @@ double HostEnergy::get_current_watts_value()
  */
 double HostEnergy::get_current_watts_value(double cpu_load) const
 {
-  xbt_assert(not power_range_watts_list_.empty(), "No power range properties specified for host %s",
-             host_->get_cname());
+  if (not has_pstate_power_values_)
+    return 0.0;
 
   /* Return watts_off if pstate == pstate_off (ie, if the host is off) */
   if (this->pstate_ == pstate_off_) {
@@ -333,12 +341,7 @@ void HostEnergy::init_watts_range_list()
 {
   const char* all_power_values_str = host_->get_property("wattage_per_state");
   if (all_power_values_str == nullptr) {
-    /* If no power values are given, we assume it's 0 everywhere */
-    XBT_DEBUG("No energetic profiles given for host %s, using 0 W by default.", host_->get_cname());
-    for (int i = 0; i < host_->get_pstate_count(); ++i) {
-        PowerRange range(0,0,0);
-        power_range_watts_list_.push_back(range);
-    }
+    XBT_WARN("No energetic profiles (wattage_per_state) given for host %s, using 0 W by default. Direct request of power/energy consumption of this host will fail.", host_->get_cname());
     return;
   }
 
@@ -346,8 +349,8 @@ void HostEnergy::init_watts_range_list()
   boost::split(all_power_values, all_power_values_str, boost::is_any_of(","));
   XBT_DEBUG("%s: power properties: %s", host_->get_cname(), all_power_values_str);
 
-  xbt_assert(all_power_values.size() == (unsigned)host_->get_pstate_count(),
-             "Invalid XML file. Found %zu energetic profiles for %d pstates", all_power_values.size(),
+  xbt_assert(all_power_values.size() == host_->get_pstate_count(),
+             "Invalid XML file. Found %zu energetic profiles for %lu pstates", all_power_values.size(),
              host_->get_pstate_count());
 
   int i = 0;
@@ -365,28 +368,27 @@ void HostEnergy::init_watts_range_list()
     double epsilon_power;
     double max_power;
 
-    char* msg_idle    = bprintf("Invalid Idle value for pstate %d on host %s: %%s", i, host_->get_cname());
-    char* msg_epsilon = bprintf("Invalid Epsilon value for pstate %d on host %s: %%s", i, host_->get_cname());
-    char* msg_max     = bprintf("Invalid AllCores value for pstate %d on host %s: %%s", i, host_->get_cname());
+    auto msg_idle    = xbt::string_printf("Invalid Idle value for pstate %d on host %s", i, host_->get_cname());
+    auto msg_epsilon = xbt::string_printf("Invalid Epsilon value for pstate %d on host %s", i, host_->get_cname());
+    auto msg_max     = xbt::string_printf("Invalid AllCores value for pstate %d on host %s", i, host_->get_cname());
 
-    idle_power = xbt_str_parse_double((current_power_values.at(0)).c_str(), msg_idle);
+    idle_power = xbt_str_parse_double((current_power_values.at(0)).c_str(), msg_idle.c_str());
     if (current_power_values.size() == 2) { // Case: Idle:AllCores
-      epsilon_power = xbt_str_parse_double((current_power_values.at(0)).c_str(), msg_idle);
-      max_power     = xbt_str_parse_double((current_power_values.at(1)).c_str(), msg_max);
+      epsilon_power = xbt_str_parse_double((current_power_values.at(0)).c_str(), msg_idle.c_str());
+      max_power     = xbt_str_parse_double((current_power_values.at(1)).c_str(), msg_max.c_str());
     } else { // Case: Idle:Epsilon:AllCores
-      epsilon_power = xbt_str_parse_double((current_power_values.at(1)).c_str(), msg_epsilon);
-      max_power     = xbt_str_parse_double((current_power_values.at(2)).c_str(), msg_max);
+      epsilon_power = xbt_str_parse_double((current_power_values.at(1)).c_str(), msg_epsilon.c_str());
+      max_power     = xbt_str_parse_double((current_power_values.at(2)).c_str(), msg_max.c_str());
     }
 
     XBT_DEBUG("Creating PowerRange for host %s. Idle:%f, Epsilon:%f, AllCores:%f.", host_->get_cname(), idle_power, epsilon_power, max_power);
 
     PowerRange range(idle_power, epsilon_power, max_power);
     power_range_watts_list_.push_back(range);
-    xbt_free(msg_idle);
-    xbt_free(msg_epsilon);
-    xbt_free(msg_max);
     ++i;
   }
+
+  has_pstate_power_values_ = true;
 }
 } // namespace plugin
 } // namespace simgrid
@@ -533,7 +535,10 @@ static void ensure_plugin_inited()
 double sg_host_get_consumed_energy(const_sg_host_t host)
 {
   ensure_plugin_inited();
-  return host->extension<HostEnergy>()->get_consumed_energy();
+  auto host_energy = host->extension<HostEnergy>();
+  xbt_assert(host_energy->has_pstate_power_values(), "No power range properties specified for host %s",
+             host->get_cname());
+  return host_energy->get_consumed_energy();
 }
 
 /** @ingroup plugin_host_energy
@@ -584,5 +589,8 @@ double sg_host_get_power_range_slope_at(const_sg_host_t host, int pstate)
 double sg_host_get_current_consumption(const_sg_host_t host)
 {
   ensure_plugin_inited();
-  return host->extension<HostEnergy>()->get_current_watts_value();
+  auto host_energy = host->extension<HostEnergy>();
+  xbt_assert(host_energy->has_pstate_power_values(), "No power range properties specified for host %s",
+             host->get_cname());
+  return host_energy->get_current_watts_value();
 }
index 8a227c3..f9332d1 100644 (file)
@@ -143,11 +143,10 @@ void LinkEnergyWifi::update(const kernel::resource::NetworkAction&)
   double durUsage = 0;
   while (const auto* var = wifi_link->get_constraint()->get_variable(&elem)) {
     auto* action = static_cast<kernel::resource::NetworkWifiAction*>(var->get_id());
-    XBT_DEBUG("cost: %f action value: %f link rate 1: %f link rate 2: %f", action->get_cost(),
-              action->get_variable()->get_value(), wifi_link->get_host_rate(&action->get_src()),
-              wifi_link->get_host_rate(&action->get_dst()));
+    XBT_DEBUG("cost: %f action value: %f link rate 1: %f link rate 2: %f", action->get_cost(), action->get_rate(),
+              wifi_link->get_host_rate(&action->get_src()), wifi_link->get_host_rate(&action->get_dst()));
 
-    if (action->get_variable()->get_value() != 0.0) {
+    if (action->get_rate() != 0.0) {
       auto it = flowTmp.find(action);
 
       // if the flow has not been registered, initialize it: 0 bytes sent, and not updated since its creation timestamp
@@ -161,7 +160,7 @@ void LinkEnergyWifi::update(const kernel::resource::NetworkAction&)
        * If this is longer than the duration since the previous update, active duration = now - previous_update
        */
       double du = // durUsage on the current flow
-          (action->get_cost() - it->second.first) / action->get_variable()->get_value();
+          (action->get_cost() - it->second.first) / action->get_rate();
 
       if(du > surf_get_clock()-it->second.second)
         du = surf_get_clock()-it->second.second;
@@ -171,7 +170,7 @@ void LinkEnergyWifi::update(const kernel::resource::NetworkAction&)
         durUsage = du;
 
       // update the amount of data already sent by the flow
-      it->second.first += du*action->get_variable()->get_value();
+      it->second.first += du * action->get_rate();
       it->second.second =  surf_get_clock();
 
       // important: if the transmission finished, remove it (needed for performance and multi-message flows)
index 08ea671..876b473 100644 (file)
@@ -156,10 +156,10 @@ double VMModel::next_occurring_event(double now)
     if (ws_vm->get_state() == s4u::VirtualMachine::State::SUSPENDED) // Ignore suspended VMs
       continue;
 
-    const kernel::resource::CpuImpl* cpu = ws_vm->pimpl_cpu;
+    const kernel::resource::CpuImpl* cpu = ws_vm->get_cpu();
 
     // solved_value below is X1 in comment above: what this VM got in the sharing on the PM
-    double solved_value = ws_vm->get_vm_impl()->get_action()->get_variable()->get_value();
+    double solved_value = ws_vm->get_vm_impl()->get_action()->get_rate();
     XBT_DEBUG("assign %f to vm %s @ pm %s", solved_value, ws_vm->get_cname(), ws_vm->get_pm()->get_cname());
 
     kernel::lmm::System* vcpu_system = cpu->get_model()->get_maxmin_system();
@@ -184,7 +184,7 @@ VirtualMachineImpl::VirtualMachineImpl(const std::string& name, s4u::VirtualMach
    * The value for GUESTOS_NOISE corresponds to the cost of the global action associated to the VM.  It corresponds to
    * the cost of a VM running no tasks.
    */
-  action_ = physical_host_->pimpl_cpu->execution_start(0, core_amount_);
+  action_ = physical_host_->get_cpu()->execution_start(0, core_amount_);
 
   // It's empty for now, so it should not request resources in the PM
   update_action_weight();
@@ -288,13 +288,13 @@ void VirtualMachineImpl::set_physical_host(s4u::Host* destination)
   piface_->set_netpoint(destination->get_netpoint());
 
   /* Adapt the speed, pstate and other physical characteristics to the one of our new physical CPU */
-  piface_->pimpl_cpu->reset_vcpu(destination->pimpl_cpu);
+  piface_->get_cpu()->reset_vcpu(destination->get_cpu());
 
   physical_host_ = destination;
 
   /* Update vcpu's action for the new pm */
   /* create a cpu action bound to the pm model at the destination. */
-  kernel::resource::CpuAction* new_cpu_action = destination->pimpl_cpu->execution_start(0, this->core_amount_);
+  kernel::resource::CpuAction* new_cpu_action = destination->get_cpu()->execution_start(0, this->core_amount_);
 
   if (action_->get_remains_no_update() > 0)
     XBT_CRITICAL("FIXME: need copy the state(?), %f", action_->get_remains_no_update());
index d013fac..68bd7c3 100644 (file)
@@ -28,7 +28,9 @@ namespace vm {
  * @details A VM represent a virtual machine
  */
 class XBT_PUBLIC VirtualMachineImpl : public surf::HostImpl, public simgrid::xbt::Extendable<VirtualMachineImpl> {
+#ifndef DOXYGEN
   friend simgrid::s4u::VirtualMachine;
+#endif
 
 public:
   /** @brief Callbacks fired after VM creation. Signature: `void(VirtualMachineImpl&)` */
index 4818d15..9eadb22 100644 (file)
@@ -40,7 +40,7 @@ VirtualMachine::VirtualMachine(const std::string& name, s4u::Host* physical_host
 
   // Create a VCPU for this VM
   std::vector<double> speeds;
-  for (int i = 0; i < physical_host->get_pstate_count(); i++)
+  for (unsigned long i = 0; i < physical_host->get_pstate_count(); i++)
     speeds.push_back(physical_host->get_pstate_speed(i));
 
   physical_host->get_netpoint()
index a174119..ae3846b 100644 (file)
@@ -8,6 +8,8 @@
 #include "simgrid/Exception.hpp"
 #include "simgrid/s4u/Activity.hpp"
 #include "simgrid/s4u/Engine.hpp"
+#include "simgrid/s4u/Exec.hpp"
+#include "simgrid/s4u/Io.hpp"
 #include "src/kernel/activity/ActivityImpl.hpp"
 #include "src/kernel/actor/ActorImpl.hpp"
 #include "src/kernel/actor/SimcallObserver.hpp"
@@ -30,6 +32,13 @@ Activity* Activity::wait_for(double timeout)
   if (state_ == State::INITED)
     vetoable_start();
 
+  if (state_ == State::FAILED) {
+    if (dynamic_cast<Exec*>(this))
+      throw HostFailureException(XBT_THROW_POINT, "Cannot wait for a failed exec");
+    if (dynamic_cast<Io*>(this))
+      throw StorageFailureException(XBT_THROW_POINT, "Cannot wait for a failed I/O");
+  }
+
   kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
   kernel::actor::ActivityWaitSimcall observer{issuer, pimpl_.get(), timeout};
   if (kernel::actor::simcall_blocking(
index 35b7070..3635696 100644 (file)
@@ -32,10 +32,6 @@ xbt::signal<void(Actor const&)> s4u::Actor::on_suspend;
 xbt::signal<void(Actor const&)> s4u::Actor::on_resume;
 xbt::signal<void(Actor const&)> s4u::Actor::on_sleep;
 xbt::signal<void(Actor const&)> s4u::Actor::on_wake_up;
-#ifndef DOXYGEN
-xbt::signal<void(Actor const&)> s4u::Actor::on_migration_start; // XBT_ATTRIB_DEPRECATED_v329
-xbt::signal<void(Actor const&)> s4u::Actor::on_migration_end;   // XBT_ATTRIB_DEPRECATED_v329
-#endif
 xbt::signal<void(Actor const&, Host const& previous_location)> s4u::Actor::on_host_change;
 xbt::signal<void(Actor const&)> s4u::Actor::on_termination;
 xbt::signal<void(Actor const&)> s4u::Actor::on_destruction;
@@ -144,16 +140,6 @@ void Actor::on_exit(const std::function<void(bool /*failed*/)>& fun) const
 
 void Actor::set_host(Host* new_host)
 {
-  if (s4u::Actor::on_migration_start.get_slot_count() > 0) { // XBT_ATTRIB_DEPRECATED_v329
-    static bool already_warned = false;
-    if (not already_warned) {
-      XBT_INFO("Please use s4u::Actor::on_host_change instead of s4u::Actor::on_migration_start. This will be removed "
-               "in v3.29");
-      already_warned = true;
-    }
-    s4u::Actor::on_migration_start(*this);
-  }
-
   const s4u::Host* previous_location = get_host();
 
   kernel::actor::simcall([this, new_host]() {
@@ -165,16 +151,6 @@ void Actor::set_host(Host* new_host)
     this->pimpl_->set_host(new_host);
   });
 
-  if (s4u::Actor::on_migration_end.get_slot_count() > 0) { // XBT_ATTRIB_DEPRECATED_v329
-    static bool already_warned = false;
-    if (not already_warned) {
-      XBT_INFO("Please use s4u::Actor::on_host_change instead of s4u::Actor::on_migration_end. This will be removed in "
-               "v3.29");
-      already_warned = true;
-    }
-    s4u::Actor::on_migration_end(*this);
-  }
-
   s4u::Actor::on_host_change(*this, *previous_location);
 }
 
@@ -373,12 +349,6 @@ void parallel_execute(const std::vector<s4u::Host*>& hosts, const std::vector<do
   exec_init(hosts, flops_amounts, bytes_amounts)->wait();
 }
 
-void parallel_execute(const std::vector<s4u::Host*>& hosts, const std::vector<double>& flops_amounts,
-                      const std::vector<double>& bytes_amounts, double timeout) // XBT_ATTRIB_DEPRECATED_v329
-{
-  exec_init(hosts, flops_amounts, bytes_amounts)->wait_for(timeout);
-}
-
 ExecPtr exec_init(double flops_amount)
 {
   return Exec::init()->set_flops_amount(flops_amount)->set_host(get_host());
@@ -387,7 +357,7 @@ ExecPtr exec_init(double flops_amount)
 ExecPtr exec_init(const std::vector<s4u::Host*>& hosts, const std::vector<double>& flops_amounts,
                   const std::vector<double>& bytes_amounts)
 {
-  xbt_assert(hosts.size() > 0, "Your parallel executions must span over at least one host.");
+  xbt_assert(not hosts.empty(), "Your parallel executions must span over at least one host.");
   xbt_assert(hosts.size() == flops_amounts.size() || flops_amounts.empty(),
              "Host count (%zu) does not match flops_amount count (%zu).", hosts.size(), flops_amounts.size());
   xbt_assert(hosts.size() * hosts.size() == bytes_amounts.size() || bytes_amounts.empty(),
@@ -468,10 +438,6 @@ void set_host(Host* new_host)
 {
   simgrid::kernel::actor::ActorImpl::self()->get_iface()->set_host(new_host);
 }
-void migrate(Host* new_host) // XBT_ATTRIB_DEPRECATED_v329
-{
-  set_host(new_host);
-}
 
 } // namespace this_actor
 } // namespace s4u
@@ -490,7 +456,7 @@ sg_actor_t* sg_actor_list()
   xbt_assert(actor_count > 0, "There is no actor!");
   std::vector<simgrid::s4u::ActorPtr> actors = e->get_all_actors();
 
-  sg_actor_t* res = xbt_new(sg_actor_t, actors.size());
+  auto* res = xbt_new(sg_actor_t, actors.size());
   for (size_t i = 0; i < actor_count; i++)
     res[i] = actors[i].get();
   return res;
@@ -687,10 +653,6 @@ void sg_actor_set_host(sg_actor_t actor, sg_host_t host)
 {
   actor->set_host(host);
 }
-void sg_actor_migrate(sg_actor_t actor, sg_host_t host) // XBT_ATTRIB_DEPRECATED_v329
-{
-  actor->set_host(host);
-}
 
 /**
  * @brief Wait for the completion of a #sg_actor_t.
index e4a8214..f1e449b 100644 (file)
@@ -39,8 +39,8 @@ int Barrier::wait()
   XBT_DEBUG("waiting %p %u/%u", this, arrived_actors_, expected_actors_);
   if (arrived_actors_ == expected_actors_) {
     cond_->notify_all();
-    mutex_->unlock();
     arrived_actors_ = 0;
+    mutex_->unlock();
     return SG_BARRIER_SERIAL_THREAD;
   }
 
index b0c22d8..a359f50 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "simgrid/Exception.hpp"
 #include "simgrid/s4u/Comm.hpp"
+#include "simgrid/s4u/Engine.hpp"
 #include "simgrid/s4u/Mailbox.hpp"
 
 #include <simgrid/comm.h>
@@ -38,25 +39,55 @@ Comm::~Comm()
   }
 }
 
-int Comm::wait_any_for(const std::vector<CommPtr>* comms, double timeout)
+ssize_t Comm::wait_any_for(const std::vector<CommPtr>& comms, double timeout)
 {
-  std::vector<kernel::activity::CommImpl*> rcomms(comms->size());
-  std::transform(begin(*comms), end(*comms), begin(rcomms),
+  std::vector<kernel::activity::CommImpl*> rcomms(comms.size());
+  std::transform(begin(comms), end(comms), begin(rcomms),
                  [](const CommPtr& comm) { return static_cast<kernel::activity::CommImpl*>(comm->pimpl_.get()); });
-  int changed_pos = simcall_comm_waitany(rcomms.data(), rcomms.size(), timeout);
+  ssize_t changed_pos = -1;
+  try {
+    changed_pos = simcall_comm_waitany(rcomms.data(), rcomms.size(), timeout);
+  } catch (const NetworkFailureException& e) {
+    for (auto c : comms) {
+      if (c->pimpl_->state_ == kernel::activity::State::FAILED) {
+        c->complete(State::FAILED);
+      }
+    }
+    e.rethrow_nested(XBT_THROW_POINT, boost::core::demangle(typeid(e).name()) + " raised in kernel mode.");
+  }
   if (changed_pos != -1)
-    comms->at(changed_pos)->complete(State::FINISHED);
+    comms.at(changed_pos)->complete(State::FINISHED);
   return changed_pos;
 }
 
-void Comm::wait_all(const std::vector<CommPtr>* comms)
+void Comm::wait_all(const std::vector<CommPtr>& comms)
 {
   // TODO: this should be a simcall or something
-  // TODO: we are missing a version with timeout
-  for (CommPtr comm : *comms)
+  for (auto& comm : comms)
     comm->wait();
 }
 
+size_t Comm::wait_all_for(const std::vector<CommPtr>& comms, double timeout)
+{
+  if (timeout < 0.0) {
+    wait_all(comms);
+    return comms.size();
+  }
+
+  double deadline = Engine::get_clock() + timeout;
+  std::vector<CommPtr> waited_comm(1, nullptr);
+  for (size_t i = 0; i < comms.size(); i++) {
+    double wait_timeout = std::max(0.0, deadline - Engine::get_clock());
+    waited_comm[0]      = comms[i];
+    // Using wait_any_for() here (and not wait_for) because we don't want comms to be invalidated on timeout
+    if (wait_any_for(waited_comm, wait_timeout) == -1) {
+      XBT_DEBUG("Timeout (%g): i = %zu", wait_timeout, i);
+      return i;
+    }
+  }
+  return comms.size();
+}
+
 CommPtr Comm::set_rate(double rate)
 {
   xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
@@ -120,7 +151,7 @@ CommPtr Comm::set_dst_data(void** buff, size_t size)
   dst_buff_size_ = size;
   return this;
 }
-CommPtr Comm::set_payload_size(double bytes)
+CommPtr Comm::set_payload_size(uint64_t bytes)
 {
   Activity::set_remaining(bytes);
   return this;
@@ -135,14 +166,14 @@ CommPtr Comm::sendto_init(Host* from, Host* to)
   return res;
 }
 
-CommPtr Comm::sendto_async(Host* from, Host* to, double simulated_size_in_bytes)
+CommPtr Comm::sendto_async(Host* from, Host* to, uint64_t simulated_size_in_bytes)
 {
   auto res = Comm::sendto_init(from, to)->set_payload_size(simulated_size_in_bytes);
   res->vetoable_start();
   return res;
 }
 
-void Comm::sendto(Host* from, Host* to, double simulated_size_in_bytes)
+void Comm::sendto(Host* from, Host* to, uint64_t simulated_size_in_bytes)
 {
   sendto_async(from, to, simulated_size_in_bytes)->wait();
 }
@@ -193,6 +224,8 @@ Comm* Comm::wait_for(double timeout)
   switch (state_) {
     case State::FINISHED:
       break;
+    case State::FAILED:
+      throw NetworkFailureException(XBT_THROW_POINT, "Cannot wait for a failed communication");
 
     case State::INITED:
     case State::STARTING: // It's not started yet. Do it in one simcall if it's a regular communication
@@ -211,7 +244,12 @@ Comm* Comm::wait_for(double timeout)
       break;
 
     case State::STARTED:
-      simcall_comm_wait(get_impl(), timeout);
+      try {
+        simcall_comm_wait(get_impl(), timeout);
+      } catch (const NetworkFailureException& e) {
+        complete(State::FAILED);
+        e.rethrow_nested(XBT_THROW_POINT, boost::core::demangle(typeid(e).name()) + " raised in kernel mode.");
+      }
       break;
 
     case State::CANCELED:
@@ -224,14 +262,14 @@ Comm* Comm::wait_for(double timeout)
   return this;
 }
 
-int Comm::test_any(const std::vector<CommPtr>* comms)
+ssize_t Comm::test_any(const std::vector<CommPtr>& comms)
 {
-  std::vector<kernel::activity::CommImpl*> rcomms(comms->size());
-  std::transform(begin(*comms), end(*comms), begin(rcomms),
+  std::vector<kernel::activity::CommImpl*> rcomms(comms.size());
+  std::transform(begin(comms), end(comms), begin(rcomms),
                  [](const CommPtr& comm) { return static_cast<kernel::activity::CommImpl*>(comm->pimpl_.get()); });
-  int changed_pos = simcall_comm_testany(rcomms.data(), rcomms.size());
+  ssize_t changed_pos = simcall_comm_testany(rcomms.data(), rcomms.size());
   if (changed_pos != -1)
-    comms->at(changed_pos)->complete(State::FINISHED);
+    comms.at(changed_pos)->complete(State::FINISHED);
   return changed_pos;
 }
 
@@ -276,6 +314,12 @@ Actor* Comm::get_sender() const
   return sender ? sender->get_ciface() : nullptr;
 }
 
+CommPtr Comm::set_copy_data_callback(void (*callback)(kernel::activity::CommImpl*, void*, size_t))
+{
+  copy_data_function_ = callback;
+  return this;
+}
+
 } // namespace s4u
 } // namespace simgrid
 /* **************************** Public C interface *************************** */
@@ -298,19 +342,7 @@ int sg_comm_test(sg_comm_t comm)
 
 sg_error_t sg_comm_wait(sg_comm_t comm)
 {
-  sg_error_t status = SG_OK;
-
-  simgrid::s4u::CommPtr s4u_comm(comm, false);
-  try {
-    s4u_comm->wait_for(-1);
-  } catch (const simgrid::TimeoutException&) {
-    status = SG_ERROR_TIMEOUT;
-  } catch (const simgrid::CancelException&) {
-    status = SG_ERROR_CANCELED;
-  } catch (const simgrid::NetworkFailureException&) {
-    status = SG_ERROR_NETWORK;
-  }
-  return status;
+  return sg_comm_wait_for(comm, -1);
 }
 
 sg_error_t sg_comm_wait_for(sg_comm_t comm, double timeout)
@@ -331,28 +363,36 @@ sg_error_t sg_comm_wait_for(sg_comm_t comm, double timeout)
 }
 
 void sg_comm_wait_all(sg_comm_t* comms, size_t count)
+{
+  sg_comm_wait_all_for(comms, count, -1);
+}
+
+size_t sg_comm_wait_all_for(sg_comm_t* comms, size_t count, double timeout)
 {
   std::vector<simgrid::s4u::CommPtr> s4u_comms;
-  for (unsigned int i = 0; i < count; i++)
+  for (size_t i = 0; i < count; i++)
     s4u_comms.emplace_back(comms[i], false);
 
-  simgrid::s4u::Comm::wait_all(&s4u_comms);
+  size_t pos = simgrid::s4u::Comm::wait_all_for(s4u_comms, timeout);
+  for (size_t i = pos; i < count; i++)
+    s4u_comms[i]->add_ref();
+  return pos;
 }
 
-int sg_comm_wait_any(sg_comm_t* comms, size_t count)
+ssize_t sg_comm_wait_any(sg_comm_t* comms, size_t count)
 {
   return sg_comm_wait_any_for(comms, count, -1);
 }
 
-int sg_comm_wait_any_for(sg_comm_t* comms, size_t count, double timeout)
+ssize_t sg_comm_wait_any_for(sg_comm_t* comms, size_t count, double timeout)
 {
   std::vector<simgrid::s4u::CommPtr> s4u_comms;
-  for (unsigned int i = 0; i < count; i++)
+  for (size_t i = 0; i < count; i++)
     s4u_comms.emplace_back(comms[i], false);
 
-  int pos = simgrid::s4u::Comm::wait_any_for(&s4u_comms, timeout);
-  for (unsigned i = 0; i < count; i++) {
-    if (pos != -1 && static_cast<unsigned>(pos) != i)
+  ssize_t pos = simgrid::s4u::Comm::wait_any_for(s4u_comms, timeout);
+  for (size_t i = 0; i < count; i++) {
+    if (pos != -1 && static_cast<size_t>(pos) != i)
       s4u_comms[i]->add_ref();
   }
   return pos;
index 735eeae..7ad08c3 100644 (file)
@@ -47,6 +47,12 @@ double Disk::get_read_bandwidth() const
   return pimpl_->get_read_bandwidth();
 }
 
+Disk* Disk::set_readwrite_bandwidth(double bw)
+{
+  kernel::actor::simcall([this, bw] { pimpl_->set_readwrite_bandwidth(bw); });
+  return this;
+}
+
 double Disk::get_write_bandwidth() const
 {
   return pimpl_->get_write_bandwidth();
@@ -131,6 +137,23 @@ sg_size_t Disk::write(sg_size_t size) const
   return IoPtr(io_init(size, Io::OpType::WRITE))->vetoable_start()->wait()->get_performed_ioops();
 }
 
+Disk* Disk::set_sharing_policy(Disk::Operation op, Disk::SharingPolicy policy, const NonLinearResourceCb& cb)
+{
+  kernel::actor::simcall([this, op, policy, &cb] { pimpl_->set_sharing_policy(op, policy, cb); });
+  return this;
+}
+
+Disk::SharingPolicy Disk::get_sharing_policy(Operation op) const
+{
+  return this->pimpl_->get_sharing_policy(op);
+}
+
+Disk* Disk::set_factor_cb(const std::function<IoFactorCb>& cb)
+{
+  kernel::actor::simcall([this, &cb] { pimpl_->set_factor_cb(cb); });
+  return this;
+}
+
 Disk* Disk::seal()
 {
   kernel::actor::simcall([this]{ pimpl_->seal(); });
index 8b07f49..7ec9933 100644 (file)
@@ -16,6 +16,7 @@
 #include "simgrid/simix.h"
 #include "src/instr/instr_private.hpp"
 #include "src/kernel/EngineImpl.hpp"
+#include "src/kernel/activity/CommImpl.hpp"
 #include "src/mc/mc_replay.hpp"
 #include "src/surf/network_interface.hpp"
 #include "surf/surf.hpp" // routing_platf. FIXME:KILLME. SOON
@@ -109,21 +110,17 @@ const std::vector<simgrid::kernel::resource::Model*>& Engine::get_all_models() c
  */
 void Engine::load_platform(const std::string& platf) const
 {
-  double start = xbt_os_time();
-  parse_platform_file(platf);
-
-  double end = xbt_os_time();
-  XBT_DEBUG("PARSE TIME: %g", (end - start));
+  pimpl->load_platform(platf);
 }
 
-void Engine::register_function(const std::string& name, int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v329
+void Engine::register_function(const std::string& name, int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v330
 {
   kernel::actor::ActorCodeFactory code_factory = [code](std::vector<std::string> args) {
     return xbt::wrap_main(code, std::move(args));
   };
   register_function(name, code_factory);
 }
-void Engine::register_default(int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v329
+void Engine::register_default(int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v330
 {
   register_default([code](std::vector<std::string> args) { return xbt::wrap_main(code, std::move(args)); });
 }
@@ -241,6 +238,14 @@ Link* Engine::link_by_name(const std::string& name) const
   return link->second->get_iface();
 }
 
+SplitDuplexLink* Engine::split_duplex_link_by_name(const std::string& name) const
+{
+  auto link = pimpl->split_duplex_links_.find(name);
+  if (link == pimpl->split_duplex_links_.end())
+    throw std::invalid_argument(std::string("Link not found: ") + name);
+  return link->second->get_iface();
+}
+
 /** @brief Find a link from its name (or nullptr if that link does not exist) */
 Link* Engine::link_by_name_or_null(const std::string& name) const
 {
@@ -255,9 +260,8 @@ Mailbox* Engine::mailbox_by_name_or_create(const std::string& name) const
   kernel::activity::MailboxImpl* mbox = kernel::actor::simcall([&name, this] {
     auto m = pimpl->mailboxes_.emplace(name, nullptr);
     if (m.second) {
-      auto* mbox = new kernel::activity::MailboxImpl(name);
-      XBT_DEBUG("Creating a mailbox at %p with name %s", mbox, name.c_str());
-      m.first->second = mbox;
+      m.first->second = new kernel::activity::MailboxImpl(name);
+      XBT_DEBUG("Creating a mailbox at %p with name %s", m.first->second, name.c_str());
     }
     return m.first->second;
   });
@@ -441,6 +445,11 @@ void Engine::set_config(const std::string& name, const std::string& value)
   config::set_value(name.c_str(), value);
 }
 
+Engine* Engine::set_default_comm_data_copy_callback(void (*callback)(kernel::activity::CommImpl*, void*, size_t))
+{
+  kernel::activity::CommImpl::set_copy_data_callback(callback);
+  return this;
+}
 } // namespace s4u
 } // namespace simgrid
 
index 24e0111..ab680d8 100644 (file)
@@ -7,6 +7,7 @@
 #include "simgrid/exec.h"
 #include "simgrid/s4u/Actor.hpp"
 #include "simgrid/s4u/Exec.hpp"
+#include "simgrid/s4u/Host.hpp"
 #include "src/kernel/activity/ExecImpl.hpp"
 #include "src/kernel/actor/ActorImpl.hpp"
 #include "src/kernel/actor/SimcallObserver.hpp"
@@ -33,6 +34,13 @@ void Exec::complete(Activity::State state)
 ExecPtr Exec::init()
 {
   auto pimpl = kernel::activity::ExecImplPtr(new kernel::activity::ExecImpl());
+  Host::on_state_change.connect([pimpl](s4u::Host const& h) {
+    if (not h.is_on() && pimpl->state_ == kernel::activity::State::RUNNING &&
+        std::find(pimpl->get_hosts().begin(), pimpl->get_hosts().end(), &h) != pimpl->get_hosts().end()) {
+      pimpl->state_ = kernel::activity::State::FAILED;
+      pimpl->post();
+    }
+  });
   return ExecPtr(pimpl->get_iface());
 }
 
@@ -53,21 +61,21 @@ Exec* Exec::start()
   return this;
 }
 
-int Exec::wait_any_for(std::vector<ExecPtr>* execs, double timeout)
+ssize_t Exec::wait_any_for(const std::vector<ExecPtr>& execs, double timeout)
 {
-  std::vector<kernel::activity::ExecImpl*> rexecs(execs->size());
-  std::transform(begin(*execs), end(*execs), begin(rexecs),
+  std::vector<kernel::activity::ExecImpl*> rexecs(execs.size());
+  std::transform(begin(execs), end(execs), begin(rexecs),
                  [](const ExecPtr& exec) { return static_cast<kernel::activity::ExecImpl*>(exec->pimpl_.get()); });
 
   kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
   kernel::actor::ExecutionWaitanySimcall observer{issuer, rexecs, timeout};
-  int changed_pos = kernel::actor::simcall_blocking(
+  ssize_t changed_pos = kernel::actor::simcall_blocking(
       [&observer] {
         kernel::activity::ExecImpl::wait_any_for(observer.get_issuer(), observer.get_execs(), observer.get_timeout());
       },
       &observer);
   if (changed_pos != -1)
-    execs->at(changed_pos)->complete(State::FINISHED);
+    execs.at(changed_pos)->complete(State::FINISHED);
   return changed_pos;
 }
 
@@ -100,15 +108,6 @@ ExecPtr Exec::set_priority(double priority)
   return this;
 }
 
-ExecPtr Exec::set_timeout(double timeout) // XBT_ATTRIB_DEPRECATED_v329
-{
-  xbt_assert(state_ == State::INITED || state_ == State::STARTING,
-             "Cannot change the bound of an exec after its start");
-  kernel::actor::simcall(
-      [this, timeout] { boost::static_pointer_cast<kernel::activity::ExecImpl>(pimpl_)->set_timeout(timeout); });
-  return this;
-}
-
 ExecPtr Exec::set_flops_amount(double flops_amount)
 {
   xbt_assert(state_ == State::INITED || state_ == State::STARTING,
@@ -310,20 +309,20 @@ sg_error_t sg_exec_wait_for(sg_exec_t exec, double timeout)
   return status;
 }
 
-int sg_exec_wait_any(sg_exec_t* execs, size_t count)
+ssize_t sg_exec_wait_any(sg_exec_t* execs, size_t count)
 {
   return sg_exec_wait_any_for(execs, count, -1.0);
 }
 
-int sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout)
+ssize_t sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout)
 {
   std::vector<simgrid::s4u::ExecPtr> s4u_execs;
-  for (unsigned int i = 0; i < count; i++)
+  for (size_t i = 0; i < count; i++)
     s4u_execs.emplace_back(execs[i], false);
 
-  int pos = simgrid::s4u::Exec::wait_any_for(&s4u_execs, timeout);
-  for (unsigned i = 0; i < count; i++) {
-    if (pos != -1 && static_cast<unsigned>(pos) != i)
+  ssize_t pos = simgrid::s4u::Exec::wait_any_for(s4u_execs, timeout);
+  for (size_t i = 0; i < count; i++) {
+    if (pos != -1 && static_cast<size_t>(pos) != i)
       s4u_execs[i]->add_ref();
   }
   return pos;
index b56ad8f..e3f77fa 100644 (file)
@@ -32,6 +32,13 @@ xbt::signal<void(Host const&)> Host::on_destruction;
 xbt::signal<void(Host const&)> Host::on_state_change;
 xbt::signal<void(Host const&)> Host::on_speed_change;
 
+Host* Host::set_cpu(kernel::resource::CpuImpl* cpu)
+{
+  pimpl_cpu_ = cpu;
+  return this;
+}
+
+#ifndef DOXYGEN
 Host* Host::set_netpoint(kernel::routing::NetPoint* netpoint)
 {
   pimpl_netpoint_ = netpoint;
@@ -42,8 +49,9 @@ Host::~Host()
 {
   if (pimpl_netpoint_ != nullptr) // not removed yet by a children class
     Engine::get_instance()->netpoint_unregister(pimpl_netpoint_);
-  delete pimpl_cpu;
+  delete pimpl_cpu_;
 }
+#endif
 
 /** @brief Fire the required callbacks and destroy the object
  *
@@ -87,7 +95,7 @@ void Host::turn_on()
 {
   if (not is_on()) {
     kernel::actor::simcall([this] {
-      this->pimpl_cpu->turn_on();
+      this->pimpl_cpu_->turn_on();
       this->pimpl_->turn_on();
       on_state_change(*this);
     });
@@ -105,7 +113,7 @@ void Host::turn_off()
           vm->shutdown();
           vm->turn_off();
         }
-      this->pimpl_cpu->turn_off();
+      this->pimpl_cpu_->turn_off();
       this->pimpl_->turn_off(self);
 
       on_state_change(*this);
@@ -115,12 +123,12 @@ void Host::turn_off()
 
 bool Host::is_on() const
 {
-  return this->pimpl_cpu->is_on();
+  return this->pimpl_cpu_->is_on();
 }
 
-int Host::get_pstate_count() const
+unsigned long Host::get_pstate_count() const
 {
-  return this->pimpl_cpu->get_pstate_count();
+  return this->pimpl_cpu_->get_pstate_count();
 }
 
 /**
@@ -172,25 +180,27 @@ void Host::route_to(const Host* dest, std::vector<kernel::resource::LinkImpl*>&
 }
 
 /** @brief Returns the networking zone englobing that host */
-NetZone* Host::get_englobing_zone()
+NetZone* Host::get_englobing_zone() const
 {
   return pimpl_netpoint_->get_englobing_zone()->get_iface();
 }
 
-void Host::sendto(Host* dest, double byte_amount) // deprecated 331
+#ifndef DOXYGEN
+void Host::sendto(Host* dest, double byte_amount) // XBT_ATTRIB_DEPRECATED_v331
 {
   Comm::sendto_async(this, dest, byte_amount)->wait();
 }
 
-CommPtr Host::sendto_async(Host* dest, double byte_amount) // deprecated 331
+CommPtr Host::sendto_async(Host* dest, double byte_amount) // XBT_ATTRIB_DEPRECATED_v331
 {
   return Comm::sendto_async(this, dest, byte_amount);
 }
 
-void Host::send_to(Host* dest, double byte_amount) // deprecated 330
+void Host::send_to(Host* dest, double byte_amount) // XBT_ATTRIB_DEPRECATED_v330
 {
   Comm::sendto(this, dest, byte_amount);
 }
+#endif
 
 /** Get the properties assigned to a host */
 const std::unordered_map<std::string, std::string>* Host::get_properties() const
@@ -220,7 +230,7 @@ Host* Host::set_properties(const std::unordered_map<std::string, std::string>& p
  * The profile must contain boolean values. */
 Host* Host::set_state_profile(kernel::profile::Profile* p)
 {
-  kernel::actor::simcall([this, p] { pimpl_cpu->set_state_profile(p); });
+  kernel::actor::simcall([this, p] { pimpl_cpu_->set_state_profile(p); });
   return this;
 }
 /** Specify a profile modeling the external load according to an exhaustive list or a stochastic law.
@@ -231,43 +241,54 @@ Host* Host::set_state_profile(kernel::profile::Profile* p)
  */
 Host* Host::set_speed_profile(kernel::profile::Profile* p)
 {
-  kernel::actor::simcall([this, p] { pimpl_cpu->set_speed_profile(p); });
+  kernel::actor::simcall([this, p] { pimpl_cpu_->set_speed_profile(p); });
   return this;
 }
 
 /** @brief Get the peak processor speed (in flops/s), at the specified pstate  */
-double Host::get_pstate_speed(int pstate_index) const
+double Host::get_pstate_speed(unsigned long pstate_index) const
 {
-  return this->pimpl_cpu->get_pstate_peak_speed(pstate_index);
+  return this->pimpl_cpu_->get_pstate_peak_speed(pstate_index);
 }
 
 double Host::get_speed() const
 {
-  return this->pimpl_cpu->get_speed(1.0);
+  return this->pimpl_cpu_->get_speed(1.0);
 }
 double Host::get_load() const
 {
-  return this->pimpl_cpu->get_load();
+  return this->pimpl_cpu_->get_load();
 }
 double Host::get_available_speed() const
 {
-  return this->pimpl_cpu->get_speed_ratio();
+  return this->pimpl_cpu_->get_speed_ratio();
+}
+
+Host* Host::set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb)
+{
+  kernel::actor::simcall([this, policy, &cb] { pimpl_cpu_->set_sharing_policy(policy, cb); });
+  return this;
+}
+
+Host::SharingPolicy Host::get_sharing_policy() const
+{
+  return this->pimpl_cpu_->get_sharing_policy();
 }
 
 int Host::get_core_count() const
 {
-  return this->pimpl_cpu->get_core_count();
+  return this->pimpl_cpu_->get_core_count();
 }
 
 Host* Host::set_core_count(int core_count)
 {
-  kernel::actor::simcall([this, core_count] { this->pimpl_cpu->set_core_count(core_count); });
+  kernel::actor::simcall([this, core_count] { this->pimpl_cpu_->set_core_count(core_count); });
   return this;
 }
 
 Host* Host::set_pstate_speed(const std::vector<double>& speed_per_state)
 {
-  kernel::actor::simcall([this, &speed_per_state] { pimpl_cpu->set_pstate_speed(speed_per_state); });
+  kernel::actor::simcall([this, &speed_per_state] { pimpl_cpu_->set_pstate_speed(speed_per_state); });
   return this;
 }
 
@@ -293,16 +314,22 @@ Host* Host::set_pstate_speed(const std::vector<std::string>& speed_per_state)
 }
 
 /** @brief Set the pstate at which the host should run */
-Host* Host::set_pstate(int pstate_index)
+Host* Host::set_pstate(unsigned long pstate_index)
 {
-  kernel::actor::simcall([this, pstate_index] { this->pimpl_cpu->set_pstate(pstate_index); });
+  kernel::actor::simcall([this, pstate_index] { this->pimpl_cpu_->set_pstate(pstate_index); });
   return this;
 }
 
 /** @brief Retrieve the pstate at which the host is currently running */
-int Host::get_pstate() const
+unsigned long Host::get_pstate() const
 {
-  return this->pimpl_cpu->get_pstate();
+  return this->pimpl_cpu_->get_pstate();
+}
+
+Host* Host::set_factor_cb(const std::function<CpuFactorCb>& cb)
+{
+  kernel::actor::simcall([this, &cb] { pimpl_cpu_->set_factor_cb(cb); });
+  return this;
 }
 
 Host* Host::set_coordinates(const std::string& coords)
@@ -397,7 +424,7 @@ sg_host_t* sg_host_list()
   xbt_assert(host_count > 0, "There is no host!");
   std::vector<simgrid::s4u::Host*> hosts = e->get_all_hosts();
 
-  sg_host_t* res = xbt_new(sg_host_t, hosts.size());
+  auto* res = xbt_new(sg_host_t, hosts.size());
   std::copy(begin(hosts), end(hosts), res);
 
   return res;
@@ -480,13 +507,13 @@ double sg_host_speed(const_sg_host_t host) // XBT_ATTRIB_DEPRECATED_v330
   return sg_host_get_speed(host);
 }
 
-/** @brief Return the speed of the processor (in flop/s) at a given pstate. See also @ref plugin_energy.
+/** @brief Return the speed of the processor (in flop/s) at a given pstate. See also @ref plugin_host_energy.
  *
  * @param  host host to test
  * @param pstate_index pstate to test
  * @return Returns the processor speed associated with pstate_index
  */
-double sg_host_get_pstate_speed(const_sg_host_t host, int pstate_index)
+double sg_host_get_pstate_speed(const_sg_host_t host, unsigned long pstate_index)
 {
   return host->get_pstate_speed(pstate_index);
 }
@@ -509,26 +536,26 @@ double sg_host_get_available_speed(const_sg_host_t host)
 
 /** @brief Returns the number of power states for a host.
  *
- *  See also @ref plugin_energy.
+ *  See also @ref plugin_host_energy.
  */
-int sg_host_get_nb_pstates(const_sg_host_t host)
+unsigned long sg_host_get_nb_pstates(const_sg_host_t host)
 {
   return host->get_pstate_count();
 }
 
 /** @brief Gets the pstate at which that host currently runs.
  *
- *  See also @ref plugin_energy.
+ *  See also @ref plugin_host_energy.
  */
-int sg_host_get_pstate(const_sg_host_t host)
+unsigned long sg_host_get_pstate(const_sg_host_t host)
 {
   return host->get_pstate();
 }
 /** @brief Sets the pstate at which that host should run.
  *
- *  See also @ref plugin_energy.
+ *  See also @ref plugin_host_energy.
  */
-void sg_host_set_pstate(sg_host_t host, int pstate)
+void sg_host_set_pstate(sg_host_t host, unsigned long pstate)
 {
   host->set_pstate(pstate);
 }
@@ -537,7 +564,7 @@ void sg_host_set_pstate(sg_host_t host, int pstate)
  *
  * @brief Start the host if it is off
  *
- * See also #sg_host_is_on() to test the current state of the host and @ref plugin_energy
+ * See also #sg_host_is_on() to test the current state of the host and @ref plugin_host_energy
  * for more info on DVFS.
  */
 void sg_host_turn_on(sg_host_t host)
@@ -549,7 +576,7 @@ void sg_host_turn_on(sg_host_t host)
  *
  * @brief Stop the host if it is on
  *
- * See also #MSG_host_is_on() to test the current state of the host and @ref plugin_energy
+ * See also #MSG_host_is_on() to test the current state of the host and @ref plugin_host_energy
  * for more info on DVFS.
  */
 void sg_host_turn_off(sg_host_t host)
@@ -560,8 +587,8 @@ void sg_host_turn_off(sg_host_t host)
 /** @ingroup m_host_management
  * @brief Determine if a host is up and running.
  *
- * See also #sg_host_turn_on() and #sg_host_turn_off() to switch the host ON and OFF and @ref plugin_energy for more
- * info on DVFS.
+ * See also #sg_host_turn_on() and #sg_host_turn_off() to switch the host ON and OFF and @ref plugin_host_energy for
+ * more info on DVFS.
  *
  * @param host host to test
  * @return Returns true if the host is up and running, and false if it's currently down
index ef4846c..38050e1 100644 (file)
@@ -46,21 +46,21 @@ Io* Io::start()
   return this;
 }
 
-int Io::wait_any_for(std::vector<IoPtr>* ios, double timeout)
+ssize_t Io::wait_any_for(const std::vector<IoPtr>& ios, double timeout)
 {
-  std::vector<kernel::activity::IoImpl*> rios(ios->size());
-  std::transform(begin(*ios), end(*ios), begin(rios),
+  std::vector<kernel::activity::IoImpl*> rios(ios.size());
+  std::transform(begin(ios), end(ios), begin(rios),
                  [](const IoPtr& io) { return static_cast<kernel::activity::IoImpl*>(io->pimpl_.get()); });
 
   kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self();
   kernel::actor::IoWaitanySimcall observer{issuer, rios, timeout};
-  int changed_pos = kernel::actor::simcall_blocking(
+  ssize_t changed_pos = kernel::actor::simcall_blocking(
       [&observer] {
         kernel::activity::IoImpl::wait_any_for(observer.get_issuer(), observer.get_ios(), observer.get_timeout());
       },
       &observer);
   if (changed_pos != -1)
-    ios->at(changed_pos)->complete(State::FINISHED);
+    ios.at(changed_pos)->complete(State::FINISHED);
   return changed_pos;
 }
 
index 5badfff..9c6d41a 100644 (file)
@@ -10,7 +10,7 @@
 #include "simgrid/s4u/Link.hpp"
 #include "simgrid/sg_config.hpp"
 #include "simgrid/simix.hpp"
-#include "src/kernel/lmm/maxmin.hpp"
+#include "src/surf/SplitDuplexLinkImpl.hpp"
 #include "src/surf/network_interface.hpp"
 #include "src/surf/network_wifi.hpp"
 #include "xbt/log.h"
@@ -35,6 +35,16 @@ Link* Link::by_name(const std::string& name)
   return Engine::get_instance()->link_by_name(name);
 }
 
+kernel::resource::LinkImpl* Link::get_impl() const
+{
+  auto* link_impl = dynamic_cast<kernel::resource::LinkImpl*>(pimpl_);
+  xbt_assert(link_impl != nullptr, "Impossible to get a LinkImpl* from link. %s.",
+             (get_sharing_policy() == SharingPolicy::SPLITDUPLEX
+                  ? "For a Split-Duplex link, you should call this method to each UP/DOWN member"
+                  : "Please report this bug"));
+  return link_impl;
+}
+
 Link* Link::by_name_or_null(const std::string& name)
 {
   return Engine::get_instance()->link_by_name_or_null(name);
@@ -92,9 +102,13 @@ Link* Link::set_bandwidth(double value)
   return this;
 }
 
-Link* Link::set_sharing_policy(Link::SharingPolicy policy)
+Link* Link::set_sharing_policy(Link::SharingPolicy policy, const NonLinearResourceCb& cb)
 {
-  kernel::actor::simcall([this, policy] { pimpl_->set_sharing_policy(policy); });
+  if (policy == SharingPolicy::SPLITDUPLEX || policy == SharingPolicy::WIFI)
+    throw std::invalid_argument(std::string("Impossible to set wifi or split-duplex for the link: ") + get_name() +
+                                std::string(". Use appropriate create function in NetZone."));
+
+  kernel::actor::simcall([this, policy, &cb] { pimpl_->set_sharing_policy(policy, cb); });
   return this;
 }
 Link::SharingPolicy Link::get_sharing_policy() const
@@ -109,6 +123,12 @@ void Link::set_host_wifi_rate(const s4u::Host* host, int level) const
   wlink->set_host_rate(host, level);
 }
 
+Link* Link::set_concurrency_limit(int limit)
+{
+  kernel::actor::simcall([this, limit] { pimpl_->set_concurrency_limit(limit); });
+  return this;
+}
+
 double Link::get_usage() const
 {
   return this->pimpl_->get_constraint()->get_usage();
@@ -175,6 +195,25 @@ Link* Link::set_properties(const std::unordered_map<std::string, std::string>& p
   return this;
 }
 
+Link* SplitDuplexLink::get_link_up() const
+{
+  const auto* pimpl = dynamic_cast<kernel::resource::SplitDuplexLinkImpl*>(pimpl_);
+  xbt_assert(pimpl, "Requesting link_up from a non split-duplex link: %s", get_cname());
+  return pimpl->get_link_up();
+}
+
+Link* SplitDuplexLink::get_link_down() const
+{
+  const auto* pimpl = dynamic_cast<kernel::resource::SplitDuplexLinkImpl*>(pimpl_);
+  xbt_assert(pimpl, "Requesting link_down from a non split-duplex link: %s", get_cname());
+  return pimpl->get_link_down();
+}
+
+SplitDuplexLink* SplitDuplexLink::by_name(const std::string& name)
+{
+  return Engine::get_instance()->split_duplex_link_by_name(name);
+}
+
 } // namespace s4u
 } // namespace simgrid
 
@@ -269,8 +308,8 @@ sg_link_t* sg_link_list()
 {
   std::vector<simgrid::s4u::Link*> links = simgrid::s4u::Engine::get_instance()->get_all_links();
 
-  sg_link_t* res = xbt_new(sg_link_t, links.size());
-  memcpy(res, links.data(), sizeof(sg_link_t) * links.size());
+  auto* res = xbt_new(sg_link_t, links.size());
+  std::copy(begin(links), end(links), res);
 
   return res;
 }
index 23b140f..2fcd87f 100644 (file)
@@ -33,17 +33,17 @@ Mailbox* Mailbox::by_name(const std::string& name)
 
 bool Mailbox::empty() const
 {
-  return pimpl_->comm_queue_.empty();
+  return pimpl_->empty();
 }
 
-unsigned int Mailbox::size() const
+size_t Mailbox::size() const
 {
-  return pimpl_->comm_queue_.size();
+  return pimpl_->size();
 }
 
 bool Mailbox::listen() const
 {
-  return not this->empty() || (pimpl_->permanent_receiver_ && not pimpl_->done_comm_queue_.empty());
+  return not pimpl_->empty() || (pimpl_->is_permanent() && pimpl_->has_some_done_comm());
 }
 
 aid_t Mailbox::listen_from() const
@@ -58,18 +58,18 @@ aid_t Mailbox::listen_from() const
 bool Mailbox::ready() const
 {
   bool comm_ready = false;
-  if (not pimpl_->comm_queue_.empty()) {
-    comm_ready = pimpl_->comm_queue_.front()->state_ == kernel::activity::State::DONE;
+  if (not pimpl_->empty()) {
+    comm_ready = pimpl_->front()->state_ == kernel::activity::State::DONE;
 
-  } else if (pimpl_->permanent_receiver_ && not pimpl_->done_comm_queue_.empty()) {
-    comm_ready = pimpl_->done_comm_queue_.front()->state_ == kernel::activity::State::DONE;
+  } else if (pimpl_->is_permanent() && pimpl_->has_some_done_comm()) {
+    comm_ready = pimpl_->done_front()->state_ == kernel::activity::State::DONE;
   }
   return comm_ready;
 }
 
 kernel::activity::CommImplPtr Mailbox::front() const
 {
-  return pimpl_->comm_queue_.empty() ? nullptr : pimpl_->comm_queue_.front();
+  return pimpl_->empty() ? nullptr : pimpl_->front();
 }
 
 void Mailbox::set_receiver(ActorPtr actor)
@@ -80,9 +80,9 @@ void Mailbox::set_receiver(ActorPtr actor)
 /** @brief get the receiver (process associated to the mailbox) */
 ActorPtr Mailbox::get_receiver() const
 {
-  if (pimpl_->permanent_receiver_ == nullptr)
+  if (pimpl_->is_permanent())
     return ActorPtr();
-  return pimpl_->permanent_receiver_->get_iface();
+  return pimpl_->get_permanent_receiver()->get_iface();
 }
 
 CommPtr Mailbox::put_init()
index d9d23ef..a791b03 100644 (file)
@@ -48,7 +48,7 @@ std::vector<NetZone*> NetZone::get_children() const
   return res;
 }
 
-NetZone* NetZone::add_child(NetZone* new_zone)
+NetZone* NetZone::add_child(NetZone* new_zone) // XBT_ATTRIB_DEPRECATED_v332
 {
   new_zone->set_parent(this);
   return this;
@@ -64,7 +64,7 @@ const char* NetZone::get_cname() const
   return pimpl_->get_cname();
 }
 
-NetZone* NetZone::get_father()
+NetZone* NetZone::get_father() const // XBT_ATTRIB_DEPRECATED_v331
 {
   return pimpl_->get_parent()->get_iface();
 }
@@ -95,38 +95,49 @@ int NetZone::get_host_count() const
   return pimpl_->get_host_count();
 }
 
-int NetZone::add_component(kernel::routing::NetPoint* elm)
+unsigned long NetZone::add_component(kernel::routing::NetPoint* elm)
 {
   return pimpl_->add_component(elm);
 }
 
-std::vector<kernel::resource::LinkImpl*> NetZone::get_link_list_impl(const std::vector<Link*>& link_list)
+// XBT_ATTRIB_DEPRECATED_v332
+std::vector<LinkInRoute> NetZone::convert_to_linkInRoute(const std::vector<kernel::resource::LinkImpl*>& link_list)
 {
-  std::vector<kernel::resource::LinkImpl*> links;
-  for (const auto& link : link_list) {
-    links.push_back(link->get_impl());
+  std::vector<LinkInRoute> links;
+  for (const auto* link : link_list) {
+    links.emplace_back(LinkInRoute(link->get_iface()));
   }
   return links;
 }
 
 void NetZone::add_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
                         kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst,
-                        const std::vector<Link*>& link_list, bool symmetrical)
+                        const std::vector<LinkInRoute>& link_list, bool symmetrical)
 {
-  pimpl_->add_route(src, dst, gw_src, gw_dst, NetZone::get_link_list_impl(link_list), symmetrical);
+  pimpl_->add_route(src, dst, gw_src, gw_dst, link_list, symmetrical);
 }
 
+// XBT_ATTRIB_DEPRECATED_v332
 void NetZone::add_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
                         kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst,
                         const std::vector<kernel::resource::LinkImpl*>& link_list, bool symmetrical)
 {
-  pimpl_->add_route(src, dst, gw_src, gw_dst, link_list, symmetrical);
+  pimpl_->add_route(src, dst, gw_src, gw_dst, convert_to_linkInRoute(link_list), symmetrical);
+}
+
+// XBT_ATTRIB_DEPRECATED_v332
+void NetZone::add_bypass_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
+                               kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst,
+                               std::vector<kernel::resource::LinkImpl*>& link_list, bool /*symmetrical*/)
+{
+  pimpl_->add_bypass_route(src, dst, gw_src, gw_dst, convert_to_linkInRoute(link_list));
 }
+
 void NetZone::add_bypass_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst,
                                kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst,
-                               std::vector<kernel::resource::LinkImpl*>& link_list, bool symmetrical)
+                               const std::vector<LinkInRoute>& link_list)
 {
-  pimpl_->add_bypass_route(src, dst, gw_src, gw_dst, link_list, symmetrical);
+  pimpl_->add_bypass_route(src, dst, gw_src, gw_dst, link_list);
 }
 
 void NetZone::extract_xbt_graph(const s_xbt_graph_t* graph, std::map<std::string, xbt_node_t, std::less<>>* nodes,
@@ -180,6 +191,24 @@ s4u::Link* NetZone::create_link(const std::string& name, const std::string& band
   return create_link(name, std::vector<std::string>{bandwidth});
 }
 
+s4u::SplitDuplexLink* NetZone::create_split_duplex_link(const std::string& name, const std::string& bandwidth)
+{
+  double speed;
+  try {
+    speed = xbt_parse_get_bandwidth("", 0, bandwidth, "");
+  } catch (const simgrid::ParseError&) {
+    throw std::invalid_argument(std::string("Impossible to create split-duplex link: ") + name +
+                                std::string(". Invalid bandwidth: ") + bandwidth);
+  }
+  return create_split_duplex_link(name, speed);
+}
+
+s4u::SplitDuplexLink* NetZone::create_split_duplex_link(const std::string& name, double bandwidth)
+{
+  return kernel::actor::simcall(
+      [this, &name, &bandwidth] { return pimpl_->create_split_duplex_link(name, std::vector<double>{bandwidth}); });
+}
+
 s4u::Link* NetZone::create_link(const std::string& name, const std::vector<std::string>& bandwidths)
 {
   std::vector<double> bw;
index 1c78fa2..a00b21f 100644 (file)
@@ -36,7 +36,7 @@ static void __SD_task_destroy_scheduling_data(SD_task_t task)
  */
 SD_task_t SD_task_create(const char* name, void* data, double amount)
 {
-  SD_task_t task = xbt_new0(s_SD_task_t, 1);
+  auto* task     = xbt_new0(s_SD_task_t, 1);
   task->kind     = SD_TASK_NOT_TYPED;
   task->state    = SD_NOT_SCHEDULED;
   sd_global->initial_tasks.insert(task);
@@ -802,7 +802,6 @@ void SD_task_run(SD_task_t task)
   XBT_VERB("Executing task '%s'", task->name);
 
   /* Beware! The scheduling data are now used by the surf action directly! no copy was done */
-  // FIXME[donassolo]: verify if all hosts belongs to the same netZone?
   auto host_model = (*task->allocation).front()->get_netpoint()->get_englobing_zone()->get_host_model();
   task->surf_action =
       host_model->execute_parallel(*task->allocation, task->flops_amount, task->bytes_amount, task->rate);
index 2744ea4..5d323db 100644 (file)
@@ -75,12 +75,6 @@ unsigned int simcall_execution_waitany_for(simgrid::kernel::activity::ExecImpl*
       &observer);
 }
 
-simgrid::kernel::activity::State simcall_process_sleep(double duration) // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid::kernel::actor::ActorImpl::self()->sleep(duration);
-  return simgrid::kernel::activity::State::DONE;
-}
-
 /**
  * @ingroup simix_comm_management
  */
@@ -191,10 +185,10 @@ unsigned int simcall_comm_waitany(simgrid::kernel::activity::ActivityImplPtr com
   std::transform(comms, comms + count, begin(rcomms), [](const simgrid::kernel::activity::ActivityImplPtr& comm) {
     return static_cast<simgrid::kernel::activity::CommImpl*>(comm.get());
   });
-  return simcall_BODY_comm_waitany(rcomms.data(), rcomms.size(), timeout);
+  return static_cast<unsigned int>(simcall_BODY_comm_waitany(rcomms.data(), rcomms.size(), timeout));
 }
 
-unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout)
+ssize_t simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout)
 {
   return simcall_BODY_comm_waitany(comms, count, timeout);
 }
@@ -210,10 +204,10 @@ int simcall_comm_testany(simgrid::kernel::activity::ActivityImplPtr comms[], siz
   std::transform(comms, comms + count, begin(rcomms), [](const simgrid::kernel::activity::ActivityImplPtr& comm) {
     return static_cast<simgrid::kernel::activity::CommImpl*>(comm.get());
   });
-  return simcall_BODY_comm_testany(rcomms.data(), rcomms.size());
+  return static_cast<int>(simcall_BODY_comm_testany(rcomms.data(), rcomms.size()));
 }
 
-int simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count)
+ssize_t simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count)
 {
   if (count == 0)
     return -1;
index 78757f9..d963f3b 100644 (file)
@@ -548,17 +548,17 @@ static inline void simcall_comm_testany__set__count(smx_simcall_t simcall, size_
 {
   simgrid::simix::marshal<size_t>(simcall->args_[1], arg);
 }
-static inline int simcall_comm_testany__get__result(smx_simcall_t simcall)
+static inline ssize_t simcall_comm_testany__get__result(smx_simcall_t simcall)
 {
-  return simgrid::simix::unmarshal<int>(simcall->result_);
+  return simgrid::simix::unmarshal<ssize_t>(simcall->result_);
 }
-static inline int simcall_comm_testany__getraw__result(smx_simcall_t simcall)
+static inline ssize_t simcall_comm_testany__getraw__result(smx_simcall_t simcall)
 {
-  return simgrid::simix::unmarshal_raw<int>(simcall->result_);
+  return simgrid::simix::unmarshal_raw<ssize_t>(simcall->result_);
 }
-static inline void simcall_comm_testany__set__result(smx_simcall_t simcall, int result)
+static inline void simcall_comm_testany__set__result(smx_simcall_t simcall, ssize_t result)
 {
-  simgrid::simix::marshal<int>(simcall->result_, result);
+  simgrid::simix::marshal<ssize_t>(simcall->result_, result);
 }
 
 static inline simgrid::kernel::activity::CommImpl** simcall_comm_waitany__get__comms(smx_simcall_t simcall)
@@ -597,17 +597,17 @@ static inline void simcall_comm_waitany__set__timeout(smx_simcall_t simcall, dou
 {
   simgrid::simix::marshal<double>(simcall->args_[2], arg);
 }
-static inline int simcall_comm_waitany__get__result(smx_simcall_t simcall)
+static inline ssize_t simcall_comm_waitany__get__result(smx_simcall_t simcall)
 {
-  return simgrid::simix::unmarshal<int>(simcall->result_);
+  return simgrid::simix::unmarshal<ssize_t>(simcall->result_);
 }
-static inline int simcall_comm_waitany__getraw__result(smx_simcall_t simcall)
+static inline ssize_t simcall_comm_waitany__getraw__result(smx_simcall_t simcall)
 {
-  return simgrid::simix::unmarshal_raw<int>(simcall->result_);
+  return simgrid::simix::unmarshal_raw<ssize_t>(simcall->result_);
 }
-static inline void simcall_comm_waitany__set__result(smx_simcall_t simcall, int result)
+static inline void simcall_comm_waitany__set__result(smx_simcall_t simcall, ssize_t result)
 {
-  simgrid::simix::marshal<int>(simcall->result_, result);
+  simgrid::simix::marshal<ssize_t>(simcall->result_, result);
 }
 
 static inline simgrid::kernel::activity::CommImpl* simcall_comm_wait__get__comm(smx_simcall_t simcall)
@@ -668,6 +668,6 @@ XBT_PRIVATE boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> simcal
 XBT_PRIVATE void simcall_HANDLER_comm_send(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout);
 XBT_PRIVATE boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> simcall_HANDLER_comm_isend(smx_simcall_t simcall, smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, bool detached);
 XBT_PRIVATE bool simcall_HANDLER_comm_test(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm);
-XBT_PRIVATE int simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count);
+XBT_PRIVATE ssize_t simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count);
 XBT_PRIVATE void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout);
 XBT_PRIVATE void simcall_HANDLER_comm_wait(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm, double timeout);
index d9be221..c3b3d94 100644 (file)
@@ -75,18 +75,18 @@ inline static bool simcall_BODY_comm_test(simgrid::kernel::activity::CommImpl* c
   return simcall<bool, simgrid::kernel::activity::CommImpl*>(Simcall::COMM_TEST, comm);
 }
 
-inline static int simcall_BODY_comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count)
+inline static ssize_t simcall_BODY_comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count)
 {
   if (false) /* Go to that function to follow the code flow through the simcall barrier */
     simcall_HANDLER_comm_testany(&SIMIX_process_self()->simcall_, comms, count);
-  return simcall<int, simgrid::kernel::activity::CommImpl**, size_t>(Simcall::COMM_TESTANY, comms, count);
+  return simcall<ssize_t, simgrid::kernel::activity::CommImpl**, size_t>(Simcall::COMM_TESTANY, comms, count);
 }
 
-inline static int simcall_BODY_comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout)
+inline static ssize_t simcall_BODY_comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout)
 {
   if (false) /* Go to that function to follow the code flow through the simcall barrier */
     simcall_HANDLER_comm_waitany(&SIMIX_process_self()->simcall_, comms, count, timeout);
-  return simcall<int, simgrid::kernel::activity::CommImpl**, size_t, double>(Simcall::COMM_WAITANY, comms, count, timeout);
+  return simcall<ssize_t, simgrid::kernel::activity::CommImpl**, size_t, double>(Simcall::COMM_WAITANY, comms, count, timeout);
 }
 
 inline static void simcall_BODY_comm_wait(simgrid::kernel::activity::CommImpl* comm, double timeout)
index 9b9a7b5..20efc2d 100644 (file)
@@ -79,7 +79,7 @@ void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered)
       break;
 
     case Simcall::COMM_TESTANY:
-      simgrid::simix::marshal<int>(simcall_.result_, simcall_HANDLER_comm_testany(&simcall_, simgrid::simix::unmarshal<simgrid::kernel::activity::CommImpl**>(simcall_.args_[0]), simgrid::simix::unmarshal<size_t>(simcall_.args_[1])));
+      simgrid::simix::marshal<ssize_t>(simcall_.result_, simcall_HANDLER_comm_testany(&simcall_, simgrid::simix::unmarshal<simgrid::kernel::activity::CommImpl**>(simcall_.args_[0]), simgrid::simix::unmarshal<size_t>(simcall_.args_[1])));
       simcall_answer();
       break;
 
index 5571691..9875570 100644 (file)
@@ -40,8 +40,8 @@ boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> comm_irecv(smx_act
 void           comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout) [[block]];
 boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, bool detached);
 bool           comm_test(simgrid::kernel::activity::CommImpl* comm);
-int            comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count);
-int            comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout) [[block]];
+ssize_t        comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count);
+ssize_t        comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout) [[block]];
 void           comm_wait(simgrid::kernel::activity::CommImpl* comm, double timeout) [[block]];
 
 void       run_kernel(std::function<void()> const* code) [[nohandler]];
index 476628d..285cb1b 100644 (file)
@@ -1,4 +1,9 @@
 ---- MODULE simix_network ----
+(* Copyright (c) 2012-2021. The SimGrid Team. All rights reserved.          *)
+
+(* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. *)
+
 (* This is a TLA module specifying the networking layer of SIMIX.
    It is used to verify the soundness of the DPOR reduction algorithm
    used in the model-checker.
index 783ffab..2d40401 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "src/internal_config.h"
 #include "src/simix/smx_private.hpp"
-#include "smpi/smpi.h"
+#include "src/smpi/include/private.hpp"
 #include "xbt/config.hpp"
 
 #include <initializer_list>
@@ -61,7 +61,7 @@ void SIMIX_context_mod_init()
   xbt_assert(not simix_global->has_context_factory());
 
 #if HAVE_SMPI && (defined(__APPLE__) || defined(__NetBSD__))
-  smpi_init_options();
+  smpi_init_options_internal(false);
   std::string priv = simgrid::config::get_value<std::string>("smpi/privatization");
   if (context_factory_name == "thread" && (priv == "dlopen" || priv == "yes" || priv == "default" || priv == "1")) {
     XBT_WARN("dlopen+thread broken on Apple and BSD. Switching to raw contexts.");
@@ -70,7 +70,7 @@ void SIMIX_context_mod_init()
 #endif
 
 #if HAVE_SMPI && defined(__FreeBSD__)
-  smpi_init_options();
+  smpi_init_options_internal(false);
   if (context_factory_name == "thread" && simgrid::config::get_value<std::string>("smpi/privatization") != "no") {
     XBT_WARN("mmap broken on FreeBSD, but dlopen+thread broken too. Switching to dlopen+raw contexts.");
     context_factory_name = "raw";
diff --git a/src/simix/smx_deployment.cpp b/src/simix/smx_deployment.cpp
deleted file mode 100644 (file)
index d353db2..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved.          */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "simgrid/s4u/Host.hpp"
-#include "smx_private.hpp"
-#include "src/kernel/EngineImpl.hpp"
-#include "src/surf/xml/platf_private.hpp" // FIXME: KILLME. There must be a better way than mimicking XML here
-#include <simgrid/engine.h>
-#include <simgrid/s4u/Engine.hpp>
-
-#include <string>
-#include <vector>
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_deployment, simix, "Logging specific to SIMIX (deployment)");
-
-void SIMIX_init_application() // XBT_ATTRIB_DEPRECATED_v329
-{
-  sg_platf_exit();
-  sg_platf_init();
-}
-
-void SIMIX_launch_application(const std::string& file) // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid_load_deployment(file.c_str());
-}
-void SIMIX_function_register(const std::string& name, xbt_main_func_t code) // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid::s4u::Engine::get_instance()->register_function(name, code);
-}
-void SIMIX_function_register(const std::string& name,
-                             void (*code)(std::vector<std::string>)) // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid::s4u::Engine::get_instance()->register_function(name, code);
-}
-void SIMIX_function_register_default(xbt_main_func_t code) // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid::s4u::Engine::get_instance()->register_default(code);
-}
-
-/** @brief Bypass the parser, get arguments, and set function to each process */
-void SIMIX_process_set_function(const char* process_host, const char* process_function, xbt_dynar_t arguments,
-                                double process_start_time, double process_kill_time) // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid::kernel::routing::ActorCreationArgs actor;
-
-  const simgrid::s4u::Host* host = sg_host_by_name(process_host);
-  if (not host)
-    throw std::invalid_argument(simgrid::xbt::string_printf("Host '%s' unknown", process_host));
-  actor.host = process_host;
-  actor.args.emplace_back(process_function);
-  /* add arguments */
-  unsigned int i;
-  char *arg;
-  xbt_dynar_foreach(arguments, i, arg) {
-    actor.args.emplace_back(arg);
-  }
-
-  // Check we know how to handle this function name:
-  const simgrid::kernel::actor::ActorCodeFactory& parse_code =
-      simgrid::kernel::EngineImpl::get_instance()->get_function(process_function);
-  xbt_assert(parse_code, "Function '%s' unknown", process_function);
-
-  actor.function           = process_function;
-  actor.kill_time          = process_kill_time;
-  actor.start_time         = process_start_time;
-  actor.restart_on_failure = false;
-  sg_platf_new_actor(&actor);
-}
index 8c0868c..5e14abb 100644 (file)
@@ -29,8 +29,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix, "Logging specific to SIMIX
 
 std::unique_ptr<simgrid::simix::Global> simix_global;
 
-void (*SMPI_switch_data_segment)(simgrid::s4u::ActorPtr) = nullptr;
-
 namespace simgrid {
 namespace simix {
 config::Flag<bool> cfg_verbose_exit{"debug/verbose-exit", "Display the actor status at exit", true};
@@ -75,7 +73,7 @@ static void segvhandler(int signum, siginfo_t* siginfo, void* /*context*/)
             "Access violation or Bus error detected.\n"
             "This probably comes from a programming error in your code, or from a stack\n"
             "overflow. If you are certain of your code, try increasing the stack size\n"
-            "   --cfg=contexts/stack-size=XXX (current size is %u KiB).\n"
+            "   --cfg=contexts/stack-size:XXX (current size is %u KiB).\n"
             "\n"
             "If it does not help, this may have one of the following causes:\n"
             "a bug in SimGrid, a bug in the OS or a bug in a third-party libraries.\n"
@@ -202,37 +200,10 @@ void SIMIX_run() // XBT_ATTRIB_DEPRECATED_v332
   simgrid::kernel::EngineImpl::get_instance()->run();
 }
 
-double SIMIX_timer_next() // XBT_ATTRIB_DEPRECATED_v329
-{
-  return simgrid::kernel::timer::Timer::next();
-}
-
-smx_timer_t SIMIX_timer_set(double date, void (*callback)(void*), void* arg) // XBT_ATTRIB_DEPRECATED_v329
-{
-  return simgrid::kernel::timer::Timer::set(date, std::bind(callback, arg));
-}
-
-/** @brief cancels a timer that was added earlier */
-void SIMIX_timer_remove(smx_timer_t timer) // XBT_ATTRIB_DEPRECATED_v329
-{
-  timer->remove();
-}
-
-/** @brief Returns the date at which the timer will trigger (or 0 if nullptr timer) */
-double SIMIX_timer_get_date(smx_timer_t timer) // XBT_ATTRIB_DEPRECATED_v329
-{
-  return timer ? timer->get_date() : 0.0;
-}
-
-void SIMIX_display_process_status() // XBT_ATTRIB_DEPRECATED_v329
-{
-  simgrid::kernel::EngineImpl::get_instance()->display_all_actor_status();
-}
-
 int SIMIX_is_maestro()
 {
   if (simix_global == nullptr) // SimDag
     return true;
-  simgrid::kernel::actor::ActorImpl* self = SIMIX_process_self();
+  const simgrid::kernel::actor::ActorImpl* self = SIMIX_process_self();
   return self == nullptr || simix_global->is_maestro(self);
 }
index 6b9d345..f0d915e 100644 (file)
@@ -20,7 +20,7 @@ class Global {
   kernel::actor::ActorImpl* maestro_                = nullptr;
 
 public:
-  bool is_maestro(kernel::actor::ActorImpl* actor) const { return actor == maestro_; }
+  bool is_maestro(const kernel::actor::ActorImpl* actor) const { return actor == maestro_; }
   void set_maestro(kernel::actor::ActorImpl* actor) { maestro_ = actor; }
   kernel::actor::ActorImpl* get_maestro() const { return maestro_; }
   void destroy_maestro()
index 85885bb..0316d22 100644 (file)
@@ -23,11 +23,10 @@ void smpi_init_fortran_types()
     MPI_COMM_WORLD->add_f();
     MPI_BYTE->add_f(); // MPI_BYTE
     MPI_CHAR->add_f(); // MPI_CHARACTER
+    MPI_C_BOOL->add_f(); // MPI_LOGICAL
     if (sizeof(void*) == 8) {
-      MPI_C_BOOL->add_f(); // MPI_LOGICAL
       MPI_INT->add_f();    // MPI_INTEGER
     } else {
-      MPI_C_BOOL->add_f(); // MPI_LOGICAL
       MPI_LONG->add_f();   // MPI_INTEGER
     }
     MPI_INT8_T->add_f();    // MPI_INTEGER1
index 7281ab2..d1b76c9 100644 (file)
@@ -11,6 +11,7 @@
 #include "smpi_comm.hpp"
 #include "smpi_datatype_derived.hpp"
 #include "smpi_status.hpp"
+#include "smpi_coll.hpp"
 #include "src/kernel/actor/ActorImpl.hpp"
 #include "src/smpi/include/smpi_actor.hpp"
 
@@ -20,14 +21,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_pmpi, smpi, "Logging specific to SMPI (pmpi
 void TRACE_smpi_set_category(const char *category)
 {
   //need to end bench otherwise categories for execution tasks are wrong
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
+
   if (category != nullptr) {
     // declare category
     TRACE_category(category);
     smpi_process()->set_tracing_category(category);
   }
-  //begin bench after changing process's category
-  smpi_bench_begin();
 }
 
 /* PMPI User level calls */
@@ -66,6 +66,9 @@ int PMPI_Finalize()
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::NoOpTIData("finalize"));
 
+  if(simgrid::config::get_value<bool>("smpi/finalization-barrier"))
+    simgrid::smpi::colls::barrier(MPI_COMM_WORLD);
+
   smpi_process()->finalize();
 
   TRACE_smpi_comm_out(rank_traced);
@@ -87,7 +90,7 @@ int PMPI_Get_version (int *version,int *subversion){
 int PMPI_Get_library_version (char *version,int *len){
   snprintf(version, MPI_MAX_LIBRARY_VERSION_STRING, "SMPI Version %d.%d. Copyright The SimGrid Team 2007-2021",
            SIMGRID_VERSION_MAJOR, SIMGRID_VERSION_MINOR);
-  *len = strlen(version) > MPI_MAX_LIBRARY_VERSION_STRING ? MPI_MAX_LIBRARY_VERSION_STRING : strlen(version);
+  *len = std::min(static_cast<int>(strlen(version)), MPI_MAX_LIBRARY_VERSION_STRING);
   return MPI_SUCCESS;
 }
 
@@ -179,7 +182,7 @@ MPI_Aint PMPI_Aint_diff(MPI_Aint address, MPI_Aint disp)
 
 int PMPI_Get_processor_name(char *name, int *resultlen)
 {
-  int len = std::min<int>(sg_host_self()->get_name().size(), MPI_MAX_PROCESSOR_NAME - 1);
+  int len = std::min(static_cast<int>(sg_host_self()->get_name().size()), MPI_MAX_PROCESSOR_NAME - 1);
   std::string(sg_host_self()->get_name()).copy(name, len);
   name[len]  = '\0';
   *resultlen = len;
index e52ae3b..8305497 100644 (file)
@@ -38,7 +38,7 @@ int PMPI_Ibarrier(MPI_Comm comm, MPI_Request *request)
   CHECK_COMM(1)
   CHECK_REQUEST(2)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t pid = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Barrier" : "PMPI_Ibarrier",
                      new simgrid::instr::NoOpTIData(request == MPI_REQUEST_IGNORED ? "barrier" : "ibarrier"));
@@ -50,7 +50,6 @@ int PMPI_Ibarrier(MPI_Comm comm, MPI_Request *request)
     simgrid::smpi::colls::ibarrier(comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -70,11 +69,11 @@ int PMPI_Ibcast(void *buf, int count, MPI_Datatype datatype,
   CHECK_ROOT(4)
   CHECK_REQUEST(6)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t pid = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Bcast" : "PMPI_Ibcast",
                      new simgrid::instr::CollTIData(request == MPI_REQUEST_IGNORED ? "bcast" : "ibcast", root, -1.0,
-                                                    datatype->is_replayable() ? count : count * datatype->size(), 0,
+                                                    count, 0,
                                                     simgrid::smpi::Datatype::encode(datatype), ""));
   if (comm->size() > 1) {
     if (request == MPI_REQUEST_IGNORED)
@@ -87,7 +86,6 @@ int PMPI_Ibcast(void *buf, int count, MPI_Datatype datatype,
   }
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -101,7 +99,6 @@ int PMPI_Igather(const void* sendbuf, int sendcount, MPI_Datatype sendtype, void
 {
   CHECK_COMM(8)
   SET_BUF1(sendbuf)
-  SET_BUF2(recvbuf)
   int rank = comm->rank();
   if(sendbuf != MPI_IN_PLACE){
     CHECK_COUNT(2, sendcount)
@@ -109,6 +106,7 @@ int PMPI_Igather(const void* sendbuf, int sendcount, MPI_Datatype sendtype, void
     CHECK_BUFFER(1,sendbuf, sendcount, sendtype)
   }
   if(rank == root){
+    SET_BUF2(recvbuf)
     CHECK_NOT_IN_PLACE_ROOT(4, recvbuf)
     CHECK_TYPE(6, recvtype)
     CHECK_COUNT(5, recvcount)
@@ -132,15 +130,14 @@ int PMPI_Igather(const void* sendbuf, int sendcount, MPI_Datatype sendtype, void
     }
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t pid = simgrid::s4u::this_actor::get_pid();
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Gather" : "PMPI_Igather",
                      new simgrid::instr::CollTIData(
                          request == MPI_REQUEST_IGNORED ? "gather" : "igather", root, -1.0,
-                         real_sendtype->is_replayable() ? real_sendcount : real_sendcount * real_sendtype->size(),
-                         (comm->rank() != root || recvtype->is_replayable()) ? recvcount : recvcount * recvtype->size(),
+                         real_sendcount, recvcount,
                          simgrid::smpi::Datatype::encode(real_sendtype), simgrid::smpi::Datatype::encode(recvtype)));
   if (request == MPI_REQUEST_IGNORED)
     simgrid::smpi::colls::gather(real_sendbuf, real_sendcount, real_sendtype, recvbuf, recvcount, recvtype, root, comm);
@@ -149,7 +146,6 @@ int PMPI_Igather(const void* sendbuf, int sendcount, MPI_Datatype sendtype, void
                                   request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -163,7 +159,6 @@ int PMPI_Igatherv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, voi
 {
   CHECK_COMM(9)
   SET_BUF1(sendbuf)
-  SET_BUF2(recvbuf)
   int rank = comm->rank();
   if(sendbuf != MPI_IN_PLACE){
     CHECK_TYPE(3, sendtype)
@@ -171,6 +166,7 @@ int PMPI_Igatherv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, voi
   }
   CHECK_BUFFER(1, sendbuf, sendcount, sendtype)
   if(rank == root){
+    SET_BUF2(recvbuf)
     CHECK_NOT_IN_PLACE_ROOT(4, recvbuf)
     CHECK_TYPE(6, recvtype)
     CHECK_NULL(5, MPI_ERR_COUNT, recvcounts)
@@ -188,7 +184,7 @@ int PMPI_Igatherv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, voi
     }
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   const void* real_sendbuf   = sendbuf;
   int real_sendcount         = sendcount;
   MPI_Datatype real_sendtype = sendtype;
@@ -198,19 +194,18 @@ int PMPI_Igatherv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, voi
   }
 
   aid_t pid        = simgrid::s4u::this_actor::get_pid();
-  int dt_size_recv = recvtype->is_replayable() ? 1 : recvtype->size();
 
   auto trace_recvcounts = std::make_shared<std::vector<int>>();
-  if (rank == root) {
-    for (int i = 0; i < comm->size(); i++) // copy data to avoid bad free
-      trace_recvcounts->push_back(recvcounts[i] * dt_size_recv);
-  }
+  if (rank == root)
+    trace_recvcounts->insert(trace_recvcounts->end(), &recvcounts[0], &recvcounts[comm->size()]);
+  else //this is not significant outside of root, put 0 as we don't know if recvcounts is initialized
+    trace_recvcounts->insert(trace_recvcounts->end(), comm->size(), 0);
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Gatherv" : "PMPI_Igatherv",
                      new simgrid::instr::VarCollTIData(
                          request == MPI_REQUEST_IGNORED ? "gatherv" : "igatherv", root,
-                         real_sendtype->is_replayable() ? real_sendcount : real_sendcount * real_sendtype->size(),
-                         nullptr, dt_size_recv, trace_recvcounts, simgrid::smpi::Datatype::encode(real_sendtype),
+                         sendcount,
+                         nullptr, -1, trace_recvcounts, simgrid::smpi::Datatype::encode(real_sendtype),
                          simgrid::smpi::Datatype::encode(recvtype)));
   if (request == MPI_REQUEST_IGNORED)
     simgrid::smpi::colls::gatherv(real_sendbuf, real_sendcount, real_sendtype, recvbuf, recvcounts, displs, recvtype,
@@ -220,7 +215,6 @@ int PMPI_Igatherv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, voi
                                    root, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -258,15 +252,14 @@ int PMPI_Iallgather(const void* sendbuf, int sendcount, MPI_Datatype sendtype, v
     return MPI_ERR_TRUNCATE;
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t pid = simgrid::s4u::this_actor::get_pid();
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Allgather" : "PMPI_Iallggather",
                      new simgrid::instr::CollTIData(
                          request == MPI_REQUEST_IGNORED ? "allgather" : "iallgather", -1, -1.0,
-                         sendtype->is_replayable() ? sendcount : sendcount * sendtype->size(),
-                         recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(),
+                         sendcount, recvcount,
                          simgrid::smpi::Datatype::encode(sendtype), simgrid::smpi::Datatype::encode(recvtype)));
   if (request == MPI_REQUEST_IGNORED)
     simgrid::smpi::colls::allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm);
@@ -274,7 +267,6 @@ int PMPI_Iallgather(const void* sendbuf, int sendcount, MPI_Datatype sendtype, v
     simgrid::smpi::colls::iallgather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -306,25 +298,22 @@ int PMPI_Iallgatherv(const void* sendbuf, int sendcount, MPI_Datatype sendtype,
     CHECK_BUFFER(4, recvbuf, recvcounts[i], recvtype)
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (sendbuf == MPI_IN_PLACE) {
     sendbuf   = static_cast<char*>(recvbuf) + recvtype->get_extent() * displs[comm->rank()];
     sendcount = recvcounts[comm->rank()];
     sendtype  = recvtype;
   }
   aid_t pid        = simgrid::s4u::this_actor::get_pid();
-  int dt_size_recv = recvtype->is_replayable() ? 1 : recvtype->size();
 
   auto trace_recvcounts = std::make_shared<std::vector<int>>();
-  for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free
-    trace_recvcounts->push_back(recvcounts[i] * dt_size_recv);
-  }
+  trace_recvcounts->insert(trace_recvcounts->end(), &recvcounts[0], &recvcounts[comm->size()]);
 
   TRACE_smpi_comm_in(
       pid, request == MPI_REQUEST_IGNORED ? "PMPI_Allgatherv" : "PMPI_Iallgatherv",
       new simgrid::instr::VarCollTIData(request == MPI_REQUEST_IGNORED ? "allgatherv" : "iallgatherv", -1,
-                                        sendtype->is_replayable() ? sendcount : sendcount * sendtype->size(), nullptr,
-                                        dt_size_recv, trace_recvcounts, simgrid::smpi::Datatype::encode(sendtype),
+                                        sendcount, nullptr,
+                                        -1, trace_recvcounts, simgrid::smpi::Datatype::encode(sendtype),
                                         simgrid::smpi::Datatype::encode(recvtype)));
   if (request == MPI_REQUEST_IGNORED)
     simgrid::smpi::colls::allgatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm);
@@ -333,7 +322,6 @@ int PMPI_Iallgatherv(const void* sendbuf, int sendcount, MPI_Datatype sendtype,
                                       request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -346,10 +334,10 @@ int PMPI_Iscatter(const void* sendbuf, int sendcount, MPI_Datatype sendtype, voi
                   MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request* request)
 {
   CHECK_COMM(8)
-  SET_BUF1(sendbuf)
   SET_BUF2(recvbuf)
   int rank = comm->rank();
   if(rank == root){
+    SET_BUF1(sendbuf)
     CHECK_NOT_IN_PLACE_ROOT(1, sendbuf)
     CHECK_COUNT(2, sendcount)
     CHECK_TYPE(3, sendtype)
@@ -375,15 +363,14 @@ int PMPI_Iscatter(const void* sendbuf, int sendcount, MPI_Datatype sendtype, voi
     return MPI_ERR_TRUNCATE;
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t pid = simgrid::s4u::this_actor::get_pid();
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Scatter" : "PMPI_Iscatter",
                      new simgrid::instr::CollTIData(
                          request == MPI_REQUEST_IGNORED ? "scatter" : "iscatter", root, -1.0,
-                         (rank != root || sendtype->is_replayable()) ? sendcount : sendcount * sendtype->size(),
-                         recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(),
+                         sendcount, recvcount,
                          simgrid::smpi::Datatype::encode(sendtype), simgrid::smpi::Datatype::encode(recvtype)));
   if (request == MPI_REQUEST_IGNORED)
     simgrid::smpi::colls::scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm);
@@ -391,7 +378,6 @@ int PMPI_Iscatter(const void* sendbuf, int sendcount, MPI_Datatype sendtype, voi
     simgrid::smpi::colls::iscatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -403,12 +389,10 @@ int PMPI_Scatterv(const void *sendbuf, const int *sendcounts, const int *displs,
 int PMPI_Iscatterv(const void* sendbuf, const int* sendcounts, const int* displs, MPI_Datatype sendtype, void* recvbuf, int recvcount,
                    MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request* request)
 {
-  SET_BUF1(sendbuf)
   SET_BUF2(recvbuf)
   CHECK_COMM(9)
   int rank = comm->rank();
   if(recvbuf != MPI_IN_PLACE){
-    CHECK_NOT_IN_PLACE_ROOT(1, sendbuf)
     CHECK_COUNT(5, recvcount)
     CHECK_TYPE(7, recvtype)
     CHECK_BUFFER(4, recvbuf, recvcount, recvtype)
@@ -416,6 +400,8 @@ int PMPI_Iscatterv(const void* sendbuf, const int* sendcounts, const int* displs
   CHECK_ROOT(9)
   CHECK_REQUEST(10)
   if (rank == root) {
+    SET_BUF1(sendbuf)
+    CHECK_NOT_IN_PLACE_ROOT(1, sendbuf)
     CHECK_NULL(2, MPI_ERR_COUNT, sendcounts)
     CHECK_NULL(3, MPI_ERR_ARG, displs)
     CHECK_TYPE(4, sendtype)
@@ -431,22 +417,21 @@ int PMPI_Iscatterv(const void* sendbuf, const int* sendcounts, const int* displs
     CHECK_NOT_IN_PLACE_ROOT(4, recvbuf)
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t pid        = simgrid::s4u::this_actor::get_pid();
-  int dt_size_send = sendtype->is_replayable() ? 1 : sendtype->size();
 
   auto trace_sendcounts = std::make_shared<std::vector<int>>();
-  if (rank == root) {
-    for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free
-      trace_sendcounts->push_back(sendcounts[i] * dt_size_send);
-    }
-  }
+  if (rank == root)
+    trace_sendcounts->insert(trace_sendcounts->end(), &sendcounts[0], &sendcounts[comm->size()]);
+  else //this is not significant outside of root, put 0 as we don't know if sendcounts is initialized
+    trace_sendcounts->insert(trace_sendcounts->end(), comm->size(), 0);
+
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Scatterv" : "PMPI_Iscatterv",
                      new simgrid::instr::VarCollTIData(
-                         request == MPI_REQUEST_IGNORED ? "scatterv" : "iscatterv", root, dt_size_send,
-                         trace_sendcounts, recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(),
+                         request == MPI_REQUEST_IGNORED ? "scatterv" : "iscatterv", root, -1,
+                         trace_sendcounts, recvcount,
                          nullptr, simgrid::smpi::Datatype::encode(sendtype),
                          simgrid::smpi::Datatype::encode(recvtype)));
   if (request == MPI_REQUEST_IGNORED)
@@ -456,7 +441,6 @@ int PMPI_Iscatterv(const void* sendbuf, const int* sendcounts, const int* displs
                                     request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -469,12 +453,12 @@ int PMPI_Ireduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype dat
 {
   CHECK_COMM(7)
   SET_BUF1(sendbuf)
-  SET_BUF2(recvbuf)
   int rank = comm->rank();
   CHECK_TYPE(4, datatype)
   CHECK_COUNT(3, count)
   CHECK_BUFFER(1, sendbuf, count, datatype)
   if(rank == root){
+    SET_BUF2(recvbuf)
     CHECK_NOT_IN_PLACE(2, recvbuf)
     CHECK_BUFFER(5, recvbuf, count, datatype)
   }
@@ -482,12 +466,12 @@ int PMPI_Ireduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype dat
   CHECK_ROOT(7)
   CHECK_REQUEST(8)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t pid = simgrid::s4u::this_actor::get_pid();
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Reduce" : "PMPI_Ireduce",
                      new simgrid::instr::CollTIData(request == MPI_REQUEST_IGNORED ? "reduce" : "ireduce", root, 0,
-                                                    datatype->is_replayable() ? count : count * datatype->size(), 0,
+                                                    count, 0,
                                                     simgrid::smpi::Datatype::encode(datatype), ""));
   if (request == MPI_REQUEST_IGNORED)
     simgrid::smpi::colls::reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
@@ -495,7 +479,6 @@ int PMPI_Ireduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype dat
     simgrid::smpi::colls::ireduce(sendbuf, recvbuf, count, datatype, op, root, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -509,9 +492,8 @@ int PMPI_Reduce_local(const void* inbuf, void* inoutbuf, int count, MPI_Datatype
   CHECK_BUFFER(2, inoutbuf, count, datatype)
   CHECK_OP(5, op, datatype)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   op->apply(inbuf, inoutbuf, &count, datatype);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -534,7 +516,7 @@ int PMPI_Iallreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype
   CHECK_BUFFER(2, recvbuf, count, datatype)
   CHECK_REQUEST(7)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   std::vector<unsigned char> tmp_sendbuf;
   const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, count, datatype);
 
@@ -542,7 +524,7 @@ int PMPI_Iallreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Allreduce" : "PMPI_Iallreduce",
                      new simgrid::instr::CollTIData(request == MPI_REQUEST_IGNORED ? "allreduce" : "iallreduce", -1, 0,
-                                                    datatype->is_replayable() ? count : count * datatype->size(), 0,
+                                                    count, 0,
                                                     simgrid::smpi::Datatype::encode(datatype), ""));
 
   if (request == MPI_REQUEST_IGNORED)
@@ -551,7 +533,6 @@ int PMPI_Iallreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype
     simgrid::smpi::colls::iallreduce(real_sendbuf, recvbuf, count, datatype, op, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -572,15 +553,14 @@ int PMPI_Iscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datat
   CHECK_REQUEST(7)
   CHECK_OP(5, op, datatype)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t pid = simgrid::s4u::this_actor::get_pid();
   std::vector<unsigned char> tmp_sendbuf;
   const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, count, datatype);
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Scan" : "PMPI_Iscan",
-                     new simgrid::instr::Pt2PtTIData(request == MPI_REQUEST_IGNORED ? "scan" : "iscan", -1,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
-                                                     simgrid::smpi::Datatype::encode(datatype)));
+                     new simgrid::instr::CollTIData(request == MPI_REQUEST_IGNORED ? "scan" : "iscan", -1, 0.0,
+                                                    count, 0, simgrid::smpi::Datatype::encode(datatype), ""));
 
   int retval;
   if (request == MPI_REQUEST_IGNORED)
@@ -589,7 +569,6 @@ int PMPI_Iscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datat
     retval = simgrid::smpi::colls::iscan(real_sendbuf, recvbuf, count, datatype, op, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return retval;
 }
 
@@ -609,15 +588,14 @@ int PMPI_Iexscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype dat
   CHECK_REQUEST(7)
   CHECK_OP(5, op, datatype)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t pid = simgrid::s4u::this_actor::get_pid();
   std::vector<unsigned char> tmp_sendbuf;
   const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, count, datatype);
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Exscan" : "PMPI_Iexscan",
-                     new simgrid::instr::Pt2PtTIData(request == MPI_REQUEST_IGNORED ? "exscan" : "iexscan", -1,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
-                                                     simgrid::smpi::Datatype::encode(datatype)));
+                     new simgrid::instr::CollTIData(request == MPI_REQUEST_IGNORED ? "exscan" : "iexscan", -1, 0.0,
+                                                    count, 0, simgrid::smpi::Datatype::encode(datatype), ""));
 
   int retval;
   if (request == MPI_REQUEST_IGNORED)
@@ -626,7 +604,6 @@ int PMPI_Iexscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype dat
     retval = simgrid::smpi::colls::iexscan(real_sendbuf, recvbuf, count, datatype, op, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return retval;
 }
 
@@ -652,14 +629,14 @@ int PMPI_Ireduce_scatter(const void *sendbuf, void *recvbuf, const int *recvcoun
     CHECK_BUFFER(2, recvbuf, recvcounts[i], datatype)
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t pid                          = simgrid::s4u::this_actor::get_pid();
   auto trace_recvcounts              = std::make_shared<std::vector<int>>();
-  int dt_send_size                   = datatype->is_replayable() ? 1 : datatype->size();
+  trace_recvcounts->insert(trace_recvcounts->end(), &recvcounts[0], &recvcounts[comm->size()]);
+
   int totalcount                     = 0;
 
   for (int i = 0; i < comm->size(); i++) { // copy data to avoid bad free
-    trace_recvcounts->push_back(recvcounts[i] * dt_send_size);
     totalcount += recvcounts[i];
   }
   std::vector<unsigned char> tmp_sendbuf;
@@ -667,8 +644,8 @@ int PMPI_Ireduce_scatter(const void *sendbuf, void *recvbuf, const int *recvcoun
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Reduce_scatter" : "PMPI_Ireduce_scatter",
                      new simgrid::instr::VarCollTIData(
-                         request == MPI_REQUEST_IGNORED ? "reducescatter" : "ireducescatter", -1, dt_send_size, nullptr,
-                         0, trace_recvcounts, simgrid::smpi::Datatype::encode(datatype), ""));
+                         request == MPI_REQUEST_IGNORED ? "reducescatter" : "ireducescatter", -1, -1, nullptr,
+                         -1 , trace_recvcounts, std::to_string(0), simgrid::smpi::Datatype::encode(datatype)));
 
   if (request == MPI_REQUEST_IGNORED)
     simgrid::smpi::colls::reduce_scatter(real_sendbuf, recvbuf, recvcounts, datatype, op, comm);
@@ -676,7 +653,6 @@ int PMPI_Ireduce_scatter(const void *sendbuf, void *recvbuf, const int *recvcoun
     simgrid::smpi::colls::ireduce_scatter(real_sendbuf, recvbuf, recvcounts, datatype, op, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -699,19 +675,19 @@ int PMPI_Ireduce_scatter_block(const void* sendbuf, void* recvbuf, int recvcount
   CHECK_REQUEST(7)
   CHECK_OP(5, op, datatype)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int count = comm->size();
 
   aid_t pid                          = simgrid::s4u::this_actor::get_pid();
-  int dt_send_size                   = datatype->is_replayable() ? 1 : datatype->size();
-  auto trace_recvcounts = std::make_shared<std::vector<int>>(recvcount * dt_send_size); // copy data to avoid bad free
+  auto trace_recvcounts = std::make_shared<std::vector<int>>(recvcount);
+
   std::vector<unsigned char> tmp_sendbuf;
   const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, recvcount * count, datatype);
 
   TRACE_smpi_comm_in(
       pid, request == MPI_REQUEST_IGNORED ? "PMPI_Reduce_scatter_block" : "PMPI_Ireduce_scatter_block",
-      new simgrid::instr::VarCollTIData(request == MPI_REQUEST_IGNORED ? "reducescatter" : "ireducescatter", -1, 0,
-                                        nullptr, 0, trace_recvcounts, simgrid::smpi::Datatype::encode(datatype), ""));
+      new simgrid::instr::VarCollTIData(request == MPI_REQUEST_IGNORED ? "reducescatter" : "ireducescatter", -1, -1,
+                                        nullptr, -1, trace_recvcounts, simgrid::smpi::Datatype::encode(datatype), ""));
 
   std::vector<int> recvcounts(count);
   for (int i      = 0; i < count; i++)
@@ -722,7 +698,6 @@ int PMPI_Ireduce_scatter_block(const void* sendbuf, void* recvbuf, int recvcount
     simgrid::smpi::colls::ireduce_scatter(real_sendbuf, recvbuf, recvcounts.data(), datatype, op, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -765,13 +740,12 @@ int PMPI_Ialltoall(const void* sendbuf, int sendcount, MPI_Datatype sendtype, vo
     return MPI_ERR_TRUNCATE;
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Alltoall" : "PMPI_Ialltoall",
                      new simgrid::instr::CollTIData(
                          request == MPI_REQUEST_IGNORED ? "alltoall" : "ialltoall", -1, -1.0,
-                         real_sendtype->is_replayable() ? real_sendcount : real_sendcount * real_sendtype->size(),
-                         recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(),
+                         real_sendcount, recvcount,
                          simgrid::smpi::Datatype::encode(real_sendtype), simgrid::smpi::Datatype::encode(recvtype)));
   int retval;
   if (request == MPI_REQUEST_IGNORED)
@@ -782,7 +756,6 @@ int PMPI_Ialltoall(const void* sendbuf, int sendcount, MPI_Datatype sendtype, vo
                                              comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return retval;
 }
 
@@ -819,28 +792,24 @@ int PMPI_Ialltoallv(const void* sendbuf, const int* sendcounts, const int* sendd
     CHECK_COUNT(6, recvcounts[i])
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int send_size                      = 0;
   int recv_size                      = 0;
   auto trace_sendcounts              = std::make_shared<std::vector<int>>();
   auto trace_recvcounts              = std::make_shared<std::vector<int>>();
+  trace_recvcounts->insert(trace_recvcounts->end(), &recvcounts[0], &recvcounts[size]);
+
   int dt_size_recv                   = recvtype->size();
 
   const int* real_sendcounts = sendcounts;
   const int* real_senddispls  = senddispls;
   MPI_Datatype real_sendtype = sendtype;
   int maxsize              = 0;
-  for (int i = 0; i < size; i++) { // copy data to avoid bad free
-    recv_size += recvcounts[i] * dt_size_recv;
-    trace_recvcounts->push_back(recvcounts[i] * dt_size_recv);
-    if (((recvdispls[i] + recvcounts[i]) * dt_size_recv) > maxsize)
-      maxsize = (recvdispls[i] + recvcounts[i]) * dt_size_recv;
-  }
-
   std::vector<unsigned char> tmp_sendbuf;
   std::vector<int> tmp_sendcounts;
   std::vector<int> tmp_senddispls;
-  const void* real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, maxsize, MPI_CHAR);
+  const void* real_sendbuf;
+
   if (sendbuf == MPI_IN_PLACE) {
     tmp_sendcounts.assign(recvcounts, recvcounts + size);
     real_sendcounts = tmp_sendcounts.data();
@@ -849,18 +818,20 @@ int PMPI_Ialltoallv(const void* sendbuf, const int* sendcounts, const int* sendd
     real_sendtype  = recvtype;
   }
 
+  for (int i = 0; i < size; i++) { // copy data to avoid bad free
+    send_size += real_sendcounts[i] ;
+    recv_size += recvcounts[i];
+    if (((recvdispls[i] + recvcounts[i]) * dt_size_recv) > maxsize)
+      maxsize = (recvdispls[i] + recvcounts[i]) * dt_size_recv;
+  }
+  real_sendbuf = smpi_get_in_place_buf(sendbuf, recvbuf, tmp_sendbuf, maxsize, MPI_CHAR);
+
   if(recvtype->size() * recvcounts[comm->rank()] !=  real_sendtype->size() * real_sendcounts[comm->rank()]){
     XBT_WARN("MPI_(I)Alltoallv : receive size from me differs from sent size to me : %zu vs %zu", recvtype->size() * recvcounts[comm->rank()], real_sendtype->size() * real_sendcounts[comm->rank()]);
-    smpi_bench_begin();
     return MPI_ERR_TRUNCATE;
   }
 
-  int dt_size_send = real_sendtype->size();
-
-  for (int i = 0; i < size; i++) { // copy data to avoid bad free
-    send_size += real_sendcounts[i] * dt_size_send;
-    trace_sendcounts->push_back(real_sendcounts[i] * dt_size_send);
-  }
+  trace_sendcounts->insert(trace_sendcounts->end(), &real_sendcounts[0], &real_sendcounts[size]);
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Alltoallv" : "PMPI_Ialltoallv",
                      new simgrid::instr::VarCollTIData(request == MPI_REQUEST_IGNORED ? "alltoallv" : "ialltoallv", -1,
@@ -877,7 +848,6 @@ int PMPI_Ialltoallv(const void* sendbuf, const int* sendcounts, const int* sendd
                                               recvcounts, recvdispls, recvtype, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return retval;
 }
 
@@ -915,22 +885,23 @@ int PMPI_Ialltoallw(const void* sendbuf, const int* sendcounts, const int* sendd
     CHECK_BUFFER(5, recvbuf, recvcounts[i], recvtypes[i])
   }
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   int send_size                      = 0;
   int recv_size                      = 0;
   auto trace_sendcounts              = std::make_shared<std::vector<int>>();
   auto trace_recvcounts              = std::make_shared<std::vector<int>>();
+  trace_recvcounts->insert(trace_recvcounts->end(), &recvcounts[0], &recvcounts[size]);
 
   const int* real_sendcounts         = sendcounts;
   const int* real_senddispls          = senddispls;
   const MPI_Datatype* real_sendtypes = sendtypes;
+
   unsigned long maxsize      = 0;
   for (int i = 0; i < size; i++) { // copy data to avoid bad free
     if (recvtypes[i] == MPI_DATATYPE_NULL)
       return MPI_ERR_TYPE;
     recv_size += recvcounts[i] * recvtypes[i]->size();
-    trace_recvcounts->push_back(recvcounts[i] * recvtypes[i]->size());
     if ((recvdispls[i] + (recvcounts[i] * recvtypes[i]->size())) > maxsize)
       maxsize = recvdispls[i] + (recvcounts[i] * recvtypes[i]->size());
   }
@@ -952,13 +923,12 @@ int PMPI_Ialltoallw(const void* sendbuf, const int* sendcounts, const int* sendd
 
   if(recvtypes[comm->rank()]->size() * recvcounts[comm->rank()] !=  real_sendtypes[comm->rank()]->size() * real_sendcounts[comm->rank()]){
     XBT_WARN("MPI_(I)Alltoallw : receive size from me differs from sent size to me : %zu vs %zu", recvtypes[comm->rank()]->size() * recvcounts[comm->rank()],  real_sendtypes[comm->rank()]->size() * real_sendcounts[comm->rank()]);
-    smpi_bench_begin();
     return MPI_ERR_TRUNCATE;
   }
 
+  trace_sendcounts->insert(trace_sendcounts->end(), &real_sendcounts[0], &real_sendcounts[size]);
   for (int i = 0; i < size; i++) { // copy data to avoid bad free
     send_size += real_sendcounts[i] * real_sendtypes[i]->size();
-    trace_sendcounts->push_back(real_sendcounts[i] * real_sendtypes[i]->size());
   }
 
   TRACE_smpi_comm_in(pid, request == MPI_REQUEST_IGNORED ? "PMPI_Alltoallw" : "PMPI_Ialltoallw",
@@ -976,6 +946,5 @@ int PMPI_Ialltoallw(const void* sendbuf, const int* sendcounts, const int* sendd
                                               recvcounts, recvdispls, recvtypes, comm, request);
 
   TRACE_smpi_comm_out(pid);
-  smpi_bench_begin();
   return retval;
 }
index e000ee2..85309dd 100644 (file)
@@ -130,9 +130,8 @@ int PMPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm* comm_out)
   CHECK_COMM2(1, comm)
   if( color != MPI_UNDEFINED)//we use a negative value for MPI_UNDEFINED
     CHECK_NEGATIVE(3, MPI_ERR_ARG, color)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   *comm_out = comm->split(color, key);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -140,9 +139,8 @@ int PMPI_Comm_split_type(MPI_Comm comm, int split_type, int key, MPI_Info info,
 {
   CHECK_COMM(1)
   CHECK_NULL(5, MPI_ERR_ARG, newcomm)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   *newcomm = comm->split_type(split_type, key, info);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -151,9 +149,8 @@ int PMPI_Comm_create_group(MPI_Comm comm, MPI_Group group, int, MPI_Comm* comm_o
   CHECK_COMM(1)
   CHECK_GROUP(2, group)
   CHECK_NULL(5, MPI_ERR_ARG, comm_out)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int retval = MPI_Comm_create(comm, group, comm_out);
-  smpi_bench_begin();
   return retval;
 }
 
index 1cf3dbe..38f6768 100644 (file)
@@ -41,9 +41,8 @@ int PMPI_File_open(MPI_Comm comm, const char *filename, int amode, MPI_Info info
   CHECK_NULL(2, MPI_ERR_FILE, filename)
   if (amode < 0)
     return MPI_ERR_AMODE;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   *fh =  new simgrid::smpi::File(comm, filename, amode, info);
-  smpi_bench_begin();
   if ((*fh)->size() != 0 && (amode & MPI_MODE_EXCL)){
     delete fh;
     return MPI_ERR_AMODE;
@@ -55,44 +54,39 @@ int PMPI_File_open(MPI_Comm comm, const char *filename, int amode, MPI_Info info
 
 int PMPI_File_close(MPI_File *fh){
   CHECK_NULL(2, MPI_ERR_ARG, fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int ret = simgrid::smpi::File::close(fh);
   *fh = MPI_FILE_NULL;
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_seek(MPI_File fh, MPI_Offset offset, int whence){
   CHECK_FILE(1, fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int ret = fh->seek(offset,whence);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence){
   CHECK_FILE(1, fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int ret = fh->seek_shared(offset,whence);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_get_position(MPI_File fh, MPI_Offset* offset){
   CHECK_FILE(1, fh)
   CHECK_NULL(2, MPI_ERR_DISP, offset)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int ret = fh->get_position(offset);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_get_position_shared(MPI_File fh, MPI_Offset* offset){
   CHECK_FILE(1, fh)
   CHECK_NULL(2, MPI_ERR_DISP, offset)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int ret = fh->get_position_shared(offset);
-  smpi_bench_begin();
   return ret;
 }
 
@@ -100,12 +94,11 @@ int PMPI_File_read(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_
   CHECK_FILE_INPUTS
   CHECK_WRONLY(fh)
   PASS_ZEROCOUNT(count)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", count * datatype->size()));
   int ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
@@ -113,13 +106,12 @@ int PMPI_File_read_shared(MPI_File fh, void *buf, int count,MPI_Datatype datatyp
   CHECK_FILE_INPUTS
   CHECK_WRONLY(fh)
   PASS_ZEROCOUNT(count)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__,
                      new simgrid::instr::CpuTIData("IO - read_shared", count * datatype->size()));
   int ret = simgrid::smpi::File::read_shared(fh, buf, count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
@@ -127,12 +119,11 @@ int PMPI_File_write(MPI_File fh, const void *buf, int count,MPI_Datatype datatyp
   CHECK_FILE_INPUTS
   CHECK_RDONLY(fh)
   PASS_ZEROCOUNT(count)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", count * datatype->size()));
   int ret = simgrid::smpi::File::write(fh, const_cast<void*>(buf), count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
@@ -140,63 +131,58 @@ int PMPI_File_write_shared(MPI_File fh, const void *buf, int count,MPI_Datatype
   CHECK_FILE_INPUTS
   CHECK_RDONLY(fh)
   PASS_ZEROCOUNT(count)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__,
                      new simgrid::instr::CpuTIData("IO - write_shared", count * datatype->size()));
   int ret = simgrid::smpi::File::write_shared(fh, buf, count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_read_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
   CHECK_FILE_INPUTS
   CHECK_WRONLY(fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_all", count * datatype->size()));
   int ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_read_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
   CHECK_FILE_INPUTS
   CHECK_WRONLY(fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__,
                      new simgrid::instr::CpuTIData("IO - read_ordered", count * datatype->size()));
   int ret = simgrid::smpi::File::read_ordered(fh, buf, count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_write_all(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
   CHECK_FILE_INPUTS
   CHECK_RDONLY(fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_all", count * datatype->size()));
   int ret = fh->op_all<simgrid::smpi::File::write>(const_cast<void*>(buf), count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_write_ordered(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
   CHECK_FILE_INPUTS
   CHECK_RDONLY(fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__,
                      new simgrid::instr::CpuTIData("IO - write_ordered", count * datatype->size()));
   int ret = simgrid::smpi::File::write_ordered(fh, buf, count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
@@ -204,31 +190,27 @@ int PMPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_D
   CHECK_FILE_INPUTS
   CHECK_WRONLY(fh)
   PASS_ZEROCOUNT(count)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", count * datatype->size()));
   int ret = fh->seek(offset,MPI_SEEK_SET);
-  if(ret!=MPI_SUCCESS)
-    return ret;
-  ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
+  if (ret == MPI_SUCCESS)
+    ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
   CHECK_FILE_INPUT_OFFSET
   CHECK_WRONLY(fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__,
                      new simgrid::instr::CpuTIData("IO - read_at_all", count * datatype->size()));
   int ret = fh->seek(offset,MPI_SEEK_SET);
-  if(ret!=MPI_SUCCESS)
-    return ret;
-  ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
+  if (ret == MPI_SUCCESS)
+    ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
@@ -236,40 +218,35 @@ int PMPI_File_write_at(MPI_File fh, MPI_Offset offset, const void *buf, int coun
   CHECK_FILE_INPUT_OFFSET
   CHECK_RDONLY(fh)
   PASS_ZEROCOUNT(count)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", count * datatype->size()));
   int ret = fh->seek(offset,MPI_SEEK_SET);
-  if(ret!=MPI_SUCCESS)
-    return ret;
-  ret = simgrid::smpi::File::write(fh, const_cast<void*>(buf), count, datatype, status);
+  if (ret == MPI_SUCCESS)
+    ret = simgrid::smpi::File::write(fh, const_cast<void*>(buf), count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_write_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
   CHECK_FILE_INPUT_OFFSET
   CHECK_RDONLY(fh)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(rank_traced, __func__,
                      new simgrid::instr::CpuTIData("IO - write_at_all", count * datatype->size()));
   int ret = fh->seek(offset,MPI_SEEK_SET);
-  if(ret!=MPI_SUCCESS)
-    return ret;
-  ret = fh->op_all<simgrid::smpi::File::write>(const_cast<void*>(buf), count, datatype, status);
+  if (ret == MPI_SUCCESS)
+    ret = fh->op_all<simgrid::smpi::File::write>(const_cast<void*>(buf), count, datatype, status);
   TRACE_smpi_comm_out(rank_traced);
-  smpi_bench_begin();
   return ret;
 }
 
 int PMPI_File_delete(const char *filename, MPI_Info info){
   if (filename == nullptr)
     return MPI_ERR_FILE;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int ret = simgrid::smpi::File::del(filename, info);
-  smpi_bench_begin();
   return ret;
 }
 
@@ -279,9 +256,8 @@ int PMPI_File_set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype, MPI_Dat
     CHECK_OFFSET(2, disp)
   CHECK_TYPE(3, etype)
   CHECK_TYPE(4, filetype)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int ret = fh->set_view(disp, etype, filetype, datarep, info);
-  smpi_bench_begin();
   return ret;
 }
 
@@ -290,9 +266,8 @@ int PMPI_File_get_view(MPI_File fh, MPI_Offset *disp, MPI_Datatype *etype, MPI_D
   CHECK_NULL(2, MPI_ERR_ARG, disp)
   CHECK_NULL(3, MPI_ERR_ARG, etype)
   CHECK_NULL(4, MPI_ERR_ARG, filetype)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int ret = fh->get_view(disp, etype, filetype, datarep);
-  smpi_bench_begin();
   return ret;
 }
 
index 1403317..de21fc6 100644 (file)
@@ -117,7 +117,8 @@ int PMPI_Group_incl(MPI_Group group, int n, const int *ranks, MPI_Group * newgro
 {
   CHECK_GROUP(1, group)
   CHECK_NEGATIVE(2, MPI_ERR_ARG, n)
-  CHECK_NULL(3, MPI_ERR_ARG, ranks)
+  if (n != 0)
+    CHECK_NULL(3, MPI_ERR_ARG, ranks)
   CHECK_NULL(4, MPI_ERR_ARG, newgroup)
   CHECK_GROUP_RANKS(group, n, ranks)
   return group->incl(n, ranks, newgroup);
index 19de25e..f903f06 100644 (file)
@@ -48,9 +48,8 @@ int PMPI_Send_init(const void *buf, int count, MPI_Datatype datatype, int dst, i
 {
   CHECK_ISEND_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   *request = simgrid::smpi::Request::send_init(buf, count, datatype, dst, tag, comm);
-  smpi_bench_begin();
 
   return MPI_SUCCESS;
 }
@@ -59,9 +58,8 @@ int PMPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src, int tag
 {
   CHECK_IRECV_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   *request = simgrid::smpi::Request::recv_init(buf, count, datatype, src, tag, comm);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -76,11 +74,10 @@ int PMPI_Ssend_init(const void* buf, int count, MPI_Datatype datatype, int dst,
   CHECK_ISEND_INPUTS
 
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   *request = simgrid::smpi::Request::ssend_init(buf, count, datatype, dst, tag, comm);
   retval = MPI_SUCCESS;
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -93,7 +90,7 @@ int PMPI_Start(MPI_Request * request)
 {
   int retval = 0;
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   CHECK_REQUEST_VALID(1)
   if ( *request == MPI_REQUEST_NULL) {
     retval = MPI_ERR_REQUEST;
@@ -115,14 +112,13 @@ int PMPI_Start(MPI_Request * request)
     retval = MPI_SUCCESS;
     TRACE_smpi_comm_out(my_proc_id);
   }
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Startall(int count, MPI_Request * requests)
 {
   int retval;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (requests == nullptr) {
     retval = MPI_ERR_ARG;
   } else {
@@ -153,7 +149,6 @@ int PMPI_Startall(int count, MPI_Request * requests)
       TRACE_smpi_comm_out(my_proc_id);
     }
   }
-  smpi_bench_begin();
   return retval;
 }
 
@@ -161,14 +156,13 @@ int PMPI_Request_free(MPI_Request * request)
 {
   int retval = 0;
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (*request != MPI_REQUEST_NULL) {
     (*request)->mark_as_deleted();
     simgrid::smpi::Request::unref(request);
     *request = MPI_REQUEST_NULL;
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin();
   return retval;
 }
 
@@ -176,15 +170,14 @@ int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MP
 {
   CHECK_IRECV_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData("irecv", src,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
+                                                     count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   *request = simgrid::smpi::Request::irecv(buf, count, datatype, src, tag, comm);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -193,19 +186,18 @@ int PMPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dst, int t
 {
   CHECK_ISEND_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int retval = 0;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   aid_t trace_dst  = getPid(comm, dst);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData("isend", dst,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
+                                                     count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, trace_dst, tag, count * datatype->size());
   *request = simgrid::smpi::Request::isend(buf, count, datatype, dst, tag, comm);
   retval = MPI_SUCCESS;
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
 
   return retval;
 }
@@ -220,17 +212,16 @@ int PMPI_Issend(const void* buf, int count, MPI_Datatype datatype, int dst, int
 {
   CHECK_ISEND_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   aid_t trace_dst  = getPid(comm, dst);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData("ISsend", dst,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
+                                                     count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, trace_dst, tag, count * datatype->size());
   *request = simgrid::smpi::Request::issend(buf, count, datatype, dst, tag, comm);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -244,7 +235,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI
   CHECK_TAG(5, tag)
   CHECK_COMM(6)
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (src == MPI_PROC_NULL) {
     if(status != MPI_STATUS_IGNORE){
       simgrid::smpi::Status::empty(status);
@@ -257,7 +248,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI
     aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
     TRACE_smpi_comm_in(my_proc_id, __func__,
                        new simgrid::instr::Pt2PtTIData("recv", src,
-                                                       datatype->is_replayable() ? count : count * datatype->size(),
+                                                       count,
                                                        tag, simgrid::smpi::Datatype::encode(datatype)));
 
     retval = simgrid::smpi::Request::recv(buf, count, datatype, src, tag, comm, status);
@@ -271,7 +262,6 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI
     TRACE_smpi_comm_out(my_proc_id);
   }
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -279,19 +269,18 @@ int PMPI_Send(const void *buf, int count, MPI_Datatype datatype, int dst, int ta
 {
   CHECK_SEND_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   aid_t dst_traced = getPid(comm, dst);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData("send", dst,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
+                                                     count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   if (not TRACE_smpi_view_internals()) {
     TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, tag, count * datatype->size());
   }
   simgrid::smpi::Request::send(buf, count, datatype, dst, tag, comm);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -304,25 +293,24 @@ int PMPI_Bsend(const void* buf, int count, MPI_Datatype datatype, int dst, int t
 {
   CHECK_SEND_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id   = simgrid::s4u::this_actor::get_pid();
   aid_t dst_traced   = getPid(comm, dst);
   int bsend_buf_size = 0;
   void* bsend_buf = nullptr;
   smpi_process()->bsend_buffer(&bsend_buf, &bsend_buf_size);
   int size = datatype->get_extent() * count;
-  if(bsend_buf==nullptr || bsend_buf_size < size + MPI_BSEND_OVERHEAD )
+  if (bsend_buf == nullptr || bsend_buf_size < size + MPI_BSEND_OVERHEAD)
     return MPI_ERR_BUFFER;
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData("bsend", dst,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
+                                                     count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   if (not TRACE_smpi_view_internals()) {
     TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, tag, count * datatype->size());
   }
   simgrid::smpi::Request::bsend(buf, count, datatype, dst, tag, comm);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -330,23 +318,22 @@ int PMPI_Ibsend(const void* buf, int count, MPI_Datatype datatype, int dst, int
 {
   CHECK_ISEND_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id   = simgrid::s4u::this_actor::get_pid();
   aid_t trace_dst    = getPid(comm, dst);
   int bsend_buf_size = 0;
   void* bsend_buf = nullptr;
   smpi_process()->bsend_buffer(&bsend_buf, &bsend_buf_size);
   int size = datatype->get_extent() * count;
-  if(bsend_buf==nullptr || bsend_buf_size < size + MPI_BSEND_OVERHEAD )
+  if (bsend_buf == nullptr || bsend_buf_size < size + MPI_BSEND_OVERHEAD)
     return MPI_ERR_BUFFER;
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData("ibsend", dst,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
+                                                     count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, trace_dst, tag, count * datatype->size());
   *request = simgrid::smpi::Request::ibsend(buf, count, datatype, dst, tag, comm);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -354,7 +341,7 @@ int PMPI_Bsend_init(const void* buf, int count, MPI_Datatype datatype, int dst,
 {
   CHECK_ISEND_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int retval = 0;
   int bsend_buf_size = 0;
   void* bsend_buf = nullptr;
@@ -365,7 +352,6 @@ int PMPI_Bsend_init(const void* buf, int count, MPI_Datatype datatype, int dst,
     *request = simgrid::smpi::Request::bsend_init(buf, count, datatype, dst, tag, comm);
     retval   = MPI_SUCCESS;
   }
-  smpi_bench_begin();
   return retval;
 }
 
@@ -373,17 +359,16 @@ int PMPI_Ssend(const void* buf, int count, MPI_Datatype datatype, int dst, int t
 {
   CHECK_SEND_INPUTS
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   aid_t dst_traced = getPid(comm, dst);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData("Ssend", dst,
-                                                     datatype->is_replayable() ? count : count * datatype->size(),
+                                                     count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, tag, count * datatype->size());
   simgrid::smpi::Request::ssend(buf, count, datatype, dst, tag, comm);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -402,7 +387,7 @@ int PMPI_Sendrecv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, int
   CHECK_BUFFER(6, recvbuf, recvcount, recvtype)
   CHECK_TAG(10, recvtag)
   CHECK_COMM(11)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   if (src == MPI_PROC_NULL) {
     if(status!=MPI_STATUS_IGNORE){
@@ -429,8 +414,8 @@ int PMPI_Sendrecv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, int
     src_hack->push_back(src_traced);
     TRACE_smpi_comm_in(my_proc_id, __func__,
                        new simgrid::instr::VarCollTIData(
-                           "sendRecv", -1, sendtype->is_replayable() ? sendcount : sendcount * sendtype->size(),
-                           dst_hack, recvtype->is_replayable() ? recvcount : recvcount * recvtype->size(), src_hack,
+                           "sendRecv", -1, sendcount,
+                           dst_hack, recvcount, src_hack,
                            simgrid::smpi::Datatype::encode(sendtype), simgrid::smpi::Datatype::encode(recvtype)));
 
     TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, sendtag, sendcount * sendtype->size());
@@ -443,7 +428,6 @@ int PMPI_Sendrecv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, int
     TRACE_smpi_comm_out(my_proc_id);
   }
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -470,7 +454,7 @@ int PMPI_Sendrecv_replace(void* buf, int count, MPI_Datatype datatype, int dst,
 int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status)
 {
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (request == nullptr || flag == nullptr) {
     retval = MPI_ERR_ARG;
   } else if (*request == MPI_REQUEST_NULL) {
@@ -487,7 +471,6 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status)
 
     TRACE_smpi_comm_out(my_proc_id);
   }
-  smpi_bench_begin();
   return retval;
 }
 
@@ -495,7 +478,7 @@ int PMPI_Testany(int count, MPI_Request requests[], int *index, int *flag, MPI_S
 {
   int retval = 0;
   CHECK_COUNT(1, count)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (index == nullptr || flag == nullptr) {
     retval = MPI_ERR_ARG;
   } else {
@@ -504,7 +487,6 @@ int PMPI_Testany(int count, MPI_Request requests[], int *index, int *flag, MPI_S
     retval = simgrid::smpi::Request::testany(count, requests, index, flag, status);
     TRACE_smpi_comm_out(my_proc_id);
   }
-  smpi_bench_begin();
   return retval;
 }
 
@@ -512,7 +494,7 @@ int PMPI_Testall(int count, MPI_Request* requests, int* flag, MPI_Status* status
 {
   int retval = 0;
   CHECK_COUNT(1, count)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (flag == nullptr) {
     retval = MPI_ERR_ARG;
   } else {
@@ -521,7 +503,6 @@ int PMPI_Testall(int count, MPI_Request* requests, int* flag, MPI_Status* status
     retval = simgrid::smpi::Request::testall(count, requests, flag, statuses);
     TRACE_smpi_comm_out(my_proc_id);
   }
-  smpi_bench_begin();
   return retval;
 }
 
@@ -529,7 +510,7 @@ int PMPI_Testsome(int incount, MPI_Request requests[], int* outcount, int* indic
 {
   int retval = 0;
   CHECK_COUNT(1, incount)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (outcount == nullptr) {
     retval = MPI_ERR_ARG;
   } else {
@@ -538,13 +519,12 @@ int PMPI_Testsome(int incount, MPI_Request requests[], int* outcount, int* indic
     retval = simgrid::smpi::Request::testsome(incount, requests, outcount, indices, status);
     TRACE_smpi_comm_out(my_proc_id);
   }
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status* status) {
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   CHECK_COMM(6)
   if(source!=MPI_ANY_SOURCE && source!=MPI_PROC_NULL)\
@@ -560,13 +540,12 @@ int PMPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status* status) {
     simgrid::smpi::Request::probe(source, tag, comm, status);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* status) {
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   CHECK_COMM(6)
   if(source!=MPI_ANY_SOURCE && source!=MPI_PROC_NULL)\
     CHECK_RANK(1, source, comm)
@@ -584,12 +563,10 @@ int PMPI_Iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* statu
     simgrid::smpi::Request::iprobe(source, tag, comm, flag, status);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin();
   return retval;
 }
 
-// TODO: cheinrich: Move declaration to other file? Rename this function - it's used for PMPI_Wait*?
-static void trace_smpi_recv_helper(MPI_Request* request, MPI_Status* status)
+static void trace_smpi_wait_recv_helper(MPI_Request* request, MPI_Status* status)
 {
   const simgrid::smpi::Request* req = *request;
   // Requests already received are null. Is this request a wait for RECV?
@@ -607,7 +584,7 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status)
 {
   int retval = 0;
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   simgrid::smpi::Status::empty(status);
 
@@ -617,25 +594,26 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status)
   } else {
     // for tracing, save the handle which might get overridden before we can use the helper on it
     MPI_Request savedreq = *request;
-    if (savedreq != MPI_REQUEST_NULL && not(savedreq->flags() & (MPI_REQ_FINISHED | MPI_REQ_GENERALIZED | MPI_REQ_NBC)))
+    if (not(savedreq->flags() & (MPI_REQ_FINISHED | MPI_REQ_GENERALIZED | MPI_REQ_NBC)))
       savedreq->ref();//don't erase the handle in Request::wait, we'll need it later
     else
       savedreq = MPI_REQUEST_NULL;
 
     aid_t my_proc_id = (*request)->comm() != MPI_COMM_NULL ? simgrid::s4u::this_actor::get_pid() : -1;
     TRACE_smpi_comm_in(my_proc_id, __func__,
-                       new simgrid::instr::WaitTIData((*request)->src(), (*request)->dst(), (*request)->tag()));
+                       new simgrid::instr::WaitTIData(MPI_COMM_WORLD->group()->rank((*request)->src()),
+                                                      MPI_COMM_WORLD->group()->rank((*request)->dst()),
+                                                      (*request)->tag()));
 
     retval = simgrid::smpi::Request::wait(request, status);
 
     //the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE)
     TRACE_smpi_comm_out(my_proc_id);
-    trace_smpi_recv_helper(&savedreq, status);
+    trace_smpi_wait_recv_helper(&savedreq, status);
     if (savedreq != MPI_REQUEST_NULL)
       simgrid::smpi::Request::unref(&savedreq);
   }
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -647,7 +625,7 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta
   if (count <= 0)
     return MPI_SUCCESS;
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   // for tracing, save the handles which might get overridden before we can use the helper on it
   std::vector<MPI_Request> savedreqs(requests, requests + count);
   for (MPI_Request& req : savedreqs) {
@@ -663,7 +641,7 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta
   *index = simgrid::smpi::Request::waitany(count, requests, status);
 
   if(*index!=MPI_UNDEFINED){
-    trace_smpi_recv_helper(&savedreqs[*index], status);
+    trace_smpi_wait_recv_helper(&savedreqs[*index], status);
     TRACE_smpi_comm_out(rank_traced);
   }
 
@@ -671,13 +649,12 @@ int PMPI_Waitany(int count, MPI_Request requests[], int *index, MPI_Status * sta
     if (req != MPI_REQUEST_NULL)
       simgrid::smpi::Request::unref(&req);
 
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
 int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
 {
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   CHECK_COUNT(1, count)
   // for tracing, save the handles which might get overridden before we can use the helper on it
   std::vector<MPI_Request> savedreqs(requests, requests + count);
@@ -694,7 +671,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
   int retval = simgrid::smpi::Request::waitall(count, requests, status);
 
   for (int i = 0; i < count; i++) {
-    trace_smpi_recv_helper(&savedreqs[i], status!=MPI_STATUSES_IGNORE ? &status[i]: MPI_STATUS_IGNORE);
+    trace_smpi_wait_recv_helper(&savedreqs[i], status != MPI_STATUSES_IGNORE ? &status[i] : MPI_STATUS_IGNORE);
   }
   TRACE_smpi_comm_out(rank_traced);
 
@@ -702,7 +679,6 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
     if (req != MPI_REQUEST_NULL)
       simgrid::smpi::Request::unref(&req);
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -710,14 +686,13 @@ int PMPI_Waitsome(int incount, MPI_Request requests[], int *outcount, int *indic
 {
   int retval = 0;
   CHECK_COUNT(1, incount)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (outcount == nullptr) {
     retval = MPI_ERR_ARG;
   } else {
     *outcount = simgrid::smpi::Request::waitsome(incount, requests, indices, status);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin();
   return retval;
 }
 
@@ -725,7 +700,7 @@ int PMPI_Cancel(MPI_Request* request)
 {
   int retval = 0;
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   CHECK_REQUEST_VALID(1)
   if (*request == MPI_REQUEST_NULL) {
     retval = MPI_ERR_REQUEST;
@@ -733,7 +708,6 @@ int PMPI_Cancel(MPI_Request* request)
     (*request)->cancel();
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin();
   return retval;
 }
 
index 7f15585..244c24b 100644 (file)
@@ -24,8 +24,7 @@ int PMPI_Cart_create(MPI_Comm comm, int ndims, const int* dims, const int* perio
   CHECK_NEGATIVE(2, MPI_ERR_ARG, ndims)
   for (int i = 0; i < ndims; i++)
     CHECK_NEGATIVE(2, MPI_ERR_ARG, dims[i])
-  const simgrid::smpi::Topo_Cart* topo =
-      new simgrid::smpi::Topo_Cart(comm, ndims, dims, periodic, reorder, comm_cart);
+  const auto* topo = new simgrid::smpi::Topo_Cart(comm, ndims, dims, periodic, reorder, comm_cart);
   if (*comm_cart == MPI_COMM_NULL) {
     delete topo;
   } else {
@@ -38,7 +37,7 @@ int PMPI_Cart_rank(MPI_Comm comm, const int* coords, int* rank) {
   CHECK_COMM(1)
   CHECK_NULL(1, MPI_ERR_TOPOLOGY, comm->topo())
   CHECK_NULL(2, MPI_SUCCESS, coords)
-  MPIR_Cart_Topology topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
+  auto* topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
   if (topo==nullptr) {
     return MPI_ERR_ARG;
   }
@@ -51,7 +50,7 @@ int PMPI_Cart_shift(MPI_Comm comm, int direction, int displ, int* source, int* d
   CHECK_NEGATIVE(3, MPI_ERR_ARG, direction)
   CHECK_NULL(4, MPI_ERR_ARG, source)
   CHECK_NULL(5, MPI_ERR_ARG, dest)
-  MPIR_Cart_Topology topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
+  auto* topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
   if (topo==nullptr) {
     return MPI_ERR_ARG;
   }
@@ -66,7 +65,7 @@ int PMPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int* coords) {
   if(maxdims==0 || coords == nullptr) {
     return MPI_SUCCESS;
   }
-  MPIR_Cart_Topology topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
+  auto* topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
   if (topo==nullptr) {
     return MPI_ERR_ARG;
   }
@@ -80,7 +79,7 @@ int PMPI_Cart_get(MPI_Comm comm, int maxdims, int* dims, int* periods, int* coor
   CHECK_COMM(1)
   CHECK_NULL(1, MPI_ERR_TOPOLOGY, comm->topo())
   CHECK_NEGATIVE(3, MPI_ERR_ARG, maxdims)
-  MPIR_Cart_Topology topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
+  auto* topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
   if (topo==nullptr) {
     return MPI_ERR_ARG;
   }
@@ -91,7 +90,7 @@ int PMPI_Cartdim_get(MPI_Comm comm, int* ndims) {
   CHECK_COMM(1)
   CHECK_NULL(1, MPI_ERR_TOPOLOGY, comm->topo())
   CHECK_NULL(2, MPI_ERR_ARG, ndims)
-  const simgrid::smpi::Topo_Cart* topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
+  const auto* topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
   if (topo==nullptr) {
     return MPI_ERR_ARG;
   }
@@ -110,11 +109,11 @@ int PMPI_Cart_sub(MPI_Comm comm, const int* remain_dims, MPI_Comm* comm_new) {
   CHECK_COMM(1)
   CHECK_NULL(1, MPI_ERR_TOPOLOGY, comm->topo())
   CHECK_NULL(3, MPI_ERR_ARG, comm_new)
-  MPIR_Cart_Topology topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
+  auto* topo = static_cast<MPIR_Cart_Topology>(comm->topo().get());
   if (topo==nullptr) {
     return MPI_ERR_ARG;
   }
-  const simgrid::smpi::Topo_Cart* cart = topo->sub(remain_dims, comm_new);
+  const auto* cart = topo->sub(remain_dims, comm_new);
   if(*comm_new==MPI_COMM_NULL)
       delete cart;
   if(cart==nullptr)
index 44de64e..651eb67 100644 (file)
@@ -114,7 +114,6 @@ int PMPI_Type_contiguous(int count, MPI_Datatype old_type, MPI_Datatype* new_typ
 }
 
 int PMPI_Type_commit(MPI_Datatype* datatype) {
-  CHECK_NULL(1, MPI_ERR_ARG, datatype)
   CHECK_MPI_NULL(1, MPI_DATATYPE_NULL, MPI_ERR_TYPE, (*datatype))
   (*datatype)->commit();
   return MPI_SUCCESS;
@@ -124,6 +123,7 @@ int PMPI_Type_vector(int count, int blocklen, int stride, MPI_Datatype old_type,
   CHECK_COUNT(1, count)
   CHECK_NEGATIVE(2, MPI_ERR_ARG, blocklen)
   CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
+  CHECK_NULL(5, MPI_ERR_ARG, new_type)
   return simgrid::smpi::Datatype::create_vector(count, blocklen, stride, old_type, new_type);
 }
 
@@ -131,6 +131,7 @@ int PMPI_Type_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype old
   CHECK_COUNT(1, count)
   CHECK_NEGATIVE(2, MPI_ERR_ARG, blocklen)
   CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
+  CHECK_NULL(5, MPI_ERR_ARG, new_type)
   return simgrid::smpi::Datatype::create_hvector(count, blocklen, stride, old_type, new_type);
 }
 
@@ -139,14 +140,13 @@ int PMPI_Type_create_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datat
 }
 
 int PMPI_Type_indexed(int count, const int* blocklens, const int* indices, MPI_Datatype old_type, MPI_Datatype* new_type) {
-  CHECK_COUNT(1, count)
-  CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
-  return simgrid::smpi::Datatype::create_indexed(count, blocklens, indices, old_type, new_type);
+  return PMPI_Type_create_indexed(count, blocklens, indices, old_type, new_type);
 }
 
 int PMPI_Type_create_indexed(int count, const int* blocklens, const int* indices, MPI_Datatype old_type, MPI_Datatype* new_type) {
   CHECK_COUNT(1, count)
   CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
+  CHECK_NULL(5, MPI_ERR_ARG, new_type)
   return simgrid::smpi::Datatype::create_indexed(count, blocklens, indices, old_type, new_type);
 }
 
@@ -155,7 +155,8 @@ int PMPI_Type_create_indexed_block(int count, int blocklength, const int* indice
 {
   CHECK_COUNT(1, count)
   CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
-  auto* blocklens = static_cast<int*>(xbt_malloc(blocklength * count * sizeof(int)));
+  CHECK_NULL(5, MPI_ERR_ARG, new_type)
+  auto* blocklens = static_cast<int*>(xbt_malloc(sizeof(int) * blocklength * count));
   for (int i    = 0; i < count; i++)
     blocklens[i]=blocklength;
   int retval    = simgrid::smpi::Datatype::create_indexed(count, blocklens, indices, old_type, new_type);
@@ -168,6 +169,7 @@ int PMPI_Type_hindexed(int count, const int* blocklens, const MPI_Aint* indices,
 {
   CHECK_COUNT(1, count)
   CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
+  CHECK_NULL(5, MPI_ERR_ARG, new_type)
   return simgrid::smpi::Datatype::create_hindexed(count, blocklens, indices, old_type, new_type);
 }
 
@@ -180,7 +182,8 @@ int PMPI_Type_create_hindexed_block(int count, int blocklength, const MPI_Aint*
                                     MPI_Datatype* new_type) {
   CHECK_COUNT(1, count)
   CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
-  auto* blocklens = static_cast<int*>(xbt_malloc(blocklength * count * sizeof(int)));
+  CHECK_NULL(5, MPI_ERR_ARG, new_type)
+  auto* blocklens = static_cast<int*>(xbt_malloc(sizeof(int) * blocklength * count));
   for (int i     = 0; i < count; i++)
     blocklens[i] = blocklength;
   int retval     = simgrid::smpi::Datatype::create_hindexed(count, blocklens, indices, old_type, new_type);
@@ -194,6 +197,7 @@ int PMPI_Type_struct(int count, const int* blocklens, const MPI_Aint* indices, c
   CHECK_COUNT(1, count)
   for(int i=0; i<count; i++)
     CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_types[i])
+  CHECK_NULL(5, MPI_ERR_ARG, new_type)
   return simgrid::smpi::Datatype::create_struct(count, blocklens, indices, old_types, new_type);
 }
 
@@ -219,6 +223,7 @@ int PMPI_Type_create_subarray(int ndims, const int* array_of_sizes,
     CHECK_NEGATIVE(3, MPI_ERR_COUNT, array_of_subsizes[i])
     CHECK_NEGATIVE(4, MPI_ERR_COUNT, array_of_starts[i])
   }
+  CHECK_NULL(7, MPI_ERR_ARG, newtype)
   if (ndims==1){
     simgrid::smpi::Datatype::create_contiguous( array_of_subsizes[0], oldtype, array_of_starts[0]*oldtype->get_extent(), newtype);
     return MPI_SUCCESS;
@@ -233,6 +238,7 @@ int PMPI_Type_create_subarray(int ndims, const int* array_of_sizes,
 
 int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){
   CHECK_MPI_NULL(1, MPI_DATATYPE_NULL, MPI_ERR_TYPE, oldtype)
+  CHECK_NULL(4, MPI_ERR_ARG, newtype)
   return simgrid::smpi::Datatype::create_resized(oldtype, lb, extent, newtype);
 }
 
index f3ff649..014cb17 100644 (file)
@@ -21,8 +21,8 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);
   CHECK_COUNT(6, target_count)\
   CHECK_TYPE(7, target_datatype)
 
-#define CHECK_TARGET_DISP(num)\
-  if(win->dynamic()==0)\
+#define CHECK_TARGET_DISP(num)                                                                                         \
+  if (not win->dynamic())                                                                                              \
     CHECK_NEGATIVE((num), MPI_ERR_RMA_RANGE, target_disp)
 
 /* PMPI User level calls */
@@ -32,14 +32,13 @@ int PMPI_Win_create( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MP
   CHECK_COMM(5)
   CHECK_NEGATIVE(2, MPI_ERR_OTHER, size)
   CHECK_NEGATIVE(3, MPI_ERR_OTHER, disp_unit)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (base == nullptr && size != 0){
     retval= MPI_ERR_OTHER;
   }else{
     *win = new simgrid::smpi::Win( base, size, disp_unit, info, comm);
     retval = MPI_SUCCESS;
   }
-  smpi_bench_begin();
   return retval;
 }
 
@@ -48,10 +47,9 @@ int PMPI_Win_allocate( MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm com
   CHECK_NEGATIVE(2, MPI_ERR_OTHER, size)
   CHECK_NEGATIVE(3, MPI_ERR_OTHER, disp_unit)
   void* ptr = xbt_malloc(size);
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   *static_cast<void**>(base) = ptr;
-  *win = new simgrid::smpi::Win( ptr, size, disp_unit, info, comm,1);
-  smpi_bench_begin();
+  *win                       = new simgrid::smpi::Win(ptr, size, disp_unit, info, comm, true);
   return MPI_SUCCESS;
 }
 
@@ -64,20 +62,18 @@ int PMPI_Win_allocate_shared( MPI_Aint size, int disp_unit, MPI_Info info, MPI_C
   if(rank==0){
      ptr = xbt_malloc(size*comm->size());
   }
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   simgrid::smpi::colls::bcast(&ptr, sizeof(void*), MPI_BYTE, 0, comm);
   simgrid::smpi::colls::barrier(comm);
   *static_cast<void**>(base) = (char*)ptr+rank*size;
-  *win = new simgrid::smpi::Win( ptr, size, disp_unit, info, comm,rank==0);
-  smpi_bench_begin();
+  *win                       = new simgrid::smpi::Win(ptr, size, disp_unit, info, comm, rank == 0);
   return MPI_SUCCESS;
 }
 
 int PMPI_Win_create_dynamic( MPI_Info info, MPI_Comm comm, MPI_Win *win){
   CHECK_COMM(2)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   *win = new simgrid::smpi::Win(info, comm);
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -86,9 +82,8 @@ int PMPI_Win_attach(MPI_Win win, void *base, MPI_Aint size){
   CHECK_NEGATIVE(3, MPI_ERR_OTHER, size)
   if (base == nullptr && size != 0)
     return MPI_ERR_OTHER;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int retval = win->attach(base, size);
-  smpi_bench_begin();
   return retval;
 }
 
@@ -96,18 +91,20 @@ int PMPI_Win_detach(MPI_Win win, const void* base)
 {
   CHECK_WIN(1, win)
   CHECK_NULL(2, MPI_ERR_OTHER, base)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   int retval = win->detach(base);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_free( MPI_Win* win){
   CHECK_NULL(1, MPI_ERR_WIN, win)
   CHECK_WIN(1, (*win))
-  smpi_bench_end();
+  if (_smpi_cfg_pedantic && (*win)->opened() == 1){//only check in pedantic mode, as it's not clear this is illegal
+    XBT_WARN("Attempt to destroy a MPI_Win too early -missing MPI_Win_fence ?");
+    return MPI_ERR_WIN;
+  }
+  const SmpiBenchGuard suspend_bench;
   delete *win;
-  smpi_bench_begin();
   return MPI_SUCCESS;
 }
 
@@ -152,12 +149,11 @@ int PMPI_Win_get_group(MPI_Win  win, MPI_Group * group){
 
 int PMPI_Win_fence( int assert,  MPI_Win win){
   CHECK_WIN(2, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_fence"));
   int retval = win->fence(assert);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
@@ -168,21 +164,18 @@ int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
   CHECK_TARGET_DISP(5)
 
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
   win->get_group(&group);
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("Get", target_rank, origin_datatype->is_replayable()
-                                                                             ? origin_count
-                                                                             : origin_count * origin_datatype->size(),
+                     new simgrid::instr::Pt2PtTIData("Get", target_rank, origin_count,
                                                      simgrid::smpi::Datatype::encode(origin_datatype)));
    retval = win->get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
                          target_datatype);
   TRACE_smpi_comm_out(my_proc_id);
  
-  smpi_bench_begin();
   return retval;
 }
 
@@ -196,15 +189,14 @@ int PMPI_Rget( void *origin_addr, int origin_count, MPI_Datatype origin_datatype
   CHECK_NULL(9, MPI_ERR_ARG, request)
 
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
   win->get_group(&group);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData(
-                         "Rget", target_rank,
-                         origin_datatype->is_replayable() ? origin_count : origin_count * origin_datatype->size(),
+                         "Rget", target_rank, origin_count,
                          simgrid::smpi::Datatype::encode(origin_datatype)));
 
   retval = win->get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
@@ -212,7 +204,6 @@ int PMPI_Rget( void *origin_addr, int origin_count, MPI_Datatype origin_datatype
 
   TRACE_smpi_comm_out(my_proc_id);
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -223,16 +214,14 @@ int PMPI_Put(const void *origin_addr, int origin_count, MPI_Datatype origin_data
   CHECK_TARGET_DISP(5)
 
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
   win->get_group(&group);
   aid_t dst_traced = group->actor(target_rank);
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("Put", target_rank, origin_datatype->is_replayable()
-                                                                             ? origin_count
-                                                                             : origin_count * origin_datatype->size(),
+                     new simgrid::instr::Pt2PtTIData("Put", target_rank, origin_count,
                                                      simgrid::smpi::Datatype::encode(origin_datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, SMPI_RMA_TAG, origin_count * origin_datatype->size());
 
@@ -241,7 +230,6 @@ int PMPI_Put(const void *origin_addr, int origin_count, MPI_Datatype origin_data
 
   TRACE_smpi_comm_out(my_proc_id);
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -254,7 +242,7 @@ int PMPI_Rput(const void *origin_addr, int origin_count, MPI_Datatype origin_dat
   CHECK_TARGET_DISP(5)
   CHECK_NULL(9, MPI_ERR_ARG, request)
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
@@ -262,8 +250,7 @@ int PMPI_Rput(const void *origin_addr, int origin_count, MPI_Datatype origin_dat
   aid_t dst_traced = group->actor(target_rank);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData(
-                         "Rput", target_rank,
-                         origin_datatype->is_replayable() ? origin_count : origin_count * origin_datatype->size(),
+                         "Rput", target_rank, origin_count,
                          simgrid::smpi::Datatype::encode(origin_datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, SMPI_RMA_TAG, origin_count * origin_datatype->size());
 
@@ -272,7 +259,6 @@ int PMPI_Rput(const void *origin_addr, int origin_count, MPI_Datatype origin_dat
 
   TRACE_smpi_comm_out(my_proc_id);
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -285,21 +271,19 @@ int PMPI_Accumulate(const void *origin_addr, int origin_count, MPI_Datatype orig
 
   int retval = 0;
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
   win->get_group(&group);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData(
-                         "Accumulate", target_rank,
-                         origin_datatype->is_replayable() ? origin_count : origin_count * origin_datatype->size(),
+                         "Accumulate", target_rank, origin_count,
                          simgrid::smpi::Datatype::encode(origin_datatype)));
   retval = win->accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
                                 target_datatype, op);
 
   TRACE_smpi_comm_out(my_proc_id);
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -315,15 +299,14 @@ int PMPI_Raccumulate(const void *origin_addr, int origin_count, MPI_Datatype ori
 
   int retval = 0;
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
   win->get_group(&group);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData(
-                         "Raccumulate", target_rank,
-                         origin_datatype->is_replayable() ? origin_count : origin_count * origin_datatype->size(),
+                         "Raccumulate", target_rank, origin_count,
                          simgrid::smpi::Datatype::encode(origin_datatype)));
 
   retval = win->accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
@@ -331,18 +314,19 @@ int PMPI_Raccumulate(const void *origin_addr, int origin_count, MPI_Datatype ori
 
   TRACE_smpi_comm_out(my_proc_id);
 
-  smpi_bench_begin();
   return retval;
 }
 
-int PMPI_Get_accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr,
-int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, int target_count,
-MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){
-  CHECK_COUNT(2, origin_count)
-  if(origin_count>0)
-    CHECK_TYPE(3, origin_datatype)
-  if (op != MPI_NO_OP)
+int PMPI_Get_accumulate(const void* origin_addr, int origin_count, MPI_Datatype origin_datatype, void* result_addr,
+                        int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
+                        int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win)
+{
+  if (op != MPI_NO_OP){
     CHECK_BUFFER(1, origin_addr, origin_count, origin_datatype)
+    CHECK_COUNT(2, origin_count)
+    if(origin_count>0)
+      CHECK_TYPE(3, origin_datatype)
+  }
   CHECK_COUNT(5, result_count)
   CHECK_TYPE(6, result_datatype)
   CHECK_BUFFER(4, result_addr, result_count, result_datatype)
@@ -354,15 +338,14 @@ MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){
   CHECK_TARGET_DISP(8)
 
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
   win->get_group(&group);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData(
-                         "Get_accumulate", target_rank,
-                         target_datatype->is_replayable() ? target_count : target_count * target_datatype->size(),
+                         "Get_accumulate", target_rank, target_count,
                          simgrid::smpi::Datatype::encode(target_datatype)));
 
   retval = win->get_accumulate( origin_addr, origin_count, origin_datatype, result_addr,
@@ -371,19 +354,21 @@ MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){
 
   TRACE_smpi_comm_out(my_proc_id);
 
-  smpi_bench_begin();
   return retval;
 }
 
-
-int PMPI_Rget_accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr,
-int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, int target_count,
-MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request* request){
+int PMPI_Rget_accumulate(const void* origin_addr, int origin_count, MPI_Datatype origin_datatype, void* result_addr,
+                         int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
+                         int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request* request)
+{
   if(target_rank==MPI_PROC_NULL)
     *request = MPI_REQUEST_NULL;
-  CHECK_COUNT(2, origin_count)
-  CHECK_TYPE(3, origin_datatype)
-  CHECK_BUFFER(1, origin_addr, origin_count, origin_datatype)
+  if (op != MPI_NO_OP){
+    CHECK_BUFFER(1, origin_addr, origin_count, origin_datatype)
+    CHECK_COUNT(2, origin_count)
+    if(origin_count>0)
+      CHECK_TYPE(3, origin_datatype)
+  }
   CHECK_COUNT(5, result_count)
   CHECK_TYPE(6, result_datatype)
   CHECK_BUFFER(4, result_addr, result_count, result_datatype)
@@ -395,15 +380,14 @@ MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request* request){
   CHECK_TARGET_DISP(8)
   CHECK_NULL(10, MPI_ERR_ARG, request)
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
   win->get_group(&group);
   TRACE_smpi_comm_in(my_proc_id, __func__,
                      new simgrid::instr::Pt2PtTIData(
-                         "Rget_accumulate", target_rank,
-                         target_datatype->is_replayable() ? target_count : target_count * target_datatype->size(),
+                         "Rget_accumulate", target_rank, target_count,
                          simgrid::smpi::Datatype::encode(target_datatype)));
 
   retval = win->get_accumulate( origin_addr, origin_count, origin_datatype, result_addr,
@@ -412,7 +396,6 @@ MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request* request){
 
   TRACE_smpi_comm_out(my_proc_id);
 
-  smpi_bench_begin();
   return retval;
 }
 
@@ -433,67 +416,61 @@ int PMPI_Compare_and_swap(const void* origin_addr, void* compare_addr, void* res
 
   int retval = 0;
 
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   MPI_Group group;
   win->get_group(&group);
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("Compare_and_swap", target_rank,
-                                                     datatype->is_replayable() ? 1 : datatype->size(),
+                     new simgrid::instr::Pt2PtTIData("Compare_and_swap", target_rank, 1,
                                                      simgrid::smpi::Datatype::encode(datatype)));
 
   retval = win->compare_and_swap(origin_addr, compare_addr, result_addr, datatype, target_rank, target_disp);
 
   TRACE_smpi_comm_out(my_proc_id);
 
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_post(MPI_Group group, int assert, MPI_Win win){
   CHECK_GROUP(1, group)
   CHECK_WIN(2, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_post"));
   int retval = win->post(group,assert);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_start(MPI_Group group, int assert, MPI_Win win){
   CHECK_GROUP(1, group)
   CHECK_WIN(2, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_start"));
   int retval = win->start(group,assert);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_complete(MPI_Win win){
   CHECK_WIN(1, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_complete"));
   int retval = win->complete();
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_wait(MPI_Win win){
   CHECK_WIN(1, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_wait"));
   int retval = win->wait();
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
@@ -501,7 +478,7 @@ int PMPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win){
   CHECK_WIN(4, win)
   CHECK_PROC_RMA(2, rank, win)
   int retval = 0;
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   if (lock_type != MPI_LOCK_EXCLUSIVE &&
       lock_type != MPI_LOCK_SHARED) {
     retval = MPI_ERR_LOCKTYPE;
@@ -511,87 +488,79 @@ int PMPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win){
     retval = win->lock(lock_type,rank,assert);
     TRACE_smpi_comm_out(my_proc_id);
   }
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_unlock(int rank, MPI_Win win){
   CHECK_WIN(2, win)
   CHECK_PROC_RMA(1, rank, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_unlock"));
   int retval = win->unlock(rank);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_lock_all(int assert, MPI_Win win){
   CHECK_WIN(2, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_lock_all"));
   int retval = win->lock_all(assert);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_unlock_all(MPI_Win win){
   CHECK_WIN(1, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_unlock_all"));
   int retval = win->unlock_all();
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_flush(int rank, MPI_Win win){
   CHECK_WIN(2, win)
   CHECK_PROC_RMA(1, rank, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_flush"));
   int retval = win->flush(rank);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_flush_local(int rank, MPI_Win win){
   CHECK_WIN(2, win)
   CHECK_PROC_RMA(1, rank, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_flush_local"));
   int retval = win->flush_local(rank);
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_flush_all(MPI_Win win){
   CHECK_WIN(1, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_flush_all"));
   int retval = win->flush_all();
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
 int PMPI_Win_flush_local_all(MPI_Win win){
   CHECK_WIN(1, win)
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_flush_local_all"));
   int retval = win->flush_local_all();
   TRACE_smpi_comm_out(my_proc_id);
-  smpi_bench_begin();
   return retval;
 }
 
index f8bed1a..33993a5 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2013-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 /* extracted from mpig_myreduce.c with
    :3,$s/MPL/MPI/g     and  :%s/\\\\$/ \\/   */
 
index 46f59c6..655d0fa 100644 (file)
@@ -74,16 +74,16 @@ int reduce_scatter__mpich_pair(const void *sendbuf, void *recvbuf, const int rec
             if (sendbuf != MPI_IN_PLACE)
                 Request::sendrecv(((char *)sendbuf+disps[dst]*extent),
                                              recvcounts[dst], datatype, dst,
-                                             COLL_TAG_SCATTER, tmp_recvbuf,
+                                             COLL_TAG_REDUCE_SCATTER, tmp_recvbuf,
                                              recvcounts[rank], datatype, src,
-                                             COLL_TAG_SCATTER, comm,
+                                             COLL_TAG_REDUCE_SCATTER, comm,
                                              MPI_STATUS_IGNORE);
             else
                 Request::sendrecv(((char *)recvbuf+disps[dst]*extent),
                                              recvcounts[dst], datatype, dst,
-                                             COLL_TAG_SCATTER, tmp_recvbuf,
+                                             COLL_TAG_REDUCE_SCATTER, tmp_recvbuf,
                                              recvcounts[rank], datatype, src,
-                                             COLL_TAG_SCATTER, comm,
+                                             COLL_TAG_REDUCE_SCATTER, comm,
                                              MPI_STATUS_IGNORE);
 
             if (is_commutative || (src < rank)) {
@@ -230,9 +230,9 @@ int reduce_scatter__mpich_noncomm(const void *sendbuf, void *recvbuf, const int
         }
 
         Request::sendrecv(outgoing_data + send_offset*true_extent,
-                                     size, datatype, peer, COLL_TAG_SCATTER,
+                                     size, datatype, peer, COLL_TAG_REDUCE_SCATTER,
                                      incoming_data + recv_offset*true_extent,
-                                     size, datatype, peer, COLL_TAG_SCATTER,
+                                     size, datatype, peer, COLL_TAG_REDUCE_SCATTER,
                                      comm, MPI_STATUS_IGNORE);
         /* always perform the reduction at recv_offset, the data at send_offset
            is now our peer's responsibility */
@@ -384,8 +384,8 @@ int reduce_scatter__mpich_rdb(const void *sendbuf, void *recvbuf, const int recv
            received in tmp_recvbuf and then accumulated into
            tmp_results. accumulation is done later below.   */
 
-        Request::sendrecv(tmp_results, 1, sendtype, dst, COLL_TAG_SCATTER, tmp_recvbuf, 1, recvtype, dst,
-                          COLL_TAG_SCATTER, comm, MPI_STATUS_IGNORE);
+        Request::sendrecv(tmp_results, 1, sendtype, dst, COLL_TAG_REDUCE_SCATTER, tmp_recvbuf, 1, recvtype, dst,
+                          COLL_TAG_REDUCE_SCATTER, comm, MPI_STATUS_IGNORE);
         received = 1;
       }
 
@@ -423,12 +423,12 @@ int reduce_scatter__mpich_rdb(const void *sendbuf, void *recvbuf, const int recv
              can send if they have the data */
           if ((dst > rank) && (rank < tree_root + nprocs_completed) && (dst >= tree_root + nprocs_completed)) {
             /* send the current result */
-            Request::send(tmp_recvbuf, 1, recvtype, dst, COLL_TAG_SCATTER, comm);
+            Request::send(tmp_recvbuf, 1, recvtype, dst, COLL_TAG_REDUCE_SCATTER, comm);
           }
           /* recv only if this proc. doesn't have data and sender
              has data */
           else if ((dst < rank) && (dst < tree_root + nprocs_completed) && (rank >= tree_root + nprocs_completed)) {
-            Request::recv(tmp_recvbuf, 1, recvtype, dst, COLL_TAG_SCATTER, comm, MPI_STATUS_IGNORE);
+            Request::recv(tmp_recvbuf, 1, recvtype, dst, COLL_TAG_REDUCE_SCATTER, comm, MPI_STATUS_IGNORE);
             received = 1;
           }
           tmp_mask >>= 1;
index a84cd1e..34b9abd 100644 (file)
@@ -25,7 +25,7 @@
       barrier__default(comm);                                                                                          \
       if (TRACE_is_enabled()) {                                                                                        \
         simgrid::instr::EventType* type =                                                                              \
-            simgrid::instr::Container::get_root()->type_->by_name_or_create<simgrid::instr::EventType>(                \
+            simgrid::instr::Container::get_root()->get_type()->by_name_or_create<simgrid::instr::EventType>(           \
                 _XBT_STRINGIFY(cat));                                                                                  \
                                                                                                                        \
         std::string cont_name = std::string("rank-" + std::to_string(simgrid::s4u::this_actor::get_pid()));            \
index 5a2e5a8..03f9c70 100644 (file)
@@ -84,6 +84,9 @@ XBT_PRIVATE void smpi_deployment_unregister_process(const std::string& instance_
 
 XBT_PRIVATE MPI_Comm* smpi_deployment_comm_world(const std::string& instance_id);
 XBT_PRIVATE void smpi_deployment_cleanup_instances();
+XBT_PRIVATE int smpi_deployment_smpirun(const simgrid::s4u::Engine* e, const std::string& hostfile, int np,
+                                        const std::string& replayfile, int map,
+                                        const std::vector<const char*>& run_args);
 
 XBT_PRIVATE void smpi_comm_copy_buffer_callback(simgrid::kernel::activity::CommImpl* comm, void* buff,
                                                 size_t buff_size);
@@ -115,10 +118,12 @@ XBT_PRIVATE double smpi_cfg_auto_shared_malloc_thresh();
 XBT_PRIVATE bool smpi_cfg_display_alloc();
 
 // utilities
+XBT_PRIVATE void smpi_init_options_internal(bool called_by_smpi_main);
+
 extern XBT_PRIVATE char* smpi_data_exe_start; // start of the data+bss segment of the executable
 extern XBT_PRIVATE size_t smpi_data_exe_size; // size of the data+bss segment of the executable
 
-XBT_PRIVATE void smpi_switch_data_segment(simgrid::s4u::ActorPtr actor);
+XBT_PRIVATE bool smpi_switch_data_segment(simgrid::s4u::ActorPtr actor, const void* addr = nullptr);
 
 XBT_PRIVATE void smpi_prepare_global_memory_segment();
 XBT_PRIVATE void smpi_backup_global_memory_segment();
@@ -129,6 +134,16 @@ XBT_PRIVATE void smpi_bench_end();
 XBT_PRIVATE void smpi_shared_destroy();
 XBT_PRIVATE double smpi_adjust_comp_speed();
 
+// This helper class uses RAII to call smpi_bench_end() when an object is built, and have smpi_bench_begin() be called
+// automatically when going out of scope.
+class XBT_PRIVATE SmpiBenchGuard {
+public:
+  SmpiBenchGuard() { smpi_bench_end(); }
+  SmpiBenchGuard(const SmpiBenchGuard&) = delete;
+  SmpiBenchGuard& operator=(const SmpiBenchGuard&) = delete;
+  ~SmpiBenchGuard() { smpi_bench_begin(); }
+};
+
 XBT_PRIVATE unsigned char* smpi_get_tmp_sendbuffer(size_t size);
 XBT_PRIVATE unsigned char* smpi_get_tmp_recvbuffer(size_t size);
 XBT_PRIVATE void smpi_free_tmp_buffer(const unsigned char* buf);
@@ -540,10 +555,6 @@ XBT_PRIVATE void private_execute_flops(double flops);
     CHECK_ARGS(init_flag, MPI_ERR_OTHER, "%s: MPI_Finalize was already called !", __func__)                            \
   }
 
-#define CHECK_MPI_NULL(num, val, err, ptr)\
-  CHECK_ARGS((ptr) == (val), (err),\
-             "%s: param %d %s cannot be %s", __func__, (num), _XBT_STRINGIFY(ptr), _XBT_STRINGIFY(val))
-
 #define CHECK_VAL(num, val, err, value)\
   CHECK_ARGS((value) == (val), (err),\
              "%s: param %d %s cannot be %s", __func__, (num), _XBT_STRINGIFY(value), _XBT_STRINGIFY(val))
@@ -552,6 +563,13 @@ XBT_PRIVATE void private_execute_flops(double flops);
   CHECK_ARGS((buf) == nullptr, (err),\
              "%s: param %d %s cannot be NULL", __func__, (num), _XBT_STRINGIFY(buf))
 
+#define CHECK_MPI_NULL(num, val, err, ptr)\
+  {\
+    CHECK_ARGS((ptr) == (val), (err),\
+               "%s: param %d %s cannot be %s", __func__, (num), _XBT_STRINGIFY(ptr), _XBT_STRINGIFY(val))\
+    CHECK_NULL(num, err, ptr)\
+  }
+
 #define CHECK_NEGATIVE(num, err, val)\
   CHECK_ARGS((val) < 0, (err),\
              "%s: param %d %s cannot be negative", __func__, (num), _XBT_STRINGIFY(val))
@@ -608,8 +626,9 @@ XBT_PRIVATE void private_execute_flops(double flops);
 
 #define CHECK_TYPE(num, datatype)\
   {\
-    CHECK_ARGS(((datatype) == MPI_DATATYPE_NULL|| not (datatype)->is_valid()), MPI_ERR_TYPE,\
-             "%s: param %d %s cannot be MPI_DATATYPE_NULL or invalid", __func__, (num), _XBT_STRINGIFY(datatype));\
+    CHECK_MPI_NULL((num), MPI_DATATYPE_NULL, MPI_ERR_TYPE, (datatype))\
+    CHECK_ARGS((not (datatype)->is_valid()), MPI_ERR_TYPE,\
+             "%s: param %d %s is invalid", __func__, (num), _XBT_STRINGIFY(datatype));\
     CHECK_DELETED((num), MPI_ERR_TYPE, datatype)\
     if (not datatype->is_basic())\
       simgrid::smpi::utils::set_current_handle(datatype);\
@@ -618,6 +637,8 @@ XBT_PRIVATE void private_execute_flops(double flops);
 #define CHECK_OP(num, op, type)\
   {\
   CHECK_MPI_NULL((num), MPI_OP_NULL, MPI_ERR_OP, (op))\
+  CHECK_ARGS((op == MPI_REPLACE || op == MPI_NO_OP), MPI_ERR_OP,\
+             "%s: param %d op %s cannot be used in non RMA calls", __func__, (num), _XBT_STRINGIFY(op));\
   CHECK_DELETED((num), MPI_ERR_OP, op)\
   if (not op->is_predefined())\
     simgrid::smpi::utils::set_current_handle(op);\
index f54a743..34881bc 100644 (file)
@@ -13,6 +13,7 @@
 #include "smpi_keyvals.hpp"
 #include "smpi_group.hpp"
 #include "smpi_topo.hpp"
+#include "smpi_config.hpp"
 
 namespace simgrid{
 namespace smpi{
@@ -36,7 +37,7 @@ class Comm : public F2C, public Keyval{
   std::string name_;
   MPI_Info info_ = MPI_INFO_NULL;
   int id_;
-  MPI_Errhandler errhandler_ = MPI_ERRORS_ARE_FATAL;
+  MPI_Errhandler errhandler_ =  _smpi_cfg_default_errhandler_is_error ? MPI_ERRORS_ARE_FATAL : MPI_ERRORS_RETURN;;
   MPI_Errhandler* errhandlers_ = nullptr; //for MPI_COMM_WORLD only
 
 public:
index 903ebdb..b26cbfb 100644 (file)
@@ -23,6 +23,9 @@ extern XBT_PRIVATE simgrid::config::Flag<double> _smpi_cfg_iprobe_cpu_usage;
 extern XBT_PRIVATE simgrid::config::Flag<bool> _smpi_cfg_trace_call_use_absolute_path;
 extern XBT_PRIVATE simgrid::config::Flag<bool> _smpi_cfg_trace_call_location;
 extern XBT_PRIVATE simgrid::config::Flag<std::string> _smpi_cfg_comp_adjustment_file;
+extern XBT_PRIVATE simgrid::config::Flag<bool> _smpi_cfg_default_errhandler_is_error;
+extern XBT_PRIVATE simgrid::config::Flag<bool> _smpi_cfg_pedantic;
+extern XBT_PRIVATE simgrid::config::Flag<double> _smpi_init_sleep;
 #if HAVE_PAPI
 extern XBT_PRIVATE simgrid::config::Flag<std::string> _smpi_cfg_papi_events_file;
 #endif
index 7bd716a..044cae6 100644 (file)
@@ -94,6 +94,9 @@ class Datatype_contents {
                     int number_of_integers, const int* integers, 
                     int number_of_addresses, const MPI_Aint* addresses, 
                     int number_of_datatypes, const MPI_Datatype* datatypes);
+  Datatype_contents(const Datatype_contents&) = delete;
+  Datatype_contents& operator=(const Datatype_contents&) = delete;
+  ~Datatype_contents();
 };
 
 class Datatype : public F2C, public Keyval{
@@ -144,7 +147,6 @@ public:
   bool is_basic() const;
   static const char* encode(const Datatype* dt) { return dt->id.c_str(); }
   static MPI_Datatype decode(const std::string& datatype_id);
-  bool is_replayable() const;
   void addflag(int flag);
   int extent(MPI_Aint* lb, MPI_Aint* extent) const;
   MPI_Aint get_extent() const { return ub_ - lb_; };
index d655edc..252cd87 100644 (file)
@@ -21,7 +21,7 @@ class Info : public F2C{
 
 public:
   explicit Info() {this->add_f();}
-  explicit Info(const Info* orig) : map_(orig->map_) {this->add_f();}
+  explicit Info(const Info* orig);
   void ref();
   static void unref(MPI_Info info);
   void set(const char* key, const char* value) { map_[key] = value; }
index b20bfa9..b3994e4 100644 (file)
@@ -11,6 +11,7 @@
 #include "smpi_errhandler.hpp"
 #include "smpi_f2c.hpp"
 #include "smpi_keyvals.hpp"
+#include "smpi_config.hpp"
 
 #include <vector>
 #include <list>
@@ -31,23 +32,25 @@ class Win : public F2C, public Keyval {
   std::vector<MPI_Win> connected_wins_;
   std::string name_;
   int opened_               = 0;
-  MPI_Group group_          = MPI_GROUP_NULL;
+  MPI_Group src_group_      = MPI_GROUP_NULL; // for post/wait
+  MPI_Group dst_group_      = MPI_GROUP_NULL; // for start/complete
   int count_                = 0; // for ordering the accs
   s4u::MutexPtr lock_mut_   = s4u::Mutex::create();
   s4u::MutexPtr atomic_mut_ = s4u::Mutex::create();
   std::list<int> lockers_;
   int rank_; // to identify owner for barriers in MPI_COMM_WORLD
   int mode_ = 0; // exclusive or shared lock
-  int allocated_;
-  int dynamic_;
-  MPI_Errhandler errhandler_ = MPI_ERRORS_ARE_FATAL;
+  bool allocated_;
+  bool dynamic_;
+  MPI_Errhandler errhandler_ = _smpi_cfg_default_errhandler_is_error ? MPI_ERRORS_ARE_FATAL : MPI_ERRORS_RETURN;
 
 public:
   static std::unordered_map<int, smpi_key_elem> keyvals_;
   static int keyval_id_;
 
-  Win(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, int allocated = 0, int dynamic = 0);
-  Win(MPI_Info info, MPI_Comm comm) : Win(MPI_BOTTOM, 0, 1, info, comm, 0, 1) {};
+  Win(void* base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, bool allocated = false,
+      bool dynamic = false);
+  Win(MPI_Info info, MPI_Comm comm) : Win(MPI_BOTTOM, 0, 1, info, comm, false, true){};
   Win(const Win&) = delete;
   Win& operator=(const Win&) = delete;
   ~Win() override;
@@ -59,7 +62,7 @@ public:
   void set_name(const char* name);
   int rank() const;
   MPI_Comm comm() const;
-  int dynamic() const;
+  bool dynamic() const;
   int start(MPI_Group group, int assert);
   int post(MPI_Group group, int assert);
   int complete();
@@ -70,6 +73,7 @@ public:
   void* base() const;
   int disp_unit() const;
   int fence(int assert);
+  int opened() const {return opened_;}
   int put(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Request* request=nullptr);
   int get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
index d58b680..ad52a2e 100644 (file)
@@ -137,12 +137,12 @@ static std::string TRACE_smpi_get_key(aid_t src, aid_t dst, int tag, int send)
 
 void TRACE_smpi_setup_container(aid_t pid, const_sg_host_t host)
 {
-  auto* father = simgrid::instr::Container::get_root();
+  auto* parent = simgrid::instr::Container::get_root();
   if (TRACE_smpi_is_grouped()) {
-    father = simgrid::instr::Container::by_name_or_null(host->get_name());
-    xbt_assert(father != nullptr, "Could not find a parent for mpi rank 'rank-%ld' at function %s", pid, __func__);
+    parent = simgrid::instr::Container::by_name_or_null(host->get_name());
+    xbt_assert(parent != nullptr, "Could not find a parent for mpi rank 'rank-%ld' at function %s", pid, __func__);
   }
-  father->create_child(std::string("rank-") + std::to_string(pid), "MPI"); // This container is of type MPI
+  parent->create_child(std::string("rank-") + std::to_string(pid), "MPI"); // This container is of type MPI
 }
 
 void TRACE_smpi_init(aid_t pid, const std::string& calling_func)
@@ -174,7 +174,7 @@ void TRACE_smpi_init(aid_t pid, const std::string& calling_func)
      * Check whether this variable already exists or not. Otherwise, it will be created
      * multiple times but only the last one would be used...
      */
-    container->type_->by_name_or_create(it.first, "");
+    container->get_type()->by_name_or_create(it.first, "");
   }
 #endif
 }
index bdb72ce..0758414 100644 (file)
@@ -216,21 +216,12 @@ void ActorExt::init()
   xbt_assert(smpi_get_universe_size() != 0, "SimGrid was not initialized properly before entering MPI_Init. "
                                             "Aborting, please check compilation process and use smpirun.");
 
-  simgrid::s4u::Actor* self = simgrid::s4u::Actor::self();
-  // cheinrich: I'm not sure what the impact of the SMPI_switch_data_segment on this call is. I moved
-  // this up here so that I can set the privatized region before the switch.
   ActorExt* ext = smpi_process();
   // if we are in MPI_Init and argc handling has already been done.
   if (ext->initialized())
     return;
 
-  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
-    /* Now using the segment index of this process  */
-    ext->set_privatized_region(smpi_init_global_memory_segment_process());
-    /* Done at the process's creation */
-    SMPI_switch_data_segment(self);
-  }
-
+  const simgrid::s4u::Actor* self = simgrid::s4u::Actor::self();
   ext->instance_id_ = self->get_property("instance_id");
   const int rank    = xbt_str_parse_int(self->get_property("rank"), "Cannot parse rank");
 
index d05db4d..35ee7a2 100644 (file)
@@ -13,6 +13,7 @@
 #include "smpi_utils.hpp"
 #include "src/internal_config.h"
 #include "src/mc/mc_replay.hpp"
+#include "src/surf/surf_interface.hpp" // sg_surf_precision
 #include "xbt/config.hpp"
 #include "xbt/file.hpp"
 
@@ -56,7 +57,7 @@ void smpi_execute_flops(double flops)
 void smpi_execute(double duration)
 {
   if (duration >= smpi_cfg_cpu_thresh()) {
-    XBT_DEBUG("Sleep for %g to handle real computation time", duration);
+    XBT_DEBUG("Sleep for %gs (host time) to handle real computation time", duration);
     private_execute_flops(duration * smpi_cfg_host_speed());
   } else {
     XBT_DEBUG("Real computation took %g while option smpi/cpu-threshold is set to %g => ignore it", duration,
@@ -66,23 +67,19 @@ void smpi_execute(double duration)
 
 void smpi_execute_benched(double duration)
 {
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   double speed = sg_host_get_speed(sg_host_self());
   smpi_execute_flops(duration*speed);
-  smpi_bench_begin();
 }
 
 void smpi_execute_flops_benched(double flops) {
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   smpi_execute_flops(flops);
-  smpi_bench_begin();
 }
 
 void smpi_bench_begin()
 {
-  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
-    smpi_switch_data_segment(simgrid::s4u::Actor::self());
-  }
+  smpi_switch_data_segment(simgrid::s4u::Actor::self());
 
   if (MC_is_active() || MC_record_replay_is_active())
     return;
@@ -166,34 +163,31 @@ void smpi_bench_end()
 }
 
 /* Private sleep function used by smpi_sleep(), smpi_usleep() and friends */
-static unsigned int private_sleep(double secs)
+static void private_sleep(double secs)
 {
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
 
   XBT_DEBUG("Sleep for: %lf secs", secs);
   aid_t pid = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_sleeping_in(pid, secs);
-
   simgrid::s4u::this_actor::sleep_for(secs);
-
   TRACE_smpi_sleeping_out(pid);
-
-  smpi_bench_begin();
-  return 0;
 }
 
 unsigned int smpi_sleep(unsigned int secs)
 {
   if (not smpi_process())
     return sleep(secs);
-  return private_sleep(secs);
+  private_sleep(secs);
+  return 0;
 }
 
 int smpi_usleep(useconds_t usecs)
 {
   if (not smpi_process())
     return usleep(usecs);
-  return static_cast<int>(private_sleep(usecs / 1000000.0));
+  private_sleep(static_cast<double>(usecs) / 1e6);
+  return 0;
 }
 
 #if _POSIX_TIMERS > 0
@@ -201,7 +195,8 @@ int smpi_nanosleep(const struct timespec* tp, struct timespec* t)
 {
   if (not smpi_process())
     return nanosleep(tp,t);
-  return static_cast<int>(private_sleep(tp->tv_sec + tp->tv_nsec / 1000000000.0));
+  private_sleep(static_cast<double>(tp->tv_sec) + static_cast<double>(tp->tv_nsec) / 1e9);
+  return 0;
 }
 #endif
 
@@ -210,19 +205,16 @@ int smpi_gettimeofday(struct timeval* tv, struct timezone* tz)
   if (not smpi_process()->initialized() || smpi_process()->finalized() || smpi_process()->sampling())
     return gettimeofday(tv, tz);
 
-  smpi_bench_end();
-  double now = simgrid::s4u::Engine::get_clock();
+  const SmpiBenchGuard suspend_bench;
   if (tv) {
-    tv->tv_sec = static_cast<time_t>(now);
-#ifdef WIN32
-    tv->tv_usec = static_cast<useconds_t>((now - tv->tv_sec) * 1e6);
-#else
-    tv->tv_usec = static_cast<suseconds_t>((now - tv->tv_sec) * 1e6);
-#endif
+    double now   = simgrid::s4u::Engine::get_clock();
+    double secs  = trunc(now);
+    double usecs = (now - secs) * 1e6;
+    tv->tv_sec   = static_cast<time_t>(secs);
+    tv->tv_usec  = static_cast<decltype(tv->tv_usec)>(usecs); // suseconds_t (or useconds_t on WIN32)
   }
   if (smpi_wtime_sleep > 0)
     simgrid::s4u::this_actor::sleep_for(smpi_wtime_sleep);
-  smpi_bench_begin();
   return 0;
 }
 
@@ -236,13 +228,14 @@ int smpi_clock_gettime(clockid_t clk_id, struct timespec* tp)
   if (not smpi_process()->initialized() || smpi_process()->finalized() || smpi_process()->sampling())
     return clock_gettime(clk_id, tp);
   //there is only one time in SMPI, so clk_id is ignored.
-  smpi_bench_end();
-  double now  = simgrid::s4u::Engine::get_clock();
-  tp->tv_sec  = static_cast<time_t>(now);
-  tp->tv_nsec = static_cast<long int>((now - tp->tv_sec) * 1e9);
+  const SmpiBenchGuard suspend_bench;
+  double now   = simgrid::s4u::Engine::get_clock();
+  double secs  = trunc(now);
+  double nsecs = (now - secs) * 1e9;
+  tp->tv_sec   = static_cast<time_t>(secs);
+  tp->tv_nsec  = static_cast<long int>(nsecs);
   if (smpi_wtime_sleep > 0)
     simgrid::s4u::this_actor::sleep_for(smpi_wtime_sleep);
-  smpi_bench_begin();
   return 0;
 }
 #endif
@@ -251,42 +244,34 @@ double smpi_mpi_wtime()
 {
   double time;
   if (smpi_process()->initialized() && not smpi_process()->finalized() && not smpi_process()->sampling()) {
-    smpi_bench_end();
+    const SmpiBenchGuard suspend_bench;
     time = simgrid::s4u::Engine::get_clock();
     if (smpi_wtime_sleep > 0)
       simgrid::s4u::this_actor::sleep_for(smpi_wtime_sleep);
-    smpi_bench_begin();
   } else {
     time = simgrid::s4u::Engine::get_clock();
   }
   return time;
 }
 
-extern double sg_surf_precision;
+// Used by Akypuera (https://github.com/schnorr/akypuera)
 unsigned long long smpi_rastro_resolution ()
 {
-  smpi_bench_end();
-  double resolution = (1/sg_surf_precision);
-  smpi_bench_begin();
-  return static_cast<unsigned long long>(resolution);
+  const SmpiBenchGuard suspend_bench;
+  return static_cast<unsigned long long>(1.0 / sg_surf_precision);
 }
 
 unsigned long long smpi_rastro_timestamp ()
 {
-  smpi_bench_end();
-  double now = simgrid::s4u::Engine::get_clock();
-
-  auto sec               = static_cast<unsigned long long>(now);
-  unsigned long long pre = (now - sec) * smpi_rastro_resolution();
-  smpi_bench_begin();
-  return sec * smpi_rastro_resolution() + pre;
+  const SmpiBenchGuard suspend_bench;
+  return static_cast<unsigned long long>(simgrid::s4u::Engine::get_clock() / sg_surf_precision);
 }
 
 /* ****************************** Functions related to the SMPI_SAMPLE_ macros ************************************/
 namespace {
 class SampleLocation : public std::string {
 public:
-  SampleLocation(bool global, const char* file, int line) : std::string(std::string(file) + ":" + std::to_string(line))
+  SampleLocation(bool global, const char* file, const char* tag) : std::string(std::string(file) + ":" + std::string(tag))
   {
     if (not global)
       this->append(":" + std::to_string(simgrid::s4u::this_actor::get_pid()));
@@ -309,9 +294,8 @@ public:
 
 bool LocalData::need_more_benchs() const
 {
-  bool res = (count < iters) || (threshold > 0.0 && (count < 2 ||          // not enough data
-                                                     relstderr > threshold // stderr too high yet
-                                                     ));
+  bool res = (count < iters) && (threshold < 0.0 || count < 2 ||          // not enough data
+                                                  relstderr >= threshold); // stderr too high yet
   XBT_DEBUG("%s (count:%d iter:%d stderr:%f thres:%f mean:%fs)",
             (res ? "need more data" : "enough benchs"), count, iters, relstderr, threshold, mean);
   return res;
@@ -320,9 +304,9 @@ bool LocalData::need_more_benchs() const
 std::unordered_map<SampleLocation, LocalData, std::hash<std::string>> samples;
 }
 
-void smpi_sample_1(int global, const char *file, int line, int iters, double threshold)
+void smpi_sample_1(int global, const char *file, const char *tag, int iters, double threshold)
 {
-  SampleLocation loc(global, file, line);
+  SampleLocation loc(global, file, tag);
   if (not smpi_process()->sampling()) { /* Only at first call when benchmarking, skip for next ones */
     smpi_bench_end();     /* Take time from previous, unrelated computation into account */
     smpi_process()->set_sampling(1);
@@ -359,9 +343,9 @@ void smpi_sample_1(int global, const char *file, int line, int iters, double thr
   }
 }
 
-int smpi_sample_2(int global, const char *file, int line, int iter_count)
+int smpi_sample_2(int global, const char *file,const char *tag, int iter_count)
 {
-  SampleLocation loc(global, file, line);
+  SampleLocation loc(global, file, tag);
 
   XBT_DEBUG("sample2 %s %d", loc.c_str(), iter_count);
   auto sample = samples.find(loc);
@@ -378,7 +362,7 @@ int smpi_sample_2(int global, const char *file, int line, int iter_count)
     // Enough data, no more bench (either we got enough data from previous visits to this benched nest, or we just
     //ran one bench and need to bail out now that our job is done). Just sleep instead
     if (not data.need_more_benchs()){
-      XBT_DEBUG("No benchmark (either no need, or just ran one): count >= iter (%d >= %d) or stderr<thres (%f<=%f). "
+      XBT_DEBUG("No benchmark (either no need, or just ran one): count (%d) >= iter (%d) (or <2) or stderr (%f) < thres (%f), or thresh is negative and ignored. "
               "Mean is %f, will be injected %d times",
               data.count, data.iters, data.relstderr, data.threshold, data.mean, iter_count);
               
@@ -395,9 +379,9 @@ int smpi_sample_2(int global, const char *file, int line, int iter_count)
   return 1;
 }
 
-void smpi_sample_3(int global, const char *file, int line)
+void smpi_sample_3(int global, const char *file, const char* tag)
 {
-  SampleLocation loc(global, file, line);
+  SampleLocation loc(global, file, tag);
 
   XBT_DEBUG("sample3 %s", loc.c_str());
   auto sample = samples.find(loc);
@@ -427,9 +411,9 @@ void smpi_sample_3(int global, const char *file, int line)
   data.benching = false;
 }
 
-int smpi_sample_exit(int global, const char *file, int line, int iter_count){
+int smpi_sample_exit(int global, const char *file, const char* tag, int iter_count){
   if (smpi_process()->sampling()){
-    SampleLocation loc(global, file, line);
+    SampleLocation loc(global, file, tag);
 
     XBT_DEBUG("sample exit %s", loc.c_str());
     auto sample = samples.find(loc);
index bab79ce..2c9cd03 100644 (file)
@@ -30,7 +30,6 @@ constexpr bool HAVE_WORKING_MMAP = false;
 constexpr bool HAVE_WORKING_MMAP = true;
 #endif
 
-bool _smpi_options_initialized=false;
 SharedMallocType _smpi_cfg_shared_malloc = SharedMallocType::GLOBAL;
 SmpiPrivStrategies _smpi_cfg_privatization = SmpiPrivStrategies::NONE;
 double _smpi_cfg_host_speed;
@@ -109,7 +108,13 @@ simgrid::config::Flag<std::string> _smpi_cfg_comp_adjustment_file{"smpi/comp-adj
         }
       }
     }};
-    
+
+simgrid::config::Flag<bool> _smpi_cfg_default_errhandler_is_error{
+  "smpi/errors-are-fatal", "Whether MPI errors are fatal or just return. Default is true", true };
+simgrid::config::Flag<bool> _smpi_cfg_pedantic{
+  "smpi/pedantic", "Activate extra checks that may crash slightly incorrect codes which would not crash on actual implementations", true };
+simgrid::config::Flag<double> _smpi_init_sleep(
+  "smpi/init", "Time to inject inside a call to MPI_Init", 0.0);
 #if HAVE_PAPI
   simgrid::config::Flag<std::string> _smpi_cfg_papi_events_file{"smpi/papi-events",
                                                                 "This switch enables tracking the specified counters with PAPI", ""};
@@ -187,9 +192,22 @@ double smpi_cfg_auto_shared_malloc_thresh(){
   return _smpi_cfg_auto_shared_malloc_thresh;
 }
 
-void smpi_init_options(){
+// public version declared in smpi.h (without parameter, and with C linkage)
+void smpi_init_options()
+{
+  smpi_init_options_internal(false);
+}
+
+void smpi_init_options_internal(bool called_by_smpi_main)
+{
+  static bool smpi_options_initialized = false;
+  static bool running_with_smpi_main   = false;
+
+  if (called_by_smpi_main)
+    running_with_smpi_main = true;
+
   // return if already called
-  if(_smpi_options_initialized)
+  if (smpi_options_initialized)
     return;
   simgrid::config::declare_flag<bool>("smpi/display-timing", "Whether we should display the timing after simulation.", false);
   simgrid::config::declare_flag<bool>("smpi/keep-temps", "Whether we should keep the generated temporary files.", false);
@@ -212,30 +230,29 @@ void smpi_init_options(){
   if (default_privatization == nullptr)
     default_privatization = "no";
 
-
-  simgrid::config::declare_flag<std::string>( "smpi/privatization", 
-    "How we should privatize global variable at runtime (no, yes, mmap, dlopen).",
-    default_privatization, [](const std::string& smpi_privatize_option){
-      if (smpi_privatize_option == "no" || smpi_privatize_option == "0")
-        _smpi_cfg_privatization = SmpiPrivStrategies::NONE;
-      else if (smpi_privatize_option == "yes" || smpi_privatize_option == "1")
-        _smpi_cfg_privatization = SmpiPrivStrategies::DEFAULT;
-      else if (smpi_privatize_option == "mmap")
-        _smpi_cfg_privatization = SmpiPrivStrategies::MMAP;
-      else if (smpi_privatize_option == "dlopen")
-        _smpi_cfg_privatization = SmpiPrivStrategies::DLOPEN;
-      else
-        xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option.c_str());
-        
-      if (not SMPI_switch_data_segment) {
-        XBT_DEBUG("Running without smpi_main(); disable smpi/privatization.");
-        _smpi_cfg_privatization = SmpiPrivStrategies::NONE;
-      }
-      if (not HAVE_WORKING_MMAP && _smpi_cfg_privatization == SmpiPrivStrategies::MMAP) {
-        XBT_INFO("mmap privatization is broken on this platform, switching to dlopen privatization instead.");
-        _smpi_cfg_privatization = SmpiPrivStrategies::DLOPEN;
-      }
-    });
+  simgrid::config::declare_flag<std::string>(
+      "smpi/privatization", "How we should privatize global variable at runtime (no, yes, mmap, dlopen).",
+      default_privatization, [](const std::string& smpi_privatize_option) {
+        if (smpi_privatize_option == "no" || smpi_privatize_option == "0")
+          _smpi_cfg_privatization = SmpiPrivStrategies::NONE;
+        else if (smpi_privatize_option == "yes" || smpi_privatize_option == "1")
+          _smpi_cfg_privatization = SmpiPrivStrategies::DEFAULT;
+        else if (smpi_privatize_option == "mmap")
+          _smpi_cfg_privatization = SmpiPrivStrategies::MMAP;
+        else if (smpi_privatize_option == "dlopen")
+          _smpi_cfg_privatization = SmpiPrivStrategies::DLOPEN;
+        else
+          xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option.c_str());
+
+        if (not running_with_smpi_main) {
+          XBT_DEBUG("Running without smpi_main(); disable smpi/privatization.");
+          _smpi_cfg_privatization = SmpiPrivStrategies::NONE;
+        }
+        if (not HAVE_WORKING_MMAP && _smpi_cfg_privatization == SmpiPrivStrategies::MMAP) {
+          XBT_INFO("mmap privatization is broken on this platform, switching to dlopen privatization instead.");
+          _smpi_cfg_privatization = SmpiPrivStrategies::DLOPEN;
+        }
+      });
 
   simgrid::config::declare_flag<std::string>("smpi/privatize-libs", 
                                             "Add libraries (; separated) to privatize (libgfortran for example)."
@@ -254,7 +271,10 @@ void smpi_init_options(){
       "smpi/ois", "Small messages timings (MPI_Isend minimum time for small messages)", "0:0:0:0:0");
   simgrid::config::declare_flag<std::string>(
       "smpi/or", "Small messages timings (MPI_Recv minimum time for small messages)", "0:0:0:0:0");
-  _smpi_options_initialized=true;
+
+  simgrid::config::declare_flag<bool>("smpi/finalization-barrier", "Do we add a barrier in MPI_Finalize or not", false);
+
+  smpi_options_initialized = true;
 }
 
 void smpi_check_options()
index 09addeb..a9d4450 100644 (file)
@@ -10,7 +10,7 @@
 #include "smpi_comm.hpp"
 #include <map>
 
-XBT_LOG_EXTERNAL_CATEGORY(smpi);
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi);
 
 namespace simgrid {
 namespace smpi {
@@ -20,14 +20,10 @@ static int universe_size = 0;
 
 class Instance {
 public:
-  Instance(int max_no_processes, MPI_Comm comm) : size_(max_no_processes), comm_world_(comm)
+  explicit Instance(int max_no_processes) : size_(max_no_processes)
   {
     auto* group = new simgrid::smpi::Group(size_);
     comm_world_ = new simgrid::smpi::Comm(group, nullptr, false, -1);
-    //  FIXME : using MPI_Attr_put with MPI_UNIVERSE_SIZE is forbidden and we make it a no-op (which triggers a warning
-    //  as MPI_ERR_ARG is returned). Directly calling Comm::attr_put breaks for now, as MPI_UNIVERSE_SIZE,is <0
-    //  instance.comm_world->attr_put<simgrid::smpi::Comm>(MPI_UNIVERSE_SIZE, reinterpret_cast<void*>(instance.size));
-
     universe_size += max_no_processes;
   }
 
@@ -58,7 +54,7 @@ void SMPI_app_instance_register(const char *name, xbt_main_func_t code, int num_
   if (code != nullptr) // When started with smpirun, we will not execute a function
     simgrid::s4u::Engine::get_instance()->register_function(name, code);
 
-  Instance instance(num_processes, MPI_COMM_NULL);
+  Instance instance(num_processes);
 
   smpi_instances.insert(std::pair<std::string, Instance>(name, instance));
 }
@@ -92,7 +88,7 @@ MPI_Comm* smpi_deployment_comm_world(const std::string& instance_id)
 
 void smpi_deployment_cleanup_instances(){
   for (auto const& item : smpi_instances) {
-    XBT_CINFO(smpi, "Stalling SMPI instance: %s. Do all your MPI ranks call MPI_Finalize()?", item.first.c_str());
+    XBT_INFO("Stalling SMPI instance: %s. Do all your MPI ranks call MPI_Finalize()?", item.first.c_str());
     Instance instance = item.second;
     simgrid::smpi::Comm::destroy(instance.comm_world_);
   }
@@ -103,3 +99,94 @@ int smpi_get_universe_size()
 {
   return simgrid::smpi::app::universe_size;
 }
+
+/** @brief Auxiliary method to get list of hosts to deploy app */
+static std::vector<simgrid::s4u::Host*> smpi_get_hosts(const simgrid::s4u::Engine* e, const std::string& hostfile)
+{
+  if (hostfile == "") {
+    return e->get_all_hosts();
+  }
+  std::vector<simgrid::s4u::Host*> hosts;
+  std::ifstream in(hostfile.c_str());
+  xbt_assert(in, "smpirun: Cannot open the host file: %s", hostfile.c_str());
+  std::string str;
+  while (std::getline(in, str)) {
+    if (not str.empty())
+      hosts.emplace_back(e->host_by_name(str));
+  }
+  xbt_assert(not hosts.empty(), "smpirun: the hostfile '%s' is empty", hostfile.c_str());
+  return hosts;
+}
+
+/** @brief Read replay configuration from file */
+static std::vector<std::string> smpi_read_replay(const std::string& replayfile)
+{
+  std::vector<std::string> replay;
+  if (replayfile == "")
+    return replay;
+
+  std::ifstream in(replayfile.c_str());
+  xbt_assert(in, "smpirun: Cannot open the replay file: %s", replayfile.c_str());
+  std::string str;
+  while (std::getline(in, str)) {
+    if (not str.empty())
+      replay.emplace_back(str);
+  }
+
+  return replay;
+}
+
+/** @brief Build argument vector to pass to process */
+static std::vector<std::string> smpi_deployment_get_args(int rank_id, const std::vector<std::string>& replay,
+                                                         const std::vector<const char*>& run_args)
+{
+  std::vector<std::string> args{std::to_string(rank_id)};
+  // pass arguments to process only if not a replay execution
+  if (replay.empty())
+    args.insert(args.end(), begin(run_args), end(run_args));
+  /* one trace per process */
+  if (replay.size() > 1)
+    args.emplace_back(replay[rank_id]);
+  return args;
+}
+
+/**
+ * @brief Deploy an SMPI application from a smpirun call
+ *
+ * This used to be done at smpirun script, parsing either the hostfile or the platform XML.
+ * If hostfile isn't provided, get the list of hosts from engine.
+ */
+int smpi_deployment_smpirun(const simgrid::s4u::Engine* e, const std::string& hostfile, int np,
+                            const std::string& replayfile, int map, const std::vector<const char*>& run_args)
+{
+  auto hosts     = smpi_get_hosts(e, hostfile);
+  auto replay    = smpi_read_replay(replayfile);
+  int hosts_size = static_cast<int>(hosts.size());
+  if (np == 0)
+    np = hosts_size;
+
+  xbt_assert(np > 0, "Invalid number of process (np must be > 0). Check your np parameter, platform or hostfile");
+
+  if (np > hosts_size) {
+    XBT_INFO("You requested to use %d ranks, but there is only %d processes in your hostfile...", np, hosts_size);
+  }
+
+  for (int i = 0; i < np; i++) {
+    simgrid::s4u::Host* host = hosts[i % hosts_size];
+    std::string rank_id      = std::to_string(i);
+    auto args                = smpi_deployment_get_args(i, replay, run_args);
+    auto actor               = simgrid::s4u::Actor::create(rank_id, host, rank_id, args);
+    /* keeping the same behavior as done in smpirun script, print mapping rank/process */
+    if (map != 0) {
+      XBT_INFO("[rank %d] -> %s", i, host->get_cname());
+    }
+    actor->set_property("instance_id", "smpirun");
+    actor->set_property("rank", rank_id);
+    if (not replay.empty())
+      actor->set_property("smpi_replay", "true");
+    /* shared trace file, set it to rank 0 */
+    if (i == 0 && replay.size() == 1)
+      actor->set_property("tracefile", replay[0]);
+  }
+  return np;
+}
index ba06a81..ba896e8 100644 (file)
@@ -77,8 +77,19 @@ static std::vector<std::string> privatize_libs_paths;
 // No instance gets manually created; check also the smpirun.in script as
 // this default name is used there as well (when the <actor> tag is generated).
 static const std::string smpi_default_instance_name("smpirun");
-static simgrid::config::Flag<double> smpi_init_sleep(
-  "smpi/init", "Time to inject inside a call to MPI_Init", 0.0);
+
+static simgrid::config::Flag<std::string>
+    smpi_hostfile("smpi/hostfile",
+                  "Classical MPI hostfile containing list of machines to dispatch "
+                  "the processes, one per line",
+                  "");
+
+static simgrid::config::Flag<std::string> smpi_replay("smpi/replay",
+                                                      "Replay a trace instead of executing the application", "");
+
+static simgrid::config::Flag<int> smpi_np("smpi/np", "Number of processes to be created", 0);
+
+static simgrid::config::Flag<int> smpi_map("smpi/map", "Display the mapping between nodes and processes", 0);
 
 void (*smpi_comm_copy_data_callback)(simgrid::kernel::activity::CommImpl*, void*,
                                      size_t) = &smpi_comm_copy_buffer_callback;
@@ -184,21 +195,15 @@ void smpi_comm_copy_buffer_callback(simgrid::kernel::activity::CommImpl* comm, v
   auto private_blocks = merge_private_blocks(src_private_blocks, dst_private_blocks);
   check_blocks(private_blocks, buff_size);
   void* tmpbuff=buff;
-  if ((smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) &&
-      (static_cast<char*>(buff) >= smpi_data_exe_start) &&
-      (static_cast<char*>(buff) < smpi_data_exe_start + smpi_data_exe_size)) {
+  if (smpi_switch_data_segment(comm->src_actor_->get_iface(), buff)) {
     XBT_DEBUG("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !");
-    smpi_switch_data_segment(comm->src_actor_->get_iface());
     tmpbuff = xbt_malloc(buff_size);
     memcpy_private(tmpbuff, buff, private_blocks);
   }
 
-  if ((smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) &&
-      ((char*)comm->dst_buff_ >= smpi_data_exe_start) &&
-      ((char*)comm->dst_buff_ < smpi_data_exe_start + smpi_data_exe_size)) {
+  if (smpi_switch_data_segment(comm->dst_actor_->get_iface(), comm->dst_buff_))
     XBT_DEBUG("Privatization : We are copying to a zone inside global memory - Switch data segment");
-    smpi_switch_data_segment(comm->dst_actor_->get_iface());
-  }
+
   XBT_DEBUG("Copying %zu bytes from %p to %p", buff_size, tmpbuff, comm->dst_buff_);
   memcpy_private(comm->dst_buff_, tmpbuff, private_blocks);
 
@@ -223,57 +228,61 @@ static void smpi_init_papi()
   // the configuration as given by the user (counter data as a pair of (counter_name, counter_counter))
   // and the (computed) event_set.
 
-  if (not smpi_cfg_papi_events_file().empty()) {
-    if (PAPI_library_init(PAPI_VER_CURRENT) != PAPI_VER_CURRENT)
-      XBT_ERROR("Could not initialize PAPI library; is it correctly installed and linked?"
-                " Expected version is %u", PAPI_VER_CURRENT);
-
-    using Tokenizer = boost::tokenizer<boost::char_separator<char>>;
-    boost::char_separator<char> separator_units(";");
-    std::string str = smpi_cfg_papi_events_file();
-    Tokenizer tokens(str, separator_units);
-
-    // Iterate over all the computational units. This could be processes, hosts, threads, ranks... You name it.
-    // I'm not exactly sure what we will support eventually, so I'll leave it at the general term "units".
-    for (auto const& unit_it : tokens) {
-      boost::char_separator<char> separator_events(":");
-      Tokenizer event_tokens(unit_it, separator_events);
-
-      int event_set = PAPI_NULL;
-      if (PAPI_create_eventset(&event_set) != PAPI_OK) {
-        // TODO: Should this let the whole simulation die?
-        XBT_CRITICAL("Could not create PAPI event set during init.");
-      }
+  if (smpi_cfg_papi_events_file().empty())
+    return;
 
-      // NOTE: We cannot use a map here, as we must obey the order of the counters
-      // This is important for PAPI: We need to map the values of counters back to the event_names (so, when PAPI_read()
-      // has finished)!
-      papi_counter_t counters2values;
-
-      // Iterate over all counters that were specified for this specific unit.
-      // Note that we need to remove the name of the unit (that could also be the "default" value), which always comes
-      // first. Hence, we start at ++(events.begin())!
-      for (Tokenizer::iterator events_it = ++(event_tokens.begin()); events_it != event_tokens.end(); ++events_it) {
-        int event_code   = PAPI_NULL;
-        auto* event_name = const_cast<char*>((*events_it).c_str());
-        if (PAPI_event_name_to_code(event_name, &event_code) != PAPI_OK) {
-          XBT_CRITICAL("Could not find PAPI event '%s'. Skipping.", event_name);
-          continue;
-        }
-        if (PAPI_add_event(event_set, event_code) != PAPI_OK) {
-          XBT_ERROR("Could not add PAPI event '%s'. Skipping.", event_name);
-          continue;
-        }
-        XBT_DEBUG("Successfully added PAPI event '%s' to the event set.", event_name);
+  if (PAPI_library_init(PAPI_VER_CURRENT) != PAPI_VER_CURRENT) {
+    XBT_ERROR("Could not initialize PAPI library; is it correctly installed and linked? Expected version is %u",
+              PAPI_VER_CURRENT);
+    return;
+  }
 
-        counters2values.emplace_back(*events_it, 0LL);
-      }
+  using Tokenizer = boost::tokenizer<boost::char_separator<char>>;
+  boost::char_separator<char> separator_units(";");
+  std::string str = smpi_cfg_papi_events_file();
+  Tokenizer tokens(str, separator_units);
+
+  // Iterate over all the computational units. This could be processes, hosts, threads, ranks... You name it.
+  // I'm not exactly sure what we will support eventually, so I'll leave it at the general term "units".
+  for (auto const& unit_it : tokens) {
+    boost::char_separator<char> separator_events(":");
+    Tokenizer event_tokens(unit_it, separator_events);
+
+    int event_set = PAPI_NULL;
+    if (PAPI_create_eventset(&event_set) != PAPI_OK) {
+      // TODO: Should this let the whole simulation die?
+      XBT_CRITICAL("Could not create PAPI event set during init.");
+      break;
+    }
 
-      std::string unit_name    = *(event_tokens.begin());
-      papi_process_data config = {.counter_data = std::move(counters2values), .event_set = event_set};
+    // NOTE: We cannot use a map here, as we must obey the order of the counters
+    // This is important for PAPI: We need to map the values of counters back to the event_names (so, when PAPI_read()
+    // has finished)!
+    papi_counter_t counters2values;
+
+    // Iterate over all counters that were specified for this specific unit.
+    // Note that we need to remove the name of the unit (that could also be the "default" value), which always comes
+    // first. Hence, we start at ++(events.begin())!
+    for (Tokenizer::iterator events_it = ++(event_tokens.begin()); events_it != event_tokens.end(); ++events_it) {
+      int event_code   = PAPI_NULL;
+      auto* event_name = const_cast<char*>((*events_it).c_str());
+      if (PAPI_event_name_to_code(event_name, &event_code) != PAPI_OK) {
+        XBT_CRITICAL("Could not find PAPI event '%s'. Skipping.", event_name);
+        continue;
+      }
+      if (PAPI_add_event(event_set, event_code) != PAPI_OK) {
+        XBT_ERROR("Could not add PAPI event '%s'. Skipping.", event_name);
+        continue;
+      }
+      XBT_DEBUG("Successfully added PAPI event '%s' to the event set.", event_name);
 
-      units2papi_setup.insert(std::make_pair(unit_name, std::move(config)));
+      counters2values.emplace_back(*events_it, 0LL);
     }
+
+    std::string unit_name    = *(event_tokens.begin());
+    papi_process_data config = {.counter_data = std::move(counters2values), .event_set = event_set};
+
+    units2papi_setup.insert(std::make_pair(unit_name, std::move(config)));
   }
 #endif
 }
@@ -283,7 +292,8 @@ using smpi_c_entry_point_type       = int (*)(int argc, char** argv);
 using smpi_fortran_entry_point_type = void (*)();
 
 template <typename F>
-static int smpi_run_entry_point(const F& entry_point, const std::string& executable_path, std::vector<std::string> args)
+static int smpi_run_entry_point(const F& entry_point, const std::string& executable_path,
+                                const std::vector<std::string>& args)
 {
   // copy C strings, we need them writable
   auto* args4argv = new std::vector<char*>(args.size());
@@ -297,7 +307,7 @@ static int smpi_run_entry_point(const F& entry_point, const std::string& executa
   // take a copy of args4argv to keep reference of the allocated strings
   const std::vector<char*> args2str(*args4argv);
 #endif
-  int argc = args4argv->size();
+  int argc = static_cast<int>(args4argv->size());
   args4argv->push_back(nullptr);
   char** argv = args4argv->data();
 
@@ -373,17 +383,17 @@ static void smpi_copy_file(const std::string& src, const std::string& target, of
   while (ssize_t got = read(fdin, buf.data(), buf.size())) {
     if (got == -1) {
       xbt_assert(errno == EINTR, "Cannot read from %s", src.c_str());
-    } else {
-      const unsigned char* p = buf.data();
-      ssize_t todo           = got;
-      while (ssize_t done = write(fdout, p, todo)) {
-        if (done == -1) {
-          xbt_assert(errno == EINTR, "Cannot write into %s", target.c_str());
-        } else {
-          p += done;
-          todo -= done;
-        }
+      continue;
+    }
+    const unsigned char* p = buf.data();
+    ssize_t todo           = got;
+    while (ssize_t done = write(fdout, p, todo)) {
+      if (done == -1) {
+        xbt_assert(errno == EINTR, "Cannot write into %s", target.c_str());
+        continue;
       }
+      p += done;
+      todo -= done;
     }
   }
   close(fdin);
@@ -436,7 +446,7 @@ static void smpi_init_privatization_dlopen(const std::string& executable)
   }
 
   simgrid::s4u::Engine::get_instance()->register_default([executable, fdin_size](std::vector<std::string> args) {
-    return std::function<void()>([executable, fdin_size, args] {
+    return simgrid::kernel::actor::ActorCode([executable, fdin_size, args = std::move(args)] {
       static std::size_t rank = 0;
       // Copy the dynamic library:
       simgrid::xbt::Path path(executable);
@@ -461,7 +471,7 @@ static void smpi_init_privatization_dlopen(const std::string& executable)
 
           // Copy the dynamic library, the new name must be the same length as the old one
           // just replace the name with 7 digits for the rank and the rest of the name.
-          auto pad                   = std::min<unsigned>(7, libname.length());
+          auto pad                   = std::min<size_t>(7, libname.length());
           std::string target_libname = std::string(pad - std::to_string(rank).length(), '0') + std::to_string(rank) + libname.substr(pad);
           std::string target_lib = simgrid::config::get_value<std::string>("smpi/tmpdir") + "/" + target_libname;
           target_libs.push_back(target_lib);
@@ -512,8 +522,16 @@ static void smpi_init_privatization_no_dlopen(const std::string& executable)
 
   // Execute the same entry point for each simulated process:
   simgrid::s4u::Engine::get_instance()->register_default([entry_point, executable](std::vector<std::string> args) {
-    return std::function<void()>(
-        [entry_point, executable, args] { smpi_run_entry_point(entry_point, executable, args); });
+    return simgrid::kernel::actor::ActorCode([entry_point, executable, args = std::move(args)] {
+      if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
+        simgrid::smpi::ActorExt* ext = smpi_process();
+        /* Now using the segment index of this process  */
+        ext->set_privatized_region(smpi_init_global_memory_segment_process());
+        /* Done at the process's creation */
+        smpi_switch_data_segment(simgrid::s4u::Actor::self());
+      }
+      smpi_run_entry_point(entry_point, executable, args);
+    });
   });
 }
 
@@ -524,9 +542,8 @@ int smpi_main(const char* executable, int argc, char* argv[])
      * configuration tools */
     return 0;
   }
-  
-  SMPI_switch_data_segment = &smpi_switch_data_segment;
-  smpi_init_options();
+
+  smpi_init_options_internal(true);
   simgrid::instr::init();
   SIMIX_global_init(&argc, argv);
 
@@ -535,7 +552,7 @@ int smpi_main(const char* executable, int argc, char* argv[])
   sg_storage_file_system_init();
   // parse the platform file: get the host list
   engine->load_platform(argv[1]);
-  simgrid::kernel::activity::CommImpl::set_copy_data_callback(smpi_comm_copy_buffer_callback);
+  engine->set_default_comm_data_copy_callback(smpi_comm_copy_buffer_callback);
 
   if (smpi_cfg_privatization() == SmpiPrivStrategies::DLOPEN)
     smpi_init_privatization_dlopen(executable);
@@ -547,13 +564,9 @@ int smpi_main(const char* executable, int argc, char* argv[])
   
   SMPI_init();
 
-  /* This is a ... heavy way to count the MPI ranks */
-  int rank_counts = 0;
-  simgrid::s4u::Actor::on_creation.connect([&rank_counts](const simgrid::s4u::Actor& actor) {
-    if (not actor.is_daemon())
-      rank_counts++;
-  });
-  engine->load_deployment(argv[2]);
+  const std::vector<const char*> args(argv + 2, argv + argc);
+  int rank_counts =
+      smpi_deployment_smpirun(engine, smpi_hostfile.get(), smpi_np.get(), smpi_replay.get(), smpi_map.get(), args);
 
   SMPI_app_instance_register(smpi_default_instance_name.c_str(), nullptr, rank_counts);
   MPI_COMM_WORLD = *smpi_deployment_comm_world(smpi_default_instance_name);
@@ -577,7 +590,7 @@ int smpi_main(const char* executable, int argc, char* argv[])
 
 // Called either directly from the user code, or from the code called by smpirun
 void SMPI_init(){
-  smpi_init_options();
+  smpi_init_options_internal(false);
   simgrid::s4u::Actor::on_creation.connect([](simgrid::s4u::Actor& actor) {
     if (not actor.is_daemon())
       actor.extension_set<simgrid::smpi::ActorExt>(new simgrid::smpi::ActorExt(&actor));
@@ -618,8 +631,8 @@ void SMPI_finalize()
 
 void smpi_mpi_init() {
   smpi_init_fortran_types();
-  if(smpi_init_sleep > 0)
-    simgrid::s4u::this_actor::sleep_for(smpi_init_sleep);
+  if(_smpi_init_sleep > 0)
+    simgrid::s4u::this_actor::sleep_for(_smpi_init_sleep);
 }
 
 void SMPI_thread_create() {
index 991377a..40bd1e4 100644 (file)
@@ -175,16 +175,25 @@ void* smpi_temp_shm_mmap(int fd, size_t size)
 /** Map a given SMPI privatization segment (make an SMPI process active)
  *
  *  When doing a state restoration, the state of the restored variables  might not be consistent with the state of the
- *  virtual memory. In this case, we to change the data segment.
+ *  virtual memory. In this case, we have to change the data segment.
+ *
+ *  If 'addr' is not null, only switch if it's an address from the data segment.
+ *
+ *  Returns 'true' if the segment has to be switched (mmap privatization and 'addr' in data segment).
  */
-void smpi_switch_data_segment(simgrid::s4u::ActorPtr actor)
+bool smpi_switch_data_segment(simgrid::s4u::ActorPtr actor, const void* addr)
 {
+  if (smpi_cfg_privatization() != SmpiPrivStrategies::MMAP || smpi_data_exe_size == 0)
+    return false; // no need to switch
+
+  if (addr != nullptr &&
+      not(static_cast<const char*>(addr) >= smpi_data_exe_start &&
+          static_cast<const char*>(addr) < smpi_data_exe_start + smpi_data_exe_size))
+    return false; // no need to switch, addr is not concerned
+
   static aid_t smpi_loaded_page = -1;
   if (smpi_loaded_page == actor->get_pid()) // no need to switch, we've already loaded the one we want
-    return;
-
-  if (smpi_data_exe_size == 0) // no need to switch
-    return;
+    return true;                            // return 'true' anyway
 
 #if HAVE_PRIVATIZATION
   // FIXME, cross-process support (mmap across process when necessary)
@@ -196,6 +205,8 @@ void smpi_switch_data_segment(simgrid::s4u::ActorPtr actor)
              "Couldn't map the new region (errno %d): %s", errno, strerror(errno));
   smpi_loaded_page = actor->get_pid();
 #endif
+
+  return true;
 }
 
 /**
index 1c64f67..e3d19a0 100644 (file)
@@ -8,6 +8,8 @@
 #include "smpi_datatype.hpp"
 #include "smpi_group.hpp"
 #include "smpi_request.hpp"
+#include "smpi_config.hpp"
+#include "simgrid/s4u/Exec.hpp"
 #include "xbt/replay.hpp"
 #include <simgrid/smpi/smpi_replay.hpp>
 #include <src/smpi/include/private.hpp>
@@ -21,7 +23,6 @@
 #include <vector>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_replay, smpi, "Trace Replay with SMPI");
-
 // From https://stackoverflow.com/questions/7110301/generic-hash-for-tuples-in-unordered-map-unordered-set
 // This is all just to make std::unordered_map work with std::tuple. If we need this in other places,
 // this could go into a header file.
@@ -70,10 +71,29 @@ void log_timed_action(const simgrid::xbt::ReplayAction& action, double clock)
   }
 }
 
-/* Helper function */
+/* Helper functions */
 static double parse_double(const std::string& string)
 {
-  return xbt_str_parse_double(string.c_str(), "%s is not a double");
+  return xbt_str_parse_double(string.c_str(), "not a double");
+}
+
+template <typename T> static T parse_integer(const std::string& string)
+{
+  double val = trunc(xbt_str_parse_double(string.c_str(), "not a double"));
+  xbt_assert(static_cast<double>(std::numeric_limits<T>::min()) <= val &&
+                 val <= static_cast<double>(std::numeric_limits<T>::max()),
+             "out of range: %g", val);
+  return static_cast<T>(val);
+}
+
+static int parse_root(const simgrid::xbt::ReplayAction& action, unsigned i)
+{
+  return i < action.size() ? std::stoi(action[i]) : 0;
+}
+
+static MPI_Datatype parse_datatype(const simgrid::xbt::ReplayAction& action, unsigned i)
+{
+  return i < action.size() ? simgrid::smpi::Datatype::decode(action[i]) : simgrid::smpi::replay::MPI_DEFAULT_TYPE;
 }
 
 namespace simgrid {
@@ -147,9 +167,8 @@ void SendRecvParser::parse(simgrid::xbt::ReplayAction& action, const std::string
   CHECK_ACTION_PARAMS(action, 3, 1)
   partner = std::stoi(action[2]);
   tag     = std::stoi(action[3]);
-  size    = parse_double(action[4]);
-  if (action.size() > 5)
-    datatype1 = simgrid::smpi::Datatype::decode(action[5]);
+  size      = parse_integer<size_t>(action[4]);
+  datatype1 = parse_datatype(action, 5);
 }
 
 void ComputeParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
@@ -174,46 +193,36 @@ void LocationParser::parse(simgrid::xbt::ReplayAction& action, const std::string
 void BcastArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
 {
   CHECK_ACTION_PARAMS(action, 1, 2)
-  size = parse_double(action[2]);
-  root = (action.size() > 3) ? std::stoi(action[3]) : 0;
-  if (action.size() > 4)
-    datatype1 = simgrid::smpi::Datatype::decode(action[4]);
+  size      = parse_integer<size_t>(action[2]);
+  root      = parse_root(action, 3);
+  datatype1 = parse_datatype(action, 4);
 }
 
 void ReduceArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
 {
   CHECK_ACTION_PARAMS(action, 2, 2)
-  double arg2 = trunc(parse_double(action[2]));
-  xbt_assert(0.0 <= arg2 && arg2 <= static_cast<double>(std::numeric_limits<unsigned>::max()));
-  comm_size = static_cast<unsigned>(arg2);
+  comm_size = parse_integer<unsigned>(action[2]);
   comp_size = parse_double(action[3]);
-  root      = (action.size() > 4) ? std::stoi(action[4]) : 0;
-  if (action.size() > 5)
-    datatype1 = simgrid::smpi::Datatype::decode(action[5]);
+  root      = parse_root(action, 4);
+  datatype1 = parse_datatype(action, 5);
 }
 
 void AllReduceArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
 {
   CHECK_ACTION_PARAMS(action, 2, 1)
-  double arg2 = trunc(parse_double(action[2]));
-  xbt_assert(0.0 <= arg2 && arg2 <= static_cast<double>(std::numeric_limits<unsigned>::max()));
-  comm_size = static_cast<unsigned>(arg2);
+  comm_size = parse_integer<unsigned>(action[2]);
   comp_size = parse_double(action[3]);
-  if (action.size() > 4)
-    datatype1 = simgrid::smpi::Datatype::decode(action[4]);
+  datatype1 = parse_datatype(action, 4);
 }
 
 void AllToAllArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
 {
   CHECK_ACTION_PARAMS(action, 2, 1)
   comm_size = MPI_COMM_WORLD->size();
-  send_size = parse_double(action[2]);
-  recv_size = parse_double(action[3]);
-
-  if (action.size() > 4)
-    datatype1 = simgrid::smpi::Datatype::decode(action[4]);
-  if (action.size() > 5)
-    datatype2 = simgrid::smpi::Datatype::decode(action[5]);
+  send_size = parse_integer<int>(action[2]);
+  recv_size = parse_integer<int>(action[3]);
+  datatype1 = parse_datatype(action, 4);
+  datatype2 = parse_datatype(action, 5);
 }
 
 void GatherArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string& name)
@@ -229,20 +238,17 @@ void GatherArgParser::parse(simgrid::xbt::ReplayAction& action, const std::strin
   */
   CHECK_ACTION_PARAMS(action, 2, 3)
   comm_size = MPI_COMM_WORLD->size();
-  send_size = parse_double(action[2]);
-  recv_size = parse_double(action[3]);
+  send_size = parse_integer<int>(action[2]);
+  recv_size = parse_integer<int>(action[3]);
 
   if (name == "gather") {
-    root      = (action.size() > 4) ? std::stoi(action[4]) : 0;
-    if (action.size() > 5)
-      datatype1 = simgrid::smpi::Datatype::decode(action[5]);
-    if (action.size() > 6)
-      datatype2 = simgrid::smpi::Datatype::decode(action[6]);
+    root      = parse_root(action, 4);
+    datatype1 = parse_datatype(action, 5);
+    datatype2 = parse_datatype(action, 6);
   } else {
-    if (action.size() > 4)
-      datatype1 = simgrid::smpi::Datatype::decode(action[4]);
-    if (action.size() > 5)
-      datatype2 = simgrid::smpi::Datatype::decode(action[5]);
+    root      = 0;
+    datatype1 = parse_datatype(action, 4);
+    datatype2 = parse_datatype(action, 5);
   }
 }
 
@@ -259,37 +265,39 @@ void GatherVArgParser::parse(simgrid::xbt::ReplayAction& action, const std::stri
   */
   comm_size = MPI_COMM_WORLD->size();
   CHECK_ACTION_PARAMS(action, comm_size + 1, 2)
-  send_size  = parse_double(action[2]);
+  send_size  = parse_integer<int>(action[2]);
   disps      = std::vector<int>(comm_size, 0);
   recvcounts = std::make_shared<std::vector<int>>(comm_size);
 
   if (name == "gatherv") {
-    root = (action.size() > 3 + comm_size) ? std::stoi(action[3 + comm_size]) : 0;
-    if (action.size() > 4 + comm_size)
-      datatype1 = simgrid::smpi::Datatype::decode(action[4 + comm_size]);
-    if (action.size() > 5 + comm_size)
-      datatype2 = simgrid::smpi::Datatype::decode(action[5 + comm_size]);
+    root      = parse_root(action, 3 + comm_size);
+    datatype1 = parse_datatype(action, 4 + comm_size);
+    datatype2 = parse_datatype(action, 5 + comm_size);
   } else {
-    int disp_index     = 0;
+    root                = 0;
+    unsigned disp_index = 0;
     /* The 3 comes from "0 gather <sendcount>", which must always be present.
      * The + comm_size is the recvcounts array, which must also be present
      */
-    if (action.size() > 3 + comm_size + comm_size) { /* datatype + disp are specified */
-      int datatype_index = 3 + comm_size;
-      disp_index     = datatype_index + 1;
-      datatype1      = simgrid::smpi::Datatype::decode(action[datatype_index]);
-      datatype2      = simgrid::smpi::Datatype::decode(action[datatype_index]);
-    } else if (action.size() >
-               3 + comm_size + 2) { /* disps specified; datatype is not specified; use the default one */
+    if (action.size() > 3 + comm_size + comm_size) {
+      // datatype + disp are specified
+      datatype1  = parse_datatype(action, 3 + comm_size);
+      datatype2  = parse_datatype(action, 4 + comm_size);
+      disp_index = 5 + comm_size;
+    } else if (action.size() > 3 + comm_size + 2) {
+      // disps specified; datatype is not specified; use the default one
+      datatype1  = MPI_DEFAULT_TYPE;
+      datatype2  = MPI_DEFAULT_TYPE;
       disp_index = 3 + comm_size;
-    } else if (action.size() > 3 + comm_size) { /* only datatype, no disp specified */
-      int datatype_index = 3 + comm_size;
-      datatype1      = simgrid::smpi::Datatype::decode(action[datatype_index]);
-      datatype2      = simgrid::smpi::Datatype::decode(action[datatype_index]);
+    } else {
+      // no disp specified, maybe only datatype,
+      datatype1 = parse_datatype(action, 3 + comm_size);
+      datatype2 = parse_datatype(action, 4 + comm_size);
     }
 
     if (disp_index != 0) {
-      for (unsigned int i = 0; i < comm_size; i++)
+      xbt_assert(disp_index + comm_size <= action.size());
+      for (unsigned i = 0; i < comm_size; i++)
         disps[i]          = std::stoi(action[disp_index + i]);
     }
   }
@@ -311,15 +319,14 @@ void ScatterArgParser::parse(simgrid::xbt::ReplayAction& action, const std::stri
         4) 0 is the send datatype id, see simgrid::smpi::Datatype::decode()
         5) 0 is the recv datatype id, see simgrid::smpi::Datatype::decode()
   */
+  comm_size = MPI_COMM_WORLD->size();
   CHECK_ACTION_PARAMS(action, 2, 3)
   comm_size = MPI_COMM_WORLD->size();
-  send_size = parse_double(action[2]);
-  recv_size = parse_double(action[3]);
-  root      = (action.size() > 4) ? std::stoi(action[4]) : 0;
-  if (action.size() > 5)
-    datatype1 = simgrid::smpi::Datatype::decode(action[5]);
-  if (action.size() > 6)
-    datatype2 = simgrid::smpi::Datatype::decode(action[6]);
+  send_size = parse_integer<int>(action[2]);
+  recv_size = parse_integer<int>(action[3]);
+  root      = parse_root(action, 4);
+  datatype1 = parse_datatype(action, 5);
+  datatype2 = parse_datatype(action, 6);
 }
 
 void ScatterVArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
@@ -333,21 +340,20 @@ void ScatterVArgParser::parse(simgrid::xbt::ReplayAction& action, const std::str
       4) 0 is the send datatype id, see simgrid::smpi::Datatype::decode()
       5) 0 is the recv datatype id, see simgrid::smpi::Datatype::decode()
   */
+  comm_size = MPI_COMM_WORLD->size();
   CHECK_ACTION_PARAMS(action, comm_size + 1, 2)
-  recv_size  = parse_double(action[2 + comm_size]);
+  recv_size  = parse_integer<int>(action[2 + comm_size]);
   disps      = std::vector<int>(comm_size, 0);
   sendcounts = std::make_shared<std::vector<int>>(comm_size);
 
-  if (action.size() > 5 + comm_size)
-    datatype1 = simgrid::smpi::Datatype::decode(action[4 + comm_size]);
-  if (action.size() > 5 + comm_size)
-    datatype2 = simgrid::smpi::Datatype::decode(action[5]);
+  root      = parse_root(action, 3 + comm_size);
+  datatype1 = parse_datatype(action, 4 + comm_size);
+  datatype2 = parse_datatype(action, 5 + comm_size);
 
   for (unsigned int i = 0; i < comm_size; i++) {
     (*sendcounts)[i] = std::stoi(action[i + 2]);
   }
   send_size_sum = std::accumulate(sendcounts->begin(), sendcounts->end(), 0);
-  root          = (action.size() > 3 + comm_size) ? std::stoi(action[3 + comm_size]) : 0;
 }
 
 void ReduceScatterArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
@@ -363,15 +369,22 @@ void ReduceScatterArgParser::parse(simgrid::xbt::ReplayAction& action, const std
   CHECK_ACTION_PARAMS(action, comm_size + 1, 1)
   comp_size  = parse_double(action[2 + comm_size]);
   recvcounts = std::make_shared<std::vector<int>>(comm_size);
-  if (action.size() > 3 + comm_size)
-    datatype1 = simgrid::smpi::Datatype::decode(action[3 + comm_size]);
+  datatype1  = parse_datatype(action, 3 + comm_size);
 
   for (unsigned int i = 0; i < comm_size; i++) {
-    recvcounts->push_back(std::stoi(action[i + 2]));
+    (*recvcounts)[i]= std::stoi(action[i + 2]);
   }
   recv_size_sum = std::accumulate(recvcounts->begin(), recvcounts->end(), 0);
 }
 
+void ScanArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
+{
+  CHECK_ACTION_PARAMS(action, 2, 1)
+  size      = parse_integer<size_t>(action[2]);
+  comp_size = parse_double(action[3]);
+  datatype1 = parse_datatype(action, 4);
+}
+
 void AllToAllVArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&)
 {
   /* The structure of the alltoallv action for the rank 0 (total 4 processes) is the following:
@@ -389,13 +402,11 @@ void AllToAllVArgParser::parse(simgrid::xbt::ReplayAction& action, const std::st
   senddisps  = std::vector<int>(comm_size, 0);
   recvdisps  = std::vector<int>(comm_size, 0);
 
-  if (action.size() > 5 + 2 * comm_size)
-    datatype1 = simgrid::smpi::Datatype::decode(action[4 + 2 * comm_size]);
-  if (action.size() > 5 + 2 * comm_size)
-    datatype2 = simgrid::smpi::Datatype::decode(action[5 + 2 * comm_size]);
+  datatype1 = parse_datatype(action, 4 + 2 * comm_size);
+  datatype2 = parse_datatype(action, 5 + 2 * comm_size);
 
-  send_buf_size = parse_double(action[2]);
-  recv_buf_size = parse_double(action[3 + comm_size]);
+  send_buf_size = parse_integer<int>(action[2]);
+  recv_buf_size = parse_integer<int>(action[3 + comm_size]);
   for (unsigned int i = 0; i < comm_size; i++) {
     (*sendcounts)[i] = std::stoi(action[3 + i]);
     (*recvcounts)[i] = std::stoi(action[4 + comm_size + i]);
@@ -418,20 +429,18 @@ void WaitAction::kernel(simgrid::xbt::ReplayAction& action)
     return;
   }
 
-  aid_t rank = request->comm() != MPI_COMM_NULL ? request->comm()->rank() : -1;
-
   // Must be taken before Request::wait() since the request may be set to
   // MPI_REQUEST_NULL by Request::wait!
   bool is_wait_for_receive = (request->flags() & MPI_REQ_RECV);
-  // TODO: Here we take the rank while we normally take the process id (look for get_pid())
-  TRACE_smpi_comm_in(rank, __func__, new simgrid::instr::WaitTIData(args.src, args.dst, args.tag));
+
+  TRACE_smpi_comm_in(get_pid(), __func__, new simgrid::instr::WaitTIData(args.src, args.dst, args.tag));
 
   MPI_Status status;
   Request::wait(&request, &status);
 
-  TRACE_smpi_comm_out(rank);
+  TRACE_smpi_comm_out(get_pid());
   if (is_wait_for_receive)
-    TRACE_smpi_recv(args.src, args.dst, args.tag);
+    TRACE_smpi_recv(MPI_COMM_WORLD->group()->actor(args.src), MPI_COMM_WORLD->group()->actor(args.dst), args.tag);
 }
 
 void SendAction::kernel(simgrid::xbt::ReplayAction&)
@@ -466,8 +475,8 @@ void RecvAction::kernel(simgrid::xbt::ReplayAction&)
 
   MPI_Status status;
   // unknown size from the receiver point of view
-  double arg_size = args.size;
-  if (arg_size <= 0.0) {
+  size_t arg_size = args.size;
+  if (arg_size == 0) {
     Request::probe(args.partner, args.tag, MPI_COMM_WORLD, &status);
     arg_size = status.count;
   }
@@ -561,7 +570,7 @@ void WaitAllAction::kernel(simgrid::xbt::ReplayAction&)
   const size_t count_requests = req_storage.size();
 
   if (count_requests > 0) {
-    TRACE_smpi_comm_in(get_pid(), __func__, new simgrid::instr::Pt2PtTIData("waitall", -1, count_requests, ""));
+    TRACE_smpi_comm_in(get_pid(), __func__, new simgrid::instr::CpuTIData("waitall", count_requests));
     std::vector<std::pair</*sender*/ aid_t, /*recv*/ aid_t>> sender_receiver;
     std::vector<MPI_Request> reqs;
     req_storage.get_requests(reqs);
@@ -591,7 +600,7 @@ void BcastAction::kernel(simgrid::xbt::ReplayAction&)
 {
   const BcastArgParser& args = get_args();
   TRACE_smpi_comm_in(get_pid(), "action_bcast",
-                     new simgrid::instr::CollTIData("bcast", MPI_COMM_WORLD->group()->actor(args.root), -1.0, args.size,
+                     new simgrid::instr::CollTIData("bcast", args.root, -1.0, args.size,
                                                     0, Datatype::encode(args.datatype1), ""));
 
   colls::bcast(send_buffer(args.size * args.datatype1->size()), args.size, args.datatype1, args.root, MPI_COMM_WORLD);
@@ -603,13 +612,17 @@ void ReduceAction::kernel(simgrid::xbt::ReplayAction&)
 {
   const ReduceArgParser& args = get_args();
   TRACE_smpi_comm_in(get_pid(), "action_reduce",
-                     new simgrid::instr::CollTIData("reduce", MPI_COMM_WORLD->group()->actor(args.root), args.comp_size,
+                     new simgrid::instr::CollTIData("reduce", args.root, args.comp_size,
                                                     args.comm_size, 0, Datatype::encode(args.datatype1), ""));
 
   colls::reduce(send_buffer(args.comm_size * args.datatype1->size()),
                 recv_buffer(args.comm_size * args.datatype1->size()), args.comm_size, args.datatype1, MPI_OP_NULL,
                 args.root, MPI_COMM_WORLD);
-  private_execute_flops(args.comp_size);
+  if (args.comp_size != 0.0)
+    simgrid::s4u::this_actor::exec_init(args.comp_size)
+      ->set_name("computation")
+      ->start()
+      ->wait();
 
   TRACE_smpi_comm_out(get_pid());
 }
@@ -624,7 +637,11 @@ void AllReduceAction::kernel(simgrid::xbt::ReplayAction&)
   colls::allreduce(send_buffer(args.comm_size * args.datatype1->size()),
                    recv_buffer(args.comm_size * args.datatype1->size()), args.comm_size, args.datatype1, MPI_OP_NULL,
                    MPI_COMM_WORLD);
-  private_execute_flops(args.comp_size);
+  if (args.comp_size != 0.0)
+    simgrid::s4u::this_actor::exec_init(args.comp_size)
+      ->set_name("computation")
+      ->start()
+      ->wait();
 
   TRACE_smpi_comm_out(get_pid());
 }
@@ -637,8 +654,8 @@ void AllToAllAction::kernel(simgrid::xbt::ReplayAction&)
                                                     Datatype::encode(args.datatype1),
                                                     Datatype::encode(args.datatype2)));
 
-  colls::alltoall(send_buffer(args.send_size * args.comm_size * args.datatype1->size()), args.send_size, args.datatype1,
-                  recv_buffer(args.recv_size * args.comm_size * args.datatype2->size()), args.recv_size, args.datatype2,
+  colls::alltoall(send_buffer(args.datatype1->size() * args.send_size * args.comm_size), args.send_size, args.datatype1,
+                  recv_buffer(args.datatype2->size() * args.recv_size * args.comm_size), args.recv_size, args.datatype2,
                   MPI_COMM_WORLD);
 
   TRACE_smpi_comm_out(get_pid());
@@ -655,7 +672,7 @@ void GatherAction::kernel(simgrid::xbt::ReplayAction&)
   if (get_name() == "gather") {
     int rank = MPI_COMM_WORLD->rank();
     colls::gather(send_buffer(args.send_size * args.datatype1->size()), args.send_size, args.datatype1,
-                  (rank == args.root) ? recv_buffer(args.recv_size * args.comm_size * args.datatype2->size()) : nullptr,
+                  (rank == args.root) ? recv_buffer(args.datatype2->size() * args.recv_size * args.comm_size) : nullptr,
                   args.recv_size, args.datatype2, args.root, MPI_COMM_WORLD);
   } else
     colls::allgather(send_buffer(args.send_size * args.datatype1->size()), args.send_size, args.datatype1,
@@ -671,7 +688,7 @@ void GatherVAction::kernel(simgrid::xbt::ReplayAction&)
   const GatherVArgParser& args = get_args();
   TRACE_smpi_comm_in(get_pid(), get_name().c_str(),
                      new simgrid::instr::VarCollTIData(
-                         get_name(), (get_name() == "gatherv") ? args.root : -1, args.send_size, nullptr, 0,
+                         get_name(), (get_name() == "gatherv") ? args.root : -1, args.send_size, nullptr, -1,
                          args.recvcounts, Datatype::encode(args.datatype1), Datatype::encode(args.datatype2)));
 
   if (get_name() == "gatherv") {
@@ -708,7 +725,7 @@ void ScatterVAction::kernel(simgrid::xbt::ReplayAction&)
   int rank = MPI_COMM_WORLD->rank();
   const ScatterVArgParser& args = get_args();
   TRACE_smpi_comm_in(get_pid(), "action_scatterv",
-                     new simgrid::instr::VarCollTIData(get_name(), args.root, 0, args.sendcounts, args.recv_size,
+                     new simgrid::instr::VarCollTIData(get_name(), args.root, -1, args.sendcounts, args.recv_size,
                                                        nullptr, Datatype::encode(args.datatype1),
                                                        Datatype::encode(args.datatype2)));
 
@@ -725,15 +742,43 @@ void ReduceScatterAction::kernel(simgrid::xbt::ReplayAction&)
   const ReduceScatterArgParser& args = get_args();
   TRACE_smpi_comm_in(
       get_pid(), "action_reducescatter",
-      new simgrid::instr::VarCollTIData("reducescatter", -1, 0, nullptr, 0, args.recvcounts,
-                                        std::to_string(args.comp_size), /* ugly hack to print comp_size */
+      new simgrid::instr::VarCollTIData(get_name(), -1, -1, nullptr, -1, args.recvcounts,
+                                        /* ugly as we use datatype field to pass computation as string */
+                                        /* and because of the trick to avoid getting 0.000000 when 0 is given */
+                                        args.comp_size == 0 ? "0" : std::to_string(args.comp_size),
                                         Datatype::encode(args.datatype1)));
 
   colls::reduce_scatter(send_buffer(args.recv_size_sum * args.datatype1->size()),
                         recv_buffer(args.recv_size_sum * args.datatype1->size()), args.recvcounts->data(),
                         args.datatype1, MPI_OP_NULL, MPI_COMM_WORLD);
+  if (args.comp_size != 0.0)
+    simgrid::s4u::this_actor::exec_init(args.comp_size)
+      ->set_name("computation")
+      ->start()
+      ->wait();
+  TRACE_smpi_comm_out(get_pid());
+}
 
-  private_execute_flops(args.comp_size);
+void ScanAction::kernel(simgrid::xbt::ReplayAction&)
+{
+  const ScanArgParser& args = get_args();
+  TRACE_smpi_comm_in(get_pid(), "action_scan",
+                     new simgrid::instr::CollTIData(get_name(), -1, args.comp_size,
+                     args.size, 0, Datatype::encode(args.datatype1), ""));
+  if (get_name() == "scan")
+    colls::scan(send_buffer(args.size * args.datatype1->size()),
+              recv_buffer(args.size * args.datatype1->size()), args.size,
+              args.datatype1, MPI_OP_NULL, MPI_COMM_WORLD);
+  else
+    colls::exscan(send_buffer(args.size * args.datatype1->size()),
+              recv_buffer(args.size * args.datatype1->size()), args.size,
+              args.datatype1, MPI_OP_NULL, MPI_COMM_WORLD);
+
+  if (args.comp_size != 0.0)
+    simgrid::s4u::this_actor::exec_init(args.comp_size)
+      ->set_name("computation")
+      ->start()
+      ->wait();
   TRACE_smpi_comm_out(get_pid());
 }
 
@@ -742,7 +787,7 @@ void AllToAllVAction::kernel(simgrid::xbt::ReplayAction&)
   const AllToAllVArgParser& args = get_args();
   TRACE_smpi_comm_in(get_pid(), __func__,
                      new simgrid::instr::VarCollTIData(
-                         "alltoallv", 0, args.send_size_sum, args.sendcounts, args.recv_size_sum, args.recvcounts,
+                         "alltoallv", -1, args.send_size_sum, args.sendcounts, args.recv_size_sum, args.recvcounts,
                          Datatype::encode(args.datatype1), Datatype::encode(args.datatype2)));
 
   colls::alltoallv(send_buffer(args.send_buf_size * args.datatype1->size()), args.sendcounts->data(),
@@ -793,6 +838,8 @@ void smpi_replay_init(const char* instance_id, int rank, double start_delay_flop
   xbt_replay_action_register("allgather", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::GatherAction("allgather").execute(action); });
   xbt_replay_action_register("allgatherv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::GatherVAction("allgatherv").execute(action); });
   xbt_replay_action_register("reducescatter", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::ReduceScatterAction().execute(action); });
+  xbt_replay_action_register("scan", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::ScanAction("scan").execute(action); });
+  xbt_replay_action_register("exscan", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::ScanAction("exscan").execute(action); });
   xbt_replay_action_register("compute", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::ComputeAction().execute(action); });
   xbt_replay_action_register("sleep", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SleepAction().execute(action); });
   xbt_replay_action_register("location", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::LocationAction().execute(action); });
@@ -805,6 +852,8 @@ void smpi_replay_init(const char* instance_id, int rank, double start_delay_flop
     // Wait for the other actors to initialize also
     simgrid::s4u::this_actor::yield();
   }
+  if(_smpi_init_sleep > 0)
+    simgrid::s4u::this_actor::sleep_for(_smpi_init_sleep);
 }
 
 /** @brief actually run the replay after initialization */
@@ -830,6 +879,10 @@ void smpi_replay_main(int rank, const char* private_trace_filename)
     }
     simgrid::smpi::Request::waitall(count_requests, requests.data(), MPI_STATUSES_IGNORE);
   }
+
+  if(simgrid::config::get_value<bool>("smpi/finalization-barrier"))
+    simgrid::smpi::colls::barrier(MPI_COMM_WORLD);
+
   active_processes--;
 
   if(active_processes==0){
index dfc99b8..2c120fb 100644 (file)
@@ -305,7 +305,7 @@ void* smpi_shared_malloc_partial(size_t size, const size_t* shared_block_offsets
 void* smpi_shared_malloc_intercept(size_t size, const char* file, int line)
 {
   if( smpi_cfg_auto_shared_malloc_thresh() == 0 || size < smpi_cfg_auto_shared_malloc_thresh()){
-    void* ptr = ::operator new(size);
+    void* ptr = xbt_malloc(size);
     if(not smpi_cfg_trace_call_use_absolute_path())
       simgrid::smpi::utils::account_malloc_size(size, simgrid::xbt::Path(file).get_base_name(), line, ptr);
     else
@@ -319,18 +319,42 @@ void* smpi_shared_malloc_intercept(size_t size, const char* file, int line)
 
 void* smpi_shared_calloc_intercept(size_t num_elm, size_t elem_size, const char* file, int line)
 {
-  if( smpi_cfg_auto_shared_malloc_thresh() == 0 || elem_size*num_elm < smpi_cfg_auto_shared_malloc_thresh()){
-    void* ptr = ::operator new(elem_size*num_elm);
+  size_t size = elem_size * num_elm;
+  if (smpi_cfg_auto_shared_malloc_thresh() == 0 || size < smpi_cfg_auto_shared_malloc_thresh()) {
+    void* ptr = xbt_malloc0(size);
     if(not smpi_cfg_trace_call_use_absolute_path())
-      simgrid::smpi::utils::account_malloc_size(elem_size*num_elm, simgrid::xbt::Path(file).get_base_name(), line, ptr);
+      simgrid::smpi::utils::account_malloc_size(size, simgrid::xbt::Path(file).get_base_name(), line, ptr);
     else
-      simgrid::smpi::utils::account_malloc_size(elem_size*num_elm, file, line, ptr);
-    memset(ptr, 0, elem_size*num_elm);
+      simgrid::smpi::utils::account_malloc_size(size, file, line, ptr);
     return ptr;
   } else {
-    simgrid::smpi::utils::account_shared_size(elem_size*num_elm);
-    return smpi_shared_malloc(elem_size*num_elm, file, line);
+    simgrid::smpi::utils::account_shared_size(size);
+    return memset(smpi_shared_malloc(size, file, line), 0, size);
+  }
+}
+
+void* smpi_shared_realloc_intercept(void* data, size_t size, const char* file, int line)
+{
+  if (size == 0) {
+    smpi_shared_free(data);
+    return nullptr;
+  }
+  if (data == nullptr)
+    return smpi_shared_malloc_intercept(size, file, line);
+
+  auto meta = allocs_metadata.find(data);
+  if (meta == allocs_metadata.end()) {
+    XBT_DEBUG("Classical realloc(%p, %zu)", data, size);
+    return xbt_realloc(data, size);
+  }
+
+  XBT_DEBUG("Shared realloc(%p, %zu) (old size: %zu)", data, size, meta->second.size);
+  void* ptr = smpi_shared_malloc_intercept(size, file, line);
+  if (ptr != data) {
+    memcpy(ptr, data, std::min(size, meta->second.size));
+    smpi_shared_free(data);
   }
+  return ptr;
 }
 
 void* smpi_shared_malloc(size_t size, const char* file, int line)
@@ -343,7 +367,7 @@ void* smpi_shared_malloc(size_t size, const char* file, int line)
     return smpi_shared_malloc_partial(size, shared_block_offsets.data(), nb_shared_blocks);
   }
   XBT_DEBUG("Classic allocation of %zu bytes", size);
-  return ::operator new(size);
+  return xbt_malloc(size);
 }
 
 int smpi_is_shared(const void* ptr, std::vector<std::pair<size_t, size_t>> &private_blocks, size_t *offset){
@@ -418,7 +442,7 @@ void smpi_shared_free(void *ptr)
   if (smpi_cfg_shared_malloc() == SharedMallocType::LOCAL) {
     auto meta = allocs_metadata.find(ptr);
     if (meta == allocs_metadata.end()) {
-      ::operator delete(ptr);
+      xbt_free(ptr);
       return;
     }
     shared_data_t* data = &meta->second.data->second;
@@ -429,7 +453,7 @@ void smpi_shared_free(void *ptr)
     if (data->count <= 0) {
       close(data->fd);
       allocs.erase(allocs.find(meta->second.data->first));
-      allocs_metadata.erase(ptr);
+      allocs_metadata.erase(meta);
       XBT_DEBUG("Shared free - Local - with removal - of %p", ptr);
     } else {
       XBT_DEBUG("Shared free - Local - no removal - of %p, count = %d", ptr, data->count);
@@ -443,16 +467,16 @@ void smpi_shared_free(void *ptr)
       munmap(ptr, meta->second.size);
       if(meta->second.data->second.count==0){
         delete meta->second.data;
-        allocs_metadata.erase(ptr);
+        allocs_metadata.erase(meta);
       }
     }else{
-      ::operator delete(ptr);
+      xbt_free(ptr);
       return;
     }
 
   } else {
     XBT_DEBUG("Classic deallocation of %p", ptr);
-    ::operator delete(ptr);
+    xbt_free(ptr);
   }
 }
 #endif
index 870ae30..bff153d 100644 (file)
@@ -67,7 +67,7 @@ std::vector<s_smpi_factor_t> parse_factor(const std::string& smpi_coef_string)
    * G --> H
    */
   for (Tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) {
-    XBT_DEBUG("token : %s", token_iter->c_str());
+    XBT_DEBUG("token: %s", token_iter->c_str());
     Tokenizer factor_values(*token_iter, factor_separator);
     s_smpi_factor_t fact;
     xbt_assert(factor_values.begin() != factor_values.end(), "Malformed radical for smpi factor: '%s'",
@@ -94,13 +94,13 @@ std::vector<s_smpi_factor_t> parse_factor(const std::string& smpi_coef_string)
     }
 
     smpi_factor.push_back(fact);
-    XBT_DEBUG("smpi_factor:\t%zu : %zu values, first: %f", fact.factor, smpi_factor.size(), fact.values[0]);
+    XBT_DEBUG("smpi_factor:\t%zu: %zu values, first: %f", fact.factor, smpi_factor.size(), fact.values[0]);
   }
   std::sort(smpi_factor.begin(), smpi_factor.end(), [](const s_smpi_factor_t &pa, const s_smpi_factor_t &pb) {
     return (pa.factor < pb.factor);
   });
   for (auto const& fact : smpi_factor) {
-    XBT_DEBUG("smpi_factor:\t%zu : %zu values, first: %f", fact.factor, smpi_factor.size() ,fact.values[0]);
+    XBT_DEBUG("smpi_factor:\t%zu: %zu values, first: %f", fact.factor, smpi_factor.size(), fact.values[0]);
   }
   smpi_factor.shrink_to_fit();
 
@@ -152,103 +152,113 @@ void print_time_analysis(double global_time){
   }
 }
 
-static void print_leaked_handles(){
+static void print_leaked_handles()
+{
   // Put the leaked non-default handles in a vector to sort them by id
   std::vector<std::pair<unsigned int, smpi::F2C*>> handles;
   if (simgrid::smpi::F2C::lookup() != nullptr)
     std::copy_if(simgrid::smpi::F2C::lookup()->begin(), simgrid::smpi::F2C::lookup()->end(),
                  std::back_inserter(handles),
                  [](auto const& entry) { return entry.first >= simgrid::smpi::F2C::get_num_default_handles(); });
-  if (not handles.empty()) {
-    auto max = static_cast<unsigned long>(simgrid::config::get_value<int>("smpi/list-leaks"));
-    std::string message = "Probable memory leaks in your code: SMPI detected %zu unfreed MPI handles :";
-    if(max==0)
-      message +="\nHINT : Display types and addresses (n max) with --cfg=smpi/list-leaks:n.\n"\
-                "Running smpirun with -wrapper \"valgrind --leak-check=full\" can provide more information";
-    XBT_INFO(message.c_str(), handles.size());
-    if (max > 0) { // we cannot trust F2C::lookup()->size() > F2C::get_num_default_handles() because some default
-                   // handles are already freed at this point
-      bool display_advice = false;
-      std::map<std::string, int, std::less<>> count;
-      for (const auto& elem : handles) {
-        std::string key = elem.second->name();
-        if ((not xbt_log_no_loc) && (not elem.second->call_location().empty()))
-          key+=" at "+ elem.second->call_location();
-        else
-          display_advice=true;
-        auto result = count.emplace(key, 1);
-        if (result.second == false)
-          result.first->second++;
-      }
-      if (display_advice)
-        XBT_WARN("To get more information (location of allocations), compile your code with -trace-call-location flag of smpicc/f90");
-      unsigned int i = 0;
-      for (const auto& p : count) {
-        if(p.second == 1)
-          XBT_INFO("leaked handle of type %s", p.first.c_str());
-        else
-          XBT_INFO("%d leaked handles of type %s", p.second, p.first.c_str());
-        i++;
-        if(i == max)
-          break;
-      }
-      if (max < count.size())
-        XBT_INFO("(%lu more handle leaks hidden as you wanted to see only %lu of them)", count.size()-max, max);
-    }
+  if (handles.empty())
+    return;
+
+  auto max            = static_cast<unsigned long>(simgrid::config::get_value<int>("smpi/list-leaks"));
+  std::string message = "Probable memory leaks in your code: SMPI detected %zu unfreed MPI handles:";
+  if (max == 0)
+    message += "\nHINT: Display types and addresses (n max) with --cfg=smpi/list-leaks:n.\n"
+               "Running smpirun with -wrapper \"valgrind --leak-check=full\" can provide more information";
+  XBT_INFO(message.c_str(), handles.size());
+  if (max == 0)
+    return;
+
+  // we cannot trust F2C::lookup()->size() > F2C::get_num_default_handles() because some default handles are already
+  // freed at this point
+  bool display_advice = false;
+  std::map<std::string, int, std::less<>> count;
+  for (const auto& elem : handles) {
+    std::string key = elem.second->name();
+    if ((not xbt_log_no_loc) && (not elem.second->call_location().empty()))
+      key += " at " + elem.second->call_location();
+    else
+      display_advice = true;
+    auto result      = count.emplace(key, 1);
+    if (result.second == false)
+      result.first->second++;
+  }
+  if (display_advice)
+    XBT_WARN("To get more information (location of allocations), compile your code with -trace-call-location flag of "
+             "smpicc/f90");
+  unsigned int i = 0;
+  for (const auto& p : count) {
+    if (p.second == 1)
+      XBT_INFO("leaked handle of type %s", p.first.c_str());
+    else
+      XBT_INFO("%d leaked handles of type %s", p.second, p.first.c_str());
+    i++;
+    if (i == max)
+      break;
   }
+  if (max < count.size())
+    XBT_INFO("(%lu more handle leaks hidden as you wanted to see only %lu of them)", count.size() - max, max);
 }
 
-static void print_leaked_buffers(){
-  if (not allocs.empty()) {
-    auto max = static_cast<unsigned long>(simgrid::config::get_value<int>("smpi/list-leaks"));
-    std::string message = "Probable memory leaks in your code: SMPI detected %zu unfreed buffers :";
-    if(max==0)
-      message +="display types and addresses (n max) with --cfg=smpi/list-leaks:n.\nRunning smpirun with -wrapper \"valgrind --leak-check=full\" can provide more information";
-    XBT_INFO(message.c_str(), allocs.size());
-
-    if (max > 0) {
-      //gather by allocation origin (only one group reported in case of no-loc or if trace-call-location is not used)
-      struct buff_leak{
-        int count;
-        size_t total_size;
-        size_t min_size;
-        size_t max_size;
-      };
-      std::map<std::string, struct buff_leak, std::less<>> leaks_aggreg;
-      for (const auto& elem : allocs) {
-        std::string key = "leaked allocations";
-        if (not xbt_log_no_loc)
-          key=elem.second.file+":"+std::to_string(elem.second.line)+" : "+key;
-        auto result = leaks_aggreg.emplace(key, buff_leak{1, elem.second.size, elem.second.size, elem.second.size});
-        if (result.second == false){
-          result.first->second.count ++;
-          result.first->second.total_size += elem.second.size;
-          if(elem.second.size > result.first->second.max_size)
-            result.first->second.max_size = elem.second.size;
-          else if (elem.second.size < result.first->second.min_size)
-            result.first->second.min_size = elem.second.size;
-        }
-      }
-      //now we can order by total size.
-      std::vector<std::pair<std::string, buff_leak>> leaks(leaks_aggreg.begin(), leaks_aggreg.end());
-      std::sort(leaks.begin(), leaks.end(), [](auto const& a, auto const& b) { return a.second.total_size > b.second.total_size; });
-
-      unsigned int i =0;
-      for (const auto& p : leaks) {
-        if(p.second.min_size == p.second.max_size)
-          XBT_INFO("%s of total size %zu, called %d times, each with size %zu",
-                  p.first.c_str(),p.second.total_size,p.second.count,p.second.min_size);
-        else
-          XBT_INFO("%s of total size %zu, called %d times, with minimum size %zu and maximum size %zu",
-                  p.first.c_str(),p.second.total_size,p.second.count,p.second.min_size,p.second.max_size);
-        i++;
-        if(i == max)
-          break;
-      }
-      if (max < leaks_aggreg.size())
-        XBT_INFO("(more buffer leaks hidden as you wanted to see only %lu of them)", max);
+static void print_leaked_buffers()
+{
+  if (allocs.empty())
+    return;
+
+  auto max            = static_cast<unsigned long>(simgrid::config::get_value<int>("smpi/list-leaks"));
+  std::string message = "Probable memory leaks in your code: SMPI detected %zu unfreed buffers:";
+  if (max == 0)
+    message += "display types and addresses (n max) with --cfg=smpi/list-leaks:n.\nRunning smpirun with -wrapper "
+               "\"valgrind --leak-check=full\" can provide more information";
+  XBT_INFO(message.c_str(), allocs.size());
+
+  if (max == 0)
+    return;
+
+  // gather by allocation origin (only one group reported in case of no-loc or if trace-call-location is not used)
+  struct buff_leak {
+    int count;
+    size_t total_size;
+    size_t min_size;
+    size_t max_size;
+  };
+  std::map<std::string, struct buff_leak, std::less<>> leaks_aggreg;
+  for (const auto& elem : allocs) {
+    std::string key = "leaked allocations";
+    if (not xbt_log_no_loc)
+      key = elem.second.file + ":" + std::to_string(elem.second.line) + ": " + key;
+    auto result = leaks_aggreg.emplace(key, buff_leak{1, elem.second.size, elem.second.size, elem.second.size});
+    if (result.second == false) {
+      result.first->second.count++;
+      result.first->second.total_size += elem.second.size;
+      if (elem.second.size > result.first->second.max_size)
+        result.first->second.max_size = elem.second.size;
+      else if (elem.second.size < result.first->second.min_size)
+        result.first->second.min_size = elem.second.size;
     }
   }
+  // now we can order by total size.
+  std::vector<std::pair<std::string, buff_leak>> leaks(leaks_aggreg.begin(), leaks_aggreg.end());
+  std::sort(leaks.begin(), leaks.end(),
+            [](auto const& a, auto const& b) { return a.second.total_size > b.second.total_size; });
+
+  unsigned int i = 0;
+  for (const auto& p : leaks) {
+    if (p.second.min_size == p.second.max_size)
+      XBT_INFO("%s of total size %zu, called %d times, each with size %zu", p.first.c_str(), p.second.total_size,
+               p.second.count, p.second.min_size);
+    else
+      XBT_INFO("%s of total size %zu, called %d times, with minimum size %zu and maximum size %zu", p.first.c_str(),
+               p.second.total_size, p.second.count, p.second.min_size, p.second.max_size);
+    i++;
+    if (i == max)
+      break;
+  }
+  if (max < leaks_aggreg.size())
+    XBT_INFO("(more buffer leaks hidden as you wanted to see only %lu of them)", max);
 }
 
 void print_memory_analysis()
@@ -265,8 +275,9 @@ void print_memory_analysis()
              total_malloc_size, max_malloc.size, simgrid::xbt::Path(max_malloc.file).get_base_name().c_str(), max_malloc.line, max_malloc.numcall
       );
     else
-      XBT_INFO("Allocations analysis asked, but 0 bytes were allocated through malloc/calloc calls intercepted by SMPI.\n"
-               "Either code is using other ways of allocating memory, or it was built with SMPI_NO_OVERRIDE_MALLOC");
+      XBT_INFO(
+          "Allocations analysis asked, but 0 bytes were allocated through malloc/calloc calls intercepted by SMPI.\n"
+          "The code may not use malloc() to allocate memory, or it was built with SMPI_NO_OVERRIDE_MALLOC");
     if(total_shared_size != 0)
       XBT_INFO("%lu bytes were automatically shared between processes, in %u calls\n", total_shared_size, total_shared_calls);
   }
index 9d6ac04..2dceee2 100644 (file)
@@ -65,16 +65,17 @@ void Comm::destroy(Comm* comm)
     Comm::destroy(smpi_process()->comm_world());
     return;
   }
-  if(comm != MPI_COMM_WORLD)
+  if (comm != MPI_COMM_WORLD && not comm->deleted()) {
+    comm->cleanup_attr<Comm>();
     comm->mark_as_deleted();
+  }
   Comm::unref(comm);
 }
 
 int Comm::dup(MPI_Comm* newcomm){
-  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
-    // we need to switch as the called function may silently touch global variables
-    smpi_switch_data_segment(s4u::Actor::self());
-  }
+  // we need to switch as the called function may silently touch global variables
+  smpi_switch_data_segment(s4u::Actor::self());
+
   auto* cp     = new Group(this->group());
   (*newcomm)   = new  Comm(cp, this->topo());
 
@@ -182,12 +183,12 @@ void Comm::get_name(char* name, int* len) const
 std::string Comm::name() const
 {
   int size;
-  char name[MPI_MAX_NAME_STRING+1];
-  this->get_name(name, &size);
+  std::array<char, MPI_MAX_NAME_STRING + 1> name;
+  this->get_name(name.data(), &size);
   if (name[0]=='\0')
     return std::string("MPI_Comm");
   else
-    return std::string(name);
+    return std::string(name.data());
 }
 
 
@@ -411,10 +412,9 @@ void Comm::init_smp(){
     smpi_process()->set_replaying(false);
   }
 
-  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
-    // we need to switch as the called function may silently touch global variables
-    smpi_switch_data_segment(s4u::Actor::self());
-  }
+  // we need to switch as the called function may silently touch global variables
+  smpi_switch_data_segment(s4u::Actor::self());
+
   // identify neighbors in comm
   MPI_Comm comm_intra = find_intra_comm(&leader);
 
@@ -425,11 +425,6 @@ void Comm::init_smp(){
 
   allgather__ring(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this);
 
-  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
-    // we need to switch as the called function may silently touch global variables
-    smpi_switch_data_segment(s4u::Actor::self());
-  }
-
   if(leaders_map_==nullptr){
     leaders_map_= leaders_map;
   }else{
@@ -481,7 +476,7 @@ void Comm::init_smp(){
   int my_local_size=comm_intra->size();
   if(comm_intra->rank()==0) {
     int is_uniform       = 1;
-    int* non_uniform_map = xbt_new0(int,leader_group_size);
+    auto* non_uniform_map = xbt_new0(int, leader_group_size);
     allgather__ring(&my_local_size, 1, MPI_INT,
         non_uniform_map, 1, MPI_INT, leader_comm);
     for(i=0; i < leader_group_size; i++) {
@@ -499,10 +494,9 @@ void Comm::init_smp(){
   }
   bcast__scatter_LR_allgather(&is_uniform_, 1, MPI_INT, 0, comm_intra);
 
-  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
-    // we need to switch as the called function may silently touch global variables
-    smpi_switch_data_segment(s4u::Actor::self());
-  }
+  // we need to switch as the called function may silently touch global variables
+  smpi_switch_data_segment(s4u::Actor::self());
+
   // Are the ranks blocked ? = allocated contiguously on the SMP nodes
   int is_blocked=1;
   int prev      = this->group()->rank(comm_intra->group()->actor(0));
@@ -559,19 +553,17 @@ void Comm::remove_rma_win(MPI_Win win){
 
 void Comm::finish_rma_calls() const
 {
+  const int myrank = rank();
   for (auto const& it : rma_wins_) {
-    if(it->rank()==this->rank()){//is it ours (for MPI_COMM_WORLD)?
+    if (it->rank() == myrank) { // is it ours (for MPI_COMM_WORLD)?
       int finished = it->finish_comms();
-      XBT_DEBUG("Barrier for rank %d - Finished %d RMA calls",this->rank(), finished);
+      XBT_DEBUG("Barrier for rank %d - Finished %d RMA calls", myrank, finished);
     }
   }
 }
 
 MPI_Info Comm::info()
 {
-  if (info_ == MPI_INFO_NULL)
-    info_ = new Info();
-  info_->ref();
   return info_;
 }
 
@@ -591,9 +583,12 @@ MPI_Errhandler Comm::errhandler()
       errhandler_->ref();
     return errhandler_;
   } else {
-    if(errhandlers_==nullptr)
-      return MPI_ERRORS_ARE_FATAL;
-    else {
+    if(errhandlers_==nullptr){
+      if (_smpi_cfg_default_errhandler_is_error)
+        return MPI_ERRORS_ARE_FATAL;
+      else
+        return MPI_ERRORS_RETURN;
+    } else {
       if(errhandlers_[this->rank()] != MPI_ERRHANDLER_NULL)
         errhandlers_[this->rank()]->ref();
       return errhandlers_[this->rank()];
index 8fb7e77..879b9f8 100644 (file)
@@ -180,6 +180,9 @@ int Datatype::copy_attrs(Datatype* datatype){
     } else if (elem.copy_fn.type_copy_fn != MPI_NULL_COPY_FN) {
       ret = elem.copy_fn.type_copy_fn(datatype, it.first, elem.extra_state, it.second, &value_out, &flag);
     }
+    if (ret != MPI_SUCCESS)
+      return ret;
+
     if (elem.copy_fn.type_copy_fn_fort != MPI_NULL_COPY_FN) {
       value_out = xbt_new(int, 1);
       if (*(int*)*elem.copy_fn.type_copy_fn_fort == 1) { // MPI_TYPE_DUP_FN
@@ -188,11 +191,11 @@ int Datatype::copy_attrs(Datatype* datatype){
       } else { // not null, nor dup
         elem.copy_fn.type_copy_fn_fort(datatype, it.first, elem.extra_state, it.second, value_out, &flag, &ret);
       }
-      if (ret != MPI_SUCCESS)
+      if (ret != MPI_SUCCESS) {
         xbt_free(value_out);
+        return ret;
+      }
     }
-    if (ret != MPI_SUCCESS)
-      return ret;
     if (flag) {
       elem.refcount++;
       attributes().emplace(it.first, value_out);
@@ -246,13 +249,6 @@ bool Datatype::is_basic() const
   return (flags_ & DT_FLAG_BASIC);
 }
 
-bool Datatype::is_replayable() const
-{
-  return (simgrid::instr::trace_format == simgrid::instr::TraceFormat::Ti) &&
-         ((this == MPI_BYTE) || (this == MPI_DOUBLE) || (this == MPI_INT) || (this == MPI_CHAR) ||
-          (this == MPI_SHORT) || (this == MPI_LONG) || (this == MPI_FLOAT));
-}
-
 MPI_Datatype Datatype::decode(const std::string& datatype_id)
 {
   return id2type_lookup.find(datatype_id)->second;
@@ -315,7 +311,8 @@ int Datatype::get_contents(int max_integers, int max_addresses, int max_datatype
   if (static_cast<unsigned>(max_datatypes) < contents_->datatypes_.size())
     return MPI_ERR_COUNT;
   std::copy(begin(contents_->datatypes_), end(contents_->datatypes_), array_of_datatypes);
-  std::for_each(begin(contents_->datatypes_), end(contents_->datatypes_), std::mem_fn(&Datatype::ref));
+  for (auto& datatype : contents_->datatypes_)
+    datatype->ref();
   return MPI_SUCCESS;
 }
 
@@ -340,9 +337,8 @@ int Datatype::copy(const void* sendbuf, int sendcount, MPI_Datatype sendtype, vo
 {
   // FIXME Handle the case of a partial shared malloc.
 
-  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
-    smpi_switch_data_segment(simgrid::s4u::Actor::self());
-  }
+  smpi_switch_data_segment(simgrid::s4u::Actor::self());
+
   /* First check if we really have something to do */
   size_t offset = 0;
   std::vector<std::pair<size_t, size_t>> private_blocks;
@@ -423,13 +419,14 @@ int Datatype::create_vector(int count, int block_length, int stride, MPI_Datatyp
     ub=((count-1)*stride+block_length-1)*old_type->get_extent()+old_type->ub();
   }
   if(old_type->flags() & DT_FLAG_DERIVED || stride != block_length){
-    *new_type = new Type_Vector(count * block_length * old_type->size(), lb, ub, DT_FLAG_DERIVED, count, block_length,
+    *new_type = new Type_Vector(old_type->size() * block_length * count, lb, ub, DT_FLAG_DERIVED, count, block_length,
                                 stride, old_type);
     retval=MPI_SUCCESS;
   }else{
     /* in this situation the data are contiguous thus it's not required to serialize and unserialize it*/
-    *new_type = new Datatype(count * block_length * old_type->size(), 0, ((count -1) * stride + block_length)*
-                         old_type->size(), DT_FLAG_CONTIGUOUS|DT_FLAG_DERIVED);
+    *new_type =
+        new Datatype(old_type->size() * block_length * count, 0,
+                     old_type->size() * ((count - 1) * stride + block_length), DT_FLAG_CONTIGUOUS | DT_FLAG_DERIVED);
     const std::array<int, 3> ints = {{count, block_length, stride}};
     (*new_type)->set_contents(MPI_COMBINER_VECTOR, 3, ints.data(), 0, nullptr, 1, &old_type);
     retval=MPI_SUCCESS;
@@ -450,12 +447,13 @@ int Datatype::create_hvector(int count, int block_length, MPI_Aint stride, MPI_D
     ub=((count-1)*stride)+(block_length-1)*old_type->get_extent()+old_type->ub();
   }
   if(old_type->flags() & DT_FLAG_DERIVED || stride != block_length*old_type->get_extent()){
-    *new_type = new Type_Hvector(count * block_length * old_type->size(), lb, ub, DT_FLAG_DERIVED, count, block_length,
+    *new_type = new Type_Hvector(old_type->size() * block_length * count, lb, ub, DT_FLAG_DERIVED, count, block_length,
                                  stride, old_type);
     retval=MPI_SUCCESS;
   }else{
     /* in this situation the data are contiguous thus it's not required to serialize and unserialize it*/
-    *new_type = new Datatype(count * block_length * old_type->size(), 0, count * block_length * old_type->size(), DT_FLAG_CONTIGUOUS|DT_FLAG_DERIVED);
+    *new_type = new Datatype(old_type->size() * block_length * count, 0, old_type->size() * block_length * count,
+                             DT_FLAG_CONTIGUOUS | DT_FLAG_DERIVED);
     const std::array<int, 2> ints = {{count, block_length}};
     (*new_type)->set_contents(MPI_COMBINER_HVECTOR, 2, ints.data(), 1, &stride, 1, &old_type);
     retval=MPI_SUCCESS;
@@ -517,7 +515,7 @@ int Datatype::create_hindexed(int count, const int* block_lengths, const MPI_Ain
     if(indices[i]+block_lengths[i]*old_type->ub()>ub)
       ub = indices[i]+block_lengths[i]*old_type->ub();
 
-    if ( (i< count -1) && (indices[i]+block_lengths[i]*(static_cast<int>(old_type->size())) != indices[i+1]) )
+    if ((i < count - 1) && (indices[i] + static_cast<MPI_Aint>(old_type->size()) * block_lengths[i] != indices[i + 1]))
       contiguous=false;
   }
   if (old_type->flags_ & DT_FLAG_DERIVED || lb!=0)
@@ -565,7 +563,8 @@ int Datatype::create_struct(int count, const int* block_lengths, const MPI_Aint*
     if (not forced_ub && indices[i] + block_lengths[i] * old_types[i]->ub() > ub)
       ub = indices[i]+block_lengths[i]*old_types[i]->ub();
 
-    if ( (i< count -1) && (indices[i]+block_lengths[i]*static_cast<int>(old_types[i]->size()) != indices[i+1]) )
+    if ((i < count - 1) &&
+        (indices[i] + static_cast<MPI_Aint>(old_types[i]->size() * block_lengths[i]) != indices[i + 1]))
       contiguous=false;
   }
   if (not contiguous) {
index b9c9cf7..17c2f4c 100644 (file)
@@ -21,6 +21,14 @@ Datatype_contents::Datatype_contents(int combiner, int number_of_integers, const
     , addresses_(addresses, addresses + number_of_addresses)
     , datatypes_(datatypes, datatypes + number_of_datatypes)
 {
+  for (auto& datatype : datatypes_)
+    datatype->ref();
+}
+
+Datatype_contents::~Datatype_contents()
+{
+  for (auto& datatype : datatypes_)
+    Datatype::unref(datatype);
 }
 
 Type_Contiguous::Type_Contiguous(int size, MPI_Aint lb, MPI_Aint ub, int flags, int block_count, MPI_Datatype old_type)
@@ -46,7 +54,7 @@ void Type_Contiguous::serialize(const void* noncontiguous_buf, void* contiguous_
 {
   auto* contiguous_buf_char          = static_cast<char*>(contiguous_buf);
   const auto* noncontiguous_buf_char = static_cast<const char*>(noncontiguous_buf) + lb();
-  memcpy(contiguous_buf_char, noncontiguous_buf_char, count * block_count_ * old_type_->size());
+  memcpy(contiguous_buf_char, noncontiguous_buf_char, old_type_->size() * count * block_count_);
 }
 
 void Type_Contiguous::unserialize(const void* contiguous_buf, void* noncontiguous_buf, int count, MPI_Op op)
index 8bdbc70..82c5e2f 100644 (file)
@@ -21,7 +21,7 @@
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_io, smpi, "Logging specific to SMPI (RMA operations)");
 
-MPI_Errhandler SMPI_default_File_Errhandler = MPI_ERRORS_RETURN;
+MPI_Errhandler SMPI_default_File_Errhandler =  _smpi_cfg_default_errhandler_is_error ? MPI_ERRORS_ARE_FATAL : MPI_ERRORS_RETURN;;
 
 namespace simgrid{
 namespace smpi{
@@ -121,15 +121,15 @@ namespace smpi{
 
   int File::seek(MPI_Offset offset, int whence){
     switch(whence){
-      case(MPI_SEEK_SET):
+      case MPI_SEEK_SET:
         XBT_VERB("Seeking in MPI_File %s, setting offset %lld", file_->get_path(), offset);
         file_->seek(offset,SEEK_SET);
         break;
-      case(MPI_SEEK_CUR):
+      case MPI_SEEK_CUR:
         XBT_VERB("Seeking in MPI_File %s, current offset + %lld", file_->get_path(), offset);
         file_->seek(offset,SEEK_CUR);
         break;
-      case(MPI_SEEK_END):
+      case MPI_SEEK_END:
         XBT_VERB("Seeking in MPI_File %s, end offset + %lld", file_->get_path(), offset);
         file_->seek(offset,SEEK_END);
         break;
@@ -301,9 +301,6 @@ namespace smpi{
 
   MPI_Info File::info()
   {
-    if (info_ == MPI_INFO_NULL)
-      info_ = new Info();
-    info_->ref();
     return info_;
   }
 
index 33be519..f979b75 100644 (file)
 namespace simgrid {
 namespace smpi {
 
+Info::Info(const Info* orig)
+{
+  if (orig != nullptr)
+    map_ = orig->map_;
+  this->add_f();
+}
+
 void Info::ref()
 {
   refcount_++;
index 5ec47aa..d9dffcd 100644 (file)
@@ -24,9 +24,9 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_op, smpi, "Logging specific to SMPI (op)");
     ((b).value) *= ((a).value);                                                                                        \
     ((b).index) *= ((a).index);                                                                                        \
   }
-#define LAND_OP(a, b) (b) = (a) && (b)
-#define LOR_OP(a, b)  (b) = (a) || (b)
-#define LXOR_OP(a, b) (b) = bool(a) != bool(b)
+#define LAND_OP(a, b) (b) = static_cast<std::remove_reference_t<decltype(b)>>((a) && (b))
+#define LOR_OP(a, b)  (b) = static_cast<std::remove_reference_t<decltype(b)>>((a) || (b))
+#define LXOR_OP(a, b) (b) = static_cast<std::remove_reference_t<decltype(b)>>(bool(a) != bool(b))
 #define BAND_OP(a, b) (b) &= (a)
 #define BOR_OP(a, b)  (b) |= (a)
 #define BXOR_OP(a, b) (b) ^= (a)
@@ -45,8 +45,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_op, smpi, "Logging specific to SMPI (op)");
   }                                        \
 }
 
+#define APPLY_BEGIN_OP_LOOP()                                                                                          \
+  MPI_Datatype datatype_base = *datatype;                                                                              \
+  while (datatype_base->duplicated_datatype() != MPI_DATATYPE_NULL)                                                    \
+    datatype_base = datatype_base->duplicated_datatype();
+
 #define APPLY_OP_LOOP(dtype, type, op)                                                                                 \
-  if (*datatype == (dtype)) {                                                                                          \
+  if (datatype_base == (dtype)) {                                                                                      \
     APPLY_FUNC(a, b, length, type, op)                                                                                 \
   } else
 
@@ -121,6 +126,7 @@ APPLY_OP_LOOP(MPI_COMPLEX32, double_double,op)
 
 static void max_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(MAX_OP)
   APPLY_FLOAT_OP_LOOP(MAX_OP)
   APPLY_END_OP_LOOP(MAX_OP)
@@ -128,6 +134,7 @@ static void max_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void min_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(MIN_OP)
   APPLY_FLOAT_OP_LOOP(MIN_OP)
   APPLY_END_OP_LOOP(MIN_OP)
@@ -135,6 +142,7 @@ static void min_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void sum_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(SUM_OP)
   APPLY_FLOAT_OP_LOOP(SUM_OP)
   APPLY_COMPLEX_OP_LOOP(SUM_OP)
@@ -144,6 +152,7 @@ static void sum_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void prod_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(PROD_OP)
   APPLY_FLOAT_OP_LOOP(PROD_OP)
   APPLY_COMPLEX_OP_LOOP(PROD_OP)
@@ -153,6 +162,7 @@ static void prod_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void land_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(LAND_OP)
   APPLY_FLOAT_OP_LOOP(LAND_OP)
   APPLY_BOOL_OP_LOOP(LAND_OP)
@@ -161,6 +171,7 @@ static void land_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void lor_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(LOR_OP)
   APPLY_FLOAT_OP_LOOP(LOR_OP)
   APPLY_BOOL_OP_LOOP(LOR_OP)
@@ -169,6 +180,7 @@ static void lor_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void lxor_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(LXOR_OP)
   APPLY_FLOAT_OP_LOOP(LXOR_OP)
   APPLY_BOOL_OP_LOOP(LXOR_OP)
@@ -177,6 +189,7 @@ static void lxor_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void band_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(BAND_OP)
   APPLY_BOOL_OP_LOOP(BAND_OP)
   APPLY_BYTE_OP_LOOP(BAND_OP)
@@ -185,6 +198,7 @@ static void band_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void bor_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(BOR_OP)
   APPLY_BOOL_OP_LOOP(BOR_OP)
   APPLY_BYTE_OP_LOOP(BOR_OP)
@@ -193,6 +207,7 @@ static void bor_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void bxor_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_BASIC_OP_LOOP(BXOR_OP)
   APPLY_BOOL_OP_LOOP(BXOR_OP)
   APPLY_BYTE_OP_LOOP(BXOR_OP)
@@ -201,12 +216,14 @@ static void bxor_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 
 static void minloc_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_PAIR_OP_LOOP(MINLOC_OP)
   APPLY_END_OP_LOOP(MINLOC_OP)
 }
 
 static void maxloc_func(void *a, void *b, int *length, MPI_Datatype * datatype)
 {
+  APPLY_BEGIN_OP_LOOP()
   APPLY_PAIR_OP_LOOP(MAXLOC_OP)
   APPLY_END_OP_LOOP(MAXLOC_OP)
 }
@@ -249,17 +266,14 @@ namespace smpi{
 
 void Op::apply(const void* invec, void* inoutvec, const int* len, MPI_Datatype datatype) const
 {
-  if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) {
-    // we need to switch as the called function may silently touch global variables
-    XBT_DEBUG("Applying operation, switch to the right data frame ");
-    smpi_switch_data_segment(simgrid::s4u::Actor::self());
-  }
+  // we need to switch as the called function may silently touch global variables
+  smpi_switch_data_segment(simgrid::s4u::Actor::self());
 
   if (not smpi_process()->replaying() && *len > 0) {
+    XBT_DEBUG("Applying operation of length %d from %p and from/to %p", *len, invec, inoutvec);
     if (not is_fortran_op_)
       this->func_(const_cast<void*>(invec), inoutvec, const_cast<int*>(len), &datatype);
     else{
-      XBT_DEBUG("Applying operation of length %d from %p and from/to %p", *len, invec, inoutvec);
       int tmp = datatype->c2f();
       /* Unfortunately, the C and Fortran version of the MPI standard do not agree on the type here,
          thus the reinterpret_cast. */
index 5ba3993..2ab04d5 100644 (file)
@@ -39,6 +39,7 @@ namespace smpi{
 Request::Request(const void* buf, int count, MPI_Datatype datatype, aid_t src, aid_t dst, int tag, MPI_Comm comm,
                  unsigned flags, MPI_Op op)
     : buf_(const_cast<void*>(buf))
+    , old_buf_(buf_)
     , type_(datatype)
     , size_(datatype->size() * count)
     , src_(src)
@@ -158,22 +159,21 @@ bool Request::match_common(MPI_Request req, MPI_Request sender, MPI_Request rece
 }
 
 void Request::init_buffer(int count){
-  void *old_buf = nullptr;
 // FIXME Handle the case of a partial shared malloc.
   // This part handles the problem of non-contiguous memory (for the unserialization at the reception)
-  if ((((flags_ & MPI_REQ_RECV) != 0) && ((flags_ & MPI_REQ_ACCUMULATE) != 0)) || (type_->flags() & DT_FLAG_DERIVED)) {
+  if (not smpi_process()->replaying() &&
+     ((((flags_ & MPI_REQ_RECV) != 0) && ((flags_ & MPI_REQ_ACCUMULATE) != 0)) || (type_->flags() & DT_FLAG_DERIVED))) {
     // This part handles the problem of non-contiguous memory
-    old_buf = buf_;
+    old_buf_ = buf_;
     if (count==0){
       buf_ = nullptr;
     }else {
       buf_ = xbt_malloc(count*type_->size());
       if ((type_->flags() & DT_FLAG_DERIVED) && ((flags_ & MPI_REQ_SEND) != 0)) {
-        type_->serialize(old_buf, buf_, count);
+        type_->serialize(old_buf_, buf_, count);
       }
     }
   }
-  old_buf_  = old_buf;
 }
 
 bool Request::match_recv(void* a, void* b, simgrid::kernel::activity::CommImpl*)
@@ -228,7 +228,7 @@ MPI_Request Request::isend_init(const void *buf, int count, MPI_Datatype datatyp
 MPI_Request Request::rma_send_init(const void *buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm,
                                MPI_Op op)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
+  MPI_Request request;
   if(op==MPI_OP_NULL){
     request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, comm->group()->actor(src),
                           dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
@@ -259,12 +259,12 @@ MPI_Request Request::recv_init(void *buf, int count, MPI_Datatype datatype, int
 MPI_Request Request::rma_recv_init(void *buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm,
                                MPI_Op op)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
   aid_t source        = MPI_PROC_NULL;
   if (src == MPI_ANY_SOURCE)
     source = MPI_ANY_SOURCE;
   else if (src != MPI_PROC_NULL)
     source = comm->group()->actor(src);
+  MPI_Request request;
   if(op==MPI_OP_NULL){
     request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, source,
                           dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
@@ -292,10 +292,9 @@ MPI_Request Request::irecv_init(void *buf, int count, MPI_Datatype datatype, int
 
 MPI_Request Request::ibsend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
-  request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
-                        dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
-                        MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND | MPI_REQ_BSEND);
+  auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
+                             dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
+                             MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND | MPI_REQ_BSEND);
   if(dst != MPI_PROC_NULL)
     request->start();
   return request;
@@ -303,10 +302,9 @@ MPI_Request Request::ibsend(const void *buf, int count, MPI_Datatype datatype, i
 
 MPI_Request Request::isend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
-  request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
-                        dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
-                        MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND);
+  auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
+                             dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
+                             MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND);
   if(dst != MPI_PROC_NULL)
     request->start();
   return request;
@@ -314,10 +312,9 @@ MPI_Request Request::isend(const void *buf, int count, MPI_Datatype datatype, in
 
 MPI_Request Request::issend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
-  request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
-                        dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
-                        MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SSEND | MPI_REQ_SEND);
+  auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
+                             dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
+                             MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SSEND | MPI_REQ_SEND);
   if(dst != MPI_PROC_NULL)
     request->start();
   return request;
@@ -325,15 +322,13 @@ MPI_Request Request::issend(const void *buf, int count, MPI_Datatype datatype, i
 
 MPI_Request Request::irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
   aid_t source        = MPI_PROC_NULL;
   if (src == MPI_ANY_SOURCE)
     source = MPI_ANY_SOURCE;
   else if (src != MPI_PROC_NULL)
     source = comm->group()->actor(src);
-  request             = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype,
-                        source, simgrid::s4u::this_actor::get_pid(), tag, comm, 
-                        MPI_REQ_NON_PERSISTENT | MPI_REQ_RECV);
+  auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, source,
+                             simgrid::s4u::this_actor::get_pid(), tag, comm, MPI_REQ_NON_PERSISTENT | MPI_REQ_RECV);
   if(src != MPI_PROC_NULL)
     request->start();
   return request;
@@ -341,8 +336,7 @@ MPI_Request Request::irecv(void *buf, int count, MPI_Datatype datatype, int src,
 
 int Request::recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status * status)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
-  request = irecv(buf, count, datatype, src, tag, comm);
+  MPI_Request request = irecv(buf, count, datatype, src, tag, comm);
   int retval = wait(&request,status);
   request = nullptr;
   return retval;
@@ -350,10 +344,9 @@ int Request::recv(void *buf, int count, MPI_Datatype datatype, int src, int tag,
 
 void Request::bsend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
-  request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
-                        dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
-                        MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND | MPI_REQ_BSEND);
+  auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
+                             dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
+                             MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND | MPI_REQ_BSEND);
 
   if(dst != MPI_PROC_NULL)
    request->start();
@@ -363,10 +356,9 @@ void Request::bsend(const void *buf, int count, MPI_Datatype datatype, int dst,
 
 void Request::send(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
-  request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
-                        dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
-                        MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND);
+  auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
+                             dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
+                             MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND);
   if(dst != MPI_PROC_NULL)
    request->start();
   wait(&request, MPI_STATUS_IGNORE);
@@ -375,10 +367,9 @@ void Request::send(const void *buf, int count, MPI_Datatype datatype, int dst, i
 
 void Request::ssend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
 {
-  MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */
-  request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
-                        dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
-                        MPI_REQ_NON_PERSISTENT | MPI_REQ_SSEND | MPI_REQ_SEND);
+  auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
+                             dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm,
+                             MPI_REQ_NON_PERSISTENT | MPI_REQ_SSEND | MPI_REQ_SEND);
 
   if(dst != MPI_PROC_NULL)
    request->start();
@@ -506,12 +497,9 @@ void Request::start()
       if (not(type_->flags() & DT_FLAG_DERIVED)) {
         oldbuf = buf_;
         if (not process->replaying() && oldbuf != nullptr && size_ != 0) {
-          if ((smpi_cfg_privatization() != SmpiPrivStrategies::NONE) &&
-              (static_cast<char*>(buf_) >= smpi_data_exe_start) &&
-              (static_cast<char*>(buf_) < smpi_data_exe_start + smpi_data_exe_size)) {
+          if (smpi_switch_data_segment(simgrid::s4u::Actor::by_pid(src_), buf_))
             XBT_DEBUG("Privatization : We are sending from a zone inside global memory. Switch data segment ");
-            smpi_switch_data_segment(simgrid::s4u::Actor::by_pid(src_));
-          }
+
           //we need this temporary buffer even for bsend, as it will be released in the copy callback and we don't have a way to differentiate it
           //so actually ... don't use manually attached buffer space.
           buf = xbt_malloc(size_);
@@ -701,13 +689,12 @@ int Request::testany(int count, MPI_Request requests[], int *index, int* flag, M
   std::vector<simgrid::kernel::activity::CommImpl*> comms;
   comms.reserve(count);
 
-  int i;
   *flag = 0;
   int ret = MPI_SUCCESS;
   *index = MPI_UNDEFINED;
 
   std::vector<int> map; /** Maps all matching comms back to their location in requests **/
-  for(i = 0; i < count; i++) {
+  for (int i = 0; i < count; i++) {
     if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->action_ && not(requests[i]->flags_ & MPI_REQ_PREPARED)) {
       comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(requests[i]->action_.get()));
       map.push_back(i);
@@ -718,6 +705,7 @@ int Request::testany(int count, MPI_Request requests[], int *index, int* flag, M
     static int nsleeps = 1;
     if(smpi_test_sleep > 0)
       simgrid::s4u::this_actor::sleep_for(nsleeps * smpi_test_sleep);
+    ssize_t i;
     try{
       i = simcall_comm_testany(comms.data(), comms.size()); // The i-th element in comms matches!
     } catch (const Exception&) {
@@ -937,14 +925,10 @@ void Request::finish_wait(MPI_Request* request, MPI_Status * status)
       MPI_Datatype datatype = req->type_;
 
       // FIXME Handle the case of a partial shared malloc.
-      if (((req->flags_ & MPI_REQ_ACCUMULATE) != 0) ||
-          (datatype->flags() & DT_FLAG_DERIVED)) { // && (not smpi_is_shared(req->old_buf_))){
-        if (not smpi_process()->replaying() && smpi_cfg_privatization() != SmpiPrivStrategies::NONE &&
-            static_cast<char*>(req->old_buf_) >= smpi_data_exe_start &&
-            static_cast<char*>(req->old_buf_) < smpi_data_exe_start + smpi_data_exe_size) {
+      if (not smpi_process()->replaying() &&
+        (((req->flags_ & MPI_REQ_ACCUMULATE) != 0) || (datatype->flags() & DT_FLAG_DERIVED))) {
+        if (smpi_switch_data_segment(simgrid::s4u::Actor::self(), req->old_buf_))
           XBT_VERB("Privatization : We are unserializing to a zone in global memory  Switch data segment ");
-          smpi_switch_data_segment(simgrid::s4u::Actor::self());
-        }
 
         if(datatype->flags() & DT_FLAG_DERIVED){
           // This part handles the problem of non-contiguous memory the unserialization at the reception
@@ -1087,7 +1071,7 @@ int Request::waitany(int count, MPI_Request requests[], MPI_Status * status)
           // This is a finished detached request, let's return this one
           comms.clear(); // don't do the waitany call afterwards
           index = i;
-          if (requests[index] != MPI_REQUEST_NULL && (requests[index])->flags_ & MPI_REQ_NBC)
+          if (requests[index]->flags_ & MPI_REQ_NBC)
             finish_nbc_requests(&requests[index], 0);
           finish_wait(&requests[i], status); // cleanup if refcount = 0
           if (requests[i] != MPI_REQUEST_NULL && (requests[i]->flags_ & MPI_REQ_NON_PERSISTENT))
@@ -1098,7 +1082,7 @@ int Request::waitany(int count, MPI_Request requests[], MPI_Status * status)
     }
     if (not comms.empty()) {
       XBT_DEBUG("Enter waitany for %zu comms", comms.size());
-      int i;
+      ssize_t i;
       try{
         i = simcall_comm_waitany(comms.data(), comms.size(), -1);
       } catch (const CancelException&) {
@@ -1174,12 +1158,9 @@ int Request::waitall(int count, MPI_Request requests[], MPI_Status status[])
     }
   }
 
-  if (not accumulates.empty()) {
-    std::sort(accumulates.begin(), accumulates.end(), sort_accumulates);
-    for (auto& req : accumulates) {
-      finish_wait(&req, status);
-    }
-  }
+  std::sort(accumulates.begin(), accumulates.end(), sort_accumulates);
+  for (auto& req : accumulates)
+    finish_wait(&req, status);
 
   return retvalue;
 }
index fa51e44..38f901a 100644 (file)
@@ -26,14 +26,11 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_rma, smpi, "Logging specific to SMPI (RMA o
     return MPI_ERR_RMA_RANGE;\
   }
 
-#define CHECK_WIN_LOCKED(win)\
-  if(opened_==0){ /*check that post/start has been done*/\
-    int locked=0;\
-    for (auto const& it : win->lockers_)\
-      if (it == comm_->rank())\
-        locked = 1;\
-    if(locked != 1)\
-      return MPI_ERR_WIN;\
+#define CHECK_WIN_LOCKED(win)                                                                                          \
+  if (opened_ == 0) { /*check that post/start has been done*/                                                          \
+    bool locked = std::any_of(begin(win->lockers_), end(win->lockers_), [this](int it) { return it == this->rank_; }); \
+    if (not locked)                                                                                                    \
+      return MPI_ERR_WIN;                                                                                              \
   }
 
 namespace simgrid{
@@ -41,7 +38,7 @@ namespace smpi{
 std::unordered_map<int, smpi_key_elem> Win::keyvals_;
 int Win::keyval_id_=0;
 
-Win::Win(void* base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, int allocated, int dynamic)
+Win::Win(void* base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, bool allocated, bool dynamic)
     : base_(base)
     , size_(size)
     , disp_unit_(disp_unit)
@@ -76,8 +73,7 @@ Win::~Win(){
   //As per the standard, perform a barrier to ensure every async comm is finished
   bar_->wait();
 
-  int finished = finish_comms();
-  XBT_DEBUG("Win destructor - Finished %d RMA calls", finished);
+  flush_local_all();
 
   if (info_ != MPI_INFO_NULL)
     simgrid::smpi::Info::unref(info_);
@@ -92,7 +88,7 @@ Win::~Win(){
   if (rank_ == 0)
     delete bar_;
 
-  if(allocated_ !=0)
+  if (allocated_)
     xbt_free(base_);
 
   F2C::free_f(this->f2c_id());
@@ -134,9 +130,6 @@ void Win::get_group(MPI_Group* group){
 
 MPI_Info Win::info()
 {
-  if (info_ == MPI_INFO_NULL)
-    info_ = new Info();
-  info_->ref();
   return info_;
 }
 
@@ -165,7 +158,7 @@ int Win::disp_unit() const
   return disp_unit_;
 }
 
-int Win::dynamic() const
+bool Win::dynamic() const
 {
   return dynamic_;
 }
@@ -186,28 +179,15 @@ void Win::set_name(const char* name){
 int Win::fence(int assert)
 {
   XBT_DEBUG("Entering fence");
-  if (opened_ == 0)
-    opened_=1;
-  if (assert != MPI_MODE_NOPRECEDE) {
+  opened_++;
+  if (not (assert & MPI_MODE_NOPRECEDE)) {
     // This is not the first fence => finalize what came before
     bar_->wait();
-    mut_->lock();
-    // This (simulated) mutex ensures that no process pushes to the vector of requests during the waitall.
-    // Without this, the vector could get redimensioned when another process pushes.
-    // This would result in the array used by Request::waitall() to be invalidated.
-    // Another solution would be to copy the data and cleanup the vector *before* Request::waitall
-
-    // start all requests that have been prepared by another process
-    if (not requests_.empty()) {
-      int size           = static_cast<int>(requests_.size());
-      MPI_Request* treqs = requests_.data();
-      Request::waitall(size, treqs, MPI_STATUSES_IGNORE);
-    }
+    flush_local_all();
     count_=0;
-    mut_->unlock();
   }
 
-  if(assert==MPI_MODE_NOSUCCEED)//there should be no ops after this one, tell we are closed.
+  if (assert & MPI_MODE_NOSUCCEED) // there should be no ops after this one, tell we are closed.
     opened_=0;
   assert_ = assert;
 
@@ -223,32 +203,21 @@ int Win::put(const void *origin_addr, int origin_count, MPI_Datatype origin_data
   //get receiver pointer
   Win* recv_win = connected_wins_[target_rank];
 
-  if(opened_==0){//check that post/start has been done
-    // no fence or start .. lock ok ?
-    int locked=0;
-    for (auto const& it : recv_win->lockers_)
-      if (it == comm_->rank())
-        locked = 1;
-    if(locked != 1)
-      return MPI_ERR_WIN;
-  }
-
+  CHECK_WIN_LOCKED(recv_win)
   CHECK_RMA_REMOTE_WIN("MPI_Put", recv_win)
 
   void* recv_addr = static_cast<char*>(recv_win->base_) + target_disp * recv_win->disp_unit_;
 
-  if (target_rank != comm_->rank()) { // This is not for myself, so we need to send messages
+  if (target_rank != rank_) { // This is not for myself, so we need to send messages
     XBT_DEBUG("Entering MPI_Put to remote rank %d", target_rank);
     // prepare send_request
     MPI_Request sreq =
-        // TODO cheinrich Check for rank / pid conversion
-        Request::rma_send_init(origin_addr, origin_count, origin_datatype, comm_->rank(), target_rank, SMPI_RMA_TAG + 1,
-                               comm_, MPI_OP_NULL);
+        Request::rma_send_init(origin_addr, origin_count, origin_datatype, rank_, target_rank, SMPI_RMA_TAG + 1, comm_,
+                               MPI_OP_NULL);
 
     //prepare receiver request
-    // TODO cheinrich Check for rank / pid conversion
-    MPI_Request rreq = Request::rma_recv_init(recv_addr, target_count, target_datatype, recv_win->comm_->rank(),
-                                              target_rank, SMPI_RMA_TAG + 1, recv_win->comm_, MPI_OP_NULL);
+    MPI_Request rreq = Request::rma_recv_init(recv_addr, target_count, target_datatype, rank_, target_rank,
+                                              SMPI_RMA_TAG + 1, recv_win->comm_, MPI_OP_NULL);
 
     //start send
     sreq->start();
@@ -288,20 +257,18 @@ int Win::get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
   const void* send_addr = static_cast<void*>(static_cast<char*>(send_win->base_) + target_disp * send_win->disp_unit_);
   XBT_DEBUG("Entering MPI_Get from %d", target_rank);
 
-  if(target_rank != comm_->rank()){
+  if (target_rank != rank_) {
     //prepare send_request
-    MPI_Request sreq = Request::rma_send_init(send_addr, target_count, target_datatype, target_rank,
-                                              send_win->comm_->rank(), SMPI_RMA_TAG + 2, send_win->comm_, MPI_OP_NULL);
+    MPI_Request sreq = Request::rma_send_init(send_addr, target_count, target_datatype, target_rank, rank_,
+                                              SMPI_RMA_TAG + 2, send_win->comm_, MPI_OP_NULL);
 
     //prepare receiver request
-    MPI_Request rreq = Request::rma_recv_init(
-        origin_addr, origin_count, origin_datatype, target_rank,
-        comm_->rank(), // TODO cheinrich Check here if comm_->rank() and above send_win->comm_->rank() are correct
-        SMPI_RMA_TAG + 2, comm_, MPI_OP_NULL);
+    MPI_Request rreq = Request::rma_recv_init(origin_addr, origin_count, origin_datatype, target_rank, rank_,
+                                              SMPI_RMA_TAG + 2, comm_, MPI_OP_NULL);
 
     //start the send, with another process than us as sender.
     sreq->start();
-    //push request to receiver's win
+    // push request to sender's win
     send_win->mut_->lock();
     send_win->requests_.push_back(sreq);
     send_win->mut_->unlock();
@@ -341,12 +308,11 @@ int Win::accumulate(const void *origin_addr, int origin_count, MPI_Datatype orig
   // SMPI tags, SMPI_RMA_TAG is set below all the other ones we use)
   // prepare send_request
 
-  MPI_Request sreq = Request::rma_send_init(origin_addr, origin_count, origin_datatype, comm_->rank(), target_rank,
+  MPI_Request sreq = Request::rma_send_init(origin_addr, origin_count, origin_datatype, rank_, target_rank,
                                             SMPI_RMA_TAG - 3 - count_, comm_, op);
 
   // prepare receiver request
-  MPI_Request rreq = Request::rma_recv_init(recv_addr, target_count, target_datatype, recv_win->comm_->rank(),
-                                            recv_win->comm_->group()->rank(comm_->group()->actor(target_rank)),
+  MPI_Request rreq = Request::rma_recv_init(recv_addr, target_count, target_datatype, rank_, target_rank,
                                             SMPI_RMA_TAG - 3 - count_, recv_win->comm_, op);
 
   count_++;
@@ -367,6 +333,9 @@ int Win::accumulate(const void *origin_addr, int origin_count, MPI_Datatype orig
     mut_->unlock();
   }
 
+  // FIXME: The current implementation fails to ensure the correct ordering of the accumulate requests.  The following
+  // 'flush' is a workaround to fix that.
+  flush(target_rank);
   XBT_DEBUG("Leaving MPI_Win_Accumulate");
   return MPI_SUCCESS;
 }
@@ -383,7 +352,7 @@ int Win::get_accumulate(const void* origin_addr, int origin_count, MPI_Datatype
 
   XBT_DEBUG("Entering MPI_Get_accumulate from %d", target_rank);
   //need to be sure ops are correctly ordered, so finish request here ? slow.
-  MPI_Request req;
+  MPI_Request req = MPI_REQUEST_NULL;
   send_win->atomic_mut_->lock();
   get(result_addr, result_count, result_datatype, target_rank,
               target_disp, target_count, target_datatype, &req);
@@ -436,29 +405,24 @@ int Win::start(MPI_Group group, int /*assert*/)
   must complete, without further dependencies.  */
 
   //naive, blocking implementation.
-  int i             = 0;
-  int j             = 0;
-  int size          = group->size();
-  std::vector<MPI_Request> reqs(size);
-
   XBT_DEBUG("Entering MPI_Win_Start");
-  while (j != size) {
-    int src = comm_->group()->rank(group->actor(j));
-    if (src != rank_ && src != MPI_UNDEFINED) { // TODO cheinrich: The check of MPI_UNDEFINED should be useless here
-      reqs[i] = Request::irecv_init(nullptr, 0, MPI_CHAR, src, SMPI_RMA_TAG + 4, comm_);
-      i++;
-    }
-    j++;
+  std::vector<MPI_Request> reqs;
+  for (int i = 0; i < group->size(); i++) {
+    int src = comm_->group()->rank(group->actor(i));
+    xbt_assert(src != MPI_UNDEFINED);
+    if (src != rank_)
+      reqs.emplace_back(Request::irecv_init(nullptr, 0, MPI_CHAR, src, SMPI_RMA_TAG + 4, comm_));
   }
-  size = i;
+  int size = static_cast<int>(reqs.size());
+
   Request::startall(size, reqs.data());
   Request::waitall(size, reqs.data(), MPI_STATUSES_IGNORE);
-  for (i = 0; i < size; i++) {
-    Request::unref(&reqs[i]);
-  }
-  opened_++; //we're open for business !
-  group_=group;
+  for (auto& req : reqs)
+    Request::unref(&req);
+
   group->ref();
+  dst_group_ = group;
+  opened_++; // we're open for business !
   XBT_DEBUG("Leaving MPI_Win_Start");
   return MPI_SUCCESS;
 }
@@ -466,30 +430,24 @@ int Win::start(MPI_Group group, int /*assert*/)
 int Win::post(MPI_Group group, int /*assert*/)
 {
   //let's make a synchronous send here
-  int i             = 0;
-  int j             = 0;
-  int size = group->size();
-  std::vector<MPI_Request> reqs(size);
-
   XBT_DEBUG("Entering MPI_Win_Post");
-  while(j!=size){
-    int dst = comm_->group()->rank(group->actor(j));
-    if (dst != rank_ && dst != MPI_UNDEFINED) {
-      reqs[i] = Request::send_init(nullptr, 0, MPI_CHAR, dst, SMPI_RMA_TAG + 4, comm_);
-      i++;
-    }
-    j++;
+  std::vector<MPI_Request> reqs;
+  for (int i = 0; i < group->size(); i++) {
+    int dst = comm_->group()->rank(group->actor(i));
+    xbt_assert(dst != MPI_UNDEFINED);
+    if (dst != rank_)
+      reqs.emplace_back(Request::send_init(nullptr, 0, MPI_CHAR, dst, SMPI_RMA_TAG + 4, comm_));
   }
-  size=i;
+  int size = static_cast<int>(reqs.size());
 
   Request::startall(size, reqs.data());
   Request::waitall(size, reqs.data(), MPI_STATUSES_IGNORE);
-  for(i=0;i<size;i++){
-    Request::unref(&reqs[i]);
-  }
-  opened_++; //we're open for business !
-  group_=group;
+  for (auto& req : reqs)
+    Request::unref(&req);
+
   group->ref();
+  src_group_ = group;
+  opened_++; // we're open for business !
   XBT_DEBUG("Leaving MPI_Win_Post");
   return MPI_SUCCESS;
 }
@@ -498,64 +456,52 @@ int Win::complete(){
   xbt_assert(opened_ != 0, "Complete called on already opened MPI_Win");
 
   XBT_DEBUG("Entering MPI_Win_Complete");
-  int i             = 0;
-  int j             = 0;
-  int size          = group_->size();
-  std::vector<MPI_Request> reqs(size);
-
-  while(j!=size){
-    int dst = comm_->group()->rank(group_->actor(j));
-    if (dst != rank_ && dst != MPI_UNDEFINED) {
-      reqs[i] = Request::send_init(nullptr, 0, MPI_CHAR, dst, SMPI_RMA_TAG + 5, comm_);
-      i++;
-    }
-    j++;
+  std::vector<MPI_Request> reqs;
+  for (int i = 0; i < dst_group_->size(); i++) {
+    int dst = comm_->group()->rank(dst_group_->actor(i));
+    xbt_assert(dst != MPI_UNDEFINED);
+    if (dst != rank_)
+      reqs.emplace_back(Request::send_init(nullptr, 0, MPI_CHAR, dst, SMPI_RMA_TAG + 5, comm_));
   }
-  size=i;
+  int size = static_cast<int>(reqs.size());
+
   XBT_DEBUG("Win_complete - Sending sync messages to %d processes", size);
   Request::startall(size, reqs.data());
   Request::waitall(size, reqs.data(), MPI_STATUSES_IGNORE);
+  for (auto& req : reqs)
+    Request::unref(&req);
 
-  for(i=0;i<size;i++){
-    Request::unref(&reqs[i]);
-  }
+  flush_local_all();
 
-  int finished = finish_comms();
-  XBT_DEBUG("Win_complete - Finished %d RMA calls", finished);
-
-  Group::unref(group_);
   opened_--; //we're closed for business !
+  Group::unref(dst_group_);
+  dst_group_ = MPI_GROUP_NULL;
   return MPI_SUCCESS;
 }
 
 int Win::wait(){
   //naive, blocking implementation.
   XBT_DEBUG("Entering MPI_Win_Wait");
-  int i             = 0;
-  int j             = 0;
-  int size          = group_->size();
-  std::vector<MPI_Request> reqs(size);
-
-  while(j!=size){
-    int src = comm_->group()->rank(group_->actor(j));
-    if (src != rank_ && src != MPI_UNDEFINED) {
-      reqs[i] = Request::irecv_init(nullptr, 0, MPI_CHAR, src, SMPI_RMA_TAG + 5, comm_);
-      i++;
-    }
-    j++;
+  std::vector<MPI_Request> reqs;
+  for (int i = 0; i < src_group_->size(); i++) {
+    int src = comm_->group()->rank(src_group_->actor(i));
+    xbt_assert(src != MPI_UNDEFINED);
+    if (src != rank_)
+      reqs.emplace_back(Request::irecv_init(nullptr, 0, MPI_CHAR, src, SMPI_RMA_TAG + 5, comm_));
   }
-  size=i;
+  int size = static_cast<int>(reqs.size());
+
   XBT_DEBUG("Win_wait - Receiving sync messages from %d processes", size);
   Request::startall(size, reqs.data());
   Request::waitall(size, reqs.data(), MPI_STATUSES_IGNORE);
-  for(i=0;i<size;i++){
-    Request::unref(&reqs[i]);
-  }
-  int finished = finish_comms();
-  XBT_DEBUG("Win_wait - Finished %d RMA calls", finished);
+  for (auto& req : reqs)
+    Request::unref(&req);
+
+  flush_local_all();
 
-  Group::unref(group_);
   opened_--; //we're closed for business !
+  Group::unref(src_group_);
+  src_group_ = MPI_GROUP_NULL;
   return MPI_SUCCESS;
 }
 
@@ -572,12 +518,9 @@ int Win::lock(int lock_type, int rank, int /*assert*/)
   } else if (not(target_win->mode_ == MPI_LOCK_SHARED && lock_type == MPI_LOCK_EXCLUSIVE))
     target_win->mode_ += lock_type; // don't set to exclusive if it's already shared
 
-  target_win->lockers_.push_back(comm_->rank());
+  target_win->lockers_.push_back(rank_);
 
-  int finished = finish_comms(rank);
-  XBT_DEBUG("Win_lock %d - Finished %d RMA calls", rank, finished);
-  finished = target_win->finish_comms(rank_);
-  XBT_DEBUG("Win_lock target %d - Finished %d RMA calls", rank, finished);
+  flush(rank);
   return MPI_SUCCESS;
 }
 
@@ -595,15 +538,12 @@ int Win::unlock(int rank){
   MPI_Win target_win = connected_wins_[rank];
   int target_mode = target_win->mode_;
   target_win->mode_= 0;
-  target_win->lockers_.remove(comm_->rank());
+  target_win->lockers_.remove(rank_);
   if (target_mode==MPI_LOCK_EXCLUSIVE){
     target_win->lock_mut_->unlock();
   }
 
-  int finished = finish_comms(rank);
-  XBT_DEBUG("Win_unlock %d - Finished %d RMA calls", rank, finished);
-  finished = target_win->finish_comms(rank_);
-  XBT_DEBUG("Win_unlock target %d - Finished %d RMA calls", rank, finished);
+  flush(rank);
   return MPI_SUCCESS;
 }
 
@@ -618,33 +558,36 @@ int Win::unlock_all(){
 }
 
 int Win::flush(int rank){
-  MPI_Win target_win = connected_wins_[rank];
-  int finished       = finish_comms(rank_);
-  XBT_DEBUG("Win_flush on local %d - Finished %d RMA calls", rank_, finished);
-  finished = target_win->finish_comms(rank);
-  XBT_DEBUG("Win_flush on remote %d - Finished %d RMA calls", rank, finished);
+  int finished = finish_comms(rank);
+  XBT_DEBUG("Win_flush on local %d for remote %d - Finished %d RMA calls", rank_, rank, finished);
+  if (rank != rank_) {
+    finished = connected_wins_[rank]->finish_comms(rank_);
+    XBT_DEBUG("Win_flush on remote %d for local %d - Finished %d RMA calls", rank, rank_, finished);
+  }
   return MPI_SUCCESS;
 }
 
 int Win::flush_local(int rank){
   int finished = finish_comms(rank);
-  XBT_DEBUG("Win_flush_local for rank %d - Finished %d RMA calls", rank, finished);
+  XBT_DEBUG("Win_flush_local on local %d for remote %d - Finished %d RMA calls", rank_, rank, finished);
   return MPI_SUCCESS;
 }
 
 int Win::flush_all(){
   int finished = finish_comms();
-  XBT_DEBUG("Win_flush_all on local - Finished %d RMA calls", finished);
+  XBT_DEBUG("Win_flush_all on local %d - Finished %d RMA calls", rank_, finished);
   for (int i = 0; i < comm_->size(); i++) {
-    finished = connected_wins_[i]->finish_comms(rank_);
-    XBT_DEBUG("Win_flush_all on %d - Finished %d RMA calls", i, finished);
+    if (i != rank_) {
+      finished = connected_wins_[i]->finish_comms(rank_);
+      XBT_DEBUG("Win_flush_all on remote %d for local %d - Finished %d RMA calls", i, rank_, finished);
+    }
   }
   return MPI_SUCCESS;
 }
 
 int Win::flush_local_all(){
   int finished = finish_comms();
-  XBT_DEBUG("Win_flush_local_all - Finished %d RMA calls", finished);
+  XBT_DEBUG("Win_flush_local_all on local %d - Finished %d RMA calls", rank_, finished);
   return MPI_SUCCESS;
 }
 
@@ -653,6 +596,10 @@ Win* Win::f2c(int id){
 }
 
 int Win::finish_comms(){
+  // This (simulated) mutex ensures that no process pushes to the vector of requests during the waitall.
+  // Without this, the vector could get redimensioned when another process pushes.
+  // This would result in the array used by Request::waitall() to be invalidated.
+  // Another solution would be to copy the data and cleanup the vector *before* Request::waitall
   mut_->lock();
   //Finish own requests
   int size = static_cast<int>(requests_.size());
@@ -666,6 +613,7 @@ int Win::finish_comms(){
 }
 
 int Win::finish_comms(int rank){
+  // See comment about the mutex in finish_comms() above
   mut_->lock();
   // Finish own requests
   // Let's see if we're either the destination or the sender of this request
index 4242dc5..f12f6a4 100644 (file)
 #include "ampi.hpp"
 #include <smpi/sampi.h>
 
-static std::vector<size_t> memory_size(500, 0); // FIXME cheinrich This needs to be dynamic
-static std::map</*address*/ void*, size_t> alloc_table; // Keep track of all allocations
+class AllocTracker {
+  std::vector<size_t> memory_size_;
+  std::map</*address*/ void*, size_t> alloc_table_; // Keep track of all allocations
+
+public:
+  void record(void* ptr, size_t size)
+  {
+    alloc_table_.emplace(ptr, size);
+    if (not simgrid::s4u::this_actor::is_maestro()) {
+      auto actor = static_cast<size_t>(simgrid::s4u::this_actor::get_pid());
+      if (actor >= memory_size_.size())
+        memory_size_.resize(actor + 1, 0);
+      memory_size_[actor] += size;
+    }
+  }
+
+  void forget(void* ptr)
+  {
+    auto elm = alloc_table_.find(ptr);
+    xbt_assert(elm != alloc_table_.end());
+    if (not simgrid::s4u::this_actor::is_maestro()) {
+      auto actor = static_cast<size_t>(simgrid::s4u::this_actor::get_pid());
+      memory_size_.at(actor) -= elm->second; // size
+    }
+    alloc_table_.erase(elm);
+  }
+
+  size_t summary() const
+  {
+    if (simgrid::s4u::this_actor::is_maestro())
+      return 0;
+    auto actor = static_cast<size_t>(simgrid::s4u::this_actor::get_pid());
+    return actor < memory_size_.size() ? memory_size_[actor] : 0;
+  }
+};
+
+static AllocTracker alloc_tracker;
 
 extern "C" void* _sampi_malloc(size_t size)
 {
   void* result = xbt_malloc(size);
-  alloc_table.insert({result, size});
-  if (not simgrid::s4u::this_actor::is_maestro()) {
-    memory_size[simgrid::s4u::this_actor::get_pid()] += size;
-  }
+  alloc_tracker.record(result, size);
   return result;
 }
 
 extern "C" void _sampi_free(void* ptr)
 {
-  size_t alloc_size = alloc_table.at(ptr);
-  aid_t my_proc_id  = simgrid::s4u::this_actor::get_pid();
-  memory_size[my_proc_id] -= alloc_size;
+  alloc_tracker.forget(ptr);
   xbt_free(ptr);
 }
 
 extern "C" void* _sampi_calloc(size_t num_elm, size_t elem_size)
 {
-  void* result = xbt_malloc0(num_elm * elem_size);
-  alloc_table.insert({result, num_elm * elem_size});
-  if (not simgrid::s4u::this_actor::is_maestro()) {
-    memory_size[simgrid::s4u::this_actor::get_pid()] += num_elm * elem_size;
-  }
+  size_t size  = num_elm * elem_size;
+  void* result = xbt_malloc0(size);
+  alloc_tracker.record(result, size);
   return result;
 }
 extern "C" void* _sampi_realloc(void* ptr, size_t size)
 {
+  alloc_tracker.forget(ptr);
   void* result = xbt_realloc(ptr, size);
-  size_t old_size = alloc_table.at(ptr);
-  alloc_table.erase(ptr);
-  alloc_table.insert({result, size});
-  if (not simgrid::s4u::this_actor::is_maestro()) {
-    memory_size[simgrid::s4u::this_actor::get_pid()] += size - old_size;
-  }
+  alloc_tracker.record(result, size);
   return result;
 }
 
@@ -74,26 +98,22 @@ xbt::signal<void(s4u::Actor const&)> on_iteration_out;
  */
 int APMPI_Iteration_in(MPI_Comm comm)
 {
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   TRACE_Iteration_in(comm->rank() + 1, new simgrid::instr::NoOpTIData("iteration_in")); // implemented on instr_smpi.c
-  smpi_bench_begin();
   return 1;
 }
 
 int APMPI_Iteration_out(MPI_Comm comm)
 {
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
   TRACE_Iteration_out(comm->rank() + 1, new simgrid::instr::NoOpTIData("iteration_out"));
-  smpi_bench_begin();
   return 1;
 }
 
 void APMPI_Migrate(MPI_Comm comm)
 {
-  smpi_bench_end();
-  aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
-  TRACE_migration_call(comm->rank() + 1, new simgrid::instr::AmpiMigrateTIData(memory_size[my_proc_id]));
-  smpi_bench_begin();
+  const SmpiBenchGuard suspend_bench;
+  TRACE_migration_call(comm->rank() + 1, new simgrid::instr::AmpiMigrateTIData(alloc_tracker.summary()));
 }
 
 int AMPI_Iteration_in(MPI_Comm comm)
index d1b24a5..bfa4240 100644 (file)
@@ -37,7 +37,7 @@ void TRACE_migration_call(aid_t pid, simgrid::instr::TIData* extra)
   if(smpi_process()->replaying()) {//When replaying, we register an event.
     smpi_container(pid)->get_state("MIGRATE_STATE")->add_entity_value(operation);
 
-    auto* type = static_cast<simgrid::instr::EventType*>(smpi_container(pid)->type_->by_name(operation));
+    auto* type = static_cast<simgrid::instr::EventType*>(smpi_container(pid)->get_type()->by_name(operation));
     new simgrid::instr::NewEvent(smpi_process()->simulated_elapsed(), smpi_container(pid), type,
                                  type->get_entity_value(operation));
   } else {
index 8016e28..d8cb726 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2018-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "simgrid/s4u.hpp"
 #include "smpi/smpi.h"
 #include "xbt/asserts.h"
index ac3e393..6c62ff4 100755 (executable)
@@ -24,6 +24,9 @@ SPEED="${DEFAULT_SPEED}"
 
 PRIVATIZE="--cfg=smpi/privatization:${SMPI_PRIVATIZATION:-@HAVE_PRIVATIZATION@}"
 
+NUMPROCS=0
+DEPLOYOPTS=""
+
 SIMOPTS="--cfg=surf/precision:1e-9 --cfg=network/model:SMPI"
 
 SMPITMPDIR="$(dirname $(mktemp -u))"
@@ -31,8 +34,8 @@ SMPITMPDIR="$(dirname $(mktemp -u))"
 #usage to print the way this script should be called
 usage () {
     cat <<EOF
-Usage: $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> program [program-options]
-       $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> -replay <tracefile> [program] [program-options]
+Usage: $0 [OPTIONS] -platform <xmldesc|so> -hostfile <hostfile> program [program-options]
+       $0 [OPTIONS] -platform <xmldesc|so> -hostfile <hostfile> -replay <tracefile> [program] [program-options]
 Options:
   -analyze                   # show information about allocations and timings at the end of execution
   -keep-temps                # don't remove the generated files after execution
@@ -72,9 +75,6 @@ fi
 
 WRAPPER=""
 HOSTFILE=""
-HOSTFILETMP=0
-MAPOPT=0
-REPLAY=0
 QUIET=""
 
 unset pid
@@ -93,18 +93,10 @@ smpirun_cleanup()
         rm -f "${PLATFORMTMP}"
         PLATFORMTMP=""
       fi
-      if [ ${HOSTFILETMP} = 1 ] && [ -n "$HOSTFILE" ] ; then
-          rm -f "${HOSTFILE}"
-          HOSTFILE=""
-      fi
       if [ "${UNROLLEDHOSTFILETMP}" = 1 ] && [ -n "$UNROLLEDHOSTFILE" ] ; then
           rm -f "${UNROLLEDHOSTFILE}"
           UNROLLEDHOSTFILE=""
       fi
-      if [ -n "${APPLICATIONTMP}" ]; then
-        rm -f "${APPLICATIONTMP}"
-        APPLICATIONTMP=""
-      fi
   fi
 }
 
@@ -162,6 +154,10 @@ while true; do
             ;;
         "-replay")
             APP_TRACES="$2"
+            if [ ! -f "${APP_TRACES}" ]; then
+                die "the file '${APP_TRACES}' does not exist"
+            fi
+            DEPLOYOPTS="${DEPLOYOPTS} --cfg=smpi/replay:${APP_TRACES}"
             shift 2
             ;;
         "-no-privatize")
@@ -169,7 +165,7 @@ while true; do
             shift 1
             ;;
         "-map")
-            MAPOPT=1
+            DEPLOYOPTS="${DEPLOYOPTS} --cfg=smpi/map:1"
             shift 1
             ;;
         "-tmpdir")
@@ -316,36 +312,10 @@ if [ -z "${HOSTFILE}" ] && [ -z "${PLATFORM}" ] ; then
     exit 1
 fi
 
-if [ -z "${HOSTFILE}" ] ; then
-    HOSTFILETMP=1
-    HOSTFILE="$(mktemp smpitmp-hostfXXXXXX)"
-    @PYTHON_EXECUTABLE@ -c '
-import xml.etree.ElementTree as ET
-import sys
-import re
-
-tree = ET.parse(sys.stdin)
-
-for elem in tree.findall(".//host"):
-    print(elem.attrib["id"])
-
-for elem in tree.findall(".//cluster"):
-    prefix = elem.attrib["prefix"]
-    radical = elem.attrib["radical"]
-    suffix = elem.attrib["suffix"]
-    for r in radical.split(","):
-        m = re.match("^([^-]*?)-([^-]*)$", r)
-        if m:
-            for i in range(int(m.group(1)), int(m.group(2))):
-                print(prefix + str(i) + suffix)
-        else:
-            print(prefix + r + suffix)
-            ' < "${PLATFORM}" > "${HOSTFILE}"
-fi
 UNROLLEDHOSTFILETMP=0
 
 # parse if our lines are terminated by :num_process
-if grep -q ':' "$HOSTFILE" ; then
+if [ -n "${HOSTFILE}" ] && grep -q ':' "${HOSTFILE}" ; then
     UNROLLEDHOSTFILETMP=1
     UNROLLEDHOSTFILE="$(mktemp smpitmp-hostfXXXXXX)"
     @PYTHON_EXECUTABLE@ -c '
@@ -360,27 +330,11 @@ for line in sys.stdin:
     else:
         print(line.strip())
 ' < "${HOSTFILE}"  > "${UNROLLEDHOSTFILE}"
-    if [ ${HOSTFILETMP} = 1 ] ; then
-        rm "${HOSTFILE}"
-        HOSTFILETMP=0
-    fi
     HOSTFILE=$UNROLLEDHOSTFILE
 fi
 
-# Don't use wc -l to compute it to avoid issues with trailing \n at EOF
-hostfile_procs=$(grep -c "[a-zA-Z0-9]" "$HOSTFILE")
-if [ "${hostfile_procs}" = 0 ] ; then
-    die "the hostfile '${HOSTFILE}' is empty"
-fi
-
-if [ -z "${NUMPROCS}" ] ; then
-    # Use the amount of processes in the hostfile as default value for the -np parameter
-    NUMPROCS=$hostfile_procs
-fi
-
-if [ "${NUMPROCS}" -gt "${hostfile_procs}" ] ; then
-    echo "You requested to use ${NUMPROCS} ranks, but there is only ${hostfile_procs} processes in your hostfile..." >&2
-fi
+DEPLOYOPTS="${DEPLOYOPTS} --cfg=smpi/np:${NUMPROCS}"
+DEPLOYOPTS="${DEPLOYOPTS} --cfg=smpi/hostfile:${HOSTFILE}"
 
 ##-------------------------------- DEFAULT or SPECIFIED PLATFORM --------------------------------------
 if [ -z "${PLATFORM}" ]; then
@@ -426,92 +380,6 @@ else
     PLATFORMTMP=${PLATFORM}
 fi
 ##-------------------------------- end DEFAULT or SPECIFIED PLATFORM --------------------------------------
-##-------------------------------- DEFAULT APPLICATION --------------------------------------
-APPLICATIONTMP="$(mktemp smpitmp-appXXXXXX)"
-#APPLICATIONTMP="app.xml"
-
-cat > "${APPLICATIONTMP}" <<APPLICATIONHEAD
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "https://simgrid.org/simgrid.dtd">
-<platform version="4.1">
-APPLICATIONHEAD
-
-##---- cache hostnames of hostfile---------------
-if [ -n "${HOSTFILE}" ] && [ -f "${HOSTFILE}" ]; then
-    hostnames=$(< "${HOSTFILE}" tr '\n\r' '  ')
-fi
-
-if [ -n "${APP_TRACES}" ]; then
-    if [ -f "${APP_TRACES}" ]; then
-        hosttraces=$(< "${APP_TRACES}" tr '\n\r' '  ' )
-        NUMTRACES=$(< "${APP_TRACES}" wc -l)
-        REPLAY=1
-    else
-        printf "File not found: %s\n" "${APP_TRACES:-\${APP_TRACES\}}" >&2
-        exit 1
-    fi
-fi
-
-##----------------------------------------------------------
-##  generate application.xml with hostnames from hostfile:
-##  the name of host_i (1<=i<=p, where -np p) is the line i in hostfile (where -hostfile hostfile), or "host$i" if
-##  hostfile has less than i lines.
-##----------------------------------------------------------
-
-HAVE_SEQ="$(which seq 2>/dev/null)"
-
-if [ -n "${HAVE_SEQ}" ]; then
-    SEQ=$(${HAVE_SEQ} 0 $(( NUMPROCS - 1)))
-else
-    cnt=0
-    while [ $cnt -lt "${NUMPROCS}" ] ; do
-        SEQ="$SEQ $cnt"
-        cnt=$((cnt + 1));
-    done
-fi
-
-set -- $hostnames
-
-##---- generate <actor> tags------------------------------
-#prepare arguments at once
-for ARG in $PROC_ARGS; do
-  XML_ARGS="${XML_ARGS}""<argument value=\"${ARG}\"/>
-"
-done
-
-for i in ${SEQ}
-do
-    j=$(( i % hostfile_procs + 1 ))
-    host=$(eval "echo \${$j}")
-
-    ##---- optional display of ranks to actor mapping
-    if [ ${MAPOPT} = 1 ]; then
-      echo "[rank $i] -> $host"
-    fi
-    {
-    echo "  <actor host=\"${host}\" function=\"$i\"> <!-- function name used only for logging -->
-    <prop id=\"instance_id\" value=\"smpirun\"/>
-    <prop id=\"rank\" value=\"$i\"/>"
-    if [ ${REPLAY} = 1 ]; then
-        echo "    <prop id=\"smpi_replay\" value=\"true\"/>"
-        if  [ "${NUMTRACES}" -gt 1 ]; then
-           # Give each process its trace file (as an argument)
-            echo "    <argument value=\"$(echo "$hosttraces"|cut -d' ' -f$j)\"/>"
-        elif [ ${i} = 0 ]; then
-           # Give the shared trace file to rank 0 (as a property)
-            echo "    <prop id=\"tracefile\" value=\"$(echo "$hosttraces"|cut -d' ' -f1)\"/>"
-        fi
-    else
-    echo "${XML_ARGS}"
-    fi
-    echo "  </actor>"
-    }    >> "${APPLICATIONTMP}"
-done
-
-cat >> "${APPLICATIONTMP}" <<APPLICATIONFOOT
-</platform>
-APPLICATIONFOOT
-##-------------------------------- end DEFAULT APPLICATION --------------------------------------
 ##---------------------- SMPI TRACING OPTIONS ---------------------------------
 if [ -n "${TRACE_ACTIVE}" ]; then
     #define trace filename
@@ -548,10 +416,7 @@ fi
 # Do not remove, this variable may be used by user code (e.g. StarPU)
 export SMPI_GLOBAL_SIZE=${NUMPROCS}
 if [ -n "${KEEP}" ] && [ -z "${QUIET}" ] ; then
-    echo "${EXEC}" ${PRIVATIZE} "${TRACEOPTIONS}" "${SIMOPTS}" "${PLATFORMTMP}" "${APPLICATIONTMP}"
-    if [ ${HOSTFILETMP} = 1 ] ; then
-        echo "Generated hostfile ${HOSTFILE} kept."
-    fi
+    echo "${EXEC}" ${PRIVATIZE} "${TRACEOPTIONS}" "${SIMOPTS}" "${PLATFORMTMP}"
     if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
         echo "Generated unrolled hostfile ${UNROLLEDHOSTFILE} kept."
     fi
@@ -568,7 +433,7 @@ fi
 # * The FD 3 is used to temporarily store FD 1. This is because the shell connects FD 1 to /dev/null when the command
 #   is launched in the background: this can be overridden in bash but not in standard bourne shell.
 exec 3<&0
-${WRAPPER} "@SMPIMAIN@" "${EXEC}" ${PRIVATIZE} ${TRACEOPTIONS} ${SIMOPTS} "${PLATFORMTMP}" "${APPLICATIONTMP}" <&3 3>&- &
+${WRAPPER} "@SMPIMAIN@" "${EXEC}" ${PRIVATIZE} ${DEPLOYOPTS} ${TRACEOPTIONS} ${SIMOPTS} "${PLATFORMTMP}" ${PROC_ARGS} <&3 3>&- &
 pid=$!
 exec 3>&-
 wait $pid
@@ -585,10 +450,7 @@ pid=""
 #
 if [ ${status} -ne 0 ] ; then
     if [ -z "${KEEP}" ] && [ -z "${QUIET}" ]; then
-        echo "${EXEC}" ${PRIVATIZE} "${TRACEOPTIONS}" "${SIMOPTS}" "${PLATFORMTMP}" "${APPLICATIONTMP}"
-        if [ ${HOSTFILETMP} = 1 ] ; then
-            echo "Generated hostfile ${HOSTFILE} kept."
-        fi
+        echo "${EXEC}" ${PRIVATIZE} "${TRACEOPTIONS}" "${SIMOPTS}" "${PLATFORMTMP}"
         if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
             echo "Generated unrolled hostfile ${UNROLLEDHOSTFILE} kept."
         fi
index 3d6f180..e81edd4 100644 (file)
@@ -159,7 +159,7 @@ void HostImpl::seal()
     return;
   }
   // seals host's CPU
-  get_iface()->pimpl_cpu->seal();
+  get_iface()->get_cpu()->seal();
   sealed_ = true;
 
   /* seal its disks */
diff --git a/src/surf/LinkImpl.cpp b/src/surf/LinkImpl.cpp
new file mode 100644 (file)
index 0000000..ecbf1ac
--- /dev/null
@@ -0,0 +1,147 @@
+/* Copyright (c) 2013-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "src/surf/LinkImpl.hpp"
+#include "simgrid/s4u/Engine.hpp"
+#include "surf/surf.hpp"
+
+#include <numeric>
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_network);
+
+/*********
+ * Model *
+ *********/
+
+namespace simgrid {
+namespace kernel {
+namespace resource {
+
+LinkImpl::LinkImpl(const std::string& name) : LinkImplIntf(name), piface_(this)
+{
+  if (name != "__loopback__")
+    xbt_assert(not s4u::Link::by_name_or_null(name), "Link '%s' declared several times in the platform.", name.c_str());
+
+  s4u::Engine::get_instance()->link_register(name, &piface_);
+  XBT_DEBUG("Create link '%s'", name.c_str());
+}
+
+/** @brief Fire the required callbacks and destroy the object
+ *
+ * Don't delete directly a Link, call l->destroy() instead.
+ */
+void LinkImpl::destroy()
+{
+  s4u::Link::on_destruction(this->piface_);
+  delete this;
+}
+
+bool LinkImpl::is_used() const
+{
+  return get_model()->get_maxmin_system()->constraint_used(get_constraint());
+}
+
+constexpr kernel::lmm::Constraint::SharingPolicy to_maxmin_policy(s4u::Link::SharingPolicy policy)
+{
+  switch (policy) {
+    case s4u::Link::SharingPolicy::NONLINEAR:
+      return kernel::lmm::Constraint::SharingPolicy::NONLINEAR;
+    case s4u::Link::SharingPolicy::FATPIPE:
+      return kernel::lmm::Constraint::SharingPolicy::FATPIPE;
+    default:
+      return kernel::lmm::Constraint::SharingPolicy::SHARED;
+  }
+}
+
+void LinkImpl::set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb)
+{
+  get_constraint()->set_sharing_policy(to_maxmin_policy(policy), cb);
+  sharing_policy_ = policy;
+}
+
+s4u::Link::SharingPolicy LinkImpl::get_sharing_policy() const
+{
+  return sharing_policy_;
+}
+
+void LinkImpl::latency_check(double latency) const
+{
+  static double last_warned_latency = sg_surf_precision;
+  if (latency != 0.0 && latency < last_warned_latency) {
+    XBT_WARN("Latency for link %s is smaller than surf/precision (%g < %g)."
+             " For more accuracy, consider setting \"--cfg=surf/precision:%g\".",
+             get_cname(), latency, sg_surf_precision, latency);
+    last_warned_latency = latency;
+  }
+}
+
+void LinkImpl::turn_on()
+{
+  if (not is_on()) {
+    Resource::turn_on();
+    s4u::Link::on_state_change(piface_);
+  }
+}
+
+void LinkImpl::turn_off()
+{
+  if (is_on()) {
+    Resource::turn_off();
+    s4u::Link::on_state_change(piface_);
+
+    const kernel::lmm::Element* elem = nullptr;
+    double now                       = surf_get_clock();
+    while (const auto* var = get_constraint()->get_variable(&elem)) {
+      Action* action = var->get_id();
+      if (action->get_state() == Action::State::INITED || action->get_state() == Action::State::STARTED) {
+        action->set_finish_time(now);
+        action->set_state(Action::State::FAILED);
+      }
+    }
+  }
+}
+
+void LinkImpl::seal()
+{
+  if (is_sealed())
+    return;
+
+  xbt_assert(this->get_model(), "Cannot seal Link(%s) without setting the Network model first", this->get_cname());
+  Resource::seal();
+  s4u::Link::on_creation(piface_);
+}
+
+void LinkImpl::on_bandwidth_change() const
+{
+  s4u::Link::on_bandwidth_change(piface_);
+}
+
+void LinkImpl::set_bandwidth_profile(profile::Profile* profile)
+{
+  if (profile) {
+    xbt_assert(bandwidth_.event == nullptr, "Cannot set a second bandwidth profile to Link %s", get_cname());
+    bandwidth_.event = profile->schedule(&profile::future_evt_set, this);
+  }
+}
+
+void LinkImpl::set_latency_profile(profile::Profile* profile)
+{
+  if (profile) {
+    xbt_assert(latency_.event == nullptr, "Cannot set a second latency profile to Link %s", get_cname());
+    latency_.event = profile->schedule(&profile::future_evt_set, this);
+  }
+}
+
+void LinkImpl::set_concurrency_limit(int limit) const
+{
+  if (limit != -1) {
+    get_constraint()->reset_concurrency_maximum();
+  }
+  get_constraint()->set_concurrency_limit(limit);
+}
+
+} // namespace resource
+} // namespace kernel
+} // namespace simgrid
\ No newline at end of file
diff --git a/src/surf/LinkImpl.hpp b/src/surf/LinkImpl.hpp
new file mode 100644 (file)
index 0000000..d560879
--- /dev/null
@@ -0,0 +1,81 @@
+/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef SIMGRID_KERNEL_RESOURCE_LINKIMPL_HPP
+#define SIMGRID_KERNEL_RESOURCE_LINKIMPL_HPP
+
+#include "src/surf/LinkImplIntf.hpp"
+
+/***********
+ * Classes *
+ ***********/
+
+namespace simgrid {
+namespace kernel {
+namespace resource {
+/************
+ * Resource *
+ ************/
+/** @ingroup SURF_network_interface
+ * @brief SURF network link interface class
+ * @details A Link represents the link between two [hosts](@ref simgrid::surf::HostImpl)
+ */
+class LinkImpl : public LinkImplIntf {
+  s4u::Link piface_;
+  s4u::Link::SharingPolicy sharing_policy_ = s4u::Link::SharingPolicy::SHARED;
+
+protected:
+  explicit LinkImpl(const std::string& name);
+  LinkImpl(const LinkImpl&) = delete;
+  LinkImpl& operator=(const LinkImpl&) = delete;
+  ~LinkImpl() override                 = default; // Use destroy() instead of this destructor.
+
+  Metric latency_   = {0.0, 1, nullptr};
+  Metric bandwidth_ = {1.0, 1, nullptr};
+
+public:
+  void destroy(); // Must be called instead of the destructor
+
+  void latency_check(double latency) const;
+
+  /** @brief Public interface */
+  const s4u::Link* get_iface() const { return &piface_; }
+  s4u::Link* get_iface() { return &piface_; }
+
+  /** @brief Get the bandwidth in bytes per second of current Link */
+  double get_bandwidth() const override { return bandwidth_.peak * bandwidth_.scale; }
+
+  /** @brief Get the latency in seconds of current Link */
+  double get_latency() const override { return latency_.peak * latency_.scale; }
+
+  /** @brief The sharing policy */
+  void set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb) override;
+  s4u::Link::SharingPolicy get_sharing_policy() const override;
+
+  /** @brief Check if the Link is used */
+  bool is_used() const override;
+
+  void turn_on() override;
+  void turn_off() override;
+
+  void seal() override;
+
+  void on_bandwidth_change() const;
+
+  /* setup the profile file with bandwidth events (peak speed changes due to external load).
+   * Profile must contain percentages (value between 0 and 1). */
+  void set_bandwidth_profile(kernel::profile::Profile* profile) override;
+  /* setup the profile file with latency events (peak latency changes due to external load).
+   * Profile must contain absolute values */
+  void set_latency_profile(kernel::profile::Profile* profile) override;
+
+  void set_concurrency_limit(int limit) const override;
+};
+
+} // namespace resource
+} // namespace kernel
+} // namespace simgrid
+
+#endif /* SIMGRID_KERNEL_RESOURCE_LINKIMPL_HPP */
diff --git a/src/surf/LinkImplIntf.hpp b/src/surf/LinkImplIntf.hpp
new file mode 100644 (file)
index 0000000..aac4b84
--- /dev/null
@@ -0,0 +1,58 @@
+/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef SIMGRID_KERNEL_RESOURCE_LINKIMPLINTF_HPP
+#define SIMGRID_KERNEL_RESOURCE_LINKIMPLINTF_HPP
+
+#include "simgrid/kernel/resource/Resource.hpp"
+#include "simgrid/s4u/Link.hpp"
+#include <xbt/PropertyHolder.hpp>
+
+/***********
+ * Classes *
+ ***********/
+
+namespace simgrid {
+namespace kernel {
+namespace resource {
+/************
+ * Resource *
+ ************/
+/** @ingroup SURF_interface
+ * @brief SURF network link interface class
+ * @details A Link represents the link between two [hosts](@ref simgrid::surf::HostImpl)
+ */
+class LinkImplIntf : public Resource_T<LinkImplIntf>, public xbt::PropertyHolder {
+public:
+  using Resource_T::Resource_T;
+  /** @brief Get the bandwidth in bytes per second of current Link */
+  virtual double get_bandwidth() const = 0;
+  /** @brief Update the bandwidth in bytes per second of current Link */
+  virtual void set_bandwidth(double value) = 0;
+
+  /** @brief Get the latency in seconds of current Link */
+  virtual double get_latency() const = 0;
+  /** @brief Update the latency in seconds of current Link */
+  virtual void set_latency(double value) = 0;
+
+  /** @brief The sharing policy */
+  virtual void set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb) = 0;
+  virtual s4u::Link::SharingPolicy get_sharing_policy() const      = 0;
+
+  /* setup the profile file with bandwidth events (peak speed changes due to external load).
+   * Profile must contain percentages (value between 0 and 1). */
+  virtual void set_bandwidth_profile(kernel::profile::Profile* profile) = 0;
+  /* setup the profile file with latency events (peak latency changes due to external load).
+   * Profile must contain absolute values */
+  virtual void set_latency_profile(kernel::profile::Profile* profile) = 0;
+  /** @brief Set the concurrency limit for this link */
+  virtual void set_concurrency_limit(int limit) const = 0;
+};
+
+} // namespace resource
+} // namespace kernel
+} // namespace simgrid
+
+#endif /* SIMGRID_KERNEL_RESOURCE_LINKIMPLINTF_HPP */
diff --git a/src/surf/SplitDuplexLinkImpl.cpp b/src/surf/SplitDuplexLinkImpl.cpp
new file mode 100644 (file)
index 0000000..99ddebe
--- /dev/null
@@ -0,0 +1,97 @@
+/* Copyright (c) 2013-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "src/surf/SplitDuplexLinkImpl.hpp"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_network);
+
+/*********
+ * Model *
+ *********/
+
+namespace simgrid {
+namespace kernel {
+namespace resource {
+
+SplitDuplexLinkImpl::SplitDuplexLinkImpl(const std::string& name, LinkImpl* link_up, LinkImpl* link_down)
+    : LinkImplIntf(name), piface_(this), link_up_(link_up), link_down_(link_down)
+{
+}
+
+bool SplitDuplexLinkImpl::is_used() const
+{
+  xbt_die("Impossible to call is_used() in split-duplex links. Call it for each individual link.");
+}
+
+void SplitDuplexLinkImpl::set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb)
+{
+  xbt_assert(policy != s4u::Link::SharingPolicy::SPLITDUPLEX && policy != s4u::Link::SharingPolicy::WIFI,
+             "Invalid sharing policy for split-duplex links");
+  link_up_->set_sharing_policy(policy, cb);
+  link_down_->set_sharing_policy(policy, cb);
+}
+
+void SplitDuplexLinkImpl::set_bandwidth(double value)
+{
+  link_up_->set_bandwidth(value);
+  link_down_->set_bandwidth(value);
+}
+
+void SplitDuplexLinkImpl::set_latency(double value)
+{
+  link_up_->set_latency(value);
+  link_down_->set_latency(value);
+}
+
+void SplitDuplexLinkImpl::turn_on()
+{
+  link_up_->turn_on();
+  link_down_->turn_on();
+}
+
+void SplitDuplexLinkImpl::turn_off()
+{
+  link_up_->turn_off();
+  link_down_->turn_off();
+}
+
+void SplitDuplexLinkImpl::apply_event(profile::Event* event, double value)
+{
+  link_up_->apply_event(event, value);
+  link_down_->apply_event(event, value);
+}
+
+void SplitDuplexLinkImpl::seal()
+{
+  if (is_sealed())
+    return;
+
+  link_up_->seal();
+  link_down_->seal();
+
+  Resource::seal();
+}
+
+void SplitDuplexLinkImpl::set_bandwidth_profile(profile::Profile* profile)
+{
+  link_up_->set_bandwidth_profile(profile);
+  link_down_->set_bandwidth_profile(profile);
+}
+
+void SplitDuplexLinkImpl::set_latency_profile(profile::Profile* profile)
+{
+  link_up_->set_latency_profile(profile);
+  link_down_->set_latency_profile(profile);
+}
+
+void SplitDuplexLinkImpl::set_concurrency_limit(int limit) const
+{
+  link_up_->set_concurrency_limit(limit);
+  link_down_->set_concurrency_limit(limit);
+}
+
+} // namespace resource
+} // namespace kernel
+} // namespace simgrid
diff --git a/src/surf/SplitDuplexLinkImpl.hpp b/src/surf/SplitDuplexLinkImpl.hpp
new file mode 100644 (file)
index 0000000..4842f08
--- /dev/null
@@ -0,0 +1,80 @@
+/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef SIMGRID_KERNEL_RESOURCE_SDLINKIMPL_HPP
+#define SIMGRID_KERNEL_RESOURCE_SDLINKIMPL_HPP
+
+#include "src/surf/LinkImpl.hpp"
+#include "src/surf/LinkImplIntf.hpp"
+
+/***********
+ * Classes *
+ ***********/
+
+namespace simgrid {
+namespace kernel {
+namespace resource {
+/************
+ * Resource *
+ ************/
+/** @ingroup SURF_network_interface
+ * @brief SURF network link interface class
+ * @details A Link represents the link between two [hosts](@ref simgrid::surf::HostImpl)
+ */
+class SplitDuplexLinkImpl : public LinkImplIntf {
+  s4u::SplitDuplexLink piface_;
+  LinkImpl* link_up_;
+  LinkImpl* link_down_;
+
+protected:
+  SplitDuplexLinkImpl(const LinkImpl&) = delete;
+  SplitDuplexLinkImpl& operator=(const LinkImpl&) = delete;
+
+public:
+  SplitDuplexLinkImpl(const std::string& name, LinkImpl* link_up, LinkImpl* link_down);
+  /** @brief Public interface */
+  const s4u::SplitDuplexLink* get_iface() const { return &piface_; }
+  s4u::SplitDuplexLink* get_iface() { return &piface_; }
+
+  /** @brief Get the bandwidth in bytes per second of current Link */
+  double get_bandwidth() const override { return link_up_->get_bandwidth(); }
+  void set_bandwidth(double value) override;
+
+  /** @brief Get the latency in seconds of current Link */
+  double get_latency() const override { return link_up_->get_latency(); }
+  void set_latency(double value) override;
+
+  /** @brief The sharing policy */
+  void set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb) override;
+  s4u::Link::SharingPolicy get_sharing_policy() const override { return s4u::Link::SharingPolicy::SPLITDUPLEX; }
+
+  /** @brief Get link composing this split-duplex link */
+  s4u::Link* get_link_up() const { return link_up_->get_iface(); }
+  s4u::Link* get_link_down() const { return link_down_->get_iface(); }
+
+  /** @brief Check if the Link is used */
+  bool is_used() const override;
+
+  void turn_on() override;
+  void turn_off() override;
+
+  void seal() override;
+
+  void apply_event(profile::Event* event, double value) override;
+
+  /* setup the profile file with bandwidth events (peak speed changes due to external load).
+   * Profile must contain percentages (value between 0 and 1). */
+  void set_bandwidth_profile(kernel::profile::Profile* profile) override;
+  /* setup the profile file with latency events (peak latency changes due to external load).
+   * Profile must contain absolute values */
+  void set_latency_profile(kernel::profile::Profile* profile) override;
+  void set_concurrency_limit(int limit) const override;
+};
+
+} // namespace resource
+} // namespace kernel
+} // namespace simgrid
+
+#endif /* SIMGRID_KERNEL_RESOURCE_SDLINKIMPL_HPP */
diff --git a/src/surf/SplitDuplexLinkImpl_test.cpp b/src/surf/SplitDuplexLinkImpl_test.cpp
new file mode 100644 (file)
index 0000000..8a2a928
--- /dev/null
@@ -0,0 +1,98 @@
+/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved.               */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "catch.hpp"
+
+#include "simgrid/s4u/Engine.hpp"
+#include "simgrid/s4u/Link.hpp"
+#include "src/surf/SplitDuplexLinkImpl.hpp"
+
+TEST_CASE("SplitDuplexLink: create", "")
+{
+  simgrid::s4u::Engine e("test");
+  auto* zone = simgrid::s4u::create_star_zone("test");
+
+  SECTION("create string")
+  {
+    simgrid::s4u::Link* link_up;
+    simgrid::s4u::Link* link_down;
+    simgrid::s4u::SplitDuplexLink* link;
+    REQUIRE_NOTHROW(link = zone->create_split_duplex_link("link", "100GBps"));
+    REQUIRE(simgrid::s4u::SplitDuplexLink::by_name("link") == link);
+    REQUIRE_NOTHROW(link_up = simgrid::s4u::Link::by_name("link_UP"));
+    REQUIRE_NOTHROW(link_down = simgrid::s4u::Link::by_name("link_DOWN"));
+    REQUIRE(link_up->get_bandwidth() == 100e9);
+    REQUIRE(link_down->get_bandwidth() == 100e9);
+    REQUIRE(link_up == link->get_link_up());
+    REQUIRE(link_down == link->get_link_down());
+  }
+
+  SECTION("create double") { REQUIRE_NOTHROW(zone->create_split_duplex_link("link", 10e6)); }
+}
+
+TEST_CASE("SplitDuplexLink: sets", "")
+{
+  simgrid::s4u::Engine e("test");
+  auto* zone            = simgrid::s4u::create_star_zone("test");
+  auto* link            = zone->create_split_duplex_link("link", 100e6);
+  auto const* link_up   = link->get_link_up();
+  auto const* link_down = link->get_link_down();
+
+  SECTION("bandwidth")
+  {
+    double bw = 1e3;
+    link->set_bandwidth(bw);
+    REQUIRE(link_up->get_bandwidth() == bw);
+    REQUIRE(link_down->get_bandwidth() == bw);
+  }
+
+  SECTION("latency")
+  {
+    double lat = 1e-9;
+    link->set_latency(lat);
+    REQUIRE(link_up->get_latency() == lat);
+    REQUIRE(link_down->get_latency() == lat);
+  }
+
+  SECTION("turn on/off")
+  {
+    link->turn_off();
+    REQUIRE(not link_up->is_on());
+    REQUIRE(not link_down->is_on());
+    link->turn_on();
+    REQUIRE(link_up->is_on());
+    REQUIRE(link_down->is_on());
+  }
+
+  SECTION("concurrency_limit")
+  {
+    link->set_concurrency_limit(3);
+    REQUIRE(link_up->get_impl()->get_constraint()->get_concurrency_limit() == 3);
+    REQUIRE(link_down->get_impl()->get_constraint()->get_concurrency_limit() == 3);
+  }
+
+  SECTION("sharing_policy: invalid")
+  {
+    REQUIRE_THROWS_AS(link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::WIFI), std::invalid_argument);
+    REQUIRE_THROWS_AS(link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX), std::invalid_argument);
+  }
+
+  SECTION("sharing_policy: fatpipe/shared")
+  {
+    for (const auto& policy : {simgrid::s4u::Link::SharingPolicy::FATPIPE, simgrid::s4u::Link::SharingPolicy::SHARED}) {
+      link->set_sharing_policy(policy);
+      REQUIRE(link_up->get_sharing_policy() == policy);
+      REQUIRE(link_down->get_sharing_policy() == policy);
+    }
+  }
+
+  SECTION("sharing_policy: nonlinear")
+  {
+    link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::NONLINEAR,
+                             [](double c, int /*n*/) -> double { return c; });
+    REQUIRE(link_up->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::NONLINEAR);
+    REQUIRE(link_down->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::NONLINEAR);
+  }
+}
index 2223a80..b3b215b 100644 (file)
@@ -90,11 +90,15 @@ void CpuCas01::on_speed_change()
 
   get_model()->get_maxmin_system()->update_constraint_bound(get_constraint(),
                                                             get_core_count() * speed_.scale * speed_.peak);
+
   while (const auto* var = get_constraint()->get_variable(&elem)) {
     const auto* action = static_cast<CpuCas01Action*>(var->get_id());
+    double bound       = action->requested_core() * speed_.scale * speed_.peak;
+    if (action->get_user_bound() > 0) {
+      bound = std::min(bound, action->get_user_bound());
+    }
 
-    get_model()->get_maxmin_system()->update_variable_bound(action->get_variable(),
-                                                            action->requested_core() * speed_.scale * speed_.peak);
+    get_model()->get_maxmin_system()->update_variable_bound(action->get_variable(), bound);
   }
 
   CpuImpl::on_speed_change();
@@ -103,17 +107,11 @@ void CpuCas01::on_speed_change()
 void CpuCas01::apply_event(profile::Event* event, double value)
 {
   if (event == speed_.event) {
-    /* TODO (Hypervisor): do the same thing for constraint_core[i] */
-    xbt_assert(get_core_count() == 1, "FIXME: add speed scaling code also for constraint_core[i]");
-
     speed_.scale = value;
     on_speed_change();
 
     tmgr_trace_event_unref(&speed_.event);
   } else if (event == state_event_) {
-    /* TODO (Hypervisor): do the same thing for constraint_core[i] */
-    xbt_assert(get_core_count() == 1, "FIXME: add state change code also for constraint_core[i]");
-
     if (value > 0) {
       if (not is_on()) {
         XBT_VERB("Restart actors on host %s", get_iface()->get_cname());
@@ -143,15 +141,24 @@ void CpuCas01::apply_event(profile::Event* event, double value)
 }
 
 /** @brief Start a new execution on this CPU lasting @param size flops and using one core */
-CpuAction* CpuCas01::execution_start(double size)
+CpuAction* CpuCas01::execution_start(double size, double user_bound)
 {
-  return new CpuCas01Action(get_model(), size, not is_on(), speed_.scale * speed_.peak, get_constraint());
+  return execution_start(size, 1, user_bound);
 }
 
-CpuAction* CpuCas01::execution_start(double size, int requested_cores)
+CpuAction* CpuCas01::execution_start(double size, int requested_cores, double user_bound)
 {
-  return new CpuCas01Action(get_model(), size, not is_on(), speed_.scale * speed_.peak, get_constraint(),
-                            requested_cores);
+  auto* action =
+      new CpuCas01Action(get_model(), size, not is_on(), speed_.scale * speed_.peak, get_constraint(), requested_cores);
+  action->set_user_bound(user_bound);
+  if (user_bound > 0 && user_bound < action->get_bound()) {
+    get_model()->get_maxmin_system()->update_variable_bound(action->get_variable(), user_bound);
+  }
+  if (factor_cb_) {
+    action->set_rate_factor(factor_cb_(size));
+  }
+
+  return action;
 }
 
 CpuAction* CpuCas01::sleep(double duration)
@@ -160,7 +167,7 @@ CpuAction* CpuCas01::sleep(double duration)
     duration = std::max(duration, sg_surf_precision);
 
   XBT_IN("(%s,%g)", get_cname(), duration);
-  auto* action = new CpuCas01Action(get_model(), 1.0, not is_on(), speed_.scale * speed_.peak, get_constraint());
+  auto* action = new CpuCas01Action(get_model(), 1.0, not is_on(), speed_.scale * speed_.peak, get_constraint(), 1);
 
   // FIXME: sleep variables should not consume 1.0 in System::expand()
   action->set_max_duration(duration);
@@ -180,6 +187,12 @@ CpuAction* CpuCas01::sleep(double duration)
   return action;
 }
 
+void CpuCas01::set_factor_cb(const std::function<s4u::Host::CpuFactorCb>& cb)
+{
+  xbt_assert(not is_sealed(), "Cannot set CPU factor callback in an already sealed CPU(%s)", get_cname());
+  factor_cb_ = cb;
+}
+
 /**********
  * Action *
  **********/
index 967b186..ed193cb 100644 (file)
@@ -44,26 +44,26 @@ public:
   CpuCas01(const CpuCas01&) = delete;
   CpuCas01& operator=(const CpuCas01&) = delete;
   void apply_event(profile::Event* event, double value) override;
-  CpuAction* execution_start(double size) override;
-  CpuAction* execution_start(double size, int requested_cores) override;
+  CpuAction* execution_start(double size, double user_bound) override;
+  CpuAction* execution_start(double size, int requested_cores, double user_bound) override;
   CpuAction* sleep(double duration) override;
+  void set_factor_cb(const std::function<s4u::Host::CpuFactorCb>& cb) override;
 
   bool is_used() const override;
 
 protected:
   void on_speed_change() override;
+
+private:
+  std::function<s4u::Host::CpuFactorCb> factor_cb_ = {};
 };
 
 /**********
  * Action *
  **********/
 class CpuCas01Action : public CpuAction {
-  friend CpuAction* CpuCas01::execution_start(double size);
-  friend CpuAction* CpuCas01::sleep(double duration);
-
 public:
-  CpuCas01Action(Model* model, double cost, bool failed, double speed, lmm::Constraint* constraint,
-                 int requested_core = 1);
+  CpuCas01Action(Model* model, double cost, bool failed, double speed, lmm::Constraint* constraint, int requested_core);
   CpuCas01Action(const CpuCas01Action&) = delete;
   CpuCas01Action& operator=(const CpuCas01Action&) = delete;
   int requested_core() const;
index bfa0af4..d9a6e9f 100644 (file)
@@ -36,7 +36,7 @@ void CpuModel::update_actions_state_full(double /*now*/, double delta)
     auto& action = static_cast<CpuAction&>(*it);
     ++it; // increment iterator here since the following calls to action.finish() may invalidate it
 
-    action.update_remains(action.get_variable()->get_value() * delta);
+    action.update_remains(action.get_rate() * delta);
     action.update_max_duration(delta);
 
     if (((action.get_remains_no_update() <= 0) && (action.get_variable()->get_penalty() > 0)) ||
@@ -54,7 +54,7 @@ CpuImpl::CpuImpl(s4u::Host* host, const std::vector<double>& speed_per_pstate)
 {
   speed_.scale    = 1;
   speed_.peak     = speed_per_pstate_.front();
-  host->pimpl_cpu = this;
+  host->set_cpu(this);
 }
 
 void CpuImpl::reset_vcpu(CpuImpl* that)
@@ -65,12 +65,13 @@ void CpuImpl::reset_vcpu(CpuImpl* that)
   this->speed_per_pstate_.assign(that->speed_per_pstate_.begin(), that->speed_per_pstate_.end());
 }
 
-CpuImpl* CpuImpl::set_pstate(int pstate_index)
+CpuImpl* CpuImpl::set_pstate(unsigned long pstate_index)
 {
-  xbt_assert(pstate_index <= static_cast<int>(speed_per_pstate_.size()),
-             "Invalid parameters for CPU %s (pstate %d > length of pstates %d). Please fix your platform file, or your "
-             "call to change the pstate.",
-             get_cname(), pstate_index, static_cast<int>(speed_per_pstate_.size()));
+  xbt_assert(
+      pstate_index <= speed_per_pstate_.size(),
+      "Invalid parameters for CPU %s (pstate %lu > length of pstates %d). Please fix your platform file, or your "
+      "call to change the pstate.",
+      get_cname(), pstate_index, static_cast<int>(speed_per_pstate_.size()));
 
   double new_peak_speed = speed_per_pstate_[pstate_index];
   pstate_               = pstate_index;
@@ -82,17 +83,16 @@ CpuImpl* CpuImpl::set_pstate(int pstate_index)
 
 CpuImpl* CpuImpl::set_pstate_speed(const std::vector<double>& speed_per_state)
 {
-  xbt_assert(speed_per_state.size() > 0, "CPU %s: processor speed vector cannot be empty", get_cname());
+  xbt_assert(not speed_per_state.empty(), "CPU %s: processor speed vector cannot be empty", get_cname());
   xbt_assert(not is_sealed(), "CPU %s: processor speed cannot be changed once CPU has been sealed", get_cname());
   speed_per_pstate_ = speed_per_state;
   speed_.peak       = speed_per_pstate_.front();
   return this;
 }
 
-double CpuImpl::get_pstate_peak_speed(int pstate_index) const
+double CpuImpl::get_pstate_peak_speed(unsigned long pstate_index) const
 {
-  xbt_assert((pstate_index <= static_cast<int>(speed_per_pstate_.size())),
-             "Invalid parameters (pstate index out of bounds)");
+  xbt_assert((pstate_index <= speed_per_pstate_.size()), "Invalid parameters (pstate index out of bounds)");
 
   return speed_per_pstate_[pstate_index];
 }
@@ -113,6 +113,31 @@ CpuImpl* CpuImpl::set_core_count(int core_count)
   return this;
 }
 
+void CpuImpl::apply_sharing_policy_cfg() const
+{
+  if (!get_constraint())
+    return;
+
+  kernel::lmm::Constraint::SharingPolicy lmm_policy = kernel::lmm::Constraint::SharingPolicy::SHARED;
+  if (sharing_policy_ == s4u::Host::SharingPolicy::NONLINEAR)
+    lmm_policy = kernel::lmm::Constraint::SharingPolicy::NONLINEAR;
+
+  get_constraint()->set_sharing_policy(lmm_policy, sharing_policy_cb_);
+}
+
+void CpuImpl::set_sharing_policy(s4u::Host::SharingPolicy policy, const s4u::NonLinearResourceCb& cb)
+{
+  xbt_assert(dynamic_cast<CpuTiModel*>(get_model()) == nullptr, "Cannot change sharing policy with CPU:TI model");
+  sharing_policy_    = policy;
+  sharing_policy_cb_ = cb;
+  apply_sharing_policy_cfg();
+}
+
+s4u::Host::SharingPolicy CpuImpl::get_sharing_policy() const
+{
+  return sharing_policy_;
+}
+
 int CpuImpl::get_core_count()
 {
   return core_count_;
@@ -135,6 +160,7 @@ void CpuImpl::seal()
   lmm::System* lmm = get_model()->get_maxmin_system();
   if (dynamic_cast<CpuTiModel*>(get_model()) == nullptr)
     this->set_constraint(lmm->constraint_new(this, core_count_ * speed_per_pstate_.front()));
+  apply_sharing_policy_cfg();
   Resource::seal();
 }
 
@@ -159,7 +185,7 @@ void CpuAction::update_remains_lazy(double now)
   }
 
   set_last_update();
-  set_last_value(get_variable()->get_value());
+  set_last_value(get_rate());
 }
 
 xbt::signal<void(CpuAction const&, Action::State)> CpuAction::on_state_change;
index cb672be..8f63dd4 100644 (file)
@@ -53,9 +53,13 @@ class XBT_PUBLIC CpuImpl : public Resource_T<CpuImpl> {
 
   s4u::Host* piface_;
   int core_count_ = 1;
-  int pstate_ = 0;                       /*< Current pstate (index in the speed_per_pstate_)*/
+  unsigned long pstate_ = 0;             /*< Current pstate (index in the speed_per_pstate_)*/
   std::vector<double> speed_per_pstate_; /*< List of supported CPU capacities (pstate related). Not 'const' because VCPU
                                             get modified on migration */
+  s4u::Host::SharingPolicy sharing_policy_ = s4u::Host::SharingPolicy::LINEAR;
+  s4u::NonLinearResourceCb sharing_policy_cb_;
+
+  void apply_sharing_policy_cfg() const;
 
 public:
   /**
@@ -93,12 +97,12 @@ public:
   virtual double get_speed_ratio() { return speed_.scale; }
 
   /** @brief Get the peak processor speed (in flops/s), at the specified pstate */
-  virtual double get_pstate_peak_speed(int pstate_index) const;
+  virtual double get_pstate_peak_speed(unsigned long pstate_index) const;
 
-  virtual int get_pstate_count() const { return speed_per_pstate_.size(); }
+  virtual unsigned long get_pstate_count() const { return speed_per_pstate_.size(); }
 
-  virtual int get_pstate() const { return pstate_; }
-  virtual CpuImpl* set_pstate(int pstate_index);
+  virtual unsigned long get_pstate() const { return pstate_; }
+  virtual CpuImpl* set_pstate(unsigned long pstate_index);
 
   /*< @brief Setup the profile file with availability events (peak speed changes due to external load).
    * Profile must contain relative values (ratio between 0 and 1)
@@ -112,22 +116,33 @@ public:
    */
   CpuImpl* set_pstate_speed(const std::vector<double>& speed_per_state);
 
+  void set_sharing_policy(s4u::Host::SharingPolicy policy, const s4u::NonLinearResourceCb& cb);
+  s4u::Host::SharingPolicy get_sharing_policy() const;
+
+  /**
+   * @brief Sets factor callback
+   * Implemented only for cas01
+   */
+  virtual void set_factor_cb(const std::function<s4u::Host::CpuFactorCb>& cb) { THROW_UNIMPLEMENTED; }
+
   /**
    * @brief Execute some quantity of computation
    *
    * @param size The value of the processing amount (in flop) needed to process
+   * @param user_bound User's bound for execution speed
    * @return The CpuAction corresponding to the processing
    */
-  virtual CpuAction* execution_start(double size) = 0;
+  virtual CpuAction* execution_start(double size, double user_bound) = 0;
 
   /**
    * @brief Execute some quantity of computation on more than one core
    *
    * @param size The value of the processing amount (in flop) needed to process
    * @param requested_cores The desired amount of cores. Must be >= 1
+   * @param user_bound User's bound for execution speed
    * @return The CpuAction corresponding to the processing
    */
-  virtual CpuAction* execution_start(double size, int requested_cores) = 0;
+  virtual CpuAction* execution_start(double size, int requested_cores, double user_bound) = 0;
 
   /**
    * @brief Make a process sleep for duration (in seconds)
index 285a6de..7df0d78 100644 (file)
@@ -31,7 +31,7 @@ CpuTiProfile::CpuTiProfile(const profile::Profile* profile)
 {
   double integral    = 0;
   double time        = 0;
-  unsigned nb_points = profile->get_event_list().size() + 1;
+  unsigned long nb_points = profile->get_event_list().size() + 1;
   time_points_.reserve(nb_points);
   integral_.reserve(nb_points);
   for (auto const& val : profile->get_event_list()) {
@@ -106,10 +106,10 @@ double CpuTiProfile::integrate_simple_point(double a) const
 {
   double integral = 0;
   double a_aux    = a;
-  int ind         = binary_search(time_points_, a);
+  long ind        = binary_search(time_points_, a);
   integral += integral_[ind];
 
-  XBT_DEBUG("a %f ind %d integral %f ind + 1 %f ind %f time +1 %f time %f", a, ind, integral, integral_[ind + 1],
+  XBT_DEBUG("a %f ind %ld integral %f ind + 1 %f ind %f time +1 %f time %f", a, ind, integral, integral_[ind + 1],
             integral_[ind], time_points_[ind + 1], time_points_[ind]);
   double_update(&a_aux, time_points_[ind], sg_maxmin_precision * sg_surf_precision);
   if (a_aux > 0)
@@ -187,7 +187,7 @@ double CpuTiTmgr::solve(double a, double amount) const
 double CpuTiProfile::solve_simple(double a, double amount) const
 {
   double integral_a = integrate_simple_point(a);
-  int ind           = binary_search(integral_, integral_a + amount);
+  long ind          = binary_search(integral_, integral_a + amount);
   double time       = time_points_[ind];
   time += (integral_a + amount - integral_[ind]) /
           ((integral_[ind + 1] - integral_[ind]) / (time_points_[ind + 1] - time_points_[ind]));
@@ -205,7 +205,7 @@ double CpuTiProfile::solve_simple(double a, double amount) const
 double CpuTiTmgr::get_power_scale(double a) const
 {
   double reduced_a                = a - floor(a / last_time_) * last_time_;
-  int point                       = CpuTiProfile::binary_search(profile_->time_points_, reduced_a);
+  long point                      = CpuTiProfile::binary_search(profile_->time_points_, reduced_a);
   kernel::profile::DatedValue val = speed_profile_->get_event_list().at(point);
   return val.value_;
 }
@@ -255,7 +255,7 @@ CpuTiTmgr::CpuTiTmgr(kernel::profile::Profile* speed_profile, double value) : sp
  * @param a        Value to search
  * @return Index of point
  */
-int CpuTiProfile::binary_search(const std::vector<double>& array, double a)
+long CpuTiProfile::binary_search(const std::vector<double>& array, double a)
 {
   if (array[0] > a)
     return 0;
@@ -495,9 +495,10 @@ void CpuTi::update_remaining_amount(double now)
   last_update_ = now;
 }
 
-CpuAction* CpuTi::execution_start(double size)
+CpuAction* CpuTi::execution_start(double size, double user_bound)
 {
   XBT_IN("(%s,%g)", get_cname(), size);
+  xbt_assert(user_bound <= 0, "Invalid user bound (%lf) in CPU TI model", user_bound);
   auto* action = new CpuTiAction(this, size);
 
   action_set_.push_back(*action); // Actually start the action
index 5fdb314..4d6cd17 100644 (file)
@@ -34,7 +34,7 @@ public:
 
   std::vector<double> time_points_;
   std::vector<double> integral_;
-  static int binary_search(const std::vector<double>& array, double a);
+  static long binary_search(const std::vector<double>& array, double a);
 };
 
 class CpuTiTmgr {
@@ -110,8 +110,8 @@ public:
   void update_remaining_amount(double now);
 
   bool is_used() const override;
-  CpuAction* execution_start(double size) override;
-  CpuAction* execution_start(double, int) override
+  CpuAction* execution_start(double size, double user_bound) override;
+  CpuAction* execution_start(double, int, double) override
   {
     THROW_UNIMPLEMENTED;
     return nullptr;
index 2ef29b3..1686085 100644 (file)
@@ -41,7 +41,7 @@ void DiskS19Model::update_actions_state(double /*now*/, double delta)
   for (auto it = std::begin(*get_started_action_set()); it != std::end(*get_started_action_set());) {
     auto& action = *it;
     ++it; // increment iterator here since the following calls to action.finish() may invalidate it
-    action.update_remains(rint(action.get_variable()->get_value() * delta));
+    action.update_remains(rint(action.get_rate() * delta));
     action.update_max_duration(delta);
 
     if (((action.get_remains_no_update() <= 0) && (action.get_variable()->get_penalty() > 0)) ||
@@ -65,45 +65,40 @@ DiskAction* DiskS19Model::io_start(const DiskImpl* disk, sg_size_t size, s4u::Io
     default:
       THROW_UNIMPLEMENTED;
   }
+  const auto& factor_cb = disk->get_factor_cb();
+  if (factor_cb) { // handling disk variability
+    action->set_rate_factor(factor_cb(size, type));
+  }
   return action;
 }
 
 /************
  * Resource *
  ************/
-void DiskS19::update_penalties(double delta) const
-{
-  const kernel::lmm::Element* elem     = nullptr;
-  const kernel::lmm::Element* nextelem = nullptr;
-  int numelem                          = 0;
-  while (const auto* var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem)) {
-    auto* action = static_cast<DiskS19Action*>(var->get_id());
-    action->sharing_penalty_ += delta;
-    if (not action->is_suspended())
-      get_model()->get_maxmin_system()->update_variable_penalty(action->get_variable(), action->sharing_penalty_);
-  }
-}
-
 void DiskS19::set_read_bandwidth(double value)
 {
   read_bw_.peak = value;
 
-  get_model()->get_maxmin_system()->update_constraint_bound(get_constraint(),
-                                                            sg_bandwidth_factor * (read_bw_.peak * read_bw_.scale));
-
-  double delta = 1.0 / value - 1.0 / (read_bw_.peak * read_bw_.scale);
-  update_penalties(delta);
+  if (get_read_constraint()) {
+    get_model()->get_maxmin_system()->update_constraint_bound(get_read_constraint(), read_bw_.peak * read_bw_.scale);
+  }
 }
 
 void DiskS19::set_write_bandwidth(double value)
 {
   write_bw_.peak = value;
 
-  get_model()->get_maxmin_system()->update_constraint_bound(get_constraint(),
-                                                            sg_bandwidth_factor * (write_bw_.peak * write_bw_.scale));
+  if (get_write_constraint()) {
+    get_model()->get_maxmin_system()->update_constraint_bound(get_write_constraint(), write_bw_.peak * write_bw_.scale);
+  }
+}
 
-  double delta = 1.0 / value - 1.0 / (write_bw_.peak * write_bw_.scale);
-  update_penalties(delta);
+void DiskS19::set_readwrite_bandwidth(double value)
+{
+  readwrite_bw_ = value;
+  if (get_constraint()) {
+    get_model()->get_maxmin_system()->update_constraint_bound(get_constraint(), readwrite_bw_);
+  }
 }
 
 void DiskS19::apply_event(kernel::profile::Event* triggered, double value)
index 5825311..9fe98e7 100644 (file)
@@ -41,12 +41,11 @@ public:
  ************/
 
 class DiskS19 : public DiskImpl {
-  void update_penalties(double delta) const;
-
 public:
   using DiskImpl::DiskImpl;
   void set_read_bandwidth(double value) override;
   void set_write_bandwidth(double value) override;
+  void set_readwrite_bandwidth(double value) override;
   void apply_event(kernel::profile::Event* triggered, double value) override;
 };
 
index 59d813d..5e49c86 100644 (file)
@@ -57,12 +57,9 @@ kernel::resource::Action* HostCLM03Model::execute_parallel(const std::vector<s4u
                                                            double rate)
 {
   kernel::resource::Action* action = nullptr;
-  /* FIXME[donassolo]: getting the network_model from the origin host
-   * Soon we need to change this function to first get the routes and later
-   * create the respective surf actions */
   auto net_model = host_list[0]->get_netpoint()->get_englobing_zone()->get_network_model();
   if ((host_list.size() == 1) && (has_cost(bytes_amount, 0) <= 0) && (has_cost(flops_amount, 0) > 0)) {
-    action = host_list[0]->pimpl_cpu->execution_start(flops_amount[0]);
+    action = host_list[0]->get_cpu()->execution_start(flops_amount[0], rate);
   } else if ((host_list.size() == 1) && (has_cost(flops_amount, 0) <= 0)) {
     action = net_model->communicate(host_list[0], host_list[0], bytes_amount[0], rate);
   } else if ((host_list.size() == 2) && (has_cost(flops_amount, 0) <= 0) && (has_cost(flops_amount, 1) <= 0)) {
index 8e1c76d..398a61b 100644 (file)
@@ -87,9 +87,9 @@ NetworkCm02Model::NetworkCm02Model(const std::string& name) : NetworkModel(name)
   }
 
   set_maxmin_system(new lmm::System(select));
-  loopback_ = create_link("__loopback__", std::vector<double>{config::get_value<double>("network/loopback-bw")})
-                  ->set_sharing_policy(s4u::Link::SharingPolicy::FATPIPE)
-                  ->set_latency(config::get_value<double>("network/loopback-lat"));
+  loopback_ = create_link("__loopback__", {config::get_value<double>("network/loopback-bw")});
+  loopback_->set_sharing_policy(s4u::Link::SharingPolicy::FATPIPE, {});
+  loopback_->set_latency(config::get_value<double>("network/loopback-lat"));
   loopback_->seal();
 }
 
@@ -130,12 +130,16 @@ void NetworkCm02Model::set_bw_factor_cb(const std::function<NetworkFactorCb>& cb
 LinkImpl* NetworkCm02Model::create_link(const std::string& name, const std::vector<double>& bandwidths)
 {
   xbt_assert(bandwidths.size() == 1, "Non-WIFI links must use only 1 bandwidth.");
-  return (new NetworkCm02Link(name, bandwidths[0], get_maxmin_system()))->set_model(this);
+  auto link = new NetworkCm02Link(name, bandwidths[0], get_maxmin_system());
+  link->set_model(this);
+  return link;
 }
 
 LinkImpl* NetworkCm02Model::create_wifi_link(const std::string& name, const std::vector<double>& bandwidths)
 {
-  return (new NetworkWifiLink(name, bandwidths, get_maxmin_system()))->set_model(this);
+  auto link = new NetworkWifiLink(name, bandwidths, get_maxmin_system());
+  link->set_model(this);
+  return link;
 }
 
 void NetworkCm02Model::update_actions_state_lazy(double now, double /*delta*/)
@@ -187,7 +191,7 @@ void NetworkCm02Model::update_actions_state_full(double /*now*/, double delta)
        */
       action.update_remains(action.get_remains());
     }
-    action.update_remains(action.get_variable()->get_value() * delta);
+    action.update_remains(action.get_rate() * delta);
 
     if (action.get_max_duration() != NO_MAX_DURATION)
       action.update_max_duration(delta);
@@ -338,6 +342,10 @@ void NetworkCm02Model::comm_action_set_bounds(const s4u::Host* src, const s4u::H
   } else {
     bw_factor = get_bandwidth_factor(size);
   }
+  xbt_assert(bw_factor != 0, "Invalid param for comm %s -> %s. Bandwidth factor cannot be 0", src->get_cname(),
+             dst->get_cname());
+  action->set_rate_factor(bw_factor);
+
   /* get mininum bandwidth among links in the route and multiply by correct factor
    * ignore wi-fi links, they're not considered for bw_factors */
   double bandwidth_bound = -1.0;
@@ -347,12 +355,13 @@ void NetworkCm02Model::comm_action_set_bounds(const s4u::Host* src, const s4u::H
     if (bandwidth_bound == -1.0 || l->get_bandwidth() < bandwidth_bound)
       bandwidth_bound = l->get_bandwidth();
   }
-  bandwidth_bound *= bw_factor;
 
+  /* increase rate given by user considering the factor, since the actual rate will be
+   * modified by it */
+  rate = rate / bw_factor;
   /* the bandwidth is determined by the minimum between flow and user's defined rate */
   if (rate >= 0 && rate < bandwidth_bound)
     bandwidth_bound = rate;
-
   action->set_user_bound(bandwidth_bound);
 
   action->lat_current_ = action->latency_;
@@ -439,7 +448,7 @@ NetworkCm02Link::NetworkCm02Link(const std::string& name, double bandwidth, kern
 {
   bandwidth_.scale = 1.0;
   bandwidth_.peak  = bandwidth;
-  this->set_constraint(system->constraint_new(this, sg_bandwidth_factor * bandwidth));
+  this->set_constraint(system->constraint_new(this, bandwidth));
 }
 
 void NetworkCm02Link::apply_event(kernel::profile::Event* triggered, double value)
@@ -469,19 +478,20 @@ void NetworkCm02Link::apply_event(kernel::profile::Event* triggered, double valu
 
 void NetworkCm02Link::set_bandwidth(double value)
 {
+  double old_peak = bandwidth_.peak;
   bandwidth_.peak = value;
 
-  get_model()->get_maxmin_system()->update_constraint_bound(get_constraint(),
-                                                            sg_bandwidth_factor * (bandwidth_.peak * bandwidth_.scale));
+  get_model()->get_maxmin_system()->update_constraint_bound(get_constraint(), (bandwidth_.peak * bandwidth_.scale));
 
   LinkImpl::on_bandwidth_change();
 
   if (sg_weight_S_parameter > 0) {
-    double delta = sg_weight_S_parameter / value - sg_weight_S_parameter / (bandwidth_.peak * bandwidth_.scale);
+    double delta = sg_weight_S_parameter / (bandwidth_.peak * bandwidth_.scale) -
+                   sg_weight_S_parameter / (old_peak * bandwidth_.scale);
 
     const kernel::lmm::Element* elem     = nullptr;
     const kernel::lmm::Element* nextelem = nullptr;
-    int numelem                          = 0;
+    size_t numelem                       = 0;
     while (const auto* var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem)) {
       auto* action = static_cast<NetworkCm02Action*>(var->get_id());
       action->sharing_penalty_ += delta;
@@ -491,14 +501,14 @@ void NetworkCm02Link::set_bandwidth(double value)
   }
 }
 
-LinkImpl* NetworkCm02Link::set_latency(double value)
+void NetworkCm02Link::set_latency(double value)
 {
   latency_check(value);
 
   double delta                         = value - latency_.peak;
   const kernel::lmm::Element* elem     = nullptr;
   const kernel::lmm::Element* nextelem = nullptr;
-  int numelem                          = 0;
+  size_t numelem                       = 0;
 
   latency_.scale = 1.0;
   latency_.peak  = value;
@@ -516,15 +526,14 @@ LinkImpl* NetworkCm02Link::set_latency(double value)
           std::min(action->get_user_bound(), NetworkModel::cfg_tcp_gamma / (2.0 * action->lat_current_)));
 
       if (action->get_user_bound() < NetworkModel::cfg_tcp_gamma / (2.0 * action->lat_current_)) {
-        XBT_INFO("Flow is limited BYBANDWIDTH");
+        XBT_DEBUG("Flow is limited BYBANDWIDTH");
       } else {
-        XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f", action->lat_current_);
+        XBT_DEBUG("Flow is limited BYLATENCY, latency of flow is %f", action->lat_current_);
       }
     }
     if (not action->is_suspended())
       get_model()->get_maxmin_system()->update_variable_penalty(action->get_variable(), action->sharing_penalty_);
   }
-  return this;
 }
 
 /**********
@@ -555,7 +564,7 @@ void NetworkCm02Action::update_remains_lazy(double now)
   }
 
   set_last_update();
-  set_last_value(get_variable()->get_value());
+  set_last_value(get_rate());
 }
 
 } // namespace resource
index 172a267..c962616 100644 (file)
@@ -77,7 +77,7 @@ public:
   NetworkCm02Link(const std::string& name, double bandwidth, lmm::System* system);
   void apply_event(kernel::profile::Event* event, double value) override;
   void set_bandwidth(double value) override;
-  LinkImpl* set_latency(double value) override;
+  void set_latency(double value) override;
 };
 
 /**********
index 2cb1cdf..16f5397 100644 (file)
@@ -10,6 +10,8 @@
 #include "src/surf/surf_interface.hpp"
 #include "surf/surf.hpp"
 
+#include <numeric>
+
 #ifndef NETWORK_INTERFACE_CPP_
 #define NETWORK_INTERFACE_CPP_
 
@@ -52,114 +54,6 @@ double NetworkModel::next_occurring_event_full(double now)
   return minRes;
 }
 
-/************
- * Resource *
- ************/
-
-LinkImpl::LinkImpl(const std::string& name) : Resource_T(name), piface_(this)
-{
-  if (name != "__loopback__")
-    xbt_assert(not s4u::Link::by_name_or_null(name), "Link '%s' declared several times in the platform.", name.c_str());
-
-  s4u::Engine::get_instance()->link_register(name, &piface_);
-  XBT_DEBUG("Create link '%s'", name.c_str());
-}
-
-/** @brief Fire the required callbacks and destroy the object
- *
- * Don't delete directly a Link, call l->destroy() instead.
- */
-void LinkImpl::destroy()
-{
-  s4u::Link::on_destruction(this->piface_);
-  delete this;
-}
-
-bool LinkImpl::is_used() const
-{
-  return get_model()->get_maxmin_system()->constraint_used(get_constraint());
-}
-
-LinkImpl* LinkImpl::set_sharing_policy(s4u::Link::SharingPolicy policy)
-{
-  get_constraint()->set_sharing_policy(policy);
-  return this;
-}
-s4u::Link::SharingPolicy LinkImpl::get_sharing_policy() const
-{
-  return get_constraint()->get_sharing_policy();
-}
-
-void LinkImpl::latency_check(double latency) const
-{
-  static double last_warned_latency = sg_surf_precision;
-  if (latency != 0.0 && latency < last_warned_latency) {
-    XBT_WARN("Latency for link %s is smaller than surf/precision (%g < %g)."
-        " For more accuracy, consider setting \"--cfg=surf/precision:%g\".",
-        get_cname(), latency, sg_surf_precision, latency);
-    last_warned_latency = latency;
-  }
-}
-
-void LinkImpl::turn_on()
-{
-  if (not is_on()) {
-    Resource::turn_on();
-    s4u::Link::on_state_change(piface_);
-  }
-}
-
-void LinkImpl::turn_off()
-{
-  if (is_on()) {
-    Resource::turn_off();
-    s4u::Link::on_state_change(piface_);
-
-    const kernel::lmm::Element* elem = nullptr;
-    double now                       = surf_get_clock();
-    while (const auto* var = get_constraint()->get_variable(&elem)) {
-      Action* action = var->get_id();
-      if (action->get_state() == Action::State::INITED || action->get_state() == Action::State::STARTED) {
-        action->set_finish_time(now);
-        action->set_state(Action::State::FAILED);
-      }
-    }
-  }
-}
-
-void LinkImpl::seal()
-{
-  if (is_sealed())
-    return;
-
-  xbt_assert(this->get_model(), "Cannot seal Link(%s) without setting the Network model first", this->get_cname());
-  Resource::seal();
-  s4u::Link::on_creation(piface_);
-}
-
-void LinkImpl::on_bandwidth_change() const
-{
-  s4u::Link::on_bandwidth_change(piface_);
-}
-
-LinkImpl* LinkImpl::set_bandwidth_profile(profile::Profile* profile)
-{
-  if (profile) {
-    xbt_assert(bandwidth_.event == nullptr, "Cannot set a second bandwidth profile to Link %s", get_cname());
-    bandwidth_.event = profile->schedule(&profile::future_evt_set, this);
-  }
-  return this;
-}
-
-LinkImpl* LinkImpl::set_latency_profile(profile::Profile* profile)
-{
-  if (profile) {
-    xbt_assert(latency_.event == nullptr, "Cannot set a second latency profile to Link %s", get_cname());
-    latency_.event = profile->schedule(&profile::future_evt_set, this);
-  }
-  return this;
-}
-
 /**********
  * Action *
  **********/
@@ -187,6 +81,33 @@ std::list<LinkImpl*> NetworkAction::get_links() const
 
   return retlist;
 }
+
+static void add_latency(const std::vector<LinkImpl*>& links, double* latency)
+{
+  if (latency)
+    *latency = std::accumulate(begin(links), end(links), *latency,
+                               [](double lat, const auto* link) { return lat + link->get_latency(); });
+}
+
+void add_link_latency(std::vector<LinkImpl*>& result, LinkImpl* link, double* latency)
+{
+  result.push_back(link);
+  if (latency)
+    *latency += link->get_latency();
+}
+
+void add_link_latency(std::vector<LinkImpl*>& result, const std::vector<LinkImpl*>& links, double* latency)
+{
+  result.insert(result.end(), begin(links), end(links));
+  add_latency(links, latency);
+}
+
+void insert_link_latency(std::vector<LinkImpl*>& result, const std::vector<LinkImpl*>& links, double* latency)
+{
+  result.insert(result.begin(), rbegin(links), rend(links));
+  add_latency(links, latency);
+}
+
 } // namespace resource
 } // namespace kernel
 } // namespace simgrid
index debc9a0..1f712a6 100644 (file)
@@ -11,6 +11,7 @@
 #include "simgrid/kernel/resource/Resource.hpp"
 #include "simgrid/s4u/Link.hpp"
 #include "src/kernel/lmm/maxmin.hpp"
+#include "src/surf/LinkImpl.hpp"
 #include <xbt/PropertyHolder.hpp>
 
 #include <list>
@@ -93,66 +94,6 @@ public:
   LinkImpl* loopback_ = nullptr;
 };
 
-/************
- * Resource *
- ************/
-/** @ingroup SURF_network_interface
- * @brief SURF network link interface class
- * @details A Link represents the link between two [hosts](@ref simgrid::surf::HostImpl)
- */
-class LinkImpl : public Resource_T<LinkImpl>, public xbt::PropertyHolder {
-  s4u::Link piface_;
-
-protected:
-  explicit LinkImpl(const std::string& name);
-  LinkImpl(const LinkImpl&) = delete;
-  LinkImpl& operator=(const LinkImpl&) = delete;
-  ~LinkImpl() override                 = default; // Use destroy() instead of this destructor.
-
-public:
-  void destroy(); // Must be called instead of the destructor
-
-  void latency_check(double latency) const;
-
-  /** @brief Public interface */
-  const s4u::Link* get_iface() const { return &piface_; }
-  s4u::Link* get_iface() { return &piface_; }
-
-  /** @brief Get the bandwidth in bytes per second of current Link */
-  double get_bandwidth() const { return bandwidth_.peak * bandwidth_.scale; }
-  /** @brief Update the bandwidth in bytes per second of current Link */
-  virtual void set_bandwidth(double value) = 0;
-
-  /** @brief Get the latency in seconds of current Link */
-  double get_latency() const { return latency_.peak * latency_.scale; }
-  /** @brief Update the latency in seconds of current Link */
-  virtual LinkImpl* set_latency(double value) = 0;
-
-  /** @brief The sharing policy */
-  virtual LinkImpl* set_sharing_policy(s4u::Link::SharingPolicy policy);
-  virtual s4u::Link::SharingPolicy get_sharing_policy() const;
-
-  /** @brief Check if the Link is used */
-  bool is_used() const override;
-
-  void turn_on() override;
-  void turn_off() override;
-
-  void seal() override;
-
-  void on_bandwidth_change() const;
-
-  /* setup the profile file with bandwidth events (peak speed changes due to external load).
-   * Profile must contain percentages (value between 0 and 1). */
-  virtual LinkImpl* set_bandwidth_profile(kernel::profile::Profile* profile);
-  /* setup the profile file with latency events (peak latency changes due to external load).
-   * Profile must contain absolute values */
-  virtual LinkImpl* set_latency_profile(kernel::profile::Profile* profile);
-
-  Metric latency_   = {0.0, 1, nullptr};
-  Metric bandwidth_ = {1.0, 1, nullptr};
-};
-
 /**********
  * Action *
  **********/
@@ -197,6 +138,14 @@ public:
   s4u::Host& get_src() const { return src_; }
   s4u::Host& get_dst() const { return dst_; }
 };
+
+/* Insert link(s) at the end of vector `result' (at the beginning, and reversed, for insert_link_latency()), and add
+ * link->get_latency() to *latency when latency is not null
+ */
+void add_link_latency(std::vector<LinkImpl*>& result, LinkImpl* link, double* latency);
+void add_link_latency(std::vector<LinkImpl*>& result, const std::vector<LinkImpl*>& links, double* latency);
+void insert_link_latency(std::vector<LinkImpl*>& result, const std::vector<LinkImpl*>& links, double* latency);
+
 } // namespace resource
 } // namespace kernel
 } // namespace simgrid
index 1180f02..cc89335 100644 (file)
@@ -114,6 +114,9 @@ static void zoneCreation_cb(simgrid::s4u::NetZone const& zone)
   wifiPhy.Set("Antennas", ns3::UintegerValue(nss_value));
   wifiPhy.Set("MaxSupportedTxSpatialStreams", ns3::UintegerValue(nss_value));
   wifiPhy.Set("MaxSupportedRxSpatialStreams", ns3::UintegerValue(nss_value));
+#if NS3_MINOR_VERSION > 33
+  wifiPhy.Set("ChannelWidth", ns3::UintegerValue(40));
+#endif
   wifiMac.SetType("ns3::ApWifiMac", "Ssid", ns3::SsidValue(ssid));
 
   mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
@@ -158,7 +161,11 @@ static void zoneCreation_cb(simgrid::s4u::NetZone const& zone)
     ns3::Simulator::Schedule(ns3::Seconds(start_time_value), &resumeWifiDevice, device);
   }
 
+#if NS3_MINOR_VERSION < 33
+  // This fails with "The channel width does not uniquely identify an operating channel" on v3.34,
+  // so we specified the ChannelWidth of wifiPhy to 40, above, when creating wifiPhy with v3.34 and higher
   ns3::Config::Set("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", ns3::UintegerValue(40));
+#endif
 
   mobility.SetPositionAllocator(positionAllocS);
   mobility.Install(nodes);
@@ -330,19 +337,23 @@ NetworkNS3Model::NetworkNS3Model(const std::string& name) : NetworkModel(name)
     ns3::GlobalRouteManager::InitializeRoutes();
   });
   routing::on_cluster_creation.connect(&clusterCreation_cb);
-  s4u::NetZone::on_route_creation.connect(&routeCreation_cb);
+  routing::NetZoneImpl::on_route_creation.connect(&routeCreation_cb);
   s4u::NetZone::on_seal.connect(&zoneCreation_cb);
 }
 
 LinkImpl* NetworkNS3Model::create_link(const std::string& name, const std::vector<double>& bandwidths)
 {
   xbt_assert(bandwidths.size() == 1, "ns-3 links must use only 1 bandwidth.");
-  return (new LinkNS3(name, bandwidths[0]))->set_model(this);
+  auto* link = new LinkNS3(name, bandwidths[0]);
+  link->set_model(this);
+  return link;
 }
 
 LinkImpl* NetworkNS3Model::create_wifi_link(const std::string& name, const std::vector<double>& bandwidths)
 {
-  return create_link(name, bandwidths)->set_sharing_policy(s4u::Link::SharingPolicy::WIFI);
+  auto* link = create_link(name, bandwidths);
+  link->set_sharing_policy(s4u::Link::SharingPolicy::WIFI, {});
+  return link;
 }
 
 Action* NetworkNS3Model::communicate(s4u::Host* src, s4u::Host* dst, double size, double rate)
@@ -455,28 +466,24 @@ void LinkNS3::apply_event(profile::Event*, double)
   THROW_UNIMPLEMENTED;
 }
 
-LinkImpl* LinkNS3::set_bandwidth_profile(profile::Profile* profile)
+void LinkNS3::set_bandwidth_profile(profile::Profile* profile)
 {
   xbt_assert(profile == nullptr, "The ns-3 network model doesn't support bandwidth profiles");
-  return this;
 }
 
-LinkImpl* LinkNS3::set_latency_profile(profile::Profile* profile)
+void LinkNS3::set_latency_profile(profile::Profile* profile)
 {
   xbt_assert(profile == nullptr, "The ns-3 network model doesn't support latency profiles");
-  return this;
 }
 
-LinkImpl* LinkNS3::set_latency(double latency)
+void LinkNS3::set_latency(double latency)
 {
   latency_.peak = latency;
-  return this;
 }
 
-LinkImpl* LinkNS3::set_sharing_policy(s4u::Link::SharingPolicy policy)
+void LinkNS3::set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb)
 {
   sharing_policy_ = policy;
-  return this;
 }
 /**********
  * Action *
index 7db4a38..398de6e 100644 (file)
@@ -36,10 +36,10 @@ public:
 
   void apply_event(profile::Event* event, double value) override;
   void set_bandwidth(double) override { THROW_UNIMPLEMENTED; }
-  LinkImpl* set_latency(double) override;
-  LinkImpl* set_bandwidth_profile(profile::Profile* profile) override;
-  LinkImpl* set_latency_profile(profile::Profile* profile) override;
-  LinkImpl* set_sharing_policy(s4u::Link::SharingPolicy policy) override;
+  void set_latency(double) override;
+  void set_bandwidth_profile(profile::Profile* profile) override;
+  void set_latency_profile(profile::Profile* profile) override;
+  void set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb) override;
   s4u::Link::SharingPolicy get_sharing_policy() const override { return sharing_policy_; }
 };
 
index 655941c..9f0707b 100644 (file)
@@ -17,7 +17,7 @@ namespace resource {
  * Resource *
  ************/
 
-NetworkWifiLink::NetworkWifiLink(const std::string& name, std::vector<double> bandwidths, lmm::System* system)
+NetworkWifiLink::NetworkWifiLink(const std::string& name, const std::vector<double>& bandwidths, lmm::System* system)
     : LinkImpl(name)
 {
   this->set_constraint(system->constraint_new(this, 1));
@@ -91,10 +91,9 @@ bool NetworkWifiLink::toggle_decay_model(){
   return use_decay_model_;
 }
 
-LinkImpl* NetworkWifiLink::set_latency(double value)
+void NetworkWifiLink::set_latency(double value)
 {
   xbt_assert(value == 0, "Latency cannot be set for WiFi Links.");
-  return this;
 }
 } // namespace resource
 } // namespace kernel
index 9a8d5e8..71850b5 100644 (file)
@@ -42,7 +42,7 @@ class NetworkWifiLink : public LinkImpl {
   std::vector<Metric> decay_bandwidths_;
 
 public:
-  NetworkWifiLink(const std::string& name, std::vector<double> bandwidths, lmm::System* system);
+  NetworkWifiLink(const std::string& name, const std::vector<double>& bandwidths, lmm::System* system);
 
   void set_host_rate(const s4u::Host* host, int rate_level);
   /** @brief Get the AP rate associated to the host (or -1 if not associated to the AP) */
@@ -51,7 +51,7 @@ public:
   s4u::Link::SharingPolicy get_sharing_policy() const override;
   void apply_event(kernel::profile::Event*, double) override { THROW_UNIMPLEMENTED; }
   void set_bandwidth(double) override { THROW_UNIMPLEMENTED; }
-  LinkImpl* set_latency(double) override;
+  void set_latency(double) override;
   void refresh_decay_bandwidths();
   bool toggle_decay_model();
   int get_host_count() const;
index e6e51fc..5af0e52 100644 (file)
@@ -61,10 +61,9 @@ NetworkL07Model::NetworkL07Model(const std::string& name, HostL07Model* hmodel,
     : NetworkModel(name), hostModel_(hmodel)
 {
   set_maxmin_system(sys);
-  loopback_ =
-      create_link("__loopback__", std::vector<double>{simgrid::config::get_value<double>("network/loopback-bw")})
-          ->set_sharing_policy(s4u::Link::SharingPolicy::FATPIPE)
-          ->set_latency(simgrid::config::get_value<double>("network/loopback-lat"));
+  loopback_ = create_link("__loopback__", {simgrid::config::get_value<double>("network/loopback-bw")});
+  loopback_->set_sharing_policy(s4u::Link::SharingPolicy::FATPIPE, {});
+  loopback_->set_latency(simgrid::config::get_value<double>("network/loopback-lat"));
   loopback_->seal();
 }
 
@@ -105,9 +104,8 @@ void HostL07Model::update_actions_state(double /*now*/, double delta)
         action.set_last_update();
       }
     }
-    XBT_DEBUG("Action (%p) : remains (%g) updated by %g.", &action, action.get_remains(),
-              action.get_variable()->get_value() * delta);
-    action.update_remains(action.get_variable()->get_value() * delta);
+    XBT_DEBUG("Action (%p) : remains (%g) updated by %g.", &action, action.get_remains(), action.get_rate() * delta);
+    action.update_remains(action.get_rate() * delta);
     action.update_max_duration(delta);
 
     XBT_DEBUG("Action (%p) : remains (%g).", &action, action.get_remains());
@@ -194,10 +192,10 @@ L07Action::L07Action(kernel::resource::Model* model, const std::vector<s4u::Host
    * communication either */
   double bound = std::numeric_limits<double>::max();
   for (size_t i = 0; i < host_list.size(); i++) {
-    model->get_maxmin_system()->expand(host_list[i]->pimpl_cpu->get_constraint(), get_variable(),
+    model->get_maxmin_system()->expand(host_list[i]->get_cpu()->get_constraint(), get_variable(),
                                        (flops_amount == nullptr ? 0.0 : flops_amount[i]));
     if (flops_amount && flops_amount[i] > 0)
-      bound = std::min(bound, host_list[i]->pimpl_cpu->get_speed(1.0) * host_list[i]->pimpl_cpu->get_speed_ratio() /
+      bound = std::min(bound, host_list[i]->get_cpu()->get_speed(1.0) * host_list[i]->get_cpu()->get_speed_ratio() /
                                   flops_amount[i]);
   }
   if (bound < std::numeric_limits<double>::max())
@@ -242,7 +240,9 @@ kernel::resource::CpuImpl* CpuL07Model::create_cpu(s4u::Host* host, const std::v
 kernel::resource::LinkImpl* NetworkL07Model::create_link(const std::string& name, const std::vector<double>& bandwidths)
 {
   xbt_assert(bandwidths.size() == 1, "Non WIFI link must have only 1 bandwidth.");
-  return (new LinkL07(name, bandwidths[0], get_maxmin_system()))->set_model(this);
+  auto link = new LinkL07(name, bandwidths[0], get_maxmin_system());
+  link->set_model(this);
+  return link;
 }
 
 kernel::resource::LinkImpl* NetworkL07Model::create_wifi_link(const std::string& name,
@@ -255,9 +255,10 @@ kernel::resource::LinkImpl* NetworkL07Model::create_wifi_link(const std::string&
  * Resource *
  ************/
 
-kernel::resource::CpuAction* CpuL07::execution_start(double size)
+kernel::resource::CpuAction* CpuL07::execution_start(double size, double user_bound)
 {
   std::vector<s4u::Host*> host_list = {get_iface()};
+  xbt_assert(user_bound <= 0, "User bound not supported by ptask model");
 
   auto* flops_amount = new double[host_list.size()]();
   flops_amount[0]    = size;
@@ -270,7 +271,7 @@ kernel::resource::CpuAction* CpuL07::execution_start(double size)
 
 kernel::resource::CpuAction* CpuL07::sleep(double duration)
 {
-  auto* action = static_cast<L07Action*>(execution_start(1.0));
+  auto* action = static_cast<L07Action*>(execution_start(1.0, -1));
   action->set_max_duration(duration);
   action->set_suspend_state(kernel::resource::Action::SuspendStates::SLEEPING);
   get_model()->get_maxmin_system()->update_variable_penalty(action->get_variable(), 0.0);
@@ -363,7 +364,7 @@ void LinkL07::set_bandwidth(double value)
   get_model()->get_maxmin_system()->update_constraint_bound(get_constraint(), bandwidth_.peak * bandwidth_.scale);
 }
 
-kernel::resource::LinkImpl* LinkL07::set_latency(double value)
+void LinkL07::set_latency(double value)
 {
   latency_check(value);
   const kernel::lmm::Element* elem = nullptr;
@@ -373,7 +374,6 @@ kernel::resource::LinkImpl* LinkL07::set_latency(double value)
     auto* action = static_cast<L07Action*>(var->get_id());
     action->updateBound();
   }
-  return this;
 }
 LinkL07::~LinkL07() = default;
 
index f153895..0b65d2b 100644 (file)
@@ -92,8 +92,8 @@ public:
 
   bool is_used() const override;
   void apply_event(kernel::profile::Event* event, double value) override;
-  kernel::resource::CpuAction* execution_start(double size) override;
-  kernel::resource::CpuAction* execution_start(double, int) override
+  kernel::resource::CpuAction* execution_start(double size, double user_bound) override;
+  kernel::resource::CpuAction* execution_start(double, int, double) override
   {
     THROW_UNIMPLEMENTED;
     return nullptr;
@@ -113,7 +113,7 @@ public:
   bool is_used() const override;
   void apply_event(kernel::profile::Event* event, double value) override;
   void set_bandwidth(double value) override;
-  LinkImpl* set_latency(double value) override;
+  void set_latency(double value) override;
 };
 
 /**********
@@ -130,7 +130,7 @@ class L07Action : public kernel::resource::CpuAction {
   double latency_;
   double rate_;
 
-  friend CpuAction* CpuL07::execution_start(double size);
+  friend CpuAction* CpuL07::execution_start(double size, double user_bound);
   friend CpuAction* CpuL07::sleep(double duration);
   friend CpuAction* HostL07Model::execute_parallel(const std::vector<s4u::Host*>& host_list, const double* flops_amount,
                                                    const double* bytes_amount, double rate);
index 8cebc8f..48b2c01 100644 (file)
@@ -16,6 +16,7 @@
 #include "simgrid/kernel/routing/VivaldiZone.hpp"
 #include "simgrid/kernel/routing/WifiZone.hpp"
 #include "simgrid/s4u/Engine.hpp"
+#include "simgrid/s4u/NetZone.hpp"
 #include "src/include/simgrid/sg_config.hpp"
 #include "src/include/surf/surf.hpp"
 #include "src/kernel/EngineImpl.hpp"
@@ -43,10 +44,6 @@ static simgrid::kernel::routing::ClusterZoneCreationArgs
 
 /** The current NetZone in the parsing */
 static simgrid::kernel::routing::NetZoneImpl* current_routing = nullptr;
-static simgrid::kernel::routing::NetZoneImpl* routing_get_current()
-{
-  return current_routing;
-}
 static simgrid::s4u::Host* current_host = nullptr;
 
 /** Module management function: creates all internal data structures */
@@ -67,8 +64,7 @@ void sg_platf_exit()
 /** @brief Add a host to the current NetZone */
 void sg_platf_new_host_begin(const simgrid::kernel::routing::HostCreationArgs* args)
 {
-  current_host = routing_get_current()
-                     ->create_host(args->id, args->speed_per_pstate)
+  current_host = current_routing->create_host(args->id, args->speed_per_pstate)
                      ->set_coordinates(args->coord)
                      ->set_core_count(args->core_amount)
                      ->set_state_profile(args->state_trace)
@@ -100,7 +96,7 @@ void sg_platf_new_peer(const simgrid::kernel::routing::PeerCreationArgs* args)
   auto* zone = dynamic_cast<simgrid::kernel::routing::VivaldiZone*>(current_routing);
   xbt_assert(zone, "<peer> tag can only be used in Vivaldi netzones.");
 
-  const auto* peer = zone->create_host(args->id, std::vector<double>{args->speed})
+  const auto* peer = zone->create_host(args->id, {args->speed})
                          ->set_state_profile(args->state_trace)
                          ->set_speed_profile(args->speed_trace)
                          ->set_coordinates(args->coord)
@@ -113,39 +109,37 @@ void sg_platf_new_peer(const simgrid::kernel::routing::PeerCreationArgs* args)
 simgrid::kernel::routing::NetPoint* sg_platf_new_router(const std::string& name, const std::string& coords)
 {
   auto* netpoint = current_routing->create_router(name)->set_coordinates(coords);
-  XBT_DEBUG("Router '%s' has the id %u", netpoint->get_cname(), netpoint->id());
+  XBT_DEBUG("Router '%s' has the id %lu", netpoint->get_cname(), netpoint->id());
 
   return netpoint;
 }
 
-static void sg_platf_new_link(const simgrid::kernel::routing::LinkCreationArgs* args, const std::string& link_name)
+static void sg_platf_set_link_properties(simgrid::s4u::Link* link,
+                                         const simgrid::kernel::routing::LinkCreationArgs* args)
 {
-  routing_get_current()
-      ->create_link(link_name, args->bandwidths)
-      ->set_properties(args->properties)
-      ->get_impl() // this call to get_impl saves some simcalls but can be removed
-      ->set_sharing_policy(args->policy)
+  link->set_properties(args->properties)
       ->set_state_profile(args->state_trace)
       ->set_latency_profile(args->latency_trace)
       ->set_bandwidth_profile(args->bandwidth_trace)
-      ->set_latency(args->latency)
-      ->seal();
+      ->set_latency(args->latency);
 }
 
-void sg_platf_new_link(const simgrid::kernel::routing::LinkCreationArgs* link)
+void sg_platf_new_link(const simgrid::kernel::routing::LinkCreationArgs* args)
 {
-  if (link->policy == simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX) {
-    sg_platf_new_link(link, link->id + "_UP");
-    sg_platf_new_link(link, link->id + "_DOWN");
+  simgrid::s4u::Link* link;
+  if (args->policy == simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX) {
+    link = current_routing->create_split_duplex_link(args->id, args->bandwidths);
   } else {
-    sg_platf_new_link(link, link->id);
+    link = current_routing->create_link(args->id, args->bandwidths);
+    link->get_impl()->set_sharing_policy(args->policy, {});
   }
+  sg_platf_set_link_properties(link, args);
+  link->seal();
 }
 
 void sg_platf_new_disk(const simgrid::kernel::routing::DiskCreationArgs* disk)
 {
-  const simgrid::s4u::Disk* new_disk = routing_get_current()
-                                           ->create_disk(disk->id, disk->read_bw, disk->write_bw)
+  const simgrid::s4u::Disk* new_disk = current_routing->create_disk(disk->id, disk->read_bw, disk->write_bw)
                                            ->set_host(current_host)
                                            ->set_properties(disk->properties)
                                            ->seal();
@@ -157,10 +151,10 @@ void sg_platf_new_disk(const simgrid::kernel::routing::DiskCreationArgs* disk)
 /** @brief Auxiliary function to create hosts */
 static std::pair<simgrid::kernel::routing::NetPoint*, simgrid::kernel::routing::NetPoint*>
 sg_platf_cluster_create_host(const simgrid::kernel::routing::ClusterCreationArgs* cluster, simgrid::s4u::NetZone* zone,
-                             const std::vector<unsigned int>& /*coord*/, int id)
+                             const std::vector<unsigned long>& /*coord*/, unsigned long id)
 {
   xbt_assert(static_cast<unsigned long>(id) < cluster->radicals.size(),
-             "Zone(%s): error when creating host number %d in the zone. Insufficient number of radicals available "
+             "Zone(%s): error when creating host number %lu in the zone. Insufficient number of radicals available "
              "(total = %zu). Check the 'radical' parameter in XML",
              cluster->id.c_str(), id, cluster->radicals.size());
 
@@ -176,11 +170,12 @@ sg_platf_cluster_create_host(const simgrid::kernel::routing::ClusterCreationArgs
 /** @brief Auxiliary function to create loopback links */
 static simgrid::s4u::Link*
 sg_platf_cluster_create_loopback(const simgrid::kernel::routing::ClusterCreationArgs* cluster,
-                                 simgrid::s4u::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
+                                 simgrid::s4u::NetZone* zone, const std::vector<unsigned long>& /*coord*/,
+                                 unsigned long id)
 {
   xbt_assert(static_cast<unsigned long>(id) < cluster->radicals.size(),
-             "Zone(%s): error when creating loopback for host number %d in the zone. Insufficient number of radicals "
-             "available "
+             "Zone(%s): error when creating loopback for host number %lu in the zone. Insufficient number of "
+             "radicals available "
              "(total = %zu). Check the 'radical' parameter in XML",
              cluster->id.c_str(), id, cluster->radicals.size());
 
@@ -197,7 +192,8 @@ sg_platf_cluster_create_loopback(const simgrid::kernel::routing::ClusterCreation
 /** @brief Auxiliary function to create limiter links */
 static simgrid::s4u::Link* sg_platf_cluster_create_limiter(const simgrid::kernel::routing::ClusterCreationArgs* cluster,
                                                            simgrid::s4u::NetZone* zone,
-                                                           const std::vector<unsigned int>& /*coord*/, int id)
+                                                           const std::vector<unsigned long>& /*coord*/,
+                                                           unsigned long id)
 {
   std::string link_id = std::string(cluster->id) + "_link_" + std::to_string(id) + "_limiter";
   XBT_DEBUG("Cluster: creating limiter link=%s bw=%f", link_id.c_str(), cluster->limiter_link);
@@ -226,7 +222,7 @@ static void sg_platf_new_cluster_hierarchical(const simgrid::kernel::routing::Cl
     set_limiter = std::bind(sg_platf_cluster_create_limiter, cluster, _1, _2, _3);
   }
 
-  simgrid::s4u::NetZone const* parent = routing_get_current() ? routing_get_current()->get_iface() : nullptr;
+  simgrid::s4u::NetZone const* parent = current_routing ? current_routing->get_iface() : nullptr;
   simgrid::s4u::NetZone* zone;
   switch (cluster->topology) {
     case simgrid::kernel::routing::ClusterTopology::TORUS:
@@ -255,7 +251,7 @@ static void sg_platf_new_cluster_hierarchical(const simgrid::kernel::routing::Cl
 static void sg_platf_new_cluster_flat(simgrid::kernel::routing::ClusterCreationArgs* cluster)
 {
   auto* zone                          = simgrid::s4u::create_star_zone(cluster->id);
-  simgrid::s4u::NetZone const* parent = routing_get_current() ? routing_get_current()->get_iface() : nullptr;
+  simgrid::s4u::NetZone const* parent = current_routing ? current_routing->get_iface() : nullptr;
   if (parent)
     zone->set_parent(parent);
 
@@ -264,13 +260,13 @@ static void sg_platf_new_cluster_flat(simgrid::kernel::routing::ClusterCreationA
     zone->set_property(elm.first, elm.second);
 
   /* Make the backbone */
-  simgrid::s4u::Link* backbone = nullptr;
+  const simgrid::s4u::Link* backbone = nullptr;
   if ((cluster->bb_bw > 0) || (cluster->bb_lat > 0)) {
     std::string bb_name = std::string(cluster->id) + "_backbone";
     XBT_DEBUG("<link\tid=\"%s\" bw=\"%f\" lat=\"%f\"/> <!--backbone -->", bb_name.c_str(), cluster->bb_bw,
               cluster->bb_lat);
 
-    backbone = zone->create_link(bb_name, std::vector<double>{cluster->bb_bw})
+    backbone = zone->create_link(bb_name, cluster->bb_bw)
                    ->set_sharing_policy(cluster->bb_sharing_policy)
                    ->set_latency(cluster->bb_lat)
                    ->seal();
@@ -295,44 +291,41 @@ static void sg_platf_new_cluster_flat(simgrid::kernel::routing::ClusterCreationA
       std::string loopback_name = link_id + "_loopback";
       XBT_DEBUG("<loopback\tid=\"%s\"\tbw=\"%f\"/>", loopback_name.c_str(), cluster->loopback_bw);
 
-      auto* loopback = zone->create_link(loopback_name, std::vector<double>{cluster->loopback_bw})
-                           ->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::FATPIPE)
-                           ->set_latency(cluster->loopback_lat)
-                           ->seal();
+      const auto* loopback = zone->create_link(loopback_name, cluster->loopback_bw)
+                                 ->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::FATPIPE)
+                                 ->set_latency(cluster->loopback_lat)
+                                 ->seal();
 
       zone->add_route(host->get_netpoint(), host->get_netpoint(), nullptr, nullptr,
-                      std::vector<simgrid::s4u::Link*>{loopback});
+                      {simgrid::s4u::LinkInRoute(loopback)});
     }
 
     // add a limiter link (shared link to account for maximal bandwidth of the node)
-    simgrid::s4u::Link* limiter = nullptr;
+    const simgrid::s4u::Link* limiter = nullptr;
     if (cluster->limiter_link > 0) {
       std::string limiter_name = std::string(link_id) + "_limiter";
       XBT_DEBUG("<limiter\tid=\"%s\"\tbw=\"%f\"/>", limiter_name.c_str(), cluster->limiter_link);
 
-      limiter = zone->create_link(limiter_name, std::vector<double>{cluster->limiter_link})->seal();
+      limiter = zone->create_link(limiter_name, cluster->limiter_link)->seal();
     }
 
     // create link
-    simgrid::s4u::Link* link_up;
-    simgrid::s4u::Link* link_down;
+    const simgrid::s4u::Link* link;
     if (cluster->sharing_policy == simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX) {
-      link_up = zone->create_link(link_id + "_UP", std::vector<double>{cluster->bw})->set_latency(cluster->lat)->seal();
-      link_down =
-          zone->create_link(link_id + "_DOWN", std::vector<double>{cluster->bw})->set_latency(cluster->lat)->seal();
+      link = zone->create_split_duplex_link(link_id, cluster->bw)->set_latency(cluster->lat)->seal();
     } else {
-      link_up   = zone->create_link(link_id, std::vector<double>{cluster->bw})->set_latency(cluster->lat)->seal();
-      link_down = link_up;
+      link = zone->create_link(link_id, cluster->bw)->set_latency(cluster->lat)->seal();
     }
 
     /* adding routes */
-    std::vector<simgrid::s4u::Link*> links_up{limiter, link_up, backbone};
-    std::vector<simgrid::s4u::Link*> links_down{backbone, link_down, limiter};
-    links_up.erase(std::remove(links_up.begin(), links_up.end(), nullptr), links_up.end());
-    links_down.erase(std::remove(links_down.begin(), links_down.end(), nullptr), links_down.end());
-
-    zone->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, links_up, false);
-    zone->add_route(nullptr, host->get_netpoint(), nullptr, nullptr, links_down, false);
+    std::vector<simgrid::s4u::LinkInRoute> links;
+    if (limiter)
+      links.emplace_back(limiter);
+    links.emplace_back(link, simgrid::s4u::LinkInRoute::Direction::UP);
+    if (backbone)
+      links.emplace_back(backbone);
+
+    zone->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, links, true);
   }
 
   // Add a router.
@@ -365,22 +358,25 @@ void sg_platf_new_tag_cluster(simgrid::kernel::routing::ClusterCreationArgs* clu
 static void sg_platf_cluster_set_hostlink(simgrid::kernel::routing::StarZone* zone,
                                           simgrid::kernel::routing::NetPoint* netpoint,
                                           const simgrid::s4u::Link* link_up, const simgrid::s4u::Link* link_down,
-                                          simgrid::kernel::resource::LinkImpl* backbone)
+                                          const simgrid::s4u::Link* backbone)
 {
-  XBT_DEBUG("Push Host_link for host '%s' to position %u", netpoint->get_cname(), netpoint->id());
+  XBT_DEBUG("Push Host_link for host '%s' to position %lu", netpoint->get_cname(), netpoint->id());
+  simgrid::s4u::LinkInRoute linkUp{link_up};
+  simgrid::s4u::LinkInRoute linkDown{link_down};
   if (backbone) {
-    zone->add_route(netpoint, nullptr, nullptr, nullptr, {link_up->get_impl(), backbone}, false);
-    zone->add_route(nullptr, netpoint, nullptr, nullptr, {backbone, link_down->get_impl()}, false);
+    simgrid::s4u::LinkInRoute linkBB{backbone};
+    zone->add_route(netpoint, nullptr, nullptr, nullptr, {linkUp, linkBB}, false);
+    zone->add_route(nullptr, netpoint, nullptr, nullptr, {linkBB, linkDown}, false);
   } else {
-    zone->add_route(netpoint, nullptr, nullptr, nullptr, {link_up->get_impl()}, false);
-    zone->add_route(nullptr, netpoint, nullptr, nullptr, {link_down->get_impl()}, false);
+    zone->add_route(netpoint, nullptr, nullptr, nullptr, {linkUp}, false);
+    zone->add_route(nullptr, netpoint, nullptr, nullptr, {linkDown}, false);
   }
 }
 
 /** @brief Add a link connecting a host to the rest of its StarZone */
 static void sg_platf_build_hostlink(simgrid::kernel::routing::StarZone* zone,
                                     const simgrid::kernel::routing::HostLinkCreationArgs* hostlink,
-                                    simgrid::kernel::resource::LinkImpl* backbone)
+                                    const simgrid::s4u::Link* backbone)
 {
   simgrid::kernel::routing::NetPoint* netpoint = simgrid::s4u::Host::by_name(hostlink->id)->get_netpoint();
   xbt_assert(netpoint, "Host '%s' not found!", hostlink->id.c_str());
@@ -396,16 +392,14 @@ static void sg_platf_build_hostlink(simgrid::kernel::routing::StarZone* zone,
 /** @brief Create a cabinet (set of hosts) inside a Cluster(StarZone) */
 static void sg_platf_build_cabinet(simgrid::kernel::routing::StarZone* zone,
                                    const simgrid::kernel::routing::CabinetCreationArgs* args,
-                                   simgrid::kernel::resource::LinkImpl* backbone)
+                                   const simgrid::s4u::Link* backbone)
 {
   for (int const& radical : args->radicals) {
     std::string id   = args->prefix + std::to_string(radical) + args->suffix;
-    auto const* host = zone->create_host(id, std::vector<double>{args->speed})->seal();
+    auto const* host = zone->create_host(id, {args->speed})->seal();
 
-    const auto* link_up =
-        zone->create_link("link_" + id + "_UP", std::vector<double>{args->bw})->set_latency(args->lat)->seal();
-    const auto* link_down =
-        zone->create_link("link_" + id + "_DOWN", std::vector<double>{args->bw})->set_latency(args->lat)->seal();
+    const auto* link_up   = zone->create_link("link_" + id + "_UP", {args->bw})->set_latency(args->lat)->seal();
+    const auto* link_down = zone->create_link("link_" + id + "_DOWN", {args->bw})->set_latency(args->lat)->seal();
 
     sg_platf_cluster_set_hostlink(zone, host->get_netpoint(), link_up, link_down, backbone);
   }
@@ -416,11 +410,11 @@ static void sg_platf_zone_cluster_populate(const simgrid::kernel::routing::Clust
   auto* zone = dynamic_cast<simgrid::kernel::routing::StarZone*>(current_routing);
   xbt_assert(zone, "Host_links are only valid for Cluster(Star)");
 
-  simgrid::kernel::resource::LinkImpl* backbone = nullptr;
+  const simgrid::s4u::Link* backbone = nullptr;
   /* create backbone */
   if (cluster->backbone) {
     sg_platf_new_link(cluster->backbone.get());
-    backbone = simgrid::s4u::Link::by_name(cluster->backbone->id)->get_impl();
+    backbone = simgrid::s4u::Link::by_name(cluster->backbone->id);
   }
 
   /* create host_links for hosts */
@@ -448,14 +442,13 @@ void sg_platf_new_cabinet(const simgrid::kernel::routing::CabinetCreationArgs* a
 /*************************************************************************************************/
 void sg_platf_new_route(simgrid::kernel::routing::RouteCreationArgs* route)
 {
-  routing_get_current()->add_route(route->src, route->dst, route->gw_src, route->gw_dst, route->link_list,
-                                   route->symmetrical);
+  current_routing->add_route(route->src, route->dst, route->gw_src, route->gw_dst, route->link_list,
+                             route->symmetrical);
 }
 
-void sg_platf_new_bypassRoute(simgrid::kernel::routing::RouteCreationArgs* bypassRoute)
+void sg_platf_new_bypass_route(simgrid::kernel::routing::RouteCreationArgs* route)
 {
-  routing_get_current()->add_bypass_route(bypassRoute->src, bypassRoute->dst, bypassRoute->gw_src, bypassRoute->gw_dst,
-                                          bypassRoute->link_list, bypassRoute->symmetrical);
+  current_routing->add_bypass_route(route->src, route->dst, route->gw_src, route->gw_dst, route->link_list);
 }
 
 void sg_platf_new_actor(simgrid::kernel::routing::ActorCreationArgs* actor)
@@ -531,7 +524,7 @@ void sg_platf_new_actor(simgrid::kernel::routing::ActorCreationArgs* actor)
 /**
  * @brief Auxiliary function to build the object NetZoneImpl
  *
- * Builds the objects, setting its father properties and root netzone if needed
+ * Builds the objects, setting its parent properties and root netzone if needed
  * @param zone the parameters defining the Zone to build.
  * @return Pointer to recently created netzone
  */
@@ -539,43 +532,45 @@ static simgrid::kernel::routing::NetZoneImpl*
 sg_platf_create_zone(const simgrid::kernel::routing::ZoneCreationArgs* zone)
 {
   /* search the routing model */
-  simgrid::kernel::routing::NetZoneImpl* new_zone = nullptr;
+  const simgrid::s4u::NetZone* new_zone = nullptr;
 
   if (strcasecmp(zone->routing.c_str(), "Cluster") == 0) {
-    new_zone = new simgrid::kernel::routing::StarZone(zone->id);
+    new_zone = simgrid::s4u::create_star_zone(zone->id);
   } else if (strcasecmp(zone->routing.c_str(), "Dijkstra") == 0) {
-    new_zone = new simgrid::kernel::routing::DijkstraZone(zone->id, false);
+    new_zone = simgrid::s4u::create_dijkstra_zone(zone->id, false);
   } else if (strcasecmp(zone->routing.c_str(), "DijkstraCache") == 0) {
-    new_zone = new simgrid::kernel::routing::DijkstraZone(zone->id, true);
+    new_zone = simgrid::s4u::create_dijkstra_zone(zone->id, true);
   } else if (strcasecmp(zone->routing.c_str(), "Floyd") == 0) {
-    new_zone = new simgrid::kernel::routing::FloydZone(zone->id);
+    new_zone = simgrid::s4u::create_floyd_zone(zone->id);
   } else if (strcasecmp(zone->routing.c_str(), "Full") == 0) {
-    new_zone = new simgrid::kernel::routing::FullZone(zone->id);
+    new_zone = simgrid::s4u::create_full_zone(zone->id);
   } else if (strcasecmp(zone->routing.c_str(), "None") == 0) {
-    new_zone = new simgrid::kernel::routing::EmptyZone(zone->id);
+    new_zone = simgrid::s4u::create_empty_zone(zone->id);
   } else if (strcasecmp(zone->routing.c_str(), "Vivaldi") == 0) {
-    new_zone = new simgrid::kernel::routing::VivaldiZone(zone->id);
+    new_zone = simgrid::s4u::create_vivaldi_zone(zone->id);
   } else if (strcasecmp(zone->routing.c_str(), "Wifi") == 0) {
-    new_zone = new simgrid::kernel::routing::WifiZone(zone->id);
+    new_zone = simgrid::s4u::create_wifi_zone(zone->id);
   } else {
     xbt_die("Not a valid model!");
   }
-  new_zone->set_parent(current_routing);
 
-  return new_zone;
+  simgrid::kernel::routing::NetZoneImpl* new_zone_impl = new_zone->get_impl();
+  new_zone_impl->set_parent(current_routing);
+
+  return new_zone_impl;
 }
 
 /**
  * @brief Add a Zone to the platform
  *
  * Add a new autonomous system to the platform. Any elements (such as host, router or sub-Zone) added after this call
- * and before the corresponding call to sg_platf_new_Zone_seal() will be added to this Zone.
+ * and before the corresponding call to sg_platf_new_zone_seal() will be added to this Zone.
  *
  * Once this function was called, the configuration concerning the used models cannot be changed anymore.
  *
  * @param zone the parameters defining the Zone to build.
  */
-simgrid::kernel::routing::NetZoneImpl* sg_platf_new_Zone_begin(const simgrid::kernel::routing::ZoneCreationArgs* zone)
+simgrid::kernel::routing::NetZoneImpl* sg_platf_new_zone_begin(const simgrid::kernel::routing::ZoneCreationArgs* zone)
 {
   zone_cluster.routing = zone->routing;
   current_routing      = sg_platf_create_zone(zone);
@@ -583,7 +578,7 @@ simgrid::kernel::routing::NetZoneImpl* sg_platf_new_Zone_begin(const simgrid::ke
   return current_routing;
 }
 
-void sg_platf_new_Zone_set_properties(const std::unordered_map<std::string, std::string>& props)
+void sg_platf_new_zone_set_properties(const std::unordered_map<std::string, std::string>& props)
 {
   xbt_assert(current_routing, "Cannot set properties of the current Zone: none under construction");
 
@@ -596,7 +591,7 @@ void sg_platf_new_Zone_set_properties(const std::unordered_map<std::string, std:
  * Once you've declared all the content of your Zone, you have to seal
  * it with this call. Your Zone is not usable until you call this function.
  */
-void sg_platf_new_Zone_seal()
+void sg_platf_new_zone_seal()
 {
   xbt_assert(current_routing, "Cannot seal the current Zone: none under construction");
   if (strcasecmp(zone_cluster.routing.c_str(), "Cluster") == 0) {
index af27388..d0d38ae 100644 (file)
@@ -10,6 +10,7 @@
 #include "src/surf/surf_private.hpp"
 #include "xbt/function_types.h"
 
+#include <cfloat>
 #include <cmath>
 #include <functional>
 #include <set>
@@ -41,11 +42,13 @@ inline auto& watched_hosts() // avoid static initialization order fiasco
 
 static inline void double_update(double* variable, double value, double precision)
 {
-  // printf("Updating %g -= %g +- %g\n",*variable,value,precision);
-  // xbt_assert(value==0  || value>precision);
-  // Check that precision is higher than the machine-dependent size of the mantissa. If not, brutal rounding  may
-  // happen, and the precision mechanism is not active...
-  // xbt_assert(*variable< (2<<DBL_MANT_DIG)*precision && FLT_RADIX==2);
+  if (false) { // debug
+    fprintf(stderr, "Updating %g -= %g +- %g\n", *variable, value, precision);
+    xbt_assert(value == 0.0 || value > precision);
+    // Check that precision is higher than the machine-dependent size of the mantissa. If not, brutal rounding  may
+    // happen, and the precision mechanism is not active...
+    xbt_assert(FLT_RADIX == 2 && *variable < precision * exp2(DBL_MANT_DIG));
+  }
   *variable -= value;
   if (*variable < precision)
     *variable = 0.0;
index b5443e8..763f963 100644 (file)
@@ -80,7 +80,7 @@ public:
   NetPoint* dst    = nullptr;
   NetPoint* gw_src = nullptr;
   NetPoint* gw_dst = nullptr;
-  std::vector<resource::LinkImpl*> link_list;
+  std::vector<simgrid::s4u::LinkInRoute> link_list;
 };
 
 enum class ClusterTopology { DRAGONFLY = 3, FAT_TREE = 2, FLAT = 1, TORUS = 0 };
@@ -180,9 +180,9 @@ void routing_cluster_add_backbone(std::unique_ptr<simgrid::kernel::routing::Link
 /*** END of the parsing cruft ***/
 
 XBT_PUBLIC simgrid::kernel::routing::NetZoneImpl*
-sg_platf_new_Zone_begin(const simgrid::kernel::routing::ZoneCreationArgs* zone); // Begin description of new Zone
-XBT_PUBLIC void sg_platf_new_Zone_set_properties(const std::unordered_map<std::string, std::string>& props);
-XBT_PUBLIC void sg_platf_new_Zone_seal();                                          // That Zone is fully described
+sg_platf_new_zone_begin(const simgrid::kernel::routing::ZoneCreationArgs* zone); // Begin description of new Zone
+XBT_PUBLIC void sg_platf_new_zone_set_properties(const std::unordered_map<std::string, std::string>& props);
+XBT_PUBLIC void sg_platf_new_zone_seal(); // That Zone is fully described
 
 XBT_PUBLIC void
 sg_platf_new_host_begin(const simgrid::kernel::routing::HostCreationArgs* host); // Add a host to the current Zone
@@ -204,7 +204,7 @@ sg_platf_new_router(const std::string&, const std::string& coords);
 XBT_PUBLIC void
 sg_platf_new_cabinet(const simgrid::kernel::routing::CabinetCreationArgs* cabinet); // Add a cabinet to the current Zone
 XBT_PUBLIC void sg_platf_new_route(simgrid::kernel::routing::RouteCreationArgs* route);             // Add a route
-XBT_PUBLIC void sg_platf_new_bypassRoute(simgrid::kernel::routing::RouteCreationArgs* bypassroute); // Add a bypassRoute
+XBT_PUBLIC void sg_platf_new_bypass_route(simgrid::kernel::routing::RouteCreationArgs* route); // Add a bypass route
 
 XBT_PUBLIC void sg_platf_new_trace(simgrid::kernel::routing::ProfileCreationArgs* trace);
 
index b95eb0b..62947af 100644 (file)
@@ -28,8 +28,7 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, "Logging specific to the SURF parsing module");
 
 std::string surf_parsed_filename; // Currently parsed file (for the error messages)
-std::vector<simgrid::kernel::resource::LinkImpl*>
-    parsed_link_list; /* temporary store of current link list of a route */
+std::vector<simgrid::s4u::LinkInRoute> parsed_link_list; /* temporary store of current link list of a route */
 
 /* Helping functions */
 void surf_parse_assert(bool cond, const std::string& msg)
@@ -482,17 +481,20 @@ void ETag_surfxml_link(){
 
 void STag_surfxml_link___ctn()
 {
-  simgrid::kernel::resource::LinkImpl* link = nullptr;
+  const simgrid::s4u::Link* link;
+  simgrid::s4u::LinkInRoute::Direction direction = simgrid::s4u::LinkInRoute::Direction::NONE;
   switch (A_surfxml_link___ctn_direction) {
   case AU_surfxml_link___ctn_direction:
   case A_surfxml_link___ctn_direction_NONE:
-    link = simgrid::s4u::Link::by_name(std::string(A_surfxml_link___ctn_id))->get_impl();
+    link = simgrid::s4u::Link::by_name(std::string(A_surfxml_link___ctn_id));
     break;
   case A_surfxml_link___ctn_direction_UP:
-    link = simgrid::s4u::Link::by_name(std::string(A_surfxml_link___ctn_id) + "_UP")->get_impl();
+    link      = simgrid::s4u::SplitDuplexLink::by_name(std::string(A_surfxml_link___ctn_id));
+    direction = simgrid::s4u::LinkInRoute::Direction::UP;
     break;
   case A_surfxml_link___ctn_direction_DOWN:
-    link = simgrid::s4u::Link::by_name(std::string(A_surfxml_link___ctn_id) + "_DOWN")->get_impl();
+    link      = simgrid::s4u::SplitDuplexLink::by_name(std::string(A_surfxml_link___ctn_id));
+    direction = simgrid::s4u::LinkInRoute::Direction::DOWN;
     break;
   default:
     surf_parse_error(std::string("Invalid direction for link ") + A_surfxml_link___ctn_id);
@@ -510,7 +512,7 @@ void STag_surfxml_link___ctn()
       dirname = "";
   }
   surf_parse_assert(link != nullptr, std::string("No such link: '") + A_surfxml_link___ctn_id + "'" + dirname);
-  parsed_link_list.push_back(link);
+  parsed_link_list.emplace_back(link, direction);
 }
 
 void ETag_surfxml_backbone()
@@ -615,7 +617,7 @@ void ETag_surfxml_bypassRoute(){
 
   route.link_list.swap(parsed_link_list);
 
-  sg_platf_new_bypassRoute(&route);
+  sg_platf_new_bypass_route(&route);
 }
 
 void ETag_surfxml_bypassASroute()
@@ -639,7 +641,7 @@ void ETag_surfxml_bypassZoneRoute()
   ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___src);
   ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___dst);
 
-  sg_platf_new_bypassRoute(&ASroute);
+  sg_platf_new_bypass_route(&ASroute);
 }
 
 void ETag_surfxml_trace(){
@@ -701,14 +703,14 @@ void STag_surfxml_zone()
   simgrid::kernel::routing::ZoneCreationArgs zone;
   zone.id      = A_surfxml_zone_id;
   zone.routing = A_surfxml_zone_routing;
-  sg_platf_new_Zone_begin(&zone);
+  sg_platf_new_zone_begin(&zone);
 }
 
 void ETag_surfxml_zone()
 {
-  sg_platf_new_Zone_set_properties(property_sets.back());
+  sg_platf_new_zone_set_properties(property_sets.back());
   property_sets.pop_back();
-  sg_platf_new_Zone_seal();
+  sg_platf_new_zone_seal();
 }
 
 void STag_surfxml_config()
index b86765a..1a4424f 100644 (file)
@@ -81,7 +81,7 @@ static inline void _xbt_dynar_get_elm(void* dst, const_xbt_dynar_t dynar, unsign
  */
 xbt_dynar_t xbt_dynar_new(const unsigned long elmsize, void_f_pvoid_t free_f)
 {
-  xbt_dynar_t dynar = xbt_new0(s_xbt_dynar_t, 1);
+  auto* dynar = xbt_new0(s_xbt_dynar_t, 1);
 
   dynar->size = 0;
   dynar->used = 0;
@@ -420,7 +420,7 @@ void xbt_dynar_sort(const_xbt_dynar_t dynar, int_f_cpvoid_cpvoid_t compar_fn)
  *
  *  Note: The dynar won't be usable afterwards.
  */
-void* xbt_dynar_to_array(xbt_dynar_t dynar)
+void* xbt_dynar_to_array(xbt_dynar_t dynar) // XBT_ATTRIB_DEPRECATED_v331
 {
   void* res;
   xbt_dynar_shrink(dynar, 1);
index 93ed95f..131eda1 100644 (file)
@@ -321,7 +321,7 @@ void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent)
   parent->firstChild = cat;
 
   if (not parent->initialized)
-    _xbt_log_cat_init(parent, xbt_log_priority_uninitialized /* ignored */ );
+    (void)_xbt_log_cat_init(parent, xbt_log_priority_uninitialized /* ignored */);
 
   cat->threshold = parent->threshold;
 
index 98e9bff..fccfac8 100644 (file)
   } else                                                                                                               \
     ((void)0)
 
+#define DEBUG_PRINT(...)                                                                                               \
+  if (false) {                                                                                                         \
+    fprintf(stderr, __VA_ARGS__);                                                                                      \
+  } else                                                                                                               \
+    ((void)0)
+
 namespace simgrid {
 namespace xbt {
 
@@ -155,11 +161,9 @@ std::vector<VmMap> get_memory_map(pid_t pid)
     if (dladdr(reinterpret_cast<void*>(address), &dlinfo))
       memreg.pathname = dlinfo.dli_fname;
 
-#if 0 /* debug */
-    std::fprintf(stderr, "Region: %016" PRIx64 "-%016" PRIx64 " | %c%c%c | %s\n", memreg.start_addr, memreg.end_addr,
-              (memreg.prot & PROT_READ) ? 'r' : '-', (memreg.prot & PROT_WRITE) ? 'w' : '-',
-              (memreg.prot & PROT_EXEC) ? 'x' : '-', memreg.pathname.c_str());
-#endif
+    DEBUG_PRINT("Region: %016" PRIx64 "-%016" PRIx64 " | %c%c%c | %s\n", memreg.start_addr, memreg.end_addr,
+                (memreg.prot & PROT_READ) ? 'r' : '-', (memreg.prot & PROT_WRITE) ? 'w' : '-',
+                (memreg.prot & PROT_EXEC) ? 'x' : '-', memreg.pathname.c_str());
 
     ret.push_back(std::move(memreg));
     address += size;
@@ -290,7 +294,7 @@ std::vector<VmMap> get_memory_map(pid_t pid)
 
     /* Create space for a new map region in the region's array and copy the */
     /* parsed stuff from the temporal memreg variable */
-    // std::fprintf(stderr, "Found region for %s\n", not memreg.pathname.empty() ? memreg.pathname.c_str() : "(null)");
+    DEBUG_PRINT("Found region for \"%s\"\n", memreg.pathname.c_str());
 
     ret.push_back(std::move(memreg));
   }
index c3f9b8c..5c95f1a 100644 (file)
 #include <fcntl.h>              /* After sys/types.h, at least for dpx/2.  */
 #include <sys/stat.h>
 #include <string.h>
-#if HAVE_UNISTD_H
-#include <unistd.h>             /* Prototypes for lseek */
-#endif
 #include "mmprivate.h"
 #include "xbt/ex.h"
 #include "xbt/xbt_modinter.h" /* declarations of mmalloc_preinit and friends that live here */
 
-#ifndef SEEK_SET
-#define SEEK_SET 0
-#endif
-
 /* Initialize access to a mmalloc managed region.
 
-   If FD is a valid file descriptor for an open file then data for the
-   mmalloc managed region is mapped to that file, otherwise an anonymous
-   map is used if supported by the underlying OS. In case of running in
-   an OS without support of anonymous mappings then "/dev/zero" is used
-   and in both cases the data will not exist in any filesystem object.
-
-   If the open file corresponding to FD is from a previous use of
-   mmalloc and passes some basic sanity checks to ensure that it is
-   compatible with the current mmalloc package, then its data is
-   mapped in and is immediately accessible at the same addresses in
-   the current process as the process that created the file (ignoring
-   the BASEADDR parameter).
-
-   For non valid FDs or empty files ones the mapping is established
-   starting at the specified address BASEADDR in the process address
-   space.
+   The mapping is established starting at the specified address BASEADDR
+   in the process address space.
 
    The provided BASEADDR should be chosen carefully in order to avoid
    bumping into existing mapped regions or future mapped regions.
 
    On failure returns NULL. */
 
-xbt_mheap_t xbt_mheap_new(int fd, void *baseaddr)
-{
-  return xbt_mheap_new_options(fd, baseaddr, 0);
-}
-
-xbt_mheap_t xbt_mheap_new_options(int fd, void *baseaddr, int options)
+xbt_mheap_t xbt_mheap_new(void* baseaddr, int options)
 {
-  struct mdesc mtemp;
-  xbt_mheap_t mdp;
-  void *mbase;
-  struct stat sbuf;
-
-  /* First check to see if FD is a valid file descriptor, and if so, see
-     if the file has any current contents (size > 0).  If it does, then
-     attempt to reuse the file.  If we can't reuse the file, either
-     because it isn't a valid mmalloc produced file, was produced by an
-     obsolete version, or any other reason, then we fail to attach to
-     this file. */
-
-  if (fd >= 0) {
-    if (fstat(fd, &sbuf) < 0)
-      return (NULL);
-
-    else if (sbuf.st_size > 0) {
-      /* We were given a valid file descriptor on an open file, so try to remap
-         it into the current process at the same address to which it was previously
-         mapped. It naturally have to pass some sanity checks for that.
-
-         Note that we have to update the file descriptor number in the malloc-
-         descriptor read from the file to match the current valid one, before
-         trying to map the file in, and again after a successful mapping and
-         after we've switched over to using the mapped in malloc descriptor
-         rather than the temporary one on the stack.
-
-         Once we've switched over to using the mapped in malloc descriptor, we
-         have to update the pointer to the morecore function, since it almost
-         certainly will be at a different address if the process reusing the
-         mapped region is from a different executable.
-
-         Also note that if the heap being remapped previously used the mmcheckf()
-         routines, we need to update the hooks since their target functions
-         will have certainly moved if the executable has changed in any way.
-         We do this by calling mmcheckf() internally.
-
-         Returns a pointer to the malloc descriptor if successful, or NULL if
-         unsuccessful for some reason. */
-
-      struct mdesc newmd;
-      struct mdesc* mdptr   = NULL;
-      struct mdesc* mdptemp = NULL;
-
-      if (lseek(fd, 0L, SEEK_SET) != 0)
-        return NULL;
-      if (read(fd, (char *) &newmd, sizeof(newmd)) != sizeof(newmd))
-        return NULL;
-      if (newmd.headersize != sizeof(newmd))
-        return NULL;
-      if (strcmp(newmd.magic, MMALLOC_MAGIC) != 0)
-        return NULL;
-      if (newmd.version > MMALLOC_VERSION)
-        return NULL;
-
-      newmd.fd = fd;
-      if (__mmalloc_remap_core(&newmd) == newmd.base) {
-        mdptr = (struct mdesc *) newmd.base;
-        mdptr->fd = fd;
-        if(!mdptr->refcount){
-          pthread_mutex_init(&mdptr->mutex, NULL);
-          mdptr->refcount++;
-        }
-      }
-
-      /* Add the new heap to the linked list of heaps attached by mmalloc */
-      mdptemp = __mmalloc_default_mdp;
-      while(mdptemp->next_mdesc)
-        mdptemp = mdptemp->next_mdesc;
-
-      LOCK(mdptemp);
-      mdptemp->next_mdesc = mdptr;
-      UNLOCK(mdptemp);
-
-      return mdptr;
-    }
-  }
-
   /* NULL is not a valid baseaddr as we cannot map anything there. C'mon, user. Think! */
   if (baseaddr == NULL)
-    return (NULL);
+    return NULL;
 
   /* We start off with the malloc descriptor allocated on the stack, until we build it up enough to
    * call _mmalloc_mmap_morecore() to allocate the first page of the region and copy it there.  Ensure that it is
    * zero'd and then initialize the fields that we know values for. */
 
-  mdp = &mtemp;
+  struct mdesc mtemp;
+  xbt_mheap_t mdp = &mtemp;
   memset((char *) mdp, 0, sizeof(mtemp));
   strncpy(mdp->magic, MMALLOC_MAGIC, MMALLOC_MAGIC_SIZE);
   mdp->headersize = sizeof(mtemp);
   mdp->version = MMALLOC_VERSION;
-  mdp->fd = fd;
   mdp->base = mdp->breakval = mdp->top = baseaddr;
   mdp->next_mdesc = NULL;
-  mdp->refcount = 1;
   mdp->options = options;
 
-  /* If we have not been passed a valid open file descriptor for the file
-     to map to, then we go for an anonymous map */
-
-  if (mdp->fd < 0){
-    mdp->flags |= MMALLOC_ANONYMOUS;
-  }
   pthread_mutex_init(&mdp->mutex, NULL);
   /* If we have not been passed a valid open file descriptor for the file
      to map to, then open /dev/zero and use that to map to. */
@@ -190,12 +79,12 @@ xbt_mheap_t xbt_mheap_new_options(int fd, void *baseaddr, int options)
    * this new copy.  If the mapping fails, then close the file descriptor if it was opened by us, and arrange to return
    * a NULL. */
 
-  if ((mbase = mmorecore(mdp, sizeof(mtemp))) != NULL) {
-    memcpy(mbase, mdp, sizeof(mtemp));
-  } else {
+  void* mbase = mmorecore(mdp, sizeof(mtemp));
+  if (mbase == NULL) {
     fprintf(stderr, "morecore failed to get some more memory!\n");
     abort();
   }
+  memcpy(mbase, mdp, sizeof(mtemp));
 
   /* Add the new heap to the linked list of heaps attached by mmalloc */
   if(__mmalloc_default_mdp){
@@ -222,9 +111,7 @@ void xbt_mheap_destroy_no_free(xbt_mheap_t md)
 {
   struct mdesc *mdp = md;
 
-  if(--mdp->refcount == 0){
-    pthread_mutex_destroy(&mdp->mutex);
-  }
+  pthread_mutex_destroy(&mdp->mutex);
 }
 
 /** Terminate access to a mmalloc managed region by unmapping all memory pages associated with the region, and closing
@@ -258,9 +145,6 @@ void *xbt_mheap_destroy(xbt_mheap_t mdp)
       /* Deallocating failed.  Update the original malloc descriptor with any changes */
       *mdp = mtemp;
     } else {
-      if (mtemp.flags & MMALLOC_DEVZERO) {
-        close(mtemp.fd);
-      }
       mdp = NULL;
     }
   }
@@ -278,9 +162,6 @@ static void mmalloc_fork_prepare(void)
   if ((mdp =__mmalloc_default_mdp)){
     while(mdp){
       LOCK(mdp);
-      if(mdp->fd >= 0){
-        mdp->refcount++;
-      }
       mdp = mdp->next_mdesc;
     }
   }
@@ -291,8 +172,7 @@ static void mmalloc_fork_parent(void)
   xbt_mheap_t mdp = NULL;
   if ((mdp =__mmalloc_default_mdp)){
     while(mdp){
-      if(mdp->fd < 0)
-        UNLOCK(mdp);
+      UNLOCK(mdp);
       mdp = mdp->next_mdesc;
     }
   }
@@ -317,7 +197,7 @@ xbt_mheap_t mmalloc_preinit(void)
       xbt_pagesize = getpagesize();
     unsigned long mask = ~((unsigned long)xbt_pagesize - 1);
     void *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask);
-    __mmalloc_default_mdp = xbt_mheap_new_options(-1, addr, XBT_MHEAP_OPTION_MEMSET);
+    __mmalloc_default_mdp = xbt_mheap_new(addr, XBT_MHEAP_OPTION_MEMSET);
 
     // atfork mandated at least on FreeBSD, or simgrid-mc will fail to fork the verified app
     int res = pthread_atfork(mmalloc_fork_prepare, mmalloc_fork_parent, mmalloc_fork_child);
index d7cd4e1..1dff798 100644 (file)
@@ -11,9 +11,6 @@
    Contributed by Fred Fish at Cygnus Support.   fnf@cygnus.com */
 
 #include "src/internal_config.h"
-#if HAVE_UNISTD_H
-#include <unistd.h>             /* Prototypes for lseek */
-#endif
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/mman.h>
 #define PAGE_ALIGN(addr) (void*) (((long)(addr) + xbt_pagesize - 1) &   \
                                   ~((long)xbt_pagesize - 1))
 
-/* Return MAP_PRIVATE if MDP represents /dev/zero.  Otherwise, return
-   MAP_SHARED.  */
-#define MAP_PRIVATE_OR_SHARED(MDP) (( MDP -> flags & MMALLOC_ANONYMOUS) \
-                                    ? MAP_PRIVATE                       \
-                                    : MAP_SHARED)
-
-/* Return MAP_ANONYMOUS if MDP uses anonymous mapping. Otherwise, return 0 */
-#define MAP_IS_ANONYMOUS(MDP) (((MDP) -> flags & MMALLOC_ANONYMOUS) \
-                               ? MAP_ANONYMOUS                      \
-                               : 0)
-
-/* Return -1 if MDP uses anonymous mapping. Otherwise, return MDP->FD */
-#define MAP_ANON_OR_FD(MDP) (((MDP) -> flags & MMALLOC_ANONYMOUS) \
-                             ? -1                                 \
-                             : (MDP) -> fd)
-
-/* Return 0if MDP uses anonymous mapping. Otherwise, return off */
-#define MAP_ANON_OR_OFFSET(MDP, off) (((MDP) -> flags & MMALLOC_ANONYMOUS) \
-                             ? 0                                           \
-                             : off)
-
 /** @brief Add memory to this heap
  *
  *  Get core for the memory region specified by MDP, using SIZE as the
 void *mmorecore(struct mdesc *mdp, ssize_t size)
 {
   void* result;                 // please keep it uninitialized to track issues
-  off_t foffset;                /* File offset at which new mapping will start */
   size_t mapbytes;              /* Number of bytes to map */
   void* moveto;                 /* Address where we wish to move "break value" to */
   void* mapto;                  /* Address we actually mapped to */
-  char buf = 0;                 /* Single byte to write to extend mapped file */
 
   if (size == 0) {
     /* Just return the current "break" value. */
@@ -88,69 +62,39 @@ void *mmorecore(struct mdesc *mdp, ssize_t size)
       fprintf(stderr,"Internal error: mmap was asked to deallocate more memory than it previously allocated. Bailling out now!\n");
       abort();
     }
-  } else {
-    /* We are allocating memory. Make sure we have an open file descriptor if not working with anonymous memory. */
-    if (!(mdp->flags & MMALLOC_ANONYMOUS) && mdp->fd < 0) {
-      fprintf(stderr,"Internal error: mmap file descriptor <0 (%d), without MMALLOC_ANONYMOUS being in the flags.\n",mdp->fd);
+  } else if ((char*)mdp->breakval + size > (char*)mdp->top) {
+    /* The request would move us past the end of the currently mapped memory, so map in enough more memory to satisfy
+       the request.  This means we also have to grow the mapped-to file by an appropriate amount, since mmap cannot
+       be used to extend a file. */
+    moveto   = PAGE_ALIGN((char*)mdp->breakval + size);
+    mapbytes = (char*)moveto - (char*)mdp->top;
+
+    /* Let's call mmap. Note that it is possible that mdp->top is 0. In this case mmap will choose the address for us.
+       This call might very well overwrite an already existing memory mapping (leading to weird bugs).
+    */
+    mapto = mmap(mdp->top, mapbytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+
+    if (mapto == MAP_FAILED) {
+      char buff[1024];
+      fprintf(stderr, "Internal error: mmap returned MAP_FAILED! error: %s\n", strerror(errno));
+      snprintf(buff, 1024, "cat /proc/%d/maps", getpid());
+      int status = system(buff);
+      if (status == -1 || !(WIFEXITED(status) && WEXITSTATUS(status) == 0))
+        fprintf(stderr, "Something went wrong when trying to %s\n", buff);
+      sleep(1);
       abort();
-    } else if ((char*)mdp->breakval + size > (char*)mdp->top) {
-      /* The request would move us past the end of the currently mapped memory, so map in enough more memory to satisfy
-         the request.  This means we also have to grow the mapped-to file by an appropriate amount, since mmap cannot
-         be used to extend a file. */
-      moveto   = PAGE_ALIGN((char*)mdp->breakval + size);
-      mapbytes = (char*)moveto - (char*)mdp->top;
-      foffset  = (char*)mdp->top - (char*)mdp->base;
-
-      if (mdp->fd > 0) {
-        if (lseek(mdp->fd, foffset + mapbytes - 1, SEEK_SET) == -1) {
-          fprintf(stderr, "Internal error: lseek into mmap'ed fd failed! error: %s", strerror(errno));
-          abort();
-        }
-        if (write(mdp->fd, &buf, 1) == -1) {
-          fprintf(stderr,"Internal error: write to mmap'ed fd failed! error: %s", strerror(errno));
-          abort();
-        }
-      }
-
-      /* Let's call mmap. Note that it is possible that mdp->top is 0. In this case mmap will choose the address for us.
-         This call might very well overwrite an already existing memory mapping (leading to weird bugs).
-       */
-      mapto = mmap(mdp->top, mapbytes, PROT_READ | PROT_WRITE,
-                   MAP_PRIVATE_OR_SHARED(mdp) | MAP_IS_ANONYMOUS(mdp) |
-                   MAP_FIXED, MAP_ANON_OR_FD(mdp), MAP_ANON_OR_OFFSET(mdp, foffset));
-
-      if (mapto == MAP_FAILED) {
-        char buff[1024];
-        fprintf(stderr,"Internal error: mmap returned MAP_FAILED! error: %s\n",strerror(errno));
-        snprintf(buff,1024,"cat /proc/%d/maps",getpid());
-        int status = system(buff);
-        if (status == -1 || !(WIFEXITED(status) && WEXITSTATUS(status) == 0))
-          fprintf(stderr, "Something went wrong when trying to %s\n", buff);
-        sleep(1);
-        abort();
-      }
+    }
 
-      if (mdp->top == 0)
-        mdp->base = mdp->breakval = mapto;
+    if (mdp->top == 0)
+      mdp->base = mdp->breakval = mapto;
 
-      mdp->top      = PAGE_ALIGN((char*)mdp->breakval + size);
-      result        = mdp->breakval;
-      mdp->breakval = (char*)mdp->breakval + size;
-    } else {
-      /* Memory is already mapped, we only need to increase the breakval: */
-      result        = mdp->breakval;
-      mdp->breakval = (char*)mdp->breakval + size;
-    }
+    mdp->top      = PAGE_ALIGN((char*)mdp->breakval + size);
+    result        = mdp->breakval;
+    mdp->breakval = (char*)mdp->breakval + size;
+  } else {
+    /* Memory is already mapped, we only need to increase the breakval: */
+    result        = mdp->breakval;
+    mdp->breakval = (char*)mdp->breakval + size;
   }
   return result;
 }
-
-void* __mmalloc_remap_core(const s_xbt_mheap_t* mdp)
-{
-  /* FIXME:  Quick hack, needs error checking and other attention. */
-
-  return mmap(mdp->base, (char*) mdp->top - (char*) mdp->base,
-              PROT_READ | PROT_WRITE | PROT_EXEC,
-              MAP_PRIVATE_OR_SHARED(mdp) | MAP_FIXED, mdp->fd, 0);
-}
-
index 9866448..acd317b 100644 (file)
@@ -62,7 +62,7 @@
    sign of the result is machine dependent for negative values, so force
    it to be treated as an unsigned int. */
 
-#define ADDR2UINT(addr)  ((uintptr_t) ((char*) (addr) - (char*) NULL))
+#define ADDR2UINT(addr)  ((uintptr_t) (addr))
 #define RESIDUAL(addr,bsize) ((uintptr_t) (ADDR2UINT (addr) % (bsize)))
 
 /* Determine the amount of memory spanned by the initial heap table
@@ -173,9 +173,6 @@ struct mdesc {
   /** @brief Mutex locking the access to the heap */
   pthread_mutex_t mutex;
 
-  /** @brief Number of processes that attached the heap */
-  unsigned int refcount;
-
   /** @brief Chained lists of mdescs */
   struct mdesc *next_mdesc;
 
@@ -245,13 +242,6 @@ struct mdesc {
    */
   void *top;
 
-  /** @brief Open file descriptor for the file to which this malloc heap is mapped
-   *
-   * If this value is negative, MAP_ANONYMOUS memory is used.
-   *
-   * Also note that it may change each time the region is mapped and unmapped. */
-  int fd;
-
   /* @brief Instrumentation */
   struct mstats heapstats;
 };
@@ -259,17 +249,12 @@ struct mdesc {
 /* Bits to look at in the malloc descriptor flags word */
 
 #define MMALLOC_DEVZERO    (1 << 0)        /* Have mapped to /dev/zero */
-#define MMALLOC_ANONYMOUS (1 << 1)      /* Use anonymous mapping */
-#define MMALLOC_INITIALIZED  (1 << 2)        /* Initialized mmalloc */
+#define MMALLOC_INITIALIZED (1 << 1)      /* Initialized mmalloc */
 
 /* A default malloc descriptor for the single sbrk() managed region. */
 
 XBT_PUBLIC_DATA struct mdesc* __mmalloc_default_mdp;
 
-/* Remap a mmalloc region that was previously mapped. */
-
-XBT_PUBLIC void* __mmalloc_remap_core(const s_xbt_mheap_t* mdp);
-
 XBT_PUBLIC void* mmorecore(struct mdesc* mdp, ssize_t size);
 
 /** Thread-safety (if the mutex is already created)
index be383be..e28a428 100644 (file)
@@ -23,7 +23,7 @@ typedef const struct xbt_swag* const_xbt_swag_t;
 
 static inline void *xbt_swag_getFirst(const_xbt_swag_t swag)
 {
-  return (swag->head);
+  return swag->head;
 }
 
 /*
@@ -124,5 +124,5 @@ static inline void *xbt_swag_remove(void *obj, xbt_swag_t swag)
  */
 static inline int xbt_swag_size(const_xbt_swag_t swag)
 {
-  return (swag->count);
+  return swag->count;
 }
index 0281701..9cbbecf 100644 (file)
@@ -62,7 +62,7 @@
 #if !HAVE_VASPRINTF
 #include <assert.h>
 #include <stdarg.h> /* vsnprintf */
-int vasprintf(char **ptr, const char *fmt, va_list ap);
+int vasprintf(char** ptr, const char* fmt, va_list ap) XBT_ATTRIB_PRINTF(2, 0);
 int vasprintf(char **ptr, const char *fmt, va_list ap)
 {
   size_t str_m;
index faadee9..8247d29 100644 (file)
@@ -26,10 +26,10 @@ static void free_(const s_xbt_log_appender_t* this_)
 
 xbt_log_appender_t xbt_log_appender_stream(FILE* f)
 {
-  xbt_log_appender_t res = xbt_new0(s_xbt_log_appender_t, 1);
-  res->do_append         = &append_file;
-  res->free_             = nullptr;
-  res->data              = static_cast<void*>(f);
+  auto* res      = xbt_new0(s_xbt_log_appender_t, 1);
+  res->do_append = &append_file;
+  res->free_     = nullptr;
+  res->data      = static_cast<void*>(f);
   return res;
 }
 
@@ -37,10 +37,10 @@ xbt_log_appender_t xbt_log_appender_file_new(const char* arg)
 {
   if (arg == nullptr)
     return xbt_log_appender_stream(stderr);
-  xbt_log_appender_t res = xbt_new0(s_xbt_log_appender_t, 1);
-  res->do_append         = &append_file;
-  res->free_             = &free_;
-  res->data              = static_cast<void*>(fopen(arg, "w"));
+  auto* res      = xbt_new0(s_xbt_log_appender_t, 1);
+  res->do_append = &append_file;
+  res->free_     = &free_;
+  res->data      = static_cast<void*>(fopen(arg, "w"));
   xbt_assert(res->data != nullptr, "Cannot open file: %s: %s", arg, strerror(errno));
   return res;
 }
@@ -113,10 +113,10 @@ static void free_append2_(const s_xbt_log_appender_t* this_)
 //For split, replace %  in the file by the current count
 xbt_log_appender_t xbt_log_appender2_file_new(const char* arg, int roll)
 {
-  xbt_log_appender_t res      = xbt_new0(s_xbt_log_appender_t, 1);
-  res->do_append              = &append2_file;
-  res->free_                  = &free_append2_;
-  xbt_log_append2_file_t data = xbt_new0(struct xbt_log_append2_file_s, 1);
+  auto* res      = xbt_new0(s_xbt_log_appender_t, 1);
+  res->do_append = &append2_file;
+  res->free_     = &free_append2_;
+  auto* data     = xbt_new0(struct xbt_log_append2_file_s, 1);
   xbt_assert(arg);
   char* buf=xbt_strdup(arg);
   char* sep=strchr(buf,':');
index 43345d4..2cf7a32 100644 (file)
@@ -185,10 +185,10 @@ static void xbt_log_layout_format_free(const s_xbt_log_layout_t* lay)
 
 xbt_log_layout_t xbt_log_layout_format_new(const char* arg)
 {
-  xbt_log_layout_t res = xbt_new0(s_xbt_log_layout_t, 1);
-  res->do_layout       = &xbt_log_layout_format_doit;
-  res->free_           = &xbt_log_layout_format_free;
-  res->data            = xbt_strdup(arg);
+  auto* res      = xbt_new0(s_xbt_log_layout_t, 1);
+  res->do_layout = &xbt_log_layout_format_doit;
+  res->free_     = &xbt_log_layout_format_free;
+  res->data      = xbt_strdup(arg);
 
   return res;
 }
index d460805..2f0d855 100644 (file)
@@ -71,8 +71,8 @@ static bool xbt_log_layout_simple_doit(const s_xbt_log_layout_t*, xbt_log_event_
 
 xbt_log_layout_t xbt_log_layout_simple_new(const char*)
 {
-  xbt_log_layout_t res = xbt_new0(s_xbt_log_layout_t, 1);
-  res->do_layout       = &xbt_log_layout_simple_doit;
+  auto* res      = xbt_new0(s_xbt_log_layout_t, 1);
+  res->do_layout = &xbt_log_layout_simple_doit;
 
   return res;
 }
index 01066f2..9439e83 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "simgrid/Exception.hpp"
 #include "xbt/ex.h"
 #include "xbt/log.h"
@@ -141,19 +146,15 @@ std::vector<double> xbt_parse_get_all_speeds(const std::string& filename, int li
                                              const std::string& entity_kind)
 {
   std::vector<double> speed_per_pstate;
+  std::vector<std::string> pstate_list;
 
-  if (speeds.find('.') == std::string::npos) {
-    double speed = xbt_parse_get_speed(filename, lineno, speeds, entity_kind);
+  boost::split(pstate_list, speeds, boost::is_any_of(","));
+  for (auto speed_str : pstate_list) {
+    boost::trim(speed_str);
+    double speed = xbt_parse_get_speed(filename, lineno, speed_str, entity_kind);
     speed_per_pstate.push_back(speed);
-  } else {
-    std::vector<std::string> pstate_list;
-    boost::split(pstate_list, speeds, boost::is_any_of(","));
-    for (auto speed_str : pstate_list) {
-      boost::trim(speed_str);
-      double speed = xbt_parse_get_speed(filename, lineno, speed_str, entity_kind);
-      speed_per_pstate.push_back(speed);
-      XBT_DEBUG("Speed value: %f", speed);
-    }
+    XBT_DEBUG("Speed value: %f", speed);
   }
+
   return speed_per_pstate;
 }
index 54cb09e..9635ca8 100644 (file)
@@ -102,9 +102,9 @@ static void handle_action(ReplayAction& action)
   action_fun function = action_funs.at(action.at(1));
   try {
     function(action);
-  } catch (const Exception& e) {
+  } catch (const Exception&) {
     action.clear();
-    xbt_die("Replay error:\n %s", e.what());
+    throw;
   }
 }
 
index 3759f49..59fb4be 100644 (file)
 
 /** @brief Parse an integer out of a string, or raise an error
  *
- * The @a str is passed as argument to your @a error_msg, as follows:
- * @verbatim throw std::invalid_argument(simgrid::xbt::string_printf(error_msg, str)); @endverbatim
+ * The @a str is concatenated to your @a error_msg, as follows:
+ * @verbatim throw std::invalid_argument(simgrid::xbt::string_printf("%s: %s", error_msg, str)); @endverbatim
  */
 long int xbt_str_parse_int(const char* str, const char* error_msg)
 {
   char* endptr;
   if (str == nullptr || str[0] == '\0')
-    throw std::invalid_argument(simgrid::xbt::string_printf(error_msg, str));
+    throw std::invalid_argument(simgrid::xbt::string_printf("%s: %s", error_msg, str));
 
   long int res = strtol(str, &endptr, 10);
   if (endptr[0] != '\0')
-    throw std::invalid_argument(simgrid::xbt::string_printf(error_msg, str));
+    throw std::invalid_argument(simgrid::xbt::string_printf("%s: %s", error_msg, str));
 
   return res;
 }
 
 /** @brief Parse a double out of a string, or raise an error
  *
- * The @a str is passed as argument to your @a error_msg, as follows:
- * @verbatim throw std::invalid_argument(simgrid::xbt::string_printf(error_msg, str)); @endverbatim
+ * The @a str is concatenated to your @a error_msg, as follows:
+ * @verbatim throw std::invalid_argument(simgrid::xbt::string_printf("%s: %s", error_msg, str)); @endverbatim
  */
 double xbt_str_parse_double(const char* str, const char* error_msg)
 {
   char *endptr;
   if (str == nullptr || str[0] == '\0')
-    throw std::invalid_argument(simgrid::xbt::string_printf(error_msg, str));
+    throw std::invalid_argument(simgrid::xbt::string_printf("%s: %s", error_msg, str));
 
   double res = strtod(str, &endptr);
   if (endptr[0] != '\0')
-    throw std::invalid_argument(simgrid::xbt::string_printf(error_msg, str));
+    throw std::invalid_argument(simgrid::xbt::string_printf("%s: %s", error_msg, str));
 
   return res;
 }
index 22ee6f9..88b1d92 100644 (file)
@@ -5,6 +5,7 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include "xbt/parse_units.hpp"
 #include "xbt/str.h"
 
 #include "simgrid/Exception.hpp"
@@ -52,4 +53,24 @@ TEST_CASE("xbt::str: String Handling", "xbt_str")
     test_parse_error(xbt_str_parse_double, "Parse '' as a double", "");
     test_parse_error(xbt_str_parse_double, "Parse cruft as a double", "cruft");
   }
+
+  SECTION("Test the parsing-with-units functions")
+  {
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1.0", "") == std::vector<double>{1e0});
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1.0,2.0", "") == std::vector<double>{1e0, 2e0});
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1.0,2.0,3.0", "") == std::vector<double>{1e0, 2e0, 3e0});
+
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1", "") == std::vector<double>{1e0});
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1,2", "") == std::vector<double>{1.0, 2.0});
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1,2,3", "") == std::vector<double>{1.0, 2.0, 3.0});
+
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1.0f", "") == std::vector<double>{1e0});
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1.0kf,2.0Mf", "") == std::vector<double>{1e3, 2e6});
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1.0Gf,2.0Tf,3.0Pf", "") ==
+            std::vector<double>{1e9, 2e12, 3e15});
+
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1f", "") == std::vector<double>{1e0});
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1kf,2Gf", "") == std::vector<double>{1e3, 2e9});
+    REQUIRE(xbt_parse_get_all_speeds(__FILE__, __LINE__, "1Ef,2Zf,3Yf", "") == std::vector<double>{1e18, 2e21, 3e24});
+  }
 }
index fc8a116..58dc9ff 100644 (file)
@@ -4,7 +4,7 @@ $ ${bindir:=.}/stack-overflow --cfg=contexts/stack-size:96 ${srcdir:=.}/examples
 > Access violation or Bus error detected.
 > This probably comes from a programming error in your code, or from a stack
 > overflow. If you are certain of your code, try increasing the stack size
->    --cfg=contexts/stack-size=XXX (current size is 96 KiB).
+>    --cfg=contexts/stack-size:XXX (current size is 96 KiB).
 >
 > If it does not help, this may have one of the following causes:
 > a bug in SimGrid, a bug in the OS or a bug in a third-party libraries.
index b3fe240..35208b3 100644 (file)
 #include <cassert>
 #include <cstring>
 
-// Test broken with multi-dimensional arrays. See https://sourceware.org/bugzilla/show_bug.cgi?id=22546
-// int test_some_array[4][5][6];
+#include <elfutils/version.h>
+#if _ELFUTILS_VERSION < 171
+// Elder elfutils/libdw broken with multi-dimensional arrays. See https://sourceware.org/bugzilla/show_bug.cgi?id=22546
 int test_some_array[4 * 5 * 6];
+#else
+int test_some_array[4][5][6];
+#endif
+
 struct some_struct {
   int first;
   int second[4][5];
index 1ffb8a0..2aac09d 100644 (file)
@@ -1,4 +1,4 @@
-foreach(x cloud-sharing ptask_L07_usage wifi_usage wifi_usage_decay)
+foreach(x cloud-sharing ptask_L07_usage wifi_usage wifi_usage_decay cm02-set-lat-bw)
   add_executable       (${x}  EXCLUDE_FROM_ALL ${x}/${x}.cpp)
   target_link_libraries(${x}  simgrid)
   set_target_properties(${x}  PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x})
diff --git a/teshsuite/models/cm02-set-lat-bw/cm02-set-lat-bw.cpp b/teshsuite/models/cm02-set-lat-bw/cm02-set-lat-bw.cpp
new file mode 100644 (file)
index 0000000..399fe99
--- /dev/null
@@ -0,0 +1,130 @@
+/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/**
+ * Test NetworkCm02Link::set_bandwidth and set_latency.
+ *
+ * Math behind: https://hal.inria.fr/inria-00361031/document
+ * - Fig. 1 and Eq. 7 in the paper
+ *
+ *
+ * Platform: dogbone
+ *
+ *   S1 ___[ 1 ]___                 ___[ 2 ]___ C1
+ *                 \               /
+ *                  R1 __[ 0 ]__ R2
+ *                 /               \
+ *   S2 ___[ 3 ]__/                 \__[ 4 ]___ C2
+ *
+ * 2 communications:
+ * - Flow A: S1 -> C1
+ * - Flow B: S2 -> C2
+ *
+ * Links: [1], [2], [3]: 1Gb/s, 10ms
+ * Link: [0] bottleneck: 1Mb/s, 20ms
+ * Link: [4]: We'll change the bandwidth and latency to see the impact on the
+ * sharing of the bottleneck link between the 2 flows.
+ */
+
+#include <simgrid/s4u.hpp>
+
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(cm02_set_lat_bw, "Messages specific for this simulation");
+
+static void sender(const std::string& recv_name, sg4::Link* l4)
+{
+  sg4::Mailbox* mbox = sg4::Mailbox::by_name(recv_name);
+  XBT_INFO("Comm to %s, same weight/penalty (w_a == w_b, ~20) for everybody, each comm should take 1s and finish at "
+           "the same time",
+           recv_name.c_str());
+  auto* payload = new double(sg4::Engine::get_clock());
+  auto comm     = mbox->put_async(payload, 1e3);
+  comm->wait();
+  sg4::this_actor::sleep_until(10); // synchronize senders
+
+  if (recv_name == "C2") {
+    XBT_INFO("Comm Flow B to C2: after 1s, change latency of L4 to increase penalty for flow B (w_b = 2* w_a)");
+    XBT_INFO("rho_a = 2*rho_b, flow A receives twice the bandwidth than flow B");
+  } else {
+    XBT_INFO("Comm Flow A to C1");
+  }
+  payload = new double(sg4::Engine::get_clock());
+  comm    = mbox->put_async(payload, 1e3);
+  sg4::this_actor::sleep_for(1);
+  if (l4)
+    l4->set_latency(20);
+  comm->wait();
+  sg4::this_actor::sleep_until(20); // synchronize senders
+  if (l4)
+    l4->set_latency(1e-9);
+
+  if (recv_name == "C2") {
+    XBT_INFO("Comm Flow B to C2: after 1s, change bandwidth of L4 to increase penalty for flow B (w_b = 2* w_a)");
+    XBT_INFO("rho_a = 2*rho_b, flow A receives twice the bandwidth than flow B");
+  } else {
+    XBT_INFO("Comm Flow A to C1");
+  }
+  payload = new double(sg4::Engine::get_clock());
+  comm    = mbox->put_async(payload, 1e3);
+  sg4::this_actor::sleep_for(1);
+  if (l4)
+    l4->set_bandwidth(1e3);
+  comm->wait();
+  sg4::this_actor::sleep_until(30);
+
+  payload = new double(-1.0);
+  mbox->put(payload, 0);
+}
+
+static void receiver()
+{
+  sg4::Mailbox* mbox = sg4::Mailbox::by_name(sg4::this_actor::get_host()->get_name());
+  while (true) {
+    auto payload = mbox->get_unique<double>();
+    if (*payload < 0)
+      break;
+    XBT_INFO("Received data. Elapsed %lf", sg4::Engine::get_clock() - *payload);
+  }
+  XBT_INFO("Bye");
+}
+
+/*************************************************************************************************/
+int main(int argc, char** argv)
+{
+  sg4::Engine e(&argc, argv);
+  /* keep it simple, no network factors nor crosstrafic */
+  simgrid::s4u::Engine::set_config("network/model:CM02");
+  simgrid::s4u::Engine::set_config("network/weight-S:20537");
+  simgrid::s4u::Engine::set_config("network/crosstraffic:0");
+
+  /* dog-bone platform */
+  std::unordered_map<std::string, sg4::Host*> hosts;
+  std::unordered_map<std::string, sg4::Link*> links;
+  auto* zone = sg4::create_full_zone("dog_zone");
+  for (const auto& name : {"S1", "S2", "C1", "C2"}) {
+    hosts[name] = zone->create_host(name, 1e6)->seal();
+  }
+
+  for (const auto& name : {"L1", "L2", "L3", "L4"}) {
+    links[name] = zone->create_link(name, 1e9)->set_latency(1e-9)->seal();
+  }
+  links["L0"] = zone->create_link("L0", 1e3)->seal();
+  zone->add_route(hosts["S1"]->get_netpoint(), hosts["C1"]->get_netpoint(), nullptr, nullptr,
+                  {sg4::LinkInRoute(links["L1"]), sg4::LinkInRoute(links["L0"]), sg4::LinkInRoute(links["L2"])});
+  zone->add_route(hosts["S2"]->get_netpoint(), hosts["C2"]->get_netpoint(), nullptr, nullptr,
+                  {sg4::LinkInRoute(links["L3"]), sg4::LinkInRoute(links["L0"]), sg4::LinkInRoute(links["L4"])});
+
+  zone->seal();
+
+  sg4::Actor::create("", hosts["S1"], sender, "C1", nullptr);
+  sg4::Actor::create("", hosts["C1"], receiver);
+  sg4::Actor::create("", hosts["S2"], sender, "C2", links["L4"]);
+  sg4::Actor::create("", hosts["C2"], receiver);
+
+  e.run();
+
+  return 0;
+}
diff --git a/teshsuite/models/cm02-set-lat-bw/cm02-set-lat-bw.tesh b/teshsuite/models/cm02-set-lat-bw/cm02-set-lat-bw.tesh
new file mode 100644 (file)
index 0000000..760b4ca
--- /dev/null
@@ -0,0 +1,22 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/cm02-set-lat-bw  "--log=root.fmt:[%10.6r]%e[%i:%a@%h]%e%m%n"
+> [  0.000000] [0:maestro@] Configuration change: Set 'network/model' to 'CM02'
+> [  0.000000] [0:maestro@] Configuration change: Set 'network/weight-S' to '20537'
+> [  0.000000] [0:maestro@] Configuration change: Set 'network/crosstraffic' to '0'
+> [  0.000000] [1:@S1] Comm to C1, same weight/penalty (w_a == w_b, ~20) for everybody, each comm should take 1s and finish at the same time
+> [  0.000000] [3:@S2] Comm to C2, same weight/penalty (w_a == w_b, ~20) for everybody, each comm should take 1s and finish at the same time
+> [  2.000000] [2:@C1] Received data. Elapsed 2.000000
+> [  2.000000] [4:@C2] Received data. Elapsed 2.000000
+> [ 10.000000] [3:@S2] Comm Flow B to C2: after 1s, change latency of L4 to increase penalty for flow B (w_b = 2* w_a)
+> [ 10.000000] [3:@S2] rho_a = 2*rho_b, flow A receives twice the bandwidth than flow B
+> [ 10.000000] [1:@S1] Comm Flow A to C1
+> [ 11.753312] [2:@C1] Received data. Elapsed 1.753312
+> [ 12.000000] [4:@C2] Received data. Elapsed 2.000000
+> [ 20.000000] [1:@S1] Comm Flow A to C1
+> [ 20.000000] [3:@S2] Comm Flow B to C2: after 1s, change bandwidth of L4 to increase penalty for flow B (w_b = 2* w_a)
+> [ 20.000000] [3:@S2] rho_a = 2*rho_b, flow A receives twice the bandwidth than flow B
+> [ 21.750000] [2:@C1] Received data. Elapsed 1.750000
+> [ 22.000000] [4:@C2] Received data. Elapsed 2.000000
+> [ 30.000000] [2:@C1] Bye
+> [ 30.000000] [4:@C2] Bye
index 68e67a5..8b96647 100644 (file)
@@ -1,7 +1,8 @@
 #!/usr/bin/env tesh
 
 p Test WITH crosstraffic
-$ ${bindir:=.}/wifi_usage ${platfdir}/wifi.xml --log=root.fmt=%m%n
+$ ${bindir:=.}/wifi_usage ${platfdir}/wifi.xml --log=root.fmt=%m%n --cfg=network/model:CM02
+> Configuration change: Set 'network/model' to 'CM02'
 > TEST: Send from a station to a node on the wired network after the AP.
 > ----------------------------------------------------------------------
 > Since AP1 is the limiting link, we have the following constraint for AP1:
@@ -22,8 +23,9 @@ $ ${bindir:=.}/wifi_usage ${platfdir}/wifi.xml --log=root.fmt=%m%n
 > Actual result: Sending 1000 bytes from 'Station 1' to 'Station 2' takes 0.000311 seconds.
 
 p Test WITHOUT crosstraffic
-$ ${bindir:=.}/wifi_usage ${platfdir}/wifi.xml --log=root.fmt=%m%n --cfg=network/crosstraffic:0
+$ ${bindir:=.}/wifi_usage ${platfdir}/wifi.xml --log=root.fmt=%m%n --cfg=network/crosstraffic:0 --cfg=network/model:CM02
 > Configuration change: Set 'network/crosstraffic' to '0'
+> Configuration change: Set 'network/model' to 'CM02'
 > TEST: Send from a station to a node on the wired network after the AP.
 > ----------------------------------------------------------------------
 > Since AP1 is the limiting link, we have the following constraint for AP1:
index f1208fd..b2fa6a9 100644 (file)
@@ -1,7 +1,8 @@
 #!/usr/bin/env tesh
 
 p Test WITH crosstraffic
-$ ${bindir:=.}/wifi_usage_decay ${platfdir}/wifi.xml --log=root.fmt=%m%n
+$ ${bindir:=.}/wifi_usage_decay ${platfdir}/wifi.xml --log=root.fmt=%m%n --cfg=network/model:CM02
+> Configuration change: Set 'network/model' to 'CM02'
 > TEST: Send from a station to a node on the wired network after the AP.
 > ----------------------------------------------------------------------
 > Since AP1 is the limiting link, we have the following constraint for AP1:
@@ -24,8 +25,9 @@ $ ${bindir:=.}/wifi_usage_decay ${platfdir}/wifi.xml --log=root.fmt=%m%n
 > Actual result: Sending 1000 bytes from 'Station 1' to 'Station 2' takes 0.000343 seconds.
 
 p Test WITHOUT crosstraffic
-$ ${bindir:=.}/wifi_usage_decay ${platfdir}/wifi.xml --log=root.fmt=%m%n --cfg=network/crosstraffic:0
+$ ${bindir:=.}/wifi_usage_decay ${platfdir}/wifi.xml --log=root.fmt=%m%n --cfg=network/crosstraffic:0 --cfg=network/model:CM02
 > Configuration change: Set 'network/crosstraffic' to '0'
+> Configuration change: Set 'network/model' to 'CM02'
 > TEST: Send from a station to a node on the wired network after the AP.
 > ----------------------------------------------------------------------
 > Since AP1 is the limiting link, we have the following constraint for AP1:
@@ -44,4 +46,4 @@ $ ${bindir:=.}/wifi_usage_decay ${platfdir}/wifi.xml --log=root.fmt=%m%n --cfg=n
 > However, decay model specify that for 2 stations, we have 54Mbps become 49.00487
 >   mu = 1 / [ 1/2 * 1/49.00487Mbps + 1/49.00487Mbps ] = 49004870
 >   simulation_time = 1000*8 / [ mu / 2 ] =  0.0003264982s (rounded to 0.000326s in SimGrid)
-> Actual result: Sending 1000 bytes from 'Station 1' to 'Station 2' takes 0.000326 seconds.
\ No newline at end of file
+> Actual result: Sending 1000 bytes from 'Station 1' to 'Station 2' takes 0.000326 seconds.
index 8d5aeb0..314d09c 100644 (file)
@@ -1,6 +1,5 @@
-foreach(example borken-context corrupt-stack)
-  set(tesh_files    ${tesh_files}   ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.tesh
-                                    ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}_d.xml)
+foreach(example borken-context corrupt-stack platform-mix)
+  set(tesh_files    ${tesh_files}   ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.tesh)
   set(examples_src  ${examples_src} ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}.py)
 
   if(enable_python)
@@ -15,5 +14,10 @@ foreach(example borken-context corrupt-stack)
   endif()
 endforeach()
 
+foreach(example borken-context corrupt-stack)
+  set(xml_files    ${xml_files}   ${CMAKE_CURRENT_SOURCE_DIR}/${example}/${example}_d.xml)
+endforeach()
+
 set(tesh_files    ${tesh_files}    PARENT_SCOPE)
+set(xml_files    ${xml_files}    PARENT_SCOPE)
 set(examples_src  ${examples_src}  PARENT_SCOPE)
diff --git a/teshsuite/python/platform-mix/platform-mix.py b/teshsuite/python/platform-mix/platform-mix.py
new file mode 100644 (file)
index 0000000..2ca7f61
--- /dev/null
@@ -0,0 +1,124 @@
+# Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+from simgrid import Actor, Engine, Host, Mailbox, NetZone, LinkInRoute, this_actor
+import sys
+
+class Sender:
+  """
+  Send 1 message for each host
+  """
+  def __init__(self, hosts):
+    self.hosts = hosts
+  
+  # Actors that are created as object will execute their __call__ method.
+  # So, the following constitutes the main function of the Sender actor.
+  def __call__(self):
+
+    for host in self.hosts:
+      mbox = Mailbox.by_name(host.name)
+      msg = "Hello. I'm " + str(this_actor.get_host().name)
+      size = int(1e6)
+      this_actor.info("Sending msg to " + host.name)
+      mbox.put(msg, size)
+
+    this_actor.info("Done dispatching all messages. Goodbye!")
+
+class Receiver:
+  """
+  Receiver actor: wait for 1 messages and do operations
+  """
+
+  def __call__(self):
+    this_actor.execute(1e9)
+    for disk in Host.current().get_disks():
+      this_actor.info("Using disk " + disk.name)
+      disk.read(10000)
+      disk.write(10000)
+    mbox = Mailbox.by_name(this_actor.get_host().name)
+    msg = mbox.get()
+    this_actor.info("I got '%s'." % msg)
+    this_actor.info("Finished executing. Goodbye!")
+
+def load_platform():
+  """ Creates a mixed platform, using many methods available in the API
+  """
+
+  root = NetZone.create_floyd_zone("root")
+  hosts = []
+  # dijkstra
+  dijkstra = NetZone.create_dijkstra_zone("dijkstra")
+  msg_base = "Creating zone: "
+  this_actor.info(msg_base + dijkstra.name)
+  dijkstra.set_parent(root)
+  host1 = dijkstra.create_host("host1", [1e9, 1e8]).set_core_count(2)
+  hosts.append(host1)
+  host1.create_disk("disk1", 1e5, 1e4).seal()
+  host1.create_disk("disk2", "1MBps", "1Mbps").seal()
+  host1.seal()
+  host2 = dijkstra.create_host("host2", ["1Gf", "1Mf"]).seal()
+  hosts.append(host2)
+  link1 = dijkstra.create_link("link1_up", [1e9]).set_latency(1e-3).set_concurrency_limit(10).seal()
+  link2 = dijkstra.create_link("link1_down", ["1GBps"]).set_latency("1ms").seal()
+  dijkstra.add_route(host1.get_netpoint(), host2.get_netpoint(), None, None, [LinkInRoute(link1)], False)
+  dijkstra.add_route(host2.get_netpoint(), host1.get_netpoint(), None, None, [LinkInRoute(link2)], False)
+  dijkstra.seal()
+
+  # vivaldi
+  vivaldi = NetZone.create_vivaldi_zone("vivaldi")
+  this_actor.info(msg_base + vivaldi.name)
+  vivaldi.set_parent(root)
+  host3 = vivaldi.create_host("host3", 1e9).set_coordinates("1 1 1").seal()
+  host4 = vivaldi.create_host("host4", "1Gf").set_coordinates("2 2 2").seal()
+  hosts.append(host3)
+  hosts.append(host4)
+
+  # empty
+  empty = NetZone.create_empty_zone("empty")
+  this_actor.info(msg_base + empty.name)
+  empty.set_parent(root)
+  host5 = empty.create_host("host5", 1e9)
+  hosts.append(host5)
+  empty.seal()
+
+  # wifi
+  wifi = NetZone.create_wifi_zone("wifi")
+  this_actor.info(msg_base + wifi.name)
+  wifi.set_parent(root)
+  router = wifi.create_router("wifi_router")
+  wifi.set_property("access_point", "wifi_router")
+  host6 = wifi.create_host(
+      "host6", ["100.0Mf", "50.0Mf", "20.0Mf"]).seal()
+  hosts.append(host6)
+  wifi_link = wifi.create_link("AP1", ["54Mbps", "36Mbps", "24Mbps"]).seal()
+  wifi_link.set_host_wifi_rate(host6, 1)
+  wifi.seal()
+
+  # create routes between netzones
+  link_a = vivaldi.create_link("linkA", 1e9).seal()
+  link_b = vivaldi.create_link("linkB", "1GBps").seal()
+  link_c = vivaldi.create_link("linkC", "1GBps").seal()
+  root.add_route(dijkstra.get_netpoint(), vivaldi.get_netpoint(
+  ), host1.get_netpoint(), host3.get_netpoint(), [LinkInRoute(link_a)], True)
+  root.add_route(vivaldi.get_netpoint(), empty.get_netpoint(
+  ), host3.get_netpoint(), host5.get_netpoint(), [LinkInRoute(link_b)], True)
+  root.add_route(empty.get_netpoint(), wifi.get_netpoint(
+  ), host5.get_netpoint(), router, [LinkInRoute(link_c)], True)
+
+  # create actors Sender/Receiver
+  Actor.create("sender", hosts[0], Sender(hosts))
+  for host in hosts:
+    Actor.create("receiver", host, Receiver())
+
+###################################################################################################
+
+if __name__ == '__main__':
+  e = Engine(sys.argv)
+
+  # create platform
+  load_platform()
+
+  # runs the simulation
+  e.run()
diff --git a/teshsuite/python/platform-mix/platform-mix.tesh b/teshsuite/python/platform-mix/platform-mix.tesh
new file mode 100644 (file)
index 0000000..64297cd
--- /dev/null
@@ -0,0 +1,26 @@
+$ ${pythoncmd:=python3} ${PYTHON_TOOL_OPTIONS:=} ${srcdir:=.}/platform-mix.py "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (0:maestro@) Creating zone: dijkstra
+> [  0.000000] (0:maestro@) Creating zone: vivaldi
+> [  0.000000] (0:maestro@) Creating zone: empty
+> [  0.000000] (0:maestro@) Creating zone: wifi
+> [  0.000000] (1:sender@host1) Sending msg to host1
+> [  1.000000] (2:receiver@host1) Using disk disk1
+> [  2.100000] (2:receiver@host1) Using disk disk2
+> [  2.190103] (2:receiver@host1) I got 'Hello. I'm host1'.
+> [  2.190103] (2:receiver@host1) Finished executing. Goodbye!
+> [  2.190103] (1:sender@host1) Sending msg to host2
+> [  2.204144] (3:receiver@host2) I got 'Hello. I'm host1'.
+> [  2.204144] (3:receiver@host2) Finished executing. Goodbye!
+> [  2.204144] (1:sender@host1) Sending msg to host3
+> [  2.205226] (4:receiver@host3) I got 'Hello. I'm host1'.
+> [  2.205226] (4:receiver@host3) Finished executing. Goodbye!
+> [  2.205226] (1:sender@host1) Sending msg to host4
+> [  2.264825] (5:receiver@host4) I got 'Hello. I'm host1'.
+> [  2.264825] (5:receiver@host4) Finished executing. Goodbye!
+> [  2.264825] (1:sender@host1) Sending msg to host5
+> [  2.265908] (6:receiver@host5) I got 'Hello. I'm host1'.
+> [  2.265908] (6:receiver@host5) Finished executing. Goodbye!
+> [  2.265908] (1:sender@host1) Sending msg to host6
+> [ 10.240550] (1:sender@host1) Done dispatching all messages. Goodbye!
+> [ 10.240550] (7:receiver@host6) I got 'Hello. I'm host1'.
+> [ 10.240550] (7:receiver@host6) Finished executing. Goodbye!
index 86416f7..1a4c45e 100644 (file)
@@ -1,14 +1,14 @@
 foreach(x actor actor-autorestart actor-suspend
         activity-lifecycle
-        comm-get-sender comm-pt2pt wait-any-for
+        comm-get-sender comm-pt2pt wait-all-for wait-any-for
         cloud-interrupt-migration cloud-two-execs
         concurrent_rw 
-        host-on-off host-on-off-actors host-on-off-recv
+        host-on-off host-on-off-actors host-on-off-recv host-multicore-speed-file io-set-bw
         basic-link-test basic-parsing-test evaluate-get-route-time evaluate-parse-time is-router
         storage_client_server listen_async pid
         trace-integration
         seal-platform
-       vm-live-migration vm-suicide)
+       vm-live-migration vm-suicide issue71)
   add_executable       (${x}  EXCLUDE_FROM_ALL ${x}/${x}.cpp)
   target_link_libraries(${x}  simgrid)
   set_target_properties(${x}  PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x})
@@ -27,15 +27,15 @@ set_property(TARGET activity-lifecycle APPEND PROPERTY INCLUDE_DIRECTORIES "${IN
 ## Add the tests.
 ## Some need to be run with all factories, some don't need tesh to run
 foreach(x actor actor-autorestart actor-suspend
-        activity-lifecycle comm-get-sender wait-any-for
-        cloud-interrupt-migration cloud-two-execs concurrent_rw
+        activity-lifecycle comm-get-sender wait-all-for wait-any-for
+        cloud-interrupt-migration cloud-two-execs concurrent_rw io-set-bw
        vm-live-migration vm-suicide)
   set(tesh_files    ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
   ADD_TESH_FACTORIES(tesh-s4u-${x} "*" --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x}/${x}.tesh)
 endforeach()
 
-foreach(x basic-link-test basic-parsing-test host-on-off host-on-off-actors host-on-off-recv is-router listen_async 
-               pid storage_client_server trace-integration seal-platform)
+foreach(x basic-link-test basic-parsing-test host-on-off host-on-off-actors host-on-off-recv host-multicore-speed-file is-router listen_async 
+               pid storage_client_server trace-integration seal-platform issue71)
   set(tesh_files    ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
   ADD_TESH(tesh-s4u-${x} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x}/${x}.tesh)
 endforeach()
@@ -95,4 +95,5 @@ set(xml_files     ${xml_files}      ${CMAKE_CURRENT_SOURCE_DIR}/activity-lifecyc
                                     ${CMAKE_CURRENT_SOURCE_DIR}/trace-integration/test-hbp1-c1s1-c3s2.xml
                                     ${CMAKE_CURRENT_SOURCE_DIR}/trace-integration/test-hbp2.5-hbp1.5.xml
                                     ${CMAKE_CURRENT_SOURCE_DIR}/vm-live-migration/platform.xml
+                                    ${CMAKE_CURRENT_SOURCE_DIR}/issue71/platform_bad.xml
                                    PARENT_SCOPE)
index 9205f32..87b7af7 100644 (file)
@@ -272,7 +272,7 @@ TEST_CASE("Activity lifecycle: comm activities")
       int* data;
       simgrid::s4u::CommPtr comm                       = simgrid::s4u::Mailbox::by_name("mb")->get_async<int>(&data);
       std::vector<simgrid::s4u::CommPtr> pending_comms = {comm};
-      REQUIRE_NETWORK_FAILURE(simgrid::s4u::Comm::wait_any(&pending_comms));
+      REQUIRE_NETWORK_FAILURE(simgrid::s4u::Comm::wait_any(pending_comms));
     });
 
     simgrid::s4u::ActorPtr sender = simgrid::s4u::Actor::create("sender", all_hosts[2], []() {
index 2b8f82f..006b6f5 100644 (file)
@@ -62,14 +62,14 @@ template <int Duration, typename Activity> bool tester_wait_any(const Activity&
   try {
     std::vector<Activity> activities = {activity};
     XBT_DEBUG("calling wait_any_for(%f)", duration);
-    int index = Activity::element_type::wait_any_for(&activities, duration);
+    ssize_t index = Activity::element_type::wait_any_for(activities, duration);
     if (index == -1) {
       XBT_DEBUG("wait_any_for() timed out");
       INFO("wait_any_for() timeout should expire at expected date: " << timeout);
       REQUIRE(simgrid::s4u::Engine::get_clock() == Approx(timeout));
       ret = false;
     } else {
-      XBT_DEBUG("wait_any_for() returned index %d", index);
+      XBT_DEBUG("wait_any_for() returned index %zd", index);
       REQUIRE(index == 0);
       ret = true;
     }
diff --git a/teshsuite/s4u/host-multicore-speed-file/host-multicore-speed-file.cpp b/teshsuite/s4u/host-multicore-speed-file/host-multicore-speed-file.cpp
new file mode 100644 (file)
index 0000000..07ad10d
--- /dev/null
@@ -0,0 +1,113 @@
+/* Copyright (c) 2010-2021. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "simgrid/kernel/ProfileBuilder.hpp"
+#include "simgrid/s4u.hpp"
+
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
+
+static void run_activities(int n, double size, double rate = -1.0)
+{
+  double start = sg4::Engine::get_clock();
+  std::vector<sg4::ExecPtr> activities;
+
+  // initialize exec activities
+  for (int i = 0; i < n; i++) {
+    sg4::ExecPtr op = sg4::this_actor::exec_init(size);
+    if (rate != -1.0)
+      op->set_bound(rate);
+    op->start();
+    activities.emplace_back(op);
+  }
+
+  // waiting for executions
+  for (const auto& act : activities)
+    act->wait();
+  XBT_INFO("Finished running 2 activities, elapsed %lf", sg4::Engine::get_clock() - start);
+}
+
+static void worker()
+{
+  XBT_INFO("Running 1 tasks (1.5e6) in a 2*(1e6) speed host. Should take 2s (1 (limited by core) + 1 (limited by speed "
+           "file)");
+  run_activities(1, 1.5e6);
+
+  XBT_INFO("Running 1 tasks (.8e6) in a 2*(1e6) speed host with limited rate (.4e6). Should take 2s (limited by rate)");
+  run_activities(1, .8e6, .4e6);
+
+  XBT_INFO("Running 1 tasks (1.1e6) in a 2*(1e6) speed host with limited rate (.6e6). Should take 2s (.6 limited by "
+           "rate + .5 limited by speed file)");
+  run_activities(1, 1.1e6, .6e6);
+
+  XBT_INFO("Running 2 tasks (1e6) in a 2*(1e6) speed host. Should take 1s");
+  run_activities(2, 1e6);
+
+  XBT_INFO("Running 2 tasks (.5e6) in a .5*2*(1e6) speed host. Should take 1s");
+  run_activities(2, .5e6);
+
+  XBT_INFO("Running 2 tasks (1.1e6) with limited rate (.6e6). Should take 2s (0.6 limited by rate + 0.5 limited by "
+           "speed file)");
+  run_activities(2, 1.1e6, .6e6);
+
+  XBT_INFO("Running 2 tasks (.8e6) with limited rate (.4e6). Should take 2s (limited by rate)");
+  run_activities(2, .8e6, .4e6);
+
+  XBT_INFO("I'm done. See you!");
+}
+
+static void failed_worker()
+{
+  XBT_INFO("Running a 2 tasks: a small .5e6 and a big 2e6.");
+  sg4::ExecPtr ok   = sg4::this_actor::exec_init(.5e6);
+  sg4::ExecPtr fail = sg4::this_actor::exec_init(2e6);
+  ok->wait();
+  XBT_INFO("Finished the small task");
+  try {
+    XBT_INFO("Waiting big task to finish");
+    fail->wait();
+  } catch (const simgrid::ForcefulKillException&) {
+    XBT_INFO("Unable to finish big task, host went down");
+  }
+}
+
+int main(int argc, char* argv[])
+{
+  sg4::Engine e(&argc, argv);
+
+  /* speed and state file description */
+  const char* erin_state_file  = R"(
+0 1
+1 0
+50 1
+100 1
+)";
+  const char* carol_speed_file = R"(
+0 1.0
+1 0.5
+)";
+  /* simple platform containing 1 host and 2 disk */
+  auto* zone = sg4::create_full_zone("red");
+  zone->create_host("erin", 1e6)
+      ->set_core_count(2)
+      ->set_state_profile(simgrid::kernel::profile::ProfileBuilder::from_string("erin_state", erin_state_file, 0))
+      ->seal();
+  zone->create_host("carol", 1e6)
+      ->set_core_count(2)
+      ->set_speed_profile(simgrid::kernel::profile::ProfileBuilder::from_string("carol_speed", carol_speed_file, 1))
+      ->seal();
+  zone->seal();
+
+  sg4::Actor::create("carol", simgrid::s4u::Host::by_name("carol"), worker);
+  sg4::Actor::create("erin", simgrid::s4u::Host::by_name("erin"), failed_worker)->set_auto_restart(true);
+
+  e.run();
+
+  XBT_INFO("Simulation time %g", simgrid::s4u::Engine::get_clock());
+
+  return 0;
+}
diff --git a/teshsuite/s4u/host-multicore-speed-file/host-multicore-speed-file.tesh b/teshsuite/s4u/host-multicore-speed-file/host-multicore-speed-file.tesh
new file mode 100644 (file)
index 0000000..f6596d3
--- /dev/null
@@ -0,0 +1,23 @@
+
+$ ./host-multicore-speed-file
+> [carol:carol:(1) 0.000000] [s4u_test/INFO] Running 1 tasks (1.5e6) in a 2*(1e6) speed host. Should take 2s (1 (limited by core) + 1 (limited by speed file)
+> [erin:erin:(2) 0.000000] [s4u_test/INFO] Running a 2 tasks: a small .5e6 and a big 2e6.
+> [erin:erin:(3) 0.000000] [s4u_test/INFO] Running a 2 tasks: a small .5e6 and a big 2e6.
+> [erin:erin:(3) 0.500000] [s4u_test/INFO] Finished the small task
+> [erin:erin:(3) 0.500000] [s4u_test/INFO] Waiting big task to finish
+> [erin:erin:(3) 1.000000] [s4u_test/INFO] Unable to finish big task, host went down
+> [carol:carol:(1) 2.000000] [s4u_test/INFO] Finished running 2 activities, elapsed 2.000000
+> [carol:carol:(1) 2.000000] [s4u_test/INFO] Running 1 tasks (.8e6) in a 2*(1e6) speed host with limited rate (.4e6). Should take 2s (limited by rate)
+> [carol:carol:(1) 4.000000] [s4u_test/INFO] Finished running 2 activities, elapsed 2.000000
+> [carol:carol:(1) 4.000000] [s4u_test/INFO] Running 1 tasks (1.1e6) in a 2*(1e6) speed host with limited rate (.6e6). Should take 2s (.6 limited by rate + .5 limited by speed file)
+> [carol:carol:(1) 6.000000] [s4u_test/INFO] Finished running 2 activities, elapsed 2.000000
+> [carol:carol:(1) 6.000000] [s4u_test/INFO] Running 2 tasks (1e6) in a 2*(1e6) speed host. Should take 1s
+> [carol:carol:(1) 7.000000] [s4u_test/INFO] Finished running 2 activities, elapsed 1.000000
+> [carol:carol:(1) 7.000000] [s4u_test/INFO] Running 2 tasks (.5e6) in a .5*2*(1e6) speed host. Should take 1s
+> [carol:carol:(1) 8.000000] [s4u_test/INFO] Finished running 2 activities, elapsed 1.000000
+> [carol:carol:(1) 8.000000] [s4u_test/INFO] Running 2 tasks (1.1e6) with limited rate (.6e6). Should take 2s (0.6 limited by rate + 0.5 limited by speed file)
+> [carol:carol:(1) 10.000000] [s4u_test/INFO] Finished running 2 activities, elapsed 2.000000
+> [carol:carol:(1) 10.000000] [s4u_test/INFO] Running 2 tasks (.8e6) with limited rate (.4e6). Should take 2s (limited by rate)
+> [carol:carol:(1) 12.000000] [s4u_test/INFO] Finished running 2 activities, elapsed 2.000000
+> [carol:carol:(1) 12.000000] [s4u_test/INFO] I'm done. See you!
+> [12.000000] [s4u_test/INFO] Simulation time 12
diff --git a/teshsuite/s4u/io-set-bw/io-set-bw.cpp b/teshsuite/s4u/io-set-bw/io-set-bw.cpp
new file mode 100644 (file)
index 0000000..2710815
--- /dev/null
@@ -0,0 +1,95 @@
+/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <simgrid/s4u.hpp>
+
+namespace sg4 = simgrid::s4u;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(io_set_bw, "Messages specific for this simulation");
+
+static void io(const sg4::Disk* disk)
+{
+  double cur_time = sg4::Engine::get_clock();
+  disk->read(1e6);
+  XBT_INFO("Read finished. Took: %lf", sg4::Engine::get_clock() - cur_time);
+  cur_time = sg4::Engine::get_clock();
+  disk->write(1e6);
+  XBT_INFO("Write finished. Took: %lf", sg4::Engine::get_clock() - cur_time);
+}
+
+static void host()
+{
+  auto* disk = sg4::Host::current()->get_disks()[0];
+  XBT_INFO("I/O operations: size 1e6. Should take 1s each");
+  io(disk);
+
+  XBT_INFO("Setting read limit to half (.5e6). Read should take 2s, write still 1s");
+  disk->set_read_bandwidth(.5e6);
+  io(disk);
+
+  XBT_INFO("Setting write limit to half (.5e6). Write should take 2s, read still 1s");
+  disk->set_read_bandwidth(1e6);
+  disk->set_write_bandwidth(.5e6);
+  io(disk);
+
+  XBT_INFO("Setting readwrite limit to half (.5e6). Write and read should take 2s now");
+  disk->set_readwrite_bandwidth(.5e6);
+  disk->set_write_bandwidth(1e6);
+  io(disk);
+
+  disk->set_readwrite_bandwidth(1e6);
+  sg4::IoPtr act;
+  double cur_time;
+  XBT_INFO("Change bandwidth in the middle of I/O operation");
+  XBT_INFO("Setting read limit to half (.5e6) in the middle of IO. Read should take 1.5s");
+  cur_time = sg4::Engine::get_clock();
+  act      = disk->read_async(1e6);
+  sg4::this_actor::sleep_for(.5);
+  disk->set_read_bandwidth(.5e6);
+  act->wait();
+  XBT_INFO("Read finished. Took: %lf", sg4::Engine::get_clock() - cur_time);
+  disk->set_read_bandwidth(1e6);
+
+  XBT_INFO("Setting write limit to half (.5e6) in the middle of IO. Write should take 1.5s");
+  cur_time = sg4::Engine::get_clock();
+  act      = disk->write_async(1e6);
+  sg4::this_actor::sleep_for(.5);
+  disk->set_write_bandwidth(.5e6);
+  act->wait();
+  XBT_INFO("Write finished. Took: %lf", sg4::Engine::get_clock() - cur_time);
+  disk->set_write_bandwidth(1e6);
+
+  XBT_INFO("Setting readwrite limit to half (.5e6) in the middle of IO. Read and write should take 1.5s");
+  cur_time        = sg4::Engine::get_clock();
+  act             = disk->write_async(.5e6);
+  sg4::IoPtr act2 = disk->read_async(.5e6);
+  sg4::this_actor::sleep_for(.5);
+  disk->set_readwrite_bandwidth(.5e6);
+  act->wait();
+  act2->wait();
+  XBT_INFO("Read and write finished. Took: %lf", sg4::Engine::get_clock() - cur_time);
+}
+
+/*************************************************************************************************/
+int main(int argc, char** argv)
+{
+  sg4::Engine e(&argc, argv);
+
+  /* simple platform containing 1 host and 2 disk */
+  auto* zone = sg4::create_full_zone("bob_zone");
+  auto* bob  = zone->create_host("bob", 1e6);
+  auto* disk = bob->create_disk("bob_disk", 1e3, 1e3);
+  /* manually setting before seal */
+  disk->set_read_bandwidth(1e6);
+  disk->set_write_bandwidth(1e6);
+  disk->set_readwrite_bandwidth(1e6);
+  zone->seal();
+
+  sg4::Actor::create("", bob, host);
+
+  e.run();
+
+  return 0;
+}
diff --git a/teshsuite/s4u/io-set-bw/io-set-bw.tesh b/teshsuite/s4u/io-set-bw/io-set-bw.tesh
new file mode 100644 (file)
index 0000000..c3b39ed
--- /dev/null
@@ -0,0 +1,22 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/io-set-bw  "--log=root.fmt:[%10.6r]%e[%i:%a@%h]%e%m%n"
+> [  0.000000] [1:@bob] I/O operations: size 1e6. Should take 1s each
+> [  1.000000] [1:@bob] Read finished. Took: 1.000000
+> [  2.000000] [1:@bob] Write finished. Took: 1.000000
+> [  2.000000] [1:@bob] Setting read limit to half (.5e6). Read should take 2s, write still 1s
+> [  4.000000] [1:@bob] Read finished. Took: 2.000000
+> [  5.000000] [1:@bob] Write finished. Took: 1.000000
+> [  5.000000] [1:@bob] Setting write limit to half (.5e6). Write should take 2s, read still 1s
+> [  6.000000] [1:@bob] Read finished. Took: 1.000000
+> [  8.000000] [1:@bob] Write finished. Took: 2.000000
+> [  8.000000] [1:@bob] Setting readwrite limit to half (.5e6). Write and read should take 2s now
+> [ 10.000000] [1:@bob] Read finished. Took: 2.000000
+> [ 12.000000] [1:@bob] Write finished. Took: 2.000000
+> [ 12.000000] [1:@bob] Change bandwidth in the middle of I/O operation
+> [ 12.000000] [1:@bob] Setting read limit to half (.5e6) in the middle of IO. Read should take 1.5s
+> [ 13.500000] [1:@bob] Read finished. Took: 1.500000
+> [ 13.500000] [1:@bob] Setting write limit to half (.5e6) in the middle of IO. Write should take 1.5s
+> [ 15.000000] [1:@bob] Write finished. Took: 1.500000
+> [ 15.000000] [1:@bob] Setting readwrite limit to half (.5e6) in the middle of IO. Read and write should take 1.5s
+> [ 16.500000] [1:@bob] Read and write finished. Took: 1.500000
diff --git a/teshsuite/s4u/issue71/issue71.cpp b/teshsuite/s4u/issue71/issue71.cpp
new file mode 100644 (file)
index 0000000..1e9481f
--- /dev/null
@@ -0,0 +1,39 @@
+/* Copyright (c) 2021. The SimGrid Team. All rights reserved.               */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <simgrid/s4u.hpp>
+#include <vector>
+
+static void runner()
+{
+  auto e                    = simgrid::s4u::Engine::get_instance();
+  simgrid::s4u::Host* host0 = e->host_by_name("c1_0");
+  simgrid::s4u::Host* host1 = e->host_by_name("c2_0");
+
+  std::vector<double> comp = {1e6, 1e6};
+  std::vector<double> comm = {1, 2, 3, 4};
+
+  std::vector<simgrid::s4u::Host*> h1 = {host0, host1};
+  simgrid::s4u::this_actor::parallel_execute(h1, comp, comm);
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid::s4u::Engine e(&argc, argv);
+  simgrid::s4u::Engine::set_config("host/model:ptask_L07");
+
+  xbt_assert(argc == 2,
+             "\nUsage: %s platform_ok.xml\n"
+             "\tor: %s platform_bad.xml\n",
+             argv[0], argv[0]);
+
+  const char* platform_file = argv[1];
+  e.load_platform(platform_file);
+
+  simgrid::s4u::Actor::create("actor", e.host_by_name("c1_0"), runner);
+
+  e.run();
+  return 0;
+}
diff --git a/teshsuite/s4u/issue71/issue71.tesh b/teshsuite/s4u/issue71/issue71.tesh
new file mode 100644 (file)
index 0000000..18a7cca
--- /dev/null
@@ -0,0 +1,5 @@
+! expect signal SIGIOT
+$ $VALGRIND_NO_LEAK_CHECK ${bindir:=.}/issue71 ${srcdir:=.}/platform_bad.xml "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n" --log=no_loc
+> [  0.000000] (0:maestro@) Configuration change: Set 'host/model' to 'ptask_L07'
+> [  0.000000] (0:maestro@) Switching to the L07 model to handle parallel tasks.
+> [  0.000000] (0:maestro@) Invalid NetzoneRoute from cluster1@router_c2 to cluster2@router_c1: gw_src router_c2 belongs to cluster2, not to cluster1.
diff --git a/teshsuite/s4u/issue71/platform_bad.xml b/teshsuite/s4u/issue71/platform_bad.xml
new file mode 100644 (file)
index 0000000..72abe0b
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "https://simgrid.org/simgrid.dtd">
+<platform version="4.1">
+  <zone id="world" routing="Full">
+    <cluster id="cluster1" router_id="router_c1"
+       prefix="c1_" radical="0-0" suffix=""
+       speed="1Gf" bw="125MBps" lat="50us"  bb_bw="2.25GBps" bb_lat="500us">
+    </cluster>
+
+    <cluster id="cluster2" router_id="router_c2"
+      prefix="c2_" radical="0-0" suffix=""
+      speed="1Gf" bw="125MBps" lat="50us"  bb_bw="2.25GBps" bb_lat="500us">
+    </cluster>
+
+    <link id="backbone" bandwidth="1.25Gbps" latency="50us"/>
+    <zoneRoute src="cluster1" dst="cluster2" gw_src="router_c2" gw_dst="router_c1"> <!-- !!! -->
+      <link_ctn id="backbone"/>
+    </zoneRoute>
+  </zone>
+</platform>
index 325d32d..f664448 100644 (file)
@@ -35,7 +35,7 @@ public:
     XBT_INFO("Done dispatching all messages");
 
     /* Now that all message exchanges were initiated, wait for their completion in one single call */
-    sg4::Comm::wait_all(&pending_comms);
+    sg4::Comm::wait_all(pending_comms);
 
     XBT_INFO("Goodbye now!");
   }
@@ -69,8 +69,8 @@ static sg4::NetZone* create_zone(const sg4::NetZone* root, const std::string& id
     std::string hostname = id + "-cpu-" + std::to_string(i);
     auto* host           = zone->create_host(hostname, 1e9);
     host->create_disk("disk-" + hostname, 1e9, 1e6);
-    auto* link = zone->create_link("link-" + hostname, 1e9);
-    zone->add_route(host->get_netpoint(), router, nullptr, nullptr, std::vector<sg4::Link*>{link});
+    const auto* link = zone->create_link("link-" + hostname, 1e9);
+    zone->add_route(host->get_netpoint(), router, nullptr, nullptr, {sg4::LinkInRoute(link)});
   }
   return zone;
 }
@@ -85,9 +85,9 @@ int main(int argc, char* argv[])
   auto* root  = sg4::create_full_zone("root");
   auto* zoneA = create_zone(root, "A");
   auto* zoneB = create_zone(root, "B");
-  auto* link  = root->create_link("root-link", 1e10);
+  const auto* link = root->create_link("root-link", 1e10);
   root->add_route(zoneA->get_netpoint(), zoneB->get_netpoint(), e.netpoint_by_name("routerA"),
-                  e.netpoint_by_name("routerB"), std::vector<sg4::Link*>{link});
+                  e.netpoint_by_name("routerB"), {sg4::LinkInRoute(link)});
 
   std::vector<sg4::Host*> host_list = e.get_all_hosts();
   /* create the sender actor running on first host */
diff --git a/teshsuite/s4u/wait-all-for/wait-all-for.cpp b/teshsuite/s4u/wait-all-for/wait-all-for.cpp
new file mode 100644 (file)
index 0000000..f8ca85d
--- /dev/null
@@ -0,0 +1,53 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <cstdlib>
+#include <iostream>
+#include <simgrid/s4u.hpp>
+#include <string>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(meh, "meh");
+
+static void worker()
+{
+  auto mbox  = simgrid::s4u::Mailbox::by_name("meh");
+  int input1 = 42;
+  int input2 = 51;
+
+  XBT_INFO("Sending and receiving %d and %d asynchronously", input1, input2);
+
+  auto put1 = mbox->put_async(&input1, 1000 * 1000 * 500);
+  auto put2 = mbox->put_async(&input2, 1000 * 1000 * 1000);
+
+  int* out1;
+  auto get1 = mbox->get_async<int>(&out1);
+
+  int* out2;
+  auto get2 = mbox->get_async<int>(&out2);
+
+  XBT_INFO("All comms have started");
+  std::vector<simgrid::s4u::CommPtr> comms = {put1, put2, get1, get2};
+
+  while (not comms.empty()) {
+    size_t index = simgrid::s4u::Comm::wait_all_for(comms, 0.5);
+    if (index < comms.size())
+      XBT_INFO("wait_all_for: Timeout reached");
+    XBT_INFO("wait_all_for: %zu comms finished (#comms=%zu)", index, comms.size());
+    comms.erase(comms.begin(), comms.begin() + index);
+  }
+
+  XBT_INFO("All comms have finished");
+  XBT_INFO("Got %d and %d", *out1, *out2);
+}
+
+int main(int argc, char* argv[])
+
+{
+  simgrid::s4u::Engine e(&argc, argv);
+  e.load_platform(argv[1]);
+  simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Tremblay"), worker);
+  e.run();
+  return 0;
+}
diff --git a/teshsuite/s4u/wait-all-for/wait-all-for.tesh b/teshsuite/s4u/wait-all-for/wait-all-for.tesh
new file mode 100644 (file)
index 0000000..c7b30a9
--- /dev/null
@@ -0,0 +1,19 @@
+#!/usr/bin/env tesh
+
+p Testing the wait_all_for feature of S4U
+
+! output sort 19
+$ ${bindir:=.}/wait-all-for ${platfdir:=.}/small_platform.xml "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
+> [  0.000000] (1:worker@Tremblay) Sending and receiving 42 and 51 asynchronously
+> [  0.000000] (1:worker@Tremblay) All comms have started
+> [  0.500000] (1:worker@Tremblay) wait_all_for: Timeout reached
+> [  0.500000] (1:worker@Tremblay) wait_all_for: 0 comms finished (#comms=4)
+> [  1.000000] (1:worker@Tremblay) wait_all_for: Timeout reached
+> [  1.000000] (1:worker@Tremblay) wait_all_for: 0 comms finished (#comms=4)
+> [  1.500000] (1:worker@Tremblay) wait_all_for: Timeout reached
+> [  1.500000] (1:worker@Tremblay) wait_all_for: 1 comms finished (#comms=4)
+> [  2.000000] (1:worker@Tremblay) wait_all_for: Timeout reached
+> [  2.000000] (1:worker@Tremblay) wait_all_for: 0 comms finished (#comms=3)
+> [  2.070331] (1:worker@Tremblay) wait_all_for: 3 comms finished (#comms=3)
+> [  2.070331] (1:worker@Tremblay) All comms have finished
+> [  2.070331] (1:worker@Tremblay) Got 42 and 51
index 7f40e7f..9438f45 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include <cstdlib>
 #include <iostream>
 #include <string>
@@ -26,11 +31,11 @@ static void worker()
   std::vector<simgrid::s4u::CommPtr> comms = {put1, put2, get1, get2};
 
   while (not comms.empty()) {
-    int index = simgrid::s4u::Comm::wait_any_for(&comms, 0.5);
+    ssize_t index = simgrid::s4u::Comm::wait_any_for(comms, 0.5);
     if (index < 0)
       XBT_INFO("wait_any_for: Timeout reached");
     else {
-      XBT_INFO("wait_any_for: A comm finished (index=%d, #comms=%zu)", index, comms.size());
+      XBT_INFO("wait_any_for: A comm finished (index=%zd, #comms=%zu)", index, comms.size());
       comms.erase(comms.begin() + index);
     }
   }
index 44583a1..fb159fd 100644 (file)
@@ -118,10 +118,10 @@ static void dump_routes()
             });
 
   for (auto src_host : hosts) { // Routes from host
-    simgrid::kernel::routing::NetPoint* src = src_host->get_netpoint();
+    const simgrid::kernel::routing::NetPoint* src = src_host->get_netpoint();
     for (auto dst_host : hosts) { // Routes to host
       std::vector<simgrid::kernel::resource::LinkImpl*> route;
-      simgrid::kernel::routing::NetPoint* dst = dst_host->get_netpoint();
+      const simgrid::kernel::routing::NetPoint* dst = dst_host->get_netpoint();
       simgrid::kernel::routing::NetZoneImpl::get_global_route(src, dst, route, nullptr);
       if (route.empty())
         continue;
@@ -159,7 +159,7 @@ static void dump_routes()
     for (auto dst_host : hosts) { // Routes to host
       std::printf("  <route src=\"%s\" dst=\"%s\">\n  ", value1->get_cname(), dst_host->get_cname());
       std::vector<simgrid::kernel::resource::LinkImpl*> route;
-      simgrid::kernel::routing::NetPoint* netcardDst = dst_host->get_netpoint();
+      const simgrid::kernel::routing::NetPoint* netcardDst = dst_host->get_netpoint();
       simgrid::kernel::routing::NetZoneImpl::get_global_route(value1, netcardDst, route, nullptr);
       for (auto const& link : route)
         std::printf("<link_ctn id=\"%s\"/>", link->get_cname());
index aa134d7..80a1f7a 100644 (file)
@@ -1226,10 +1226,6 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_dragonfly_noncontiguous_rad.xml "-
 >   <link id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP" bandwidth="375000000" latency="0.000050000"/>
 >   <link id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_DOWN" bandwidth="375000000" latency="0.000050000"/>
 >   <link id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP" bandwidth="375000000" latency="0.000050000"/>
->   <link id="bob_cluster_link_-1_limiter" bandwidth="150000000" latency="0.000000000"/>
->   <link id="bob_cluster_link_-2_limiter" bandwidth="150000000" latency="0.000000000"/>
->   <link id="bob_cluster_link_-3_limiter" bandwidth="150000000" latency="0.000000000"/>
->   <link id="bob_cluster_link_-4_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_0_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_0_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
 >   <link id="bob_cluster_link_1002_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
@@ -1238,6 +1234,10 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_dragonfly_noncontiguous_rad.xml "-
 >   <link id="bob_cluster_link_1_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_2_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_3_limiter" bandwidth="150000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_4_limiter" bandwidth="150000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_5_limiter" bandwidth="150000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_6_limiter" bandwidth="150000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_7_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
 >   <link id="green_link_in_chassis_0_between_routers_0_and_1_4_UP" bandwidth="125000000" latency="0.000050000"/>
 >   <link id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
@@ -1254,46 +1254,46 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_dragonfly_noncontiguous_rad.xml "-
 >   <link_ctn id="bob_cluster_link_0_loopback"/>
 >   </route>
 >   <route src="node-0.simgrid.org" dst="node-1002.simgrid.org">
->   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-0.simgrid.org" dst="node-1003.simgrid.org">
->   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/><link_ctn id="bob_cluster_link_2_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-0.simgrid.org" dst="node-1004.simgrid.org">
->   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/><link_ctn id="bob_cluster_link_3_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-1002.simgrid.org" dst="node-0.simgrid.org">
->   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-1002.simgrid.org" dst="node-1002.simgrid.org">
 >   <link_ctn id="bob_cluster_link_1002_loopback"/>
 >   </route>
 >   <route src="node-1002.simgrid.org" dst="node-1003.simgrid.org">
->   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/><link_ctn id="bob_cluster_link_2_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-1002.simgrid.org" dst="node-1004.simgrid.org">
->   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/><link_ctn id="bob_cluster_link_3_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-1003.simgrid.org" dst="node-0.simgrid.org">
->   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-1003.simgrid.org" dst="node-1002.simgrid.org">
->   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-1003.simgrid.org" dst="node-1003.simgrid.org">
 >   <link_ctn id="bob_cluster_link_1003_loopback"/>
 >   </route>
 >   <route src="node-1003.simgrid.org" dst="node-1004.simgrid.org">
->   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/><link_ctn id="bob_cluster_link_3_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-1004.simgrid.org" dst="node-0.simgrid.org">
->   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-1004.simgrid.org" dst="node-1002.simgrid.org">
->   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_DOWN"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-1004.simgrid.org" dst="node-1003.simgrid.org">
->   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/><link_ctn id="bob_cluster_link_2_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-1004.simgrid.org" dst="node-1004.simgrid.org">
 >   <link_ctn id="bob_cluster_link_1004_loopback"/>
@@ -1311,10 +1311,6 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_fat_tree_noncontiguous_rad.xml "--
 >   <host id="node-119.simgrid.org" speed="1000000000"/>
 >   <host id="node-120.simgrid.org" speed="1000000000"/>
 >   <link id="__loopback__" bandwidth="10000000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_-1_limiter" bandwidth="50000000" latency="0.000000000"/>
->   <link id="bob_cluster_link_-2_limiter" bandwidth="50000000" latency="0.000000000"/>
->   <link id="bob_cluster_link_-3_limiter" bandwidth="50000000" latency="0.000000000"/>
->   <link id="bob_cluster_link_-4_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_0_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_100_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
 >   <link id="bob_cluster_link_101_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
@@ -1323,74 +1319,78 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_fat_tree_noncontiguous_rad.xml "--
 >   <link id="bob_cluster_link_1_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_2_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_3_limiter" bandwidth="50000000" latency="0.000000000"/>
->   <link id="link_from_-1_-3_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-1_-3_4_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-1_-3_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-1_-3_5_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-1_-4_6_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-1_-4_6_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-1_-4_7_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-1_-4_7_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-2_-3_8_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-2_-3_8_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-2_-3_9_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-2_-3_9_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-2_-4_10_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-2_-4_10_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-2_-4_11_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_-2_-4_11_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_0_-1_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_0_-1_0_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_1_-1_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_1_-1_1_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_2_-2_2_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_2_-2_2_UP" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_3_-2_3_DOWN" bandwidth="125000000" latency="0.000050000"/>
->   <link id="link_from_3_-2_3_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="bob_cluster_link_4_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_5_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_6_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_7_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="link_from_0_7_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_0_7_0_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_1_7_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_1_7_1_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_2_6_2_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_2_6_2_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_3_6_3_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_3_6_3_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_6_4_10_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_6_4_10_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_6_4_11_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_6_4_11_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_6_5_8_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_6_5_8_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_6_5_9_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_6_5_9_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_7_4_6_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_7_4_6_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_7_4_7_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_7_4_7_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_7_5_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_7_5_4_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_7_5_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link_from_7_5_5_UP" bandwidth="125000000" latency="0.000050000"/>
 >   <route src="node-100.simgrid.org" dst="node-100.simgrid.org">
 >   <link_ctn id="bob_cluster_link_100_loopback"/>
 >   </route>
 >   <route src="node-100.simgrid.org" dst="node-101.simgrid.org">
->   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_7_0_UP"/><link_ctn id="link_from_1_7_1_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-100.simgrid.org" dst="node-119.simgrid.org">
->   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="link_from_-1_-3_4_UP"/><link_ctn id="link_from_-2_-3_8_DOWN"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_7_0_UP"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="link_from_7_5_4_UP"/><link_ctn id="link_from_6_5_8_DOWN"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="link_from_2_6_2_DOWN"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-100.simgrid.org" dst="node-120.simgrid.org">
->   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="link_from_-1_-4_6_UP"/><link_ctn id="link_from_-2_-4_10_DOWN"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_7_0_UP"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="link_from_7_4_6_UP"/><link_ctn id="link_from_6_4_10_DOWN"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="link_from_3_6_3_DOWN"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-101.simgrid.org" dst="node-100.simgrid.org">
->   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_7_1_UP"/><link_ctn id="link_from_0_7_0_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-101.simgrid.org" dst="node-101.simgrid.org">
 >   <link_ctn id="bob_cluster_link_101_loopback"/>
 >   </route>
 >   <route src="node-101.simgrid.org" dst="node-119.simgrid.org">
->   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="link_from_-1_-3_4_UP"/><link_ctn id="link_from_-2_-3_8_DOWN"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_7_1_UP"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="link_from_7_5_4_UP"/><link_ctn id="link_from_6_5_8_DOWN"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="link_from_2_6_2_DOWN"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-101.simgrid.org" dst="node-120.simgrid.org">
->   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="link_from_-1_-4_6_UP"/><link_ctn id="link_from_-2_-4_10_DOWN"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_7_1_UP"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="link_from_7_4_6_UP"/><link_ctn id="link_from_6_4_10_DOWN"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="link_from_3_6_3_DOWN"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-119.simgrid.org" dst="node-100.simgrid.org">
->   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="link_from_-2_-3_8_UP"/><link_ctn id="link_from_-1_-3_4_DOWN"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_6_2_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="link_from_6_5_8_UP"/><link_ctn id="link_from_7_5_4_DOWN"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="link_from_0_7_0_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-119.simgrid.org" dst="node-101.simgrid.org">
->   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="link_from_-2_-4_10_UP"/><link_ctn id="link_from_-1_-4_6_DOWN"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_6_2_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="link_from_6_4_10_UP"/><link_ctn id="link_from_7_4_6_DOWN"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="link_from_1_7_1_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-119.simgrid.org" dst="node-119.simgrid.org">
 >   <link_ctn id="bob_cluster_link_119_loopback"/>
 >   </route>
 >   <route src="node-119.simgrid.org" dst="node-120.simgrid.org">
->   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_6_2_UP"/><link_ctn id="link_from_3_6_3_DOWN"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-120.simgrid.org" dst="node-100.simgrid.org">
->   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="link_from_-2_-3_8_UP"/><link_ctn id="link_from_-1_-3_4_DOWN"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_6_3_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="link_from_6_5_8_UP"/><link_ctn id="link_from_7_5_4_DOWN"/><link_ctn id="bob_cluster_link_5_limiter"/><link_ctn id="link_from_0_7_0_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-120.simgrid.org" dst="node-101.simgrid.org">
->   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="link_from_-2_-4_10_UP"/><link_ctn id="link_from_-1_-4_6_DOWN"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_6_3_UP"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="link_from_6_4_10_UP"/><link_ctn id="link_from_7_4_6_DOWN"/><link_ctn id="bob_cluster_link_4_limiter"/><link_ctn id="link_from_1_7_1_DOWN"/><link_ctn id="bob_cluster_link_7_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-120.simgrid.org" dst="node-119.simgrid.org">
->   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_6_3_UP"/><link_ctn id="link_from_2_6_2_DOWN"/><link_ctn id="bob_cluster_link_6_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-120.simgrid.org" dst="node-120.simgrid.org">
 >   <link_ctn id="bob_cluster_link_120_loopback"/>
@@ -1490,3 +1490,28 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_torus_noncontiguous_rad.xml "--log
 >   </route>
 > </AS>
 > </platform>
+$ ${bindir:=.}/flatifier ../platforms/two_hosts_one_link_splitduplex.xml "--log=root.fmt:[%10.6r]%e[%i:%a@%h]%e%m%n"
+> <?xml version='1.0'?>
+> <!DOCTYPE platform SYSTEM "https://simgrid.org/simgrid.dtd">
+> <platform version="4">
+> <AS id="AS0" routing="Full">
+>   <host id="alice" speed="500000000"/>
+>   <host id="bob" speed="1000000000"/>
+>   <link id="__loopback__" bandwidth="10000000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="link1_DOWN" bandwidth="125000000" latency="0.000050000"/>
+>   <link id="link1_UP" bandwidth="125000000" latency="0.000050000"/>
+>   <route src="alice" dst="alice">
+>   <link_ctn id="__loopback__"/>
+>   </route>
+>   <route src="alice" dst="bob">
+>   <link_ctn id="link1_UP"/>
+>   </route>
+>   <route src="bob" dst="alice">
+>   <link_ctn id="link1_DOWN"/>
+>   </route>
+>   <route src="bob" dst="bob">
+>   <link_ctn id="__loopback__"/>
+>   </route>
+> </AS>
+> </platform>
+
index 7e766ff..f121533 100644 (file)
@@ -7,11 +7,8 @@
 
     <link id="link1" bandwidth="125MBps" latency="50us" sharing_policy="SPLITDUPLEX"/>
 
-    <route src="alice" dst="bob" symmetrical="NO">
+    <route src="alice" dst="bob" symmetrical="YES">
       <link_ctn id="link1" direction="UP"/>
     </route>
-    <route src="bob" dst="alice" symmetrical="NO">
-      <link_ctn id="link1" direction="DOWN"/>
-    </route>
   </zone>
 </platform>
index a3314a2..1986807 100644 (file)
@@ -9,7 +9,7 @@ if(enable_smpi)
   foreach(x coll-allgather coll-allgatherv coll-allreduce coll-allreduce-with-leaks coll-alltoall coll-alltoallv coll-barrier coll-bcast
             coll-gather coll-reduce coll-reduce-scatter coll-scatter macro-sample pt2pt-dsend pt2pt-pingpong
             type-hvector type-indexed type-struct type-vector bug-17132 gh-139 timers privatization 
-            io-simple io-simple-at io-all io-all-at io-shared io-ordered topo-cart-sub)
+            io-simple io-simple-at io-all io-all-at io-shared io-ordered topo-cart-sub replay-ti-colls)
     add_executable       (${x}  EXCLUDE_FROM_ALL ${x}/${x}.c)
     target_link_libraries(${x}  simgrid)
     set_target_properties(${x}  PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x})
@@ -39,7 +39,7 @@ foreach(x coll-allgather coll-allgatherv coll-allreduce coll-allreduce-with-leak
     coll-gather coll-reduce coll-reduce-scatter coll-scatter macro-sample pt2pt-dsend pt2pt-pingpong
     type-hvector type-indexed type-struct type-vector bug-17132 gh-139 timers privatization
     macro-shared auto-shared macro-partial-shared macro-partial-shared-communication
-    io-simple io-simple-at io-all io-all-at io-shared io-ordered topo-cart-sub)
+    io-simple io-simple-at io-all io-all-at io-shared io-ordered topo-cart-sub replay-ti-colls)
   set(tesh_files    ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
   set(teshsuite_src ${teshsuite_src} ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.c)
 endforeach()
@@ -50,11 +50,13 @@ set(tesh_files    ${tesh_files}     ${CMAKE_CURRENT_SOURCE_DIR}/coll-allreduce/c
                                     ${CMAKE_CURRENT_SOURCE_DIR}/coll-allreduce/coll-allreduce-papi.tesh
                                     ${CMAKE_CURRENT_SOURCE_DIR}/coll-allreduce-with-leaks/mc-coll-allreduce-with-leaks.tesh
                                     ${CMAKE_CURRENT_SOURCE_DIR}/coll-alltoall/clusters.tesh
+                                    ${CMAKE_CURRENT_SOURCE_DIR}/coll-alltoall/griffon.tesh
                                     ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt-pingpong/broken_hostfiles.tesh
                                     ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt-pingpong/TI_output.tesh
                                     ${CMAKE_CURRENT_SOURCE_DIR}/fort_args/fort_args.tesh  PARENT_SCOPE)
 set(bin_files       ${bin_files}    ${CMAKE_CURRENT_SOURCE_DIR}/hostfile
                                     ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_cluster
+                                    ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_griffon
                                     ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_coll
                                     ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_mpich
                                     ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_io
@@ -137,7 +139,7 @@ if(enable_smpi)
   ADD_TESH(tesh-smpi-coll-allreduce-automatic --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/coll-allreduce --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi/coll-allreduce ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/coll-allreduce/coll-allreduce-automatic.tesh)
 
   # Extra alltoall test: cluster-types
-  ADD_TESH(tesh-smpi-cluster-types --cfg smpi/alltoall:mvapich2 --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/coll-alltoall --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi/coll-alltoall ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/coll-alltoall/clusters.tesh)
+  ADD_TESH(tesh-smpi-cluster-types --cfg smpi/alltoall:mvapich2 --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/coll-alltoall --setenv libdir=${CMAKE_BINARY_DIR}/lib --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi/coll-alltoall ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/coll-alltoall/clusters.tesh)
 
   # Extra allreduce test : PAPI tracing
   if (HAVE_PAPI)
@@ -157,6 +159,8 @@ if(enable_smpi)
   # Extra pt2pt pingpong test: broken usage ti-tracing
   ADD_TESH_FACTORIES(tesh-smpi-broken  "thread"   --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/pt2pt-pingpong --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi/pt2pt-pingpong ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt-pingpong/broken_hostfiles.tesh)
   ADD_TESH(tesh-smpi-replay-ti-tracing            --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt-pingpong --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi/pt2pt-pingpong ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt-pingpong/TI_output.tesh)
+  ADD_TESH(tesh-smpi-replay-ti-tracing-coll       --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/replay-ti-colls --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi/replay-ti-colls ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/replay-ti-colls/replay-ti-colls.tesh)
+
   ADD_TESH_FACTORIES(tesh-smpi-gh-139  "thread"   --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/gh-139 --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi/gh-139 ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/gh-139/gh-139.tesh)
   
   # Simple privatization tests
index 9bc350f..b32153e 100644 (file)
@@ -34,6 +34,8 @@ int main(int argc, char *argv[])
   MPI_Comm_size(MPI_COMM_WORLD, &size);
   //Let's Allocate a memory buffer
   uint64_t* buf = calloc(1, sizeof(uint64_t));
+
+  MPI_Barrier(MPI_COMM_WORLD);
   //one writes data in it
   if(rank==0){
     *buf=size;
index 1f529a7..cb26451 100644 (file)
@@ -1,3 +1,3 @@
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -np 16 -platform ${platfdir:=.}/small_platform.xml -hostfile ../hostfile ${bindir:=.}/bug-17132 --cfg=smpi/simulate-computation:no --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> You requested to use 16 ranks, but there is only 5 processes in your hostfile...
-> Walltime = 0.478832
+> [0.000000] [smpi/INFO] You requested to use 16 ranks, but there is only 5 processes in your hostfile...
+> Walltime = 0.489366
index d1432f2..22f4f9f 100644 (file)
@@ -70,5 +70,5 @@ int main(int argc, char *argv[])
   xbt_free(sb);
   xbt_free(rb);
   MPI_Finalize();
-  return (EXIT_SUCCESS);
+  return EXIT_SUCCESS;
 }
index 46080fe..0f51204 100644 (file)
@@ -3,22 +3,22 @@
 
 p Test allgather
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-allgather --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_pmpi.thres:error --log=smpi_mpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
 > [0] rcvbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
 > [1] rcvbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
 > [2] rcvbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
index a825d42..7838b3f 100644 (file)
@@ -86,5 +86,5 @@ int main(int argc, char *argv[])
   xbt_free(recv_counts);
   xbt_free(recv_disps);
   MPI_Finalize();
-  return (EXIT_SUCCESS);
+  return EXIT_SUCCESS;
 }
index 0e96e14..c94e643 100644 (file)
@@ -3,22 +3,22 @@
 
 p Test allgatherv
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-allgatherv --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error  --log=smpi_pmpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
 > [0] sndbuf=[0 ]
 > [1] sndbuf=[1 2 ]
 > [2] sndbuf=[3 4 5 ]
index 73b6583..073a35c 100644 (file)
@@ -40,5 +40,5 @@ int main(int argc, char *argv[])
   }
   //Do not free dup and rb/sb
   MPI_Finalize();
-  return (EXIT_SUCCESS);
+  return EXIT_SUCCESS;
 }
index 82bba27..25c5561 100644 (file)
@@ -2,29 +2,29 @@
 
 p Test allreduce
 $ $VALGRIND_NO_LEAK_CHECK ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform  ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-allreduce-with-leaks --log=smpi_config.thres:warning --cfg=smpi/display-allocs:yes --cfg=smpi/simulate-computation:no --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error --cfg=smpi/list-leaks:10
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
-> [0.023768] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 32 unfreed MPI handles :
-> [0.023768] [smpi_utils/INFO] 16 leaked handles of type MPI_Comm at coll-allreduce-with-leaks.c:23
-> [0.023768] [smpi_utils/INFO] 16 leaked handles of type MPI_Group at coll-allreduce-with-leaks.c:23
-> [0.023768] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 32 unfreed buffers :
-> [0.023768] [smpi_utils/INFO] coll-allreduce-with-leaks.c:28 : leaked allocations of total size 1504, called 16 times, with minimum size 64 and maximum size 124
-> [0.023768] [smpi_utils/INFO] coll-allreduce-with-leaks.c:27 : leaked allocations of total size 1024, called 16 times, each with size 64
-> [0.023768] [smpi_utils/INFO] Memory Usage: Simulated application allocated 2528 bytes during its lifetime through malloc/calloc calls.
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
+> [0.023780] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 32 unfreed MPI handles:
+> [0.023780] [smpi_utils/INFO] 16 leaked handles of type MPI_Comm at coll-allreduce-with-leaks.c:23
+> [0.023780] [smpi_utils/INFO] 16 leaked handles of type MPI_Group at coll-allreduce-with-leaks.c:23
+> [0.023780] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 32 unfreed buffers:
+> [0.023780] [smpi_utils/INFO] coll-allreduce-with-leaks.c:28: leaked allocations of total size 1504, called 16 times, with minimum size 64 and maximum size 124
+> [0.023780] [smpi_utils/INFO] coll-allreduce-with-leaks.c:27: leaked allocations of total size 1024, called 16 times, each with size 64
+> [0.023780] [smpi_utils/INFO] Memory Usage: Simulated application allocated 2528 bytes during its lifetime through malloc/calloc calls.
 > Largest allocation at once from a single process was 124 bytes, at coll-allreduce-with-leaks.c:28. It was called 1 times during the whole simulation.
 > If this is too much, consider sharing allocations for computation buffers.
 > This can be done automatically by setting --cfg=smpi/auto-shared-malloc-thresh to the minimum size wanted size (this can alter execution if data content is necessary)
index 796eb1b..dbd9617 100644 (file)
@@ -2,27 +2,27 @@
 
 p Test allreduce
 $ $VALGRIND_NO_LEAK_CHECK ${bindir:=.}/../../../smpi_script/bin/smpirun -wrapper "${bindir:=.}/../../../bin/simgrid-mc" -map -hostfile ../hostfile_coll -platform  ${platfdir:=.}/small_platform.xml -np 4 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-allreduce-with-leaks --log=smpi_config.thres:warning --cfg=smpi/display-allocs:yes --cfg=smpi/simulate-computation:no --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error --cfg=smpi/list-leaks:10 --log=no_loc
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
 > [0.000000] [mc_safety/INFO] Check a safety property. Reduction is: dpor.
-> [0.000000] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 8 unfreed MPI handles :
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 8 unfreed MPI handles:
 > [0.000000] [smpi_utils/WARNING] To get more information (location of allocations), compile your code with -trace-call-location flag of smpicc/f90
 > [0.000000] [smpi_utils/INFO] 4 leaked handles of type MPI_Comm
 > [0.000000] [smpi_utils/INFO] 4 leaked handles of type MPI_Group
-> [0.000000] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 8 unfreed buffers :
+> [0.000000] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 8 unfreed buffers:
 > [0.000000] [smpi_utils/INFO] leaked allocations of total size 152, called 8 times, with minimum size 16 and maximum size 28
 > [0.000000] [smpi_utils/INFO] Memory Usage: Simulated application allocated 152 bytes during its lifetime through malloc/calloc calls.
 > Largest allocation at once from a single process was 28 bytes, at coll-allreduce-with-leaks.c:28. It was called 1 times during the whole simulation.
 > If this is too much, consider sharing allocations for computation buffers.
 > This can be done automatically by setting --cfg=smpi/auto-shared-malloc-thresh to the minimum size wanted size (this can alter execution if data content is necessary)
 > 
-> [0.000000] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 8 unfreed MPI handles :
+> [0.000000] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 8 unfreed MPI handles:
 > [0.000000] [smpi_utils/WARNING] To get more information (location of allocations), compile your code with -trace-call-location flag of smpicc/f90
 > [0.000000] [smpi_utils/INFO] 4 leaked handles of type MPI_Comm
 > [0.000000] [smpi_utils/INFO] 4 leaked handles of type MPI_Group
-> [0.000000] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 8 unfreed buffers :
+> [0.000000] [smpi_utils/INFO] Probable memory leaks in your code: SMPI detected 8 unfreed buffers:
 > [0.000000] [smpi_utils/INFO] leaked allocations of total size 152, called 8 times, with minimum size 16 and maximum size 28
 > [0.000000] [smpi_utils/INFO] Memory Usage: Simulated application allocated 152 bytes during its lifetime through malloc/calloc calls.
 > Largest allocation at once from a single process was 28 bytes, at coll-allreduce-with-leaks.c:28. It was called 1 times during the whole simulation.
index ae895e1..940489f 100644 (file)
@@ -3,38 +3,38 @@
 p Test allreduce
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-allreduce --log=smpi_config.thres:warning --log=smpi_coll.thres:error --cfg=smpi/allreduce:automatic --cfg=smpi/async-small-thresh:65536 --cfg=smpi/send-is-detached-thresh:128000 --cfg=smpi/simulate-computation:no "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n" --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
-> [  0.515984] (5:4@Jupiter) The quickest allreduce was redbcast on rank 4 and took 0.008017
-> [  0.515984] (6:5@Jupiter) The quickest allreduce was redbcast on rank 5 and took 0.008048
-> [  0.515984] (7:6@Jupiter) The quickest allreduce was redbcast on rank 6 and took 0.008048
-> [  0.515984] (8:7@Jupiter) The quickest allreduce was redbcast on rank 7 and took 0.008078
-> [  0.516103] (2:1@Tremblay) The quickest allreduce was redbcast on rank 1 and took 0.008013
-> [  0.516103] (3:2@Tremblay) The quickest allreduce was redbcast on rank 2 and took 0.008013
-> [  0.516103] (4:3@Tremblay) The quickest allreduce was redbcast on rank 3 and took 0.008044
-> [  0.516709] (13:12@Ginette) The quickest allreduce was mvapich2 on rank 12 and took 0.005970
-> [  0.516709] (14:13@Ginette) The quickest allreduce was mvapich2 on rank 13 and took 0.006001
-> [  0.516709] (15:14@Ginette) The quickest allreduce was mvapich2 on rank 14 and took 0.006001
-> [  0.516709] (16:15@Ginette) The quickest allreduce was ompi on rank 15 and took 0.005970
-> [  0.519260] (10:9@Fafard) The quickest allreduce was mvapich2 on rank 9 and took 0.005977
-> [  0.519260] (11:10@Fafard) The quickest allreduce was mvapich2 on rank 10 and took 0.005977
-> [  0.519260] (12:11@Fafard) The quickest allreduce was mvapich2 on rank 11 and took 0.006007
-> [  0.519260] (9:8@Fafard) The quickest allreduce was mvapich2 on rank 8 and took 0.005946
-> [  0.523253] (1:0@Tremblay) For rank 0, the quickest was redbcast : 0.008013 , but global was mvapich2 : 0.009198 at max
+> [  0.000000] (0:maestro@) [rank 0] -> Tremblay
+> [  0.000000] (0:maestro@) [rank 1] -> Tremblay
+> [  0.000000] (0:maestro@) [rank 2] -> Tremblay
+> [  0.000000] (0:maestro@) [rank 3] -> Tremblay
+> [  0.000000] (0:maestro@) [rank 4] -> Jupiter
+> [  0.000000] (0:maestro@) [rank 5] -> Jupiter
+> [  0.000000] (0:maestro@) [rank 6] -> Jupiter
+> [  0.000000] (0:maestro@) [rank 7] -> Jupiter
+> [  0.000000] (0:maestro@) [rank 8] -> Fafard
+> [  0.000000] (0:maestro@) [rank 9] -> Fafard
+> [  0.000000] (0:maestro@) [rank 10] -> Fafard
+> [  0.000000] (0:maestro@) [rank 11] -> Fafard
+> [  0.000000] (0:maestro@) [rank 12] -> Ginette
+> [  0.000000] (0:maestro@) [rank 13] -> Ginette
+> [  0.000000] (0:maestro@) [rank 14] -> Ginette
+> [  0.000000] (0:maestro@) [rank 15] -> Ginette
+> [  0.516218] (8:7@Jupiter) The quickest allreduce was redbcast on rank 7 and took 0.008087
+> [  0.516218] (7:6@Jupiter) The quickest allreduce was redbcast on rank 6 and took 0.008056
+> [  0.516218] (6:5@Jupiter) The quickest allreduce was redbcast on rank 5 and took 0.008056
+> [  0.516218] (5:4@Jupiter) The quickest allreduce was redbcast on rank 4 and took 0.008026
+> [  0.516333] (4:3@Tremblay) The quickest allreduce was redbcast on rank 3 and took 0.008054
+> [  0.516333] (3:2@Tremblay) The quickest allreduce was redbcast on rank 2 and took 0.008023
+> [  0.516333] (2:1@Tremblay) The quickest allreduce was redbcast on rank 1 and took 0.008023
+> [  0.516940] (13:12@Ginette) The quickest allreduce was mvapich2 on rank 12 and took 0.005970
+> [  0.516940] (14:13@Ginette) The quickest allreduce was mvapich2 on rank 13 and took 0.006001
+> [  0.516940] (15:14@Ginette) The quickest allreduce was mvapich2 on rank 14 and took 0.006001
+> [  0.516940] (16:15@Ginette) The quickest allreduce was ompi on rank 15 and took 0.005970
+> [  0.519494] (12:11@Fafard) The quickest allreduce was mvapich2 on rank 11 and took 0.006009
+> [  0.519494] (11:10@Fafard) The quickest allreduce was mvapich2 on rank 10 and took 0.005978
+> [  0.519494] (10:9@Fafard) The quickest allreduce was mvapich2 on rank 9 and took 0.005978
+> [  0.519494] (9:8@Fafard) The quickest allreduce was mvapich2 on rank 8 and took 0.005948
+> [  0.523490] (1:0@Tremblay) For rank 0, the quickest was redbcast : 0.008023 , but global was mvapich2 : 0.009199 at max
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]
 > [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
 > [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ]
index c15eb4d..d7a1f69 100644 (file)
@@ -4,10 +4,10 @@
 ! timeout 20
 p Test allreduce
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ${platfdir:=.}/small_platform.xml -np 4 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-allreduce 300000 --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
-> [rank 2] -> Fafard
-> [rank 3] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 2] -> Fafard
+> [0.000000] [smpi/INFO] [rank 3] -> Ginette
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]
 > [1] sndbuf=[4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ]
 > [2] sndbuf=[8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ]
index d6072c8..d47dba9 100644 (file)
@@ -3,22 +3,22 @@
 
 p Test allreduce with papi events activated - needs papi installed, simgrid compiled with it, and sudo or sudo sh -c "echo 0 > /proc/sys/kernel/perf_event_paranoid"
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 -trace --log=xbt_cfg.thres:critical ${bindir:=.}/coll-allreduce --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error --cfg=smpi/papi-events:default:PAPI_L1_TCM:PAPI_TOT_CYC
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]
 > [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
 > [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ]
index 2574b72..3962c9e 100644 (file)
@@ -72,5 +72,5 @@ int main(int argc, char *argv[])
   xbt_free(sb);
   xbt_free(rb);
   MPI_Finalize();
-  return (EXIT_SUCCESS);
+  return EXIT_SUCCESS;
 }
index ef138fe..e19a0e4 100644 (file)
@@ -3,22 +3,22 @@
 
 p Test allreduce
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-allreduce --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]
 > [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
 > [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ]
index a40b131..5732aa3 100644 (file)
@@ -3,18 +3,18 @@
 
 p Test classic - backbone
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${bindir}/../hostfile_cluster -platform ${platfdir:=.}/cluster_backbone.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> node-0.simgrid.org
-> [rank 1] -> node-1.simgrid.org
-> [rank 2] -> node-2.simgrid.org
-> [rank 3] -> node-3.simgrid.org
-> [rank 4] -> node-4.simgrid.org
-> [rank 5] -> node-5.simgrid.org
-> [rank 6] -> node-6.simgrid.org
-> [rank 7] -> node-7.simgrid.org
-> [rank 8] -> node-8.simgrid.org
-> [rank 9] -> node-9.simgrid.org
-> [rank 10] -> node-10.simgrid.org
-> [rank 11] -> node-11.simgrid.org
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
 > [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
 > [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
@@ -43,18 +43,18 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${bindir}/../host
 ! output sort
 p Test separate clusters
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -platform ${platfdir:=.}/cluster_multi.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> node-0.1core.org
-> [rank 1] -> node-1.1core.org
-> [rank 2] -> node-2.1core.org
-> [rank 3] -> node-3.1core.org
-> [rank 4] -> node-4.1core.org
-> [rank 5] -> node-5.1core.org
-> [rank 6] -> node-6.1core.org
-> [rank 7] -> node-0.2cores.org
-> [rank 8] -> node-1.2cores.org
-> [rank 9] -> node-2.2cores.org
-> [rank 10] -> node-3.2cores.org
-> [rank 11] -> node-4.2cores.org
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.1core.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-0.2cores.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-0.4cores.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-1.1core.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-1.2cores.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-1.4cores.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-2.1core.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-2.2cores.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-2.4cores.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-3.1core.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-3.2cores.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-3.4cores.org
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
 > [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
 > [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
@@ -83,18 +83,18 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -platform ${platfdir:=.}/cl
 ! output sort
 p Test torus
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_cluster -platform ${platfdir:=.}/cluster_torus.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> node-0.simgrid.org
-> [rank 1] -> node-1.simgrid.org
-> [rank 2] -> node-2.simgrid.org
-> [rank 3] -> node-3.simgrid.org
-> [rank 4] -> node-4.simgrid.org
-> [rank 5] -> node-5.simgrid.org
-> [rank 6] -> node-6.simgrid.org
-> [rank 7] -> node-7.simgrid.org
-> [rank 8] -> node-8.simgrid.org
-> [rank 9] -> node-9.simgrid.org
-> [rank 10] -> node-10.simgrid.org
-> [rank 11] -> node-11.simgrid.org
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
 > [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
 > [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
@@ -123,18 +123,18 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_clust
 ! output sort
 p Test fat tree
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_cluster -platform ${platfdir:=.}/cluster_fat_tree.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> node-0.simgrid.org
-> [rank 1] -> node-1.simgrid.org
-> [rank 2] -> node-2.simgrid.org
-> [rank 3] -> node-3.simgrid.org
-> [rank 4] -> node-4.simgrid.org
-> [rank 5] -> node-5.simgrid.org
-> [rank 6] -> node-6.simgrid.org
-> [rank 7] -> node-7.simgrid.org
-> [rank 8] -> node-8.simgrid.org
-> [rank 9] -> node-9.simgrid.org
-> [rank 10] -> node-10.simgrid.org
-> [rank 11] -> node-11.simgrid.org
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
 > [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
 > [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
@@ -163,18 +163,18 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_clust
 ! output sort
 p Test fat tree IB
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_cluster -platform ${platfdir:=.}/cluster_fat_tree.xml -np 12 --cfg=network/model:IB --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> node-0.simgrid.org
-> [rank 1] -> node-1.simgrid.org
-> [rank 2] -> node-2.simgrid.org
-> [rank 3] -> node-3.simgrid.org
-> [rank 4] -> node-4.simgrid.org
-> [rank 5] -> node-5.simgrid.org
-> [rank 6] -> node-6.simgrid.org
-> [rank 7] -> node-7.simgrid.org
-> [rank 8] -> node-8.simgrid.org
-> [rank 9] -> node-9.simgrid.org
-> [rank 10] -> node-10.simgrid.org
-> [rank 11] -> node-11.simgrid.org
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
 > [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
 > [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
@@ -203,18 +203,18 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_clust
 ! output sort
 p Test Dragonfly
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_cluster -platform ${platfdir:=.}/cluster_dragonfly.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> node-0.simgrid.org
-> [rank 1] -> node-1.simgrid.org
-> [rank 2] -> node-2.simgrid.org
-> [rank 3] -> node-3.simgrid.org
-> [rank 4] -> node-4.simgrid.org
-> [rank 5] -> node-5.simgrid.org
-> [rank 6] -> node-6.simgrid.org
-> [rank 7] -> node-7.simgrid.org
-> [rank 8] -> node-8.simgrid.org
-> [rank 9] -> node-9.simgrid.org
-> [rank 10] -> node-10.simgrid.org
-> [rank 11] -> node-11.simgrid.org
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
 > [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
 > [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
@@ -239,3 +239,564 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_clust
 > [9] rcvbuf=[9 21 33 45 57 69 81 93 105 117 129 141 ]
 > [5] rcvbuf=[5 17 29 41 53 65 77 89 101 113 125 137 ]
 > [1] rcvbuf=[1 13 25 37 49 61 73 85 97 109 121 133 ]
+
+! output sort
+p Test Griffon(xml)
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_griffon -platform ${platfdir:=.}/griffon.xml -np 92 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> griffon-1.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 1] -> griffon-2.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 2] -> griffon-3.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 3] -> griffon-4.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 4] -> griffon-5.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 5] -> griffon-6.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 6] -> griffon-7.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 7] -> griffon-8.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 8] -> griffon-9.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 9] -> griffon-10.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 10] -> griffon-11.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 11] -> griffon-12.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 12] -> griffon-13.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 13] -> griffon-14.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 14] -> griffon-15.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 15] -> griffon-16.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 16] -> griffon-17.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 17] -> griffon-18.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 18] -> griffon-19.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 19] -> griffon-20.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 20] -> griffon-21.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 21] -> griffon-22.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 22] -> griffon-23.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 23] -> griffon-24.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 24] -> griffon-25.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 25] -> griffon-26.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 26] -> griffon-27.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 27] -> griffon-28.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 28] -> griffon-29.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 29] -> griffon-30.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 30] -> griffon-31.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 31] -> griffon-32.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 32] -> griffon-33.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 33] -> griffon-34.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 34] -> griffon-35.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 35] -> griffon-36.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 36] -> griffon-37.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 37] -> griffon-38.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 38] -> griffon-39.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 39] -> griffon-40.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 40] -> griffon-41.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 41] -> griffon-42.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 42] -> griffon-43.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 43] -> griffon-44.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 44] -> griffon-45.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 45] -> griffon-46.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 46] -> griffon-47.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 47] -> griffon-48.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 48] -> griffon-49.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 49] -> griffon-50.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 50] -> griffon-51.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 51] -> griffon-52.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 52] -> griffon-53.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 53] -> griffon-54.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 54] -> griffon-55.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 55] -> griffon-56.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 56] -> griffon-57.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 57] -> griffon-58.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 58] -> griffon-59.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 59] -> griffon-60.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 60] -> griffon-61.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 61] -> griffon-62.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 62] -> griffon-63.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 63] -> griffon-64.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 64] -> griffon-65.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 65] -> griffon-66.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 66] -> griffon-67.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 67] -> griffon-68.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 68] -> griffon-69.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 69] -> griffon-70.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 70] -> griffon-71.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 71] -> griffon-72.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 72] -> griffon-73.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 73] -> griffon-74.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 74] -> griffon-75.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 75] -> griffon-76.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 76] -> griffon-77.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 77] -> griffon-78.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 78] -> griffon-79.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 79] -> griffon-80.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 80] -> griffon-81.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 81] -> griffon-82.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 82] -> griffon-83.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 83] -> griffon-84.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 84] -> griffon-85.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 85] -> griffon-86.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 86] -> griffon-87.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 87] -> griffon-88.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 88] -> griffon-89.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 89] -> griffon-90.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 90] -> griffon-91.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 91] -> griffon-92.nancy.grid5000.fr
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 ]
+> [1] sndbuf=[92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 ]
+> [2] sndbuf=[184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 ]
+> [3] sndbuf=[276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 ]
+> [4] sndbuf=[368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 ]
+> [5] sndbuf=[460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 ]
+> [6] sndbuf=[552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 ]
+> [7] sndbuf=[644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 ]
+> [8] sndbuf=[736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 ]
+> [9] sndbuf=[828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 ]
+> [10] sndbuf=[920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 ]
+> [11] sndbuf=[1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 ]
+> [12] sndbuf=[1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 ]
+> [13] sndbuf=[1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 ]
+> [14] sndbuf=[1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 ]
+> [15] sndbuf=[1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 ]
+> [16] sndbuf=[1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 ]
+> [17] sndbuf=[1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 ]
+> [18] sndbuf=[1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 ]
+> [19] sndbuf=[1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 ]
+> [20] sndbuf=[1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 ]
+> [21] sndbuf=[1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 ]
+> [22] sndbuf=[2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 ]
+> [23] sndbuf=[2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 ]
+> [24] sndbuf=[2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 ]
+> [25] sndbuf=[2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 ]
+> [26] sndbuf=[2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 ]
+> [27] sndbuf=[2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 ]
+> [28] sndbuf=[2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 ]
+> [29] sndbuf=[2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 ]
+> [30] sndbuf=[2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 ]
+> [31] sndbuf=[2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 ]
+> [32] sndbuf=[2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 ]
+> [33] sndbuf=[3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 ]
+> [34] sndbuf=[3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 ]
+> [35] sndbuf=[3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 ]
+> [36] sndbuf=[3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 ]
+> [37] sndbuf=[3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 ]
+> [38] sndbuf=[3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 ]
+> [39] sndbuf=[3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 ]
+> [40] sndbuf=[3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 ]
+> [41] sndbuf=[3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 ]
+> [42] sndbuf=[3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 ]
+> [43] sndbuf=[3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 ]
+> [44] sndbuf=[4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 ]
+> [45] sndbuf=[4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 ]
+> [46] sndbuf=[4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 ]
+> [47] sndbuf=[4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 ]
+> [48] sndbuf=[4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 ]
+> [49] sndbuf=[4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 ]
+> [50] sndbuf=[4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 ]
+> [51] sndbuf=[4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 ]
+> [52] sndbuf=[4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 ]
+> [53] sndbuf=[4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 ]
+> [54] sndbuf=[4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 ]
+> [55] sndbuf=[5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 ]
+> [56] sndbuf=[5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 ]
+> [57] sndbuf=[5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 ]
+> [58] sndbuf=[5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 ]
+> [59] sndbuf=[5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 ]
+> [60] sndbuf=[5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 ]
+> [61] sndbuf=[5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 ]
+> [62] sndbuf=[5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 ]
+> [63] sndbuf=[5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 ]
+> [64] sndbuf=[5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 ]
+> [65] sndbuf=[5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 ]
+> [66] sndbuf=[6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 ]
+> [67] sndbuf=[6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 ]
+> [68] sndbuf=[6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 ]
+> [69] sndbuf=[6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 ]
+> [70] sndbuf=[6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 ]
+> [71] sndbuf=[6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 ]
+> [72] sndbuf=[6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 ]
+> [73] sndbuf=[6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 ]
+> [74] sndbuf=[6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 ]
+> [75] sndbuf=[6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 ]
+> [76] sndbuf=[6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 ]
+> [77] sndbuf=[7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 ]
+> [78] sndbuf=[7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 ]
+> [79] sndbuf=[7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 ]
+> [80] sndbuf=[7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 ]
+> [81] sndbuf=[7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 ]
+> [82] sndbuf=[7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 ]
+> [83] sndbuf=[7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 ]
+> [84] sndbuf=[7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 ]
+> [85] sndbuf=[7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 ]
+> [86] sndbuf=[7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 ]
+> [87] sndbuf=[8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 ]
+> [88] sndbuf=[8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 ]
+> [89] sndbuf=[8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 ]
+> [90] sndbuf=[8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 ]
+> [91] sndbuf=[8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 ]
+> [19] rcvbuf=[19 111 203 295 387 479 571 663 755 847 939 1031 1123 1215 1307 1399 1491 1583 1675 1767 1859 1951 2043 2135 2227 2319 2411 2503 2595 2687 2779 2871 2963 3055 3147 3239 3331 3423 3515 3607 3699 3791 3883 3975 4067 4159 4251 4343 4435 4527 4619 4711 4803 4895 4987 5079 5171 5263 5355 5447 5539 5631 5723 5815 5907 5999 6091 6183 6275 6367 6459 6551 6643 6735 6827 6919 7011 7103 7195 7287 7379 7471 7563 7655 7747 7839 7931 8023 8115 8207 8299 8391 ]
+> [17] rcvbuf=[17 109 201 293 385 477 569 661 753 845 937 1029 1121 1213 1305 1397 1489 1581 1673 1765 1857 1949 2041 2133 2225 2317 2409 2501 2593 2685 2777 2869 2961 3053 3145 3237 3329 3421 3513 3605 3697 3789 3881 3973 4065 4157 4249 4341 4433 4525 4617 4709 4801 4893 4985 5077 5169 5261 5353 5445 5537 5629 5721 5813 5905 5997 6089 6181 6273 6365 6457 6549 6641 6733 6825 6917 7009 7101 7193 7285 7377 7469 7561 7653 7745 7837 7929 8021 8113 8205 8297 8389 ]
+> [3] rcvbuf=[3 95 187 279 371 463 555 647 739 831 923 1015 1107 1199 1291 1383 1475 1567 1659 1751 1843 1935 2027 2119 2211 2303 2395 2487 2579 2671 2763 2855 2947 3039 3131 3223 3315 3407 3499 3591 3683 3775 3867 3959 4051 4143 4235 4327 4419 4511 4603 4695 4787 4879 4971 5063 5155 5247 5339 5431 5523 5615 5707 5799 5891 5983 6075 6167 6259 6351 6443 6535 6627 6719 6811 6903 6995 7087 7179 7271 7363 7455 7547 7639 7731 7823 7915 8007 8099 8191 8283 8375 ]
+> [1] rcvbuf=[1 93 185 277 369 461 553 645 737 829 921 1013 1105 1197 1289 1381 1473 1565 1657 1749 1841 1933 2025 2117 2209 2301 2393 2485 2577 2669 2761 2853 2945 3037 3129 3221 3313 3405 3497 3589 3681 3773 3865 3957 4049 4141 4233 4325 4417 4509 4601 4693 4785 4877 4969 5061 5153 5245 5337 5429 5521 5613 5705 5797 5889 5981 6073 6165 6257 6349 6441 6533 6625 6717 6809 6901 6993 7085 7177 7269 7361 7453 7545 7637 7729 7821 7913 8005 8097 8189 8281 8373 ]
+> [27] rcvbuf=[27 119 211 303 395 487 579 671 763 855 947 1039 1131 1223 1315 1407 1499 1591 1683 1775 1867 1959 2051 2143 2235 2327 2419 2511 2603 2695 2787 2879 2971 3063 3155 3247 3339 3431 3523 3615 3707 3799 3891 3983 4075 4167 4259 4351 4443 4535 4627 4719 4811 4903 4995 5087 5179 5271 5363 5455 5547 5639 5731 5823 5915 6007 6099 6191 6283 6375 6467 6559 6651 6743 6835 6927 7019 7111 7203 7295 7387 7479 7571 7663 7755 7847 7939 8031 8123 8215 8307 8399 ]
+> [25] rcvbuf=[25 117 209 301 393 485 577 669 761 853 945 1037 1129 1221 1313 1405 1497 1589 1681 1773 1865 1957 2049 2141 2233 2325 2417 2509 2601 2693 2785 2877 2969 3061 3153 3245 3337 3429 3521 3613 3705 3797 3889 3981 4073 4165 4257 4349 4441 4533 4625 4717 4809 4901 4993 5085 5177 5269 5361 5453 5545 5637 5729 5821 5913 6005 6097 6189 6281 6373 6465 6557 6649 6741 6833 6925 7017 7109 7201 7293 7385 7477 7569 7661 7753 7845 7937 8029 8121 8213 8305 8397 ]
+> [26] rcvbuf=[26 118 210 302 394 486 578 670 762 854 946 1038 1130 1222 1314 1406 1498 1590 1682 1774 1866 1958 2050 2142 2234 2326 2418 2510 2602 2694 2786 2878 2970 3062 3154 3246 3338 3430 3522 3614 3706 3798 3890 3982 4074 4166 4258 4350 4442 4534 4626 4718 4810 4902 4994 5086 5178 5270 5362 5454 5546 5638 5730 5822 5914 6006 6098 6190 6282 6374 6466 6558 6650 6742 6834 6926 7018 7110 7202 7294 7386 7478 7570 7662 7754 7846 7938 8030 8122 8214 8306 8398 ]
+> [16] rcvbuf=[16 108 200 292 384 476 568 660 752 844 936 1028 1120 1212 1304 1396 1488 1580 1672 1764 1856 1948 2040 2132 2224 2316 2408 2500 2592 2684 2776 2868 2960 3052 3144 3236 3328 3420 3512 3604 3696 3788 3880 3972 4064 4156 4248 4340 4432 4524 4616 4708 4800 4892 4984 5076 5168 5260 5352 5444 5536 5628 5720 5812 5904 5996 6088 6180 6272 6364 6456 6548 6640 6732 6824 6916 7008 7100 7192 7284 7376 7468 7560 7652 7744 7836 7928 8020 8112 8204 8296 8388 ]
+> [24] rcvbuf=[24 116 208 300 392 484 576 668 760 852 944 1036 1128 1220 1312 1404 1496 1588 1680 1772 1864 1956 2048 2140 2232 2324 2416 2508 2600 2692 2784 2876 2968 3060 3152 3244 3336 3428 3520 3612 3704 3796 3888 3980 4072 4164 4256 4348 4440 4532 4624 4716 4808 4900 4992 5084 5176 5268 5360 5452 5544 5636 5728 5820 5912 6004 6096 6188 6280 6372 6464 6556 6648 6740 6832 6924 7016 7108 7200 7292 7384 7476 7568 7660 7752 7844 7936 8028 8120 8212 8304 8396 ]
+> [0] rcvbuf=[0 92 184 276 368 460 552 644 736 828 920 1012 1104 1196 1288 1380 1472 1564 1656 1748 1840 1932 2024 2116 2208 2300 2392 2484 2576 2668 2760 2852 2944 3036 3128 3220 3312 3404 3496 3588 3680 3772 3864 3956 4048 4140 4232 4324 4416 4508 4600 4692 4784 4876 4968 5060 5152 5244 5336 5428 5520 5612 5704 5796 5888 5980 6072 6164 6256 6348 6440 6532 6624 6716 6808 6900 6992 7084 7176 7268 7360 7452 7544 7636 7728 7820 7912 8004 8096 8188 8280 8372 ]
+> [8] rcvbuf=[8 100 192 284 376 468 560 652 744 836 928 1020 1112 1204 1296 1388 1480 1572 1664 1756 1848 1940 2032 2124 2216 2308 2400 2492 2584 2676 2768 2860 2952 3044 3136 3228 3320 3412 3504 3596 3688 3780 3872 3964 4056 4148 4240 4332 4424 4516 4608 4700 4792 4884 4976 5068 5160 5252 5344 5436 5528 5620 5712 5804 5896 5988 6080 6172 6264 6356 6448 6540 6632 6724 6816 6908 7000 7092 7184 7276 7368 7460 7552 7644 7736 7828 7920 8012 8104 8196 8288 8380 ]
+> [23] rcvbuf=[23 115 207 299 391 483 575 667 759 851 943 1035 1127 1219 1311 1403 1495 1587 1679 1771 1863 1955 2047 2139 2231 2323 2415 2507 2599 2691 2783 2875 2967 3059 3151 3243 3335 3427 3519 3611 3703 3795 3887 3979 4071 4163 4255 4347 4439 4531 4623 4715 4807 4899 4991 5083 5175 5267 5359 5451 5543 5635 5727 5819 5911 6003 6095 6187 6279 6371 6463 6555 6647 6739 6831 6923 7015 7107 7199 7291 7383 7475 7567 7659 7751 7843 7935 8027 8119 8211 8303 8395 ]
+> [21] rcvbuf=[21 113 205 297 389 481 573 665 757 849 941 1033 1125 1217 1309 1401 1493 1585 1677 1769 1861 1953 2045 2137 2229 2321 2413 2505 2597 2689 2781 2873 2965 3057 3149 3241 3333 3425 3517 3609 3701 3793 3885 3977 4069 4161 4253 4345 4437 4529 4621 4713 4805 4897 4989 5081 5173 5265 5357 5449 5541 5633 5725 5817 5909 6001 6093 6185 6277 6369 6461 6553 6645 6737 6829 6921 7013 7105 7197 7289 7381 7473 7565 7657 7749 7841 7933 8025 8117 8209 8301 8393 ]
+> [7] rcvbuf=[7 99 191 283 375 467 559 651 743 835 927 1019 1111 1203 1295 1387 1479 1571 1663 1755 1847 1939 2031 2123 2215 2307 2399 2491 2583 2675 2767 2859 2951 3043 3135 3227 3319 3411 3503 3595 3687 3779 3871 3963 4055 4147 4239 4331 4423 4515 4607 4699 4791 4883 4975 5067 5159 5251 5343 5435 5527 5619 5711 5803 5895 5987 6079 6171 6263 6355 6447 6539 6631 6723 6815 6907 6999 7091 7183 7275 7367 7459 7551 7643 7735 7827 7919 8011 8103 8195 8287 8379 ]
+> [5] rcvbuf=[5 97 189 281 373 465 557 649 741 833 925 1017 1109 1201 1293 1385 1477 1569 1661 1753 1845 1937 2029 2121 2213 2305 2397 2489 2581 2673 2765 2857 2949 3041 3133 3225 3317 3409 3501 3593 3685 3777 3869 3961 4053 4145 4237 4329 4421 4513 4605 4697 4789 4881 4973 5065 5157 5249 5341 5433 5525 5617 5709 5801 5893 5985 6077 6169 6261 6353 6445 6537 6629 6721 6813 6905 6997 7089 7181 7273 7365 7457 7549 7641 7733 7825 7917 8009 8101 8193 8285 8377 ]
+> [18] rcvbuf=[18 110 202 294 386 478 570 662 754 846 938 1030 1122 1214 1306 1398 1490 1582 1674 1766 1858 1950 2042 2134 2226 2318 2410 2502 2594 2686 2778 2870 2962 3054 3146 3238 3330 3422 3514 3606 3698 3790 3882 3974 4066 4158 4250 4342 4434 4526 4618 4710 4802 4894 4986 5078 5170 5262 5354 5446 5538 5630 5722 5814 5906 5998 6090 6182 6274 6366 6458 6550 6642 6734 6826 6918 7010 7102 7194 7286 7378 7470 7562 7654 7746 7838 7930 8022 8114 8206 8298 8390 ]
+> [2] rcvbuf=[2 94 186 278 370 462 554 646 738 830 922 1014 1106 1198 1290 1382 1474 1566 1658 1750 1842 1934 2026 2118 2210 2302 2394 2486 2578 2670 2762 2854 2946 3038 3130 3222 3314 3406 3498 3590 3682 3774 3866 3958 4050 4142 4234 4326 4418 4510 4602 4694 4786 4878 4970 5062 5154 5246 5338 5430 5522 5614 5706 5798 5890 5982 6074 6166 6258 6350 6442 6534 6626 6718 6810 6902 6994 7086 7178 7270 7362 7454 7546 7638 7730 7822 7914 8006 8098 8190 8282 8374 ]
+> [11] rcvbuf=[11 103 195 287 379 471 563 655 747 839 931 1023 1115 1207 1299 1391 1483 1575 1667 1759 1851 1943 2035 2127 2219 2311 2403 2495 2587 2679 2771 2863 2955 3047 3139 3231 3323 3415 3507 3599 3691 3783 3875 3967 4059 4151 4243 4335 4427 4519 4611 4703 4795 4887 4979 5071 5163 5255 5347 5439 5531 5623 5715 5807 5899 5991 6083 6175 6267 6359 6451 6543 6635 6727 6819 6911 7003 7095 7187 7279 7371 7463 7555 7647 7739 7831 7923 8015 8107 8199 8291 8383 ]
+> [9] rcvbuf=[9 101 193 285 377 469 561 653 745 837 929 1021 1113 1205 1297 1389 1481 1573 1665 1757 1849 1941 2033 2125 2217 2309 2401 2493 2585 2677 2769 2861 2953 3045 3137 3229 3321 3413 3505 3597 3689 3781 3873 3965 4057 4149 4241 4333 4425 4517 4609 4701 4793 4885 4977 5069 5161 5253 5345 5437 5529 5621 5713 5805 5897 5989 6081 6173 6265 6357 6449 6541 6633 6725 6817 6909 7001 7093 7185 7277 7369 7461 7553 7645 7737 7829 7921 8013 8105 8197 8289 8381 ]
+> [15] rcvbuf=[15 107 199 291 383 475 567 659 751 843 935 1027 1119 1211 1303 1395 1487 1579 1671 1763 1855 1947 2039 2131 2223 2315 2407 2499 2591 2683 2775 2867 2959 3051 3143 3235 3327 3419 3511 3603 3695 3787 3879 3971 4063 4155 4247 4339 4431 4523 4615 4707 4799 4891 4983 5075 5167 5259 5351 5443 5535 5627 5719 5811 5903 5995 6087 6179 6271 6363 6455 6547 6639 6731 6823 6915 7007 7099 7191 7283 7375 7467 7559 7651 7743 7835 7927 8019 8111 8203 8295 8387 ]
+> [13] rcvbuf=[13 105 197 289 381 473 565 657 749 841 933 1025 1117 1209 1301 1393 1485 1577 1669 1761 1853 1945 2037 2129 2221 2313 2405 2497 2589 2681 2773 2865 2957 3049 3141 3233 3325 3417 3509 3601 3693 3785 3877 3969 4061 4153 4245 4337 4429 4521 4613 4705 4797 4889 4981 5073 5165 5257 5349 5441 5533 5625 5717 5809 5901 5993 6085 6177 6269 6361 6453 6545 6637 6729 6821 6913 7005 7097 7189 7281 7373 7465 7557 7649 7741 7833 7925 8017 8109 8201 8293 8385 ]
+> [22] rcvbuf=[22 114 206 298 390 482 574 666 758 850 942 1034 1126 1218 1310 1402 1494 1586 1678 1770 1862 1954 2046 2138 2230 2322 2414 2506 2598 2690 2782 2874 2966 3058 3150 3242 3334 3426 3518 3610 3702 3794 3886 3978 4070 4162 4254 4346 4438 4530 4622 4714 4806 4898 4990 5082 5174 5266 5358 5450 5542 5634 5726 5818 5910 6002 6094 6186 6278 6370 6462 6554 6646 6738 6830 6922 7014 7106 7198 7290 7382 7474 7566 7658 7750 7842 7934 8026 8118 8210 8302 8394 ]
+> [20] rcvbuf=[20 112 204 296 388 480 572 664 756 848 940 1032 1124 1216 1308 1400 1492 1584 1676 1768 1860 1952 2044 2136 2228 2320 2412 2504 2596 2688 2780 2872 2964 3056 3148 3240 3332 3424 3516 3608 3700 3792 3884 3976 4068 4160 4252 4344 4436 4528 4620 4712 4804 4896 4988 5080 5172 5264 5356 5448 5540 5632 5724 5816 5908 6000 6092 6184 6276 6368 6460 6552 6644 6736 6828 6920 7012 7104 7196 7288 7380 7472 7564 7656 7748 7840 7932 8024 8116 8208 8300 8392 ]
+> [6] rcvbuf=[6 98 190 282 374 466 558 650 742 834 926 1018 1110 1202 1294 1386 1478 1570 1662 1754 1846 1938 2030 2122 2214 2306 2398 2490 2582 2674 2766 2858 2950 3042 3134 3226 3318 3410 3502 3594 3686 3778 3870 3962 4054 4146 4238 4330 4422 4514 4606 4698 4790 4882 4974 5066 5158 5250 5342 5434 5526 5618 5710 5802 5894 5986 6078 6170 6262 6354 6446 6538 6630 6722 6814 6906 6998 7090 7182 7274 7366 7458 7550 7642 7734 7826 7918 8010 8102 8194 8286 8378 ]
+> [4] rcvbuf=[4 96 188 280 372 464 556 648 740 832 924 1016 1108 1200 1292 1384 1476 1568 1660 1752 1844 1936 2028 2120 2212 2304 2396 2488 2580 2672 2764 2856 2948 3040 3132 3224 3316 3408 3500 3592 3684 3776 3868 3960 4052 4144 4236 4328 4420 4512 4604 4696 4788 4880 4972 5064 5156 5248 5340 5432 5524 5616 5708 5800 5892 5984 6076 6168 6260 6352 6444 6536 6628 6720 6812 6904 6996 7088 7180 7272 7364 7456 7548 7640 7732 7824 7916 8008 8100 8192 8284 8376 ]
+> [10] rcvbuf=[10 102 194 286 378 470 562 654 746 838 930 1022 1114 1206 1298 1390 1482 1574 1666 1758 1850 1942 2034 2126 2218 2310 2402 2494 2586 2678 2770 2862 2954 3046 3138 3230 3322 3414 3506 3598 3690 3782 3874 3966 4058 4150 4242 4334 4426 4518 4610 4702 4794 4886 4978 5070 5162 5254 5346 5438 5530 5622 5714 5806 5898 5990 6082 6174 6266 6358 6450 6542 6634 6726 6818 6910 7002 7094 7186 7278 7370 7462 7554 7646 7738 7830 7922 8014 8106 8198 8290 8382 ]
+> [14] rcvbuf=[14 106 198 290 382 474 566 658 750 842 934 1026 1118 1210 1302 1394 1486 1578 1670 1762 1854 1946 2038 2130 2222 2314 2406 2498 2590 2682 2774 2866 2958 3050 3142 3234 3326 3418 3510 3602 3694 3786 3878 3970 4062 4154 4246 4338 4430 4522 4614 4706 4798 4890 4982 5074 5166 5258 5350 5442 5534 5626 5718 5810 5902 5994 6086 6178 6270 6362 6454 6546 6638 6730 6822 6914 7006 7098 7190 7282 7374 7466 7558 7650 7742 7834 7926 8018 8110 8202 8294 8386 ]
+> [12] rcvbuf=[12 104 196 288 380 472 564 656 748 840 932 1024 1116 1208 1300 1392 1484 1576 1668 1760 1852 1944 2036 2128 2220 2312 2404 2496 2588 2680 2772 2864 2956 3048 3140 3232 3324 3416 3508 3600 3692 3784 3876 3968 4060 4152 4244 4336 4428 4520 4612 4704 4796 4888 4980 5072 5164 5256 5348 5440 5532 5624 5716 5808 5900 5992 6084 6176 6268 6360 6452 6544 6636 6728 6820 6912 7004 7096 7188 7280 7372 7464 7556 7648 7740 7832 7924 8016 8108 8200 8292 8384 ]
+> [83] rcvbuf=[83 175 267 359 451 543 635 727 819 911 1003 1095 1187 1279 1371 1463 1555 1647 1739 1831 1923 2015 2107 2199 2291 2383 2475 2567 2659 2751 2843 2935 3027 3119 3211 3303 3395 3487 3579 3671 3763 3855 3947 4039 4131 4223 4315 4407 4499 4591 4683 4775 4867 4959 5051 5143 5235 5327 5419 5511 5603 5695 5787 5879 5971 6063 6155 6247 6339 6431 6523 6615 6707 6799 6891 6983 7075 7167 7259 7351 7443 7535 7627 7719 7811 7903 7995 8087 8179 8271 8363 8455 ]
+> [81] rcvbuf=[81 173 265 357 449 541 633 725 817 909 1001 1093 1185 1277 1369 1461 1553 1645 1737 1829 1921 2013 2105 2197 2289 2381 2473 2565 2657 2749 2841 2933 3025 3117 3209 3301 3393 3485 3577 3669 3761 3853 3945 4037 4129 4221 4313 4405 4497 4589 4681 4773 4865 4957 5049 5141 5233 5325 5417 5509 5601 5693 5785 5877 5969 6061 6153 6245 6337 6429 6521 6613 6705 6797 6889 6981 7073 7165 7257 7349 7441 7533 7625 7717 7809 7901 7993 8085 8177 8269 8361 8453 ]
+> [67] rcvbuf=[67 159 251 343 435 527 619 711 803 895 987 1079 1171 1263 1355 1447 1539 1631 1723 1815 1907 1999 2091 2183 2275 2367 2459 2551 2643 2735 2827 2919 3011 3103 3195 3287 3379 3471 3563 3655 3747 3839 3931 4023 4115 4207 4299 4391 4483 4575 4667 4759 4851 4943 5035 5127 5219 5311 5403 5495 5587 5679 5771 5863 5955 6047 6139 6231 6323 6415 6507 6599 6691 6783 6875 6967 7059 7151 7243 7335 7427 7519 7611 7703 7795 7887 7979 8071 8163 8255 8347 8439 ]
+> [65] rcvbuf=[65 157 249 341 433 525 617 709 801 893 985 1077 1169 1261 1353 1445 1537 1629 1721 1813 1905 1997 2089 2181 2273 2365 2457 2549 2641 2733 2825 2917 3009 3101 3193 3285 3377 3469 3561 3653 3745 3837 3929 4021 4113 4205 4297 4389 4481 4573 4665 4757 4849 4941 5033 5125 5217 5309 5401 5493 5585 5677 5769 5861 5953 6045 6137 6229 6321 6413 6505 6597 6689 6781 6873 6965 7057 7149 7241 7333 7425 7517 7609 7701 7793 7885 7977 8069 8161 8253 8345 8437 ]
+> [57] rcvbuf=[57 149 241 333 425 517 609 701 793 885 977 1069 1161 1253 1345 1437 1529 1621 1713 1805 1897 1989 2081 2173 2265 2357 2449 2541 2633 2725 2817 2909 3001 3093 3185 3277 3369 3461 3553 3645 3737 3829 3921 4013 4105 4197 4289 4381 4473 4565 4657 4749 4841 4933 5025 5117 5209 5301 5393 5485 5577 5669 5761 5853 5945 6037 6129 6221 6313 6405 6497 6589 6681 6773 6865 6957 7049 7141 7233 7325 7417 7509 7601 7693 7785 7877 7969 8061 8153 8245 8337 8429 ]
+> [59] rcvbuf=[59 151 243 335 427 519 611 703 795 887 979 1071 1163 1255 1347 1439 1531 1623 1715 1807 1899 1991 2083 2175 2267 2359 2451 2543 2635 2727 2819 2911 3003 3095 3187 3279 3371 3463 3555 3647 3739 3831 3923 4015 4107 4199 4291 4383 4475 4567 4659 4751 4843 4935 5027 5119 5211 5303 5395 5487 5579 5671 5763 5855 5947 6039 6131 6223 6315 6407 6499 6591 6683 6775 6867 6959 7051 7143 7235 7327 7419 7511 7603 7695 7787 7879 7971 8063 8155 8247 8339 8431 ]
+> [33] rcvbuf=[33 125 217 309 401 493 585 677 769 861 953 1045 1137 1229 1321 1413 1505 1597 1689 1781 1873 1965 2057 2149 2241 2333 2425 2517 2609 2701 2793 2885 2977 3069 3161 3253 3345 3437 3529 3621 3713 3805 3897 3989 4081 4173 4265 4357 4449 4541 4633 4725 4817 4909 5001 5093 5185 5277 5369 5461 5553 5645 5737 5829 5921 6013 6105 6197 6289 6381 6473 6565 6657 6749 6841 6933 7025 7117 7209 7301 7393 7485 7577 7669 7761 7853 7945 8037 8129 8221 8313 8405 ]
+> [35] rcvbuf=[35 127 219 311 403 495 587 679 771 863 955 1047 1139 1231 1323 1415 1507 1599 1691 1783 1875 1967 2059 2151 2243 2335 2427 2519 2611 2703 2795 2887 2979 3071 3163 3255 3347 3439 3531 3623 3715 3807 3899 3991 4083 4175 4267 4359 4451 4543 4635 4727 4819 4911 5003 5095 5187 5279 5371 5463 5555 5647 5739 5831 5923 6015 6107 6199 6291 6383 6475 6567 6659 6751 6843 6935 7027 7119 7211 7303 7395 7487 7579 7671 7763 7855 7947 8039 8131 8223 8315 8407 ]
+> [49] rcvbuf=[49 141 233 325 417 509 601 693 785 877 969 1061 1153 1245 1337 1429 1521 1613 1705 1797 1889 1981 2073 2165 2257 2349 2441 2533 2625 2717 2809 2901 2993 3085 3177 3269 3361 3453 3545 3637 3729 3821 3913 4005 4097 4189 4281 4373 4465 4557 4649 4741 4833 4925 5017 5109 5201 5293 5385 5477 5569 5661 5753 5845 5937 6029 6121 6213 6305 6397 6489 6581 6673 6765 6857 6949 7041 7133 7225 7317 7409 7501 7593 7685 7777 7869 7961 8053 8145 8237 8329 8421 ]
+> [51] rcvbuf=[51 143 235 327 419 511 603 695 787 879 971 1063 1155 1247 1339 1431 1523 1615 1707 1799 1891 1983 2075 2167 2259 2351 2443 2535 2627 2719 2811 2903 2995 3087 3179 3271 3363 3455 3547 3639 3731 3823 3915 4007 4099 4191 4283 4375 4467 4559 4651 4743 4835 4927 5019 5111 5203 5295 5387 5479 5571 5663 5755 5847 5939 6031 6123 6215 6307 6399 6491 6583 6675 6767 6859 6951 7043 7135 7227 7319 7411 7503 7595 7687 7779 7871 7963 8055 8147 8239 8331 8423 ]
+> [58] rcvbuf=[58 150 242 334 426 518 610 702 794 886 978 1070 1162 1254 1346 1438 1530 1622 1714 1806 1898 1990 2082 2174 2266 2358 2450 2542 2634 2726 2818 2910 3002 3094 3186 3278 3370 3462 3554 3646 3738 3830 3922 4014 4106 4198 4290 4382 4474 4566 4658 4750 4842 4934 5026 5118 5210 5302 5394 5486 5578 5670 5762 5854 5946 6038 6130 6222 6314 6406 6498 6590 6682 6774 6866 6958 7050 7142 7234 7326 7418 7510 7602 7694 7786 7878 7970 8062 8154 8246 8338 8430 ]
+> [91] rcvbuf=[91 183 275 367 459 551 643 735 827 919 1011 1103 1195 1287 1379 1471 1563 1655 1747 1839 1931 2023 2115 2207 2299 2391 2483 2575 2667 2759 2851 2943 3035 3127 3219 3311 3403 3495 3587 3679 3771 3863 3955 4047 4139 4231 4323 4415 4507 4599 4691 4783 4875 4967 5059 5151 5243 5335 5427 5519 5611 5703 5795 5887 5979 6071 6163 6255 6347 6439 6531 6623 6715 6807 6899 6991 7083 7175 7267 7359 7451 7543 7635 7727 7819 7911 8003 8095 8187 8279 8371 8463 ]
+> [89] rcvbuf=[89 181 273 365 457 549 641 733 825 917 1009 1101 1193 1285 1377 1469 1561 1653 1745 1837 1929 2021 2113 2205 2297 2389 2481 2573 2665 2757 2849 2941 3033 3125 3217 3309 3401 3493 3585 3677 3769 3861 3953 4045 4137 4229 4321 4413 4505 4597 4689 4781 4873 4965 5057 5149 5241 5333 5425 5517 5609 5701 5793 5885 5977 6069 6161 6253 6345 6437 6529 6621 6713 6805 6897 6989 7081 7173 7265 7357 7449 7541 7633 7725 7817 7909 8001 8093 8185 8277 8369 8461 ]
+> [40] rcvbuf=[40 132 224 316 408 500 592 684 776 868 960 1052 1144 1236 1328 1420 1512 1604 1696 1788 1880 1972 2064 2156 2248 2340 2432 2524 2616 2708 2800 2892 2984 3076 3168 3260 3352 3444 3536 3628 3720 3812 3904 3996 4088 4180 4272 4364 4456 4548 4640 4732 4824 4916 5008 5100 5192 5284 5376 5468 5560 5652 5744 5836 5928 6020 6112 6204 6296 6388 6480 6572 6664 6756 6848 6940 7032 7124 7216 7308 7400 7492 7584 7676 7768 7860 7952 8044 8136 8228 8320 8412 ]
+> [32] rcvbuf=[32 124 216 308 400 492 584 676 768 860 952 1044 1136 1228 1320 1412 1504 1596 1688 1780 1872 1964 2056 2148 2240 2332 2424 2516 2608 2700 2792 2884 2976 3068 3160 3252 3344 3436 3528 3620 3712 3804 3896 3988 4080 4172 4264 4356 4448 4540 4632 4724 4816 4908 5000 5092 5184 5276 5368 5460 5552 5644 5736 5828 5920 6012 6104 6196 6288 6380 6472 6564 6656 6748 6840 6932 7024 7116 7208 7300 7392 7484 7576 7668 7760 7852 7944 8036 8128 8220 8312 8404 ]
+> [56] rcvbuf=[56 148 240 332 424 516 608 700 792 884 976 1068 1160 1252 1344 1436 1528 1620 1712 1804 1896 1988 2080 2172 2264 2356 2448 2540 2632 2724 2816 2908 3000 3092 3184 3276 3368 3460 3552 3644 3736 3828 3920 4012 4104 4196 4288 4380 4472 4564 4656 4748 4840 4932 5024 5116 5208 5300 5392 5484 5576 5668 5760 5852 5944 6036 6128 6220 6312 6404 6496 6588 6680 6772 6864 6956 7048 7140 7232 7324 7416 7508 7600 7692 7784 7876 7968 8060 8152 8244 8336 8428 ]
+> [48] rcvbuf=[48 140 232 324 416 508 600 692 784 876 968 1060 1152 1244 1336 1428 1520 1612 1704 1796 1888 1980 2072 2164 2256 2348 2440 2532 2624 2716 2808 2900 2992 3084 3176 3268 3360 3452 3544 3636 3728 3820 3912 4004 4096 4188 4280 4372 4464 4556 4648 4740 4832 4924 5016 5108 5200 5292 5384 5476 5568 5660 5752 5844 5936 6028 6120 6212 6304 6396 6488 6580 6672 6764 6856 6948 7040 7132 7224 7316 7408 7500 7592 7684 7776 7868 7960 8052 8144 8236 8328 8420 ]
+> [90] rcvbuf=[90 182 274 366 458 550 642 734 826 918 1010 1102 1194 1286 1378 1470 1562 1654 1746 1838 1930 2022 2114 2206 2298 2390 2482 2574 2666 2758 2850 2942 3034 3126 3218 3310 3402 3494 3586 3678 3770 3862 3954 4046 4138 4230 4322 4414 4506 4598 4690 4782 4874 4966 5058 5150 5242 5334 5426 5518 5610 5702 5794 5886 5978 6070 6162 6254 6346 6438 6530 6622 6714 6806 6898 6990 7082 7174 7266 7358 7450 7542 7634 7726 7818 7910 8002 8094 8186 8278 8370 8462 ]
+> [37] rcvbuf=[37 129 221 313 405 497 589 681 773 865 957 1049 1141 1233 1325 1417 1509 1601 1693 1785 1877 1969 2061 2153 2245 2337 2429 2521 2613 2705 2797 2889 2981 3073 3165 3257 3349 3441 3533 3625 3717 3809 3901 3993 4085 4177 4269 4361 4453 4545 4637 4729 4821 4913 5005 5097 5189 5281 5373 5465 5557 5649 5741 5833 5925 6017 6109 6201 6293 6385 6477 6569 6661 6753 6845 6937 7029 7121 7213 7305 7397 7489 7581 7673 7765 7857 7949 8041 8133 8225 8317 8409 ]
+> [39] rcvbuf=[39 131 223 315 407 499 591 683 775 867 959 1051 1143 1235 1327 1419 1511 1603 1695 1787 1879 1971 2063 2155 2247 2339 2431 2523 2615 2707 2799 2891 2983 3075 3167 3259 3351 3443 3535 3627 3719 3811 3903 3995 4087 4179 4271 4363 4455 4547 4639 4731 4823 4915 5007 5099 5191 5283 5375 5467 5559 5651 5743 5835 5927 6019 6111 6203 6295 6387 6479 6571 6663 6755 6847 6939 7031 7123 7215 7307 7399 7491 7583 7675 7767 7859 7951 8043 8135 8227 8319 8411 ]
+> [53] rcvbuf=[53 145 237 329 421 513 605 697 789 881 973 1065 1157 1249 1341 1433 1525 1617 1709 1801 1893 1985 2077 2169 2261 2353 2445 2537 2629 2721 2813 2905 2997 3089 3181 3273 3365 3457 3549 3641 3733 3825 3917 4009 4101 4193 4285 4377 4469 4561 4653 4745 4837 4929 5021 5113 5205 5297 5389 5481 5573 5665 5757 5849 5941 6033 6125 6217 6309 6401 6493 6585 6677 6769 6861 6953 7045 7137 7229 7321 7413 7505 7597 7689 7781 7873 7965 8057 8149 8241 8333 8425 ]
+> [55] rcvbuf=[55 147 239 331 423 515 607 699 791 883 975 1067 1159 1251 1343 1435 1527 1619 1711 1803 1895 1987 2079 2171 2263 2355 2447 2539 2631 2723 2815 2907 2999 3091 3183 3275 3367 3459 3551 3643 3735 3827 3919 4011 4103 4195 4287 4379 4471 4563 4655 4747 4839 4931 5023 5115 5207 5299 5391 5483 5575 5667 5759 5851 5943 6035 6127 6219 6311 6403 6495 6587 6679 6771 6863 6955 7047 7139 7231 7323 7415 7507 7599 7691 7783 7875 7967 8059 8151 8243 8335 8427 ]
+> [80] rcvbuf=[80 172 264 356 448 540 632 724 816 908 1000 1092 1184 1276 1368 1460 1552 1644 1736 1828 1920 2012 2104 2196 2288 2380 2472 2564 2656 2748 2840 2932 3024 3116 3208 3300 3392 3484 3576 3668 3760 3852 3944 4036 4128 4220 4312 4404 4496 4588 4680 4772 4864 4956 5048 5140 5232 5324 5416 5508 5600 5692 5784 5876 5968 6060 6152 6244 6336 6428 6520 6612 6704 6796 6888 6980 7072 7164 7256 7348 7440 7532 7624 7716 7808 7900 7992 8084 8176 8268 8360 8452 ]
+> [88] rcvbuf=[88 180 272 364 456 548 640 732 824 916 1008 1100 1192 1284 1376 1468 1560 1652 1744 1836 1928 2020 2112 2204 2296 2388 2480 2572 2664 2756 2848 2940 3032 3124 3216 3308 3400 3492 3584 3676 3768 3860 3952 4044 4136 4228 4320 4412 4504 4596 4688 4780 4872 4964 5056 5148 5240 5332 5424 5516 5608 5700 5792 5884 5976 6068 6160 6252 6344 6436 6528 6620 6712 6804 6896 6988 7080 7172 7264 7356 7448 7540 7632 7724 7816 7908 8000 8092 8184 8276 8368 8460 ]
+> [64] rcvbuf=[64 156 248 340 432 524 616 708 800 892 984 1076 1168 1260 1352 1444 1536 1628 1720 1812 1904 1996 2088 2180 2272 2364 2456 2548 2640 2732 2824 2916 3008 3100 3192 3284 3376 3468 3560 3652 3744 3836 3928 4020 4112 4204 4296 4388 4480 4572 4664 4756 4848 4940 5032 5124 5216 5308 5400 5492 5584 5676 5768 5860 5952 6044 6136 6228 6320 6412 6504 6596 6688 6780 6872 6964 7056 7148 7240 7332 7424 7516 7608 7700 7792 7884 7976 8068 8160 8252 8344 8436 ]
+> [72] rcvbuf=[72 164 256 348 440 532 624 716 808 900 992 1084 1176 1268 1360 1452 1544 1636 1728 1820 1912 2004 2096 2188 2280 2372 2464 2556 2648 2740 2832 2924 3016 3108 3200 3292 3384 3476 3568 3660 3752 3844 3936 4028 4120 4212 4304 4396 4488 4580 4672 4764 4856 4948 5040 5132 5224 5316 5408 5500 5592 5684 5776 5868 5960 6052 6144 6236 6328 6420 6512 6604 6696 6788 6880 6972 7064 7156 7248 7340 7432 7524 7616 7708 7800 7892 7984 8076 8168 8260 8352 8444 ]
+> [28] rcvbuf=[28 120 212 304 396 488 580 672 764 856 948 1040 1132 1224 1316 1408 1500 1592 1684 1776 1868 1960 2052 2144 2236 2328 2420 2512 2604 2696 2788 2880 2972 3064 3156 3248 3340 3432 3524 3616 3708 3800 3892 3984 4076 4168 4260 4352 4444 4536 4628 4720 4812 4904 4996 5088 5180 5272 5364 5456 5548 5640 5732 5824 5916 6008 6100 6192 6284 6376 6468 6560 6652 6744 6836 6928 7020 7112 7204 7296 7388 7480 7572 7664 7756 7848 7940 8032 8124 8216 8308 8400 ]
+> [87] rcvbuf=[87 179 271 363 455 547 639 731 823 915 1007 1099 1191 1283 1375 1467 1559 1651 1743 1835 1927 2019 2111 2203 2295 2387 2479 2571 2663 2755 2847 2939 3031 3123 3215 3307 3399 3491 3583 3675 3767 3859 3951 4043 4135 4227 4319 4411 4503 4595 4687 4779 4871 4963 5055 5147 5239 5331 5423 5515 5607 5699 5791 5883 5975 6067 6159 6251 6343 6435 6527 6619 6711 6803 6895 6987 7079 7171 7263 7355 7447 7539 7631 7723 7815 7907 7999 8091 8183 8275 8367 8459 ]
+> [85] rcvbuf=[85 177 269 361 453 545 637 729 821 913 1005 1097 1189 1281 1373 1465 1557 1649 1741 1833 1925 2017 2109 2201 2293 2385 2477 2569 2661 2753 2845 2937 3029 3121 3213 3305 3397 3489 3581 3673 3765 3857 3949 4041 4133 4225 4317 4409 4501 4593 4685 4777 4869 4961 5053 5145 5237 5329 5421 5513 5605 5697 5789 5881 5973 6065 6157 6249 6341 6433 6525 6617 6709 6801 6893 6985 7077 7169 7261 7353 7445 7537 7629 7721 7813 7905 7997 8089 8181 8273 8365 8457 ]
+> [71] rcvbuf=[71 163 255 347 439 531 623 715 807 899 991 1083 1175 1267 1359 1451 1543 1635 1727 1819 1911 2003 2095 2187 2279 2371 2463 2555 2647 2739 2831 2923 3015 3107 3199 3291 3383 3475 3567 3659 3751 3843 3935 4027 4119 4211 4303 4395 4487 4579 4671 4763 4855 4947 5039 5131 5223 5315 5407 5499 5591 5683 5775 5867 5959 6051 6143 6235 6327 6419 6511 6603 6695 6787 6879 6971 7063 7155 7247 7339 7431 7523 7615 7707 7799 7891 7983 8075 8167 8259 8351 8443 ]
+> [69] rcvbuf=[69 161 253 345 437 529 621 713 805 897 989 1081 1173 1265 1357 1449 1541 1633 1725 1817 1909 2001 2093 2185 2277 2369 2461 2553 2645 2737 2829 2921 3013 3105 3197 3289 3381 3473 3565 3657 3749 3841 3933 4025 4117 4209 4301 4393 4485 4577 4669 4761 4853 4945 5037 5129 5221 5313 5405 5497 5589 5681 5773 5865 5957 6049 6141 6233 6325 6417 6509 6601 6693 6785 6877 6969 7061 7153 7245 7337 7429 7521 7613 7705 7797 7889 7981 8073 8165 8257 8349 8441 ]
+> [82] rcvbuf=[82 174 266 358 450 542 634 726 818 910 1002 1094 1186 1278 1370 1462 1554 1646 1738 1830 1922 2014 2106 2198 2290 2382 2474 2566 2658 2750 2842 2934 3026 3118 3210 3302 3394 3486 3578 3670 3762 3854 3946 4038 4130 4222 4314 4406 4498 4590 4682 4774 4866 4958 5050 5142 5234 5326 5418 5510 5602 5694 5786 5878 5970 6062 6154 6246 6338 6430 6522 6614 6706 6798 6890 6982 7074 7166 7258 7350 7442 7534 7626 7718 7810 7902 7994 8086 8178 8270 8362 8454 ]
+> [66] rcvbuf=[66 158 250 342 434 526 618 710 802 894 986 1078 1170 1262 1354 1446 1538 1630 1722 1814 1906 1998 2090 2182 2274 2366 2458 2550 2642 2734 2826 2918 3010 3102 3194 3286 3378 3470 3562 3654 3746 3838 3930 4022 4114 4206 4298 4390 4482 4574 4666 4758 4850 4942 5034 5126 5218 5310 5402 5494 5586 5678 5770 5862 5954 6046 6138 6230 6322 6414 6506 6598 6690 6782 6874 6966 7058 7150 7242 7334 7426 7518 7610 7702 7794 7886 7978 8070 8162 8254 8346 8438 ]
+> [75] rcvbuf=[75 167 259 351 443 535 627 719 811 903 995 1087 1179 1271 1363 1455 1547 1639 1731 1823 1915 2007 2099 2191 2283 2375 2467 2559 2651 2743 2835 2927 3019 3111 3203 3295 3387 3479 3571 3663 3755 3847 3939 4031 4123 4215 4307 4399 4491 4583 4675 4767 4859 4951 5043 5135 5227 5319 5411 5503 5595 5687 5779 5871 5963 6055 6147 6239 6331 6423 6515 6607 6699 6791 6883 6975 7067 7159 7251 7343 7435 7527 7619 7711 7803 7895 7987 8079 8171 8263 8355 8447 ]
+> [73] rcvbuf=[73 165 257 349 441 533 625 717 809 901 993 1085 1177 1269 1361 1453 1545 1637 1729 1821 1913 2005 2097 2189 2281 2373 2465 2557 2649 2741 2833 2925 3017 3109 3201 3293 3385 3477 3569 3661 3753 3845 3937 4029 4121 4213 4305 4397 4489 4581 4673 4765 4857 4949 5041 5133 5225 5317 5409 5501 5593 5685 5777 5869 5961 6053 6145 6237 6329 6421 6513 6605 6697 6789 6881 6973 7065 7157 7249 7341 7433 7525 7617 7709 7801 7893 7985 8077 8169 8261 8353 8445 ]
+> [79] rcvbuf=[79 171 263 355 447 539 631 723 815 907 999 1091 1183 1275 1367 1459 1551 1643 1735 1827 1919 2011 2103 2195 2287 2379 2471 2563 2655 2747 2839 2931 3023 3115 3207 3299 3391 3483 3575 3667 3759 3851 3943 4035 4127 4219 4311 4403 4495 4587 4679 4771 4863 4955 5047 5139 5231 5323 5415 5507 5599 5691 5783 5875 5967 6059 6151 6243 6335 6427 6519 6611 6703 6795 6887 6979 7071 7163 7255 7347 7439 7531 7623 7715 7807 7899 7991 8083 8175 8267 8359 8451 ]
+> [77] rcvbuf=[77 169 261 353 445 537 629 721 813 905 997 1089 1181 1273 1365 1457 1549 1641 1733 1825 1917 2009 2101 2193 2285 2377 2469 2561 2653 2745 2837 2929 3021 3113 3205 3297 3389 3481 3573 3665 3757 3849 3941 4033 4125 4217 4309 4401 4493 4585 4677 4769 4861 4953 5045 5137 5229 5321 5413 5505 5597 5689 5781 5873 5965 6057 6149 6241 6333 6425 6517 6609 6701 6793 6885 6977 7069 7161 7253 7345 7437 7529 7621 7713 7805 7897 7989 8081 8173 8265 8357 8449 ]
+> [86] rcvbuf=[86 178 270 362 454 546 638 730 822 914 1006 1098 1190 1282 1374 1466 1558 1650 1742 1834 1926 2018 2110 2202 2294 2386 2478 2570 2662 2754 2846 2938 3030 3122 3214 3306 3398 3490 3582 3674 3766 3858 3950 4042 4134 4226 4318 4410 4502 4594 4686 4778 4870 4962 5054 5146 5238 5330 5422 5514 5606 5698 5790 5882 5974 6066 6158 6250 6342 6434 6526 6618 6710 6802 6894 6986 7078 7170 7262 7354 7446 7538 7630 7722 7814 7906 7998 8090 8182 8274 8366 8458 ]
+> [84] rcvbuf=[84 176 268 360 452 544 636 728 820 912 1004 1096 1188 1280 1372 1464 1556 1648 1740 1832 1924 2016 2108 2200 2292 2384 2476 2568 2660 2752 2844 2936 3028 3120 3212 3304 3396 3488 3580 3672 3764 3856 3948 4040 4132 4224 4316 4408 4500 4592 4684 4776 4868 4960 5052 5144 5236 5328 5420 5512 5604 5696 5788 5880 5972 6064 6156 6248 6340 6432 6524 6616 6708 6800 6892 6984 7076 7168 7260 7352 7444 7536 7628 7720 7812 7904 7996 8088 8180 8272 8364 8456 ]
+> [70] rcvbuf=[70 162 254 346 438 530 622 714 806 898 990 1082 1174 1266 1358 1450 1542 1634 1726 1818 1910 2002 2094 2186 2278 2370 2462 2554 2646 2738 2830 2922 3014 3106 3198 3290 3382 3474 3566 3658 3750 3842 3934 4026 4118 4210 4302 4394 4486 4578 4670 4762 4854 4946 5038 5130 5222 5314 5406 5498 5590 5682 5774 5866 5958 6050 6142 6234 6326 6418 6510 6602 6694 6786 6878 6970 7062 7154 7246 7338 7430 7522 7614 7706 7798 7890 7982 8074 8166 8258 8350 8442 ]
+> [68] rcvbuf=[68 160 252 344 436 528 620 712 804 896 988 1080 1172 1264 1356 1448 1540 1632 1724 1816 1908 2000 2092 2184 2276 2368 2460 2552 2644 2736 2828 2920 3012 3104 3196 3288 3380 3472 3564 3656 3748 3840 3932 4024 4116 4208 4300 4392 4484 4576 4668 4760 4852 4944 5036 5128 5220 5312 5404 5496 5588 5680 5772 5864 5956 6048 6140 6232 6324 6416 6508 6600 6692 6784 6876 6968 7060 7152 7244 7336 7428 7520 7612 7704 7796 7888 7980 8072 8164 8256 8348 8440 ]
+> [34] rcvbuf=[34 126 218 310 402 494 586 678 770 862 954 1046 1138 1230 1322 1414 1506 1598 1690 1782 1874 1966 2058 2150 2242 2334 2426 2518 2610 2702 2794 2886 2978 3070 3162 3254 3346 3438 3530 3622 3714 3806 3898 3990 4082 4174 4266 4358 4450 4542 4634 4726 4818 4910 5002 5094 5186 5278 5370 5462 5554 5646 5738 5830 5922 6014 6106 6198 6290 6382 6474 6566 6658 6750 6842 6934 7026 7118 7210 7302 7394 7486 7578 7670 7762 7854 7946 8038 8130 8222 8314 8406 ]
+> [50] rcvbuf=[50 142 234 326 418 510 602 694 786 878 970 1062 1154 1246 1338 1430 1522 1614 1706 1798 1890 1982 2074 2166 2258 2350 2442 2534 2626 2718 2810 2902 2994 3086 3178 3270 3362 3454 3546 3638 3730 3822 3914 4006 4098 4190 4282 4374 4466 4558 4650 4742 4834 4926 5018 5110 5202 5294 5386 5478 5570 5662 5754 5846 5938 6030 6122 6214 6306 6398 6490 6582 6674 6766 6858 6950 7042 7134 7226 7318 7410 7502 7594 7686 7778 7870 7962 8054 8146 8238 8330 8422 ]
+> [74] rcvbuf=[74 166 258 350 442 534 626 718 810 902 994 1086 1178 1270 1362 1454 1546 1638 1730 1822 1914 2006 2098 2190 2282 2374 2466 2558 2650 2742 2834 2926 3018 3110 3202 3294 3386 3478 3570 3662 3754 3846 3938 4030 4122 4214 4306 4398 4490 4582 4674 4766 4858 4950 5042 5134 5226 5318 5410 5502 5594 5686 5778 5870 5962 6054 6146 6238 6330 6422 6514 6606 6698 6790 6882 6974 7066 7158 7250 7342 7434 7526 7618 7710 7802 7894 7986 8078 8170 8262 8354 8446 ]
+> [76] rcvbuf=[76 168 260 352 444 536 628 720 812 904 996 1088 1180 1272 1364 1456 1548 1640 1732 1824 1916 2008 2100 2192 2284 2376 2468 2560 2652 2744 2836 2928 3020 3112 3204 3296 3388 3480 3572 3664 3756 3848 3940 4032 4124 4216 4308 4400 4492 4584 4676 4768 4860 4952 5044 5136 5228 5320 5412 5504 5596 5688 5780 5872 5964 6056 6148 6240 6332 6424 6516 6608 6700 6792 6884 6976 7068 7160 7252 7344 7436 7528 7620 7712 7804 7896 7988 8080 8172 8264 8356 8448 ]
+> [78] rcvbuf=[78 170 262 354 446 538 630 722 814 906 998 1090 1182 1274 1366 1458 1550 1642 1734 1826 1918 2010 2102 2194 2286 2378 2470 2562 2654 2746 2838 2930 3022 3114 3206 3298 3390 3482 3574 3666 3758 3850 3942 4034 4126 4218 4310 4402 4494 4586 4678 4770 4862 4954 5046 5138 5230 5322 5414 5506 5598 5690 5782 5874 5966 6058 6150 6242 6334 6426 6518 6610 6702 6794 6886 6978 7070 7162 7254 7346 7438 7530 7622 7714 7806 7898 7990 8082 8174 8266 8358 8450 ]
+> [41] rcvbuf=[41 133 225 317 409 501 593 685 777 869 961 1053 1145 1237 1329 1421 1513 1605 1697 1789 1881 1973 2065 2157 2249 2341 2433 2525 2617 2709 2801 2893 2985 3077 3169 3261 3353 3445 3537 3629 3721 3813 3905 3997 4089 4181 4273 4365 4457 4549 4641 4733 4825 4917 5009 5101 5193 5285 5377 5469 5561 5653 5745 5837 5929 6021 6113 6205 6297 6389 6481 6573 6665 6757 6849 6941 7033 7125 7217 7309 7401 7493 7585 7677 7769 7861 7953 8045 8137 8229 8321 8413 ]
+> [43] rcvbuf=[43 135 227 319 411 503 595 687 779 871 963 1055 1147 1239 1331 1423 1515 1607 1699 1791 1883 1975 2067 2159 2251 2343 2435 2527 2619 2711 2803 2895 2987 3079 3171 3263 3355 3447 3539 3631 3723 3815 3907 3999 4091 4183 4275 4367 4459 4551 4643 4735 4827 4919 5011 5103 5195 5287 5379 5471 5563 5655 5747 5839 5931 6023 6115 6207 6299 6391 6483 6575 6667 6759 6851 6943 7035 7127 7219 7311 7403 7495 7587 7679 7771 7863 7955 8047 8139 8231 8323 8415 ]
+> [36] rcvbuf=[36 128 220 312 404 496 588 680 772 864 956 1048 1140 1232 1324 1416 1508 1600 1692 1784 1876 1968 2060 2152 2244 2336 2428 2520 2612 2704 2796 2888 2980 3072 3164 3256 3348 3440 3532 3624 3716 3808 3900 3992 4084 4176 4268 4360 4452 4544 4636 4728 4820 4912 5004 5096 5188 5280 5372 5464 5556 5648 5740 5832 5924 6016 6108 6200 6292 6384 6476 6568 6660 6752 6844 6936 7028 7120 7212 7304 7396 7488 7580 7672 7764 7856 7948 8040 8132 8224 8316 8408 ]
+> [38] rcvbuf=[38 130 222 314 406 498 590 682 774 866 958 1050 1142 1234 1326 1418 1510 1602 1694 1786 1878 1970 2062 2154 2246 2338 2430 2522 2614 2706 2798 2890 2982 3074 3166 3258 3350 3442 3534 3626 3718 3810 3902 3994 4086 4178 4270 4362 4454 4546 4638 4730 4822 4914 5006 5098 5190 5282 5374 5466 5558 5650 5742 5834 5926 6018 6110 6202 6294 6386 6478 6570 6662 6754 6846 6938 7030 7122 7214 7306 7398 7490 7582 7674 7766 7858 7950 8042 8134 8226 8318 8410 ]
+> [52] rcvbuf=[52 144 236 328 420 512 604 696 788 880 972 1064 1156 1248 1340 1432 1524 1616 1708 1800 1892 1984 2076 2168 2260 2352 2444 2536 2628 2720 2812 2904 2996 3088 3180 3272 3364 3456 3548 3640 3732 3824 3916 4008 4100 4192 4284 4376 4468 4560 4652 4744 4836 4928 5020 5112 5204 5296 5388 5480 5572 5664 5756 5848 5940 6032 6124 6216 6308 6400 6492 6584 6676 6768 6860 6952 7044 7136 7228 7320 7412 7504 7596 7688 7780 7872 7964 8056 8148 8240 8332 8424 ]
+> [54] rcvbuf=[54 146 238 330 422 514 606 698 790 882 974 1066 1158 1250 1342 1434 1526 1618 1710 1802 1894 1986 2078 2170 2262 2354 2446 2538 2630 2722 2814 2906 2998 3090 3182 3274 3366 3458 3550 3642 3734 3826 3918 4010 4102 4194 4286 4378 4470 4562 4654 4746 4838 4930 5022 5114 5206 5298 5390 5482 5574 5666 5758 5850 5942 6034 6126 6218 6310 6402 6494 6586 6678 6770 6862 6954 7046 7138 7230 7322 7414 7506 7598 7690 7782 7874 7966 8058 8150 8242 8334 8426 ]
+> [29] rcvbuf=[29 121 213 305 397 489 581 673 765 857 949 1041 1133 1225 1317 1409 1501 1593 1685 1777 1869 1961 2053 2145 2237 2329 2421 2513 2605 2697 2789 2881 2973 3065 3157 3249 3341 3433 3525 3617 3709 3801 3893 3985 4077 4169 4261 4353 4445 4537 4629 4721 4813 4905 4997 5089 5181 5273 5365 5457 5549 5641 5733 5825 5917 6009 6101 6193 6285 6377 6469 6561 6653 6745 6837 6929 7021 7113 7205 7297 7389 7481 7573 7665 7757 7849 7941 8033 8125 8217 8309 8401 ]
+> [31] rcvbuf=[31 123 215 307 399 491 583 675 767 859 951 1043 1135 1227 1319 1411 1503 1595 1687 1779 1871 1963 2055 2147 2239 2331 2423 2515 2607 2699 2791 2883 2975 3067 3159 3251 3343 3435 3527 3619 3711 3803 3895 3987 4079 4171 4263 4355 4447 4539 4631 4723 4815 4907 4999 5091 5183 5275 5367 5459 5551 5643 5735 5827 5919 6011 6103 6195 6287 6379 6471 6563 6655 6747 6839 6931 7023 7115 7207 7299 7391 7483 7575 7667 7759 7851 7943 8035 8127 8219 8311 8403 ]
+> [45] rcvbuf=[45 137 229 321 413 505 597 689 781 873 965 1057 1149 1241 1333 1425 1517 1609 1701 1793 1885 1977 2069 2161 2253 2345 2437 2529 2621 2713 2805 2897 2989 3081 3173 3265 3357 3449 3541 3633 3725 3817 3909 4001 4093 4185 4277 4369 4461 4553 4645 4737 4829 4921 5013 5105 5197 5289 5381 5473 5565 5657 5749 5841 5933 6025 6117 6209 6301 6393 6485 6577 6669 6761 6853 6945 7037 7129 7221 7313 7405 7497 7589 7681 7773 7865 7957 8049 8141 8233 8325 8417 ]
+> [47] rcvbuf=[47 139 231 323 415 507 599 691 783 875 967 1059 1151 1243 1335 1427 1519 1611 1703 1795 1887 1979 2071 2163 2255 2347 2439 2531 2623 2715 2807 2899 2991 3083 3175 3267 3359 3451 3543 3635 3727 3819 3911 4003 4095 4187 4279 4371 4463 4555 4647 4739 4831 4923 5015 5107 5199 5291 5383 5475 5567 5659 5751 5843 5935 6027 6119 6211 6303 6395 6487 6579 6671 6763 6855 6947 7039 7131 7223 7315 7407 7499 7591 7683 7775 7867 7959 8051 8143 8235 8327 8419 ]
+> [42] rcvbuf=[42 134 226 318 410 502 594 686 778 870 962 1054 1146 1238 1330 1422 1514 1606 1698 1790 1882 1974 2066 2158 2250 2342 2434 2526 2618 2710 2802 2894 2986 3078 3170 3262 3354 3446 3538 3630 3722 3814 3906 3998 4090 4182 4274 4366 4458 4550 4642 4734 4826 4918 5010 5102 5194 5286 5378 5470 5562 5654 5746 5838 5930 6022 6114 6206 6298 6390 6482 6574 6666 6758 6850 6942 7034 7126 7218 7310 7402 7494 7586 7678 7770 7862 7954 8046 8138 8230 8322 8414 ]
+> [44] rcvbuf=[44 136 228 320 412 504 596 688 780 872 964 1056 1148 1240 1332 1424 1516 1608 1700 1792 1884 1976 2068 2160 2252 2344 2436 2528 2620 2712 2804 2896 2988 3080 3172 3264 3356 3448 3540 3632 3724 3816 3908 4000 4092 4184 4276 4368 4460 4552 4644 4736 4828 4920 5012 5104 5196 5288 5380 5472 5564 5656 5748 5840 5932 6024 6116 6208 6300 6392 6484 6576 6668 6760 6852 6944 7036 7128 7220 7312 7404 7496 7588 7680 7772 7864 7956 8048 8140 8232 8324 8416 ]
+> [30] rcvbuf=[30 122 214 306 398 490 582 674 766 858 950 1042 1134 1226 1318 1410 1502 1594 1686 1778 1870 1962 2054 2146 2238 2330 2422 2514 2606 2698 2790 2882 2974 3066 3158 3250 3342 3434 3526 3618 3710 3802 3894 3986 4078 4170 4262 4354 4446 4538 4630 4722 4814 4906 4998 5090 5182 5274 5366 5458 5550 5642 5734 5826 5918 6010 6102 6194 6286 6378 6470 6562 6654 6746 6838 6930 7022 7114 7206 7298 7390 7482 7574 7666 7758 7850 7942 8034 8126 8218 8310 8402 ]
+> [46] rcvbuf=[46 138 230 322 414 506 598 690 782 874 966 1058 1150 1242 1334 1426 1518 1610 1702 1794 1886 1978 2070 2162 2254 2346 2438 2530 2622 2714 2806 2898 2990 3082 3174 3266 3358 3450 3542 3634 3726 3818 3910 4002 4094 4186 4278 4370 4462 4554 4646 4738 4830 4922 5014 5106 5198 5290 5382 5474 5566 5658 5750 5842 5934 6026 6118 6210 6302 6394 6486 6578 6670 6762 6854 6946 7038 7130 7222 7314 7406 7498 7590 7682 7774 7866 7958 8050 8142 8234 8326 8418 ]
+> [63] rcvbuf=[63 155 247 339 431 523 615 707 799 891 983 1075 1167 1259 1351 1443 1535 1627 1719 1811 1903 1995 2087 2179 2271 2363 2455 2547 2639 2731 2823 2915 3007 3099 3191 3283 3375 3467 3559 3651 3743 3835 3927 4019 4111 4203 4295 4387 4479 4571 4663 4755 4847 4939 5031 5123 5215 5307 5399 5491 5583 5675 5767 5859 5951 6043 6135 6227 6319 6411 6503 6595 6687 6779 6871 6963 7055 7147 7239 7331 7423 7515 7607 7699 7791 7883 7975 8067 8159 8251 8343 8435 ]
+> [61] rcvbuf=[61 153 245 337 429 521 613 705 797 889 981 1073 1165 1257 1349 1441 1533 1625 1717 1809 1901 1993 2085 2177 2269 2361 2453 2545 2637 2729 2821 2913 3005 3097 3189 3281 3373 3465 3557 3649 3741 3833 3925 4017 4109 4201 4293 4385 4477 4569 4661 4753 4845 4937 5029 5121 5213 5305 5397 5489 5581 5673 5765 5857 5949 6041 6133 6225 6317 6409 6501 6593 6685 6777 6869 6961 7053 7145 7237 7329 7421 7513 7605 7697 7789 7881 7973 8065 8157 8249 8341 8433 ]
+> [60] rcvbuf=[60 152 244 336 428 520 612 704 796 888 980 1072 1164 1256 1348 1440 1532 1624 1716 1808 1900 1992 2084 2176 2268 2360 2452 2544 2636 2728 2820 2912 3004 3096 3188 3280 3372 3464 3556 3648 3740 3832 3924 4016 4108 4200 4292 4384 4476 4568 4660 4752 4844 4936 5028 5120 5212 5304 5396 5488 5580 5672 5764 5856 5948 6040 6132 6224 6316 6408 6500 6592 6684 6776 6868 6960 7052 7144 7236 7328 7420 7512 7604 7696 7788 7880 7972 8064 8156 8248 8340 8432 ]
+> [62] rcvbuf=[62 154 246 338 430 522 614 706 798 890 982 1074 1166 1258 1350 1442 1534 1626 1718 1810 1902 1994 2086 2178 2270 2362 2454 2546 2638 2730 2822 2914 3006 3098 3190 3282 3374 3466 3558 3650 3742 3834 3926 4018 4110 4202 4294 4386 4478 4570 4662 4754 4846 4938 5030 5122 5214 5306 5398 5490 5582 5674 5766 5858 5950 6042 6134 6226 6318 6410 6502 6594 6686 6778 6870 6962 7054 7146 7238 7330 7422 7514 7606 7698 7790 7882 7974 8066 8158 8250 8342 8434 ]
+
+! output sort
+p Test Griffon(C++)
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_griffon -platform ${libdir:=.}/libgriffon.so -np 92 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> griffon-1.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 1] -> griffon-2.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 2] -> griffon-3.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 3] -> griffon-4.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 4] -> griffon-5.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 5] -> griffon-6.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 6] -> griffon-7.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 7] -> griffon-8.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 8] -> griffon-9.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 9] -> griffon-10.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 10] -> griffon-11.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 11] -> griffon-12.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 12] -> griffon-13.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 13] -> griffon-14.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 14] -> griffon-15.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 15] -> griffon-16.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 16] -> griffon-17.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 17] -> griffon-18.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 18] -> griffon-19.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 19] -> griffon-20.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 20] -> griffon-21.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 21] -> griffon-22.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 22] -> griffon-23.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 23] -> griffon-24.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 24] -> griffon-25.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 25] -> griffon-26.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 26] -> griffon-27.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 27] -> griffon-28.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 28] -> griffon-29.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 29] -> griffon-30.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 30] -> griffon-31.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 31] -> griffon-32.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 32] -> griffon-33.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 33] -> griffon-34.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 34] -> griffon-35.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 35] -> griffon-36.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 36] -> griffon-37.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 37] -> griffon-38.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 38] -> griffon-39.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 39] -> griffon-40.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 40] -> griffon-41.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 41] -> griffon-42.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 42] -> griffon-43.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 43] -> griffon-44.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 44] -> griffon-45.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 45] -> griffon-46.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 46] -> griffon-47.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 47] -> griffon-48.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 48] -> griffon-49.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 49] -> griffon-50.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 50] -> griffon-51.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 51] -> griffon-52.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 52] -> griffon-53.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 53] -> griffon-54.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 54] -> griffon-55.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 55] -> griffon-56.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 56] -> griffon-57.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 57] -> griffon-58.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 58] -> griffon-59.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 59] -> griffon-60.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 60] -> griffon-61.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 61] -> griffon-62.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 62] -> griffon-63.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 63] -> griffon-64.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 64] -> griffon-65.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 65] -> griffon-66.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 66] -> griffon-67.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 67] -> griffon-68.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 68] -> griffon-69.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 69] -> griffon-70.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 70] -> griffon-71.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 71] -> griffon-72.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 72] -> griffon-73.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 73] -> griffon-74.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 74] -> griffon-75.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 75] -> griffon-76.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 76] -> griffon-77.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 77] -> griffon-78.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 78] -> griffon-79.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 79] -> griffon-80.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 80] -> griffon-81.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 81] -> griffon-82.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 82] -> griffon-83.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 83] -> griffon-84.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 84] -> griffon-85.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 85] -> griffon-86.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 86] -> griffon-87.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 87] -> griffon-88.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 88] -> griffon-89.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 89] -> griffon-90.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 90] -> griffon-91.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 91] -> griffon-92.nancy.grid5000.fr
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 ]
+> [1] sndbuf=[92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 ]
+> [2] sndbuf=[184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 ]
+> [3] sndbuf=[276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 ]
+> [4] sndbuf=[368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 ]
+> [5] sndbuf=[460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 ]
+> [6] sndbuf=[552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 ]
+> [7] sndbuf=[644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 ]
+> [8] sndbuf=[736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 ]
+> [9] sndbuf=[828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 ]
+> [10] sndbuf=[920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 ]
+> [11] sndbuf=[1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 ]
+> [12] sndbuf=[1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 ]
+> [13] sndbuf=[1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 ]
+> [14] sndbuf=[1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 ]
+> [15] sndbuf=[1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 ]
+> [16] sndbuf=[1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 ]
+> [17] sndbuf=[1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 ]
+> [18] sndbuf=[1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 ]
+> [19] sndbuf=[1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 ]
+> [20] sndbuf=[1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 ]
+> [21] sndbuf=[1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 ]
+> [22] sndbuf=[2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 ]
+> [23] sndbuf=[2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 ]
+> [24] sndbuf=[2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 ]
+> [25] sndbuf=[2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 ]
+> [26] sndbuf=[2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 ]
+> [27] sndbuf=[2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 ]
+> [28] sndbuf=[2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 ]
+> [29] sndbuf=[2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 ]
+> [30] sndbuf=[2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 ]
+> [31] sndbuf=[2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 ]
+> [32] sndbuf=[2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 ]
+> [33] sndbuf=[3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 ]
+> [34] sndbuf=[3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 ]
+> [35] sndbuf=[3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 ]
+> [36] sndbuf=[3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 ]
+> [37] sndbuf=[3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 ]
+> [38] sndbuf=[3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 ]
+> [39] sndbuf=[3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 ]
+> [40] sndbuf=[3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 ]
+> [41] sndbuf=[3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 ]
+> [42] sndbuf=[3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 ]
+> [43] sndbuf=[3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 ]
+> [44] sndbuf=[4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 ]
+> [45] sndbuf=[4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 ]
+> [46] sndbuf=[4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 ]
+> [47] sndbuf=[4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 ]
+> [48] sndbuf=[4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 ]
+> [49] sndbuf=[4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 ]
+> [50] sndbuf=[4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 ]
+> [51] sndbuf=[4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 ]
+> [52] sndbuf=[4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 ]
+> [53] sndbuf=[4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 ]
+> [54] sndbuf=[4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 ]
+> [55] sndbuf=[5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 ]
+> [56] sndbuf=[5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 ]
+> [57] sndbuf=[5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 ]
+> [58] sndbuf=[5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 ]
+> [59] sndbuf=[5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 ]
+> [60] sndbuf=[5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 ]
+> [61] sndbuf=[5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 ]
+> [62] sndbuf=[5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 ]
+> [63] sndbuf=[5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 ]
+> [64] sndbuf=[5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 ]
+> [65] sndbuf=[5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 ]
+> [66] sndbuf=[6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 ]
+> [67] sndbuf=[6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 ]
+> [68] sndbuf=[6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 ]
+> [69] sndbuf=[6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 ]
+> [70] sndbuf=[6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 ]
+> [71] sndbuf=[6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 ]
+> [72] sndbuf=[6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 ]
+> [73] sndbuf=[6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 ]
+> [74] sndbuf=[6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 ]
+> [75] sndbuf=[6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 ]
+> [76] sndbuf=[6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 ]
+> [77] sndbuf=[7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 ]
+> [78] sndbuf=[7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 ]
+> [79] sndbuf=[7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 ]
+> [80] sndbuf=[7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 ]
+> [81] sndbuf=[7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 ]
+> [82] sndbuf=[7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 ]
+> [83] sndbuf=[7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 ]
+> [84] sndbuf=[7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 ]
+> [85] sndbuf=[7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 ]
+> [86] sndbuf=[7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 ]
+> [87] sndbuf=[8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 ]
+> [88] sndbuf=[8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 ]
+> [89] sndbuf=[8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 ]
+> [90] sndbuf=[8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 ]
+> [91] sndbuf=[8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 ]
+> [19] rcvbuf=[19 111 203 295 387 479 571 663 755 847 939 1031 1123 1215 1307 1399 1491 1583 1675 1767 1859 1951 2043 2135 2227 2319 2411 2503 2595 2687 2779 2871 2963 3055 3147 3239 3331 3423 3515 3607 3699 3791 3883 3975 4067 4159 4251 4343 4435 4527 4619 4711 4803 4895 4987 5079 5171 5263 5355 5447 5539 5631 5723 5815 5907 5999 6091 6183 6275 6367 6459 6551 6643 6735 6827 6919 7011 7103 7195 7287 7379 7471 7563 7655 7747 7839 7931 8023 8115 8207 8299 8391 ]
+> [17] rcvbuf=[17 109 201 293 385 477 569 661 753 845 937 1029 1121 1213 1305 1397 1489 1581 1673 1765 1857 1949 2041 2133 2225 2317 2409 2501 2593 2685 2777 2869 2961 3053 3145 3237 3329 3421 3513 3605 3697 3789 3881 3973 4065 4157 4249 4341 4433 4525 4617 4709 4801 4893 4985 5077 5169 5261 5353 5445 5537 5629 5721 5813 5905 5997 6089 6181 6273 6365 6457 6549 6641 6733 6825 6917 7009 7101 7193 7285 7377 7469 7561 7653 7745 7837 7929 8021 8113 8205 8297 8389 ]
+> [3] rcvbuf=[3 95 187 279 371 463 555 647 739 831 923 1015 1107 1199 1291 1383 1475 1567 1659 1751 1843 1935 2027 2119 2211 2303 2395 2487 2579 2671 2763 2855 2947 3039 3131 3223 3315 3407 3499 3591 3683 3775 3867 3959 4051 4143 4235 4327 4419 4511 4603 4695 4787 4879 4971 5063 5155 5247 5339 5431 5523 5615 5707 5799 5891 5983 6075 6167 6259 6351 6443 6535 6627 6719 6811 6903 6995 7087 7179 7271 7363 7455 7547 7639 7731 7823 7915 8007 8099 8191 8283 8375 ]
+> [1] rcvbuf=[1 93 185 277 369 461 553 645 737 829 921 1013 1105 1197 1289 1381 1473 1565 1657 1749 1841 1933 2025 2117 2209 2301 2393 2485 2577 2669 2761 2853 2945 3037 3129 3221 3313 3405 3497 3589 3681 3773 3865 3957 4049 4141 4233 4325 4417 4509 4601 4693 4785 4877 4969 5061 5153 5245 5337 5429 5521 5613 5705 5797 5889 5981 6073 6165 6257 6349 6441 6533 6625 6717 6809 6901 6993 7085 7177 7269 7361 7453 7545 7637 7729 7821 7913 8005 8097 8189 8281 8373 ]
+> [27] rcvbuf=[27 119 211 303 395 487 579 671 763 855 947 1039 1131 1223 1315 1407 1499 1591 1683 1775 1867 1959 2051 2143 2235 2327 2419 2511 2603 2695 2787 2879 2971 3063 3155 3247 3339 3431 3523 3615 3707 3799 3891 3983 4075 4167 4259 4351 4443 4535 4627 4719 4811 4903 4995 5087 5179 5271 5363 5455 5547 5639 5731 5823 5915 6007 6099 6191 6283 6375 6467 6559 6651 6743 6835 6927 7019 7111 7203 7295 7387 7479 7571 7663 7755 7847 7939 8031 8123 8215 8307 8399 ]
+> [25] rcvbuf=[25 117 209 301 393 485 577 669 761 853 945 1037 1129 1221 1313 1405 1497 1589 1681 1773 1865 1957 2049 2141 2233 2325 2417 2509 2601 2693 2785 2877 2969 3061 3153 3245 3337 3429 3521 3613 3705 3797 3889 3981 4073 4165 4257 4349 4441 4533 4625 4717 4809 4901 4993 5085 5177 5269 5361 5453 5545 5637 5729 5821 5913 6005 6097 6189 6281 6373 6465 6557 6649 6741 6833 6925 7017 7109 7201 7293 7385 7477 7569 7661 7753 7845 7937 8029 8121 8213 8305 8397 ]
+> [26] rcvbuf=[26 118 210 302 394 486 578 670 762 854 946 1038 1130 1222 1314 1406 1498 1590 1682 1774 1866 1958 2050 2142 2234 2326 2418 2510 2602 2694 2786 2878 2970 3062 3154 3246 3338 3430 3522 3614 3706 3798 3890 3982 4074 4166 4258 4350 4442 4534 4626 4718 4810 4902 4994 5086 5178 5270 5362 5454 5546 5638 5730 5822 5914 6006 6098 6190 6282 6374 6466 6558 6650 6742 6834 6926 7018 7110 7202 7294 7386 7478 7570 7662 7754 7846 7938 8030 8122 8214 8306 8398 ]
+> [16] rcvbuf=[16 108 200 292 384 476 568 660 752 844 936 1028 1120 1212 1304 1396 1488 1580 1672 1764 1856 1948 2040 2132 2224 2316 2408 2500 2592 2684 2776 2868 2960 3052 3144 3236 3328 3420 3512 3604 3696 3788 3880 3972 4064 4156 4248 4340 4432 4524 4616 4708 4800 4892 4984 5076 5168 5260 5352 5444 5536 5628 5720 5812 5904 5996 6088 6180 6272 6364 6456 6548 6640 6732 6824 6916 7008 7100 7192 7284 7376 7468 7560 7652 7744 7836 7928 8020 8112 8204 8296 8388 ]
+> [24] rcvbuf=[24 116 208 300 392 484 576 668 760 852 944 1036 1128 1220 1312 1404 1496 1588 1680 1772 1864 1956 2048 2140 2232 2324 2416 2508 2600 2692 2784 2876 2968 3060 3152 3244 3336 3428 3520 3612 3704 3796 3888 3980 4072 4164 4256 4348 4440 4532 4624 4716 4808 4900 4992 5084 5176 5268 5360 5452 5544 5636 5728 5820 5912 6004 6096 6188 6280 6372 6464 6556 6648 6740 6832 6924 7016 7108 7200 7292 7384 7476 7568 7660 7752 7844 7936 8028 8120 8212 8304 8396 ]
+> [0] rcvbuf=[0 92 184 276 368 460 552 644 736 828 920 1012 1104 1196 1288 1380 1472 1564 1656 1748 1840 1932 2024 2116 2208 2300 2392 2484 2576 2668 2760 2852 2944 3036 3128 3220 3312 3404 3496 3588 3680 3772 3864 3956 4048 4140 4232 4324 4416 4508 4600 4692 4784 4876 4968 5060 5152 5244 5336 5428 5520 5612 5704 5796 5888 5980 6072 6164 6256 6348 6440 6532 6624 6716 6808 6900 6992 7084 7176 7268 7360 7452 7544 7636 7728 7820 7912 8004 8096 8188 8280 8372 ]
+> [8] rcvbuf=[8 100 192 284 376 468 560 652 744 836 928 1020 1112 1204 1296 1388 1480 1572 1664 1756 1848 1940 2032 2124 2216 2308 2400 2492 2584 2676 2768 2860 2952 3044 3136 3228 3320 3412 3504 3596 3688 3780 3872 3964 4056 4148 4240 4332 4424 4516 4608 4700 4792 4884 4976 5068 5160 5252 5344 5436 5528 5620 5712 5804 5896 5988 6080 6172 6264 6356 6448 6540 6632 6724 6816 6908 7000 7092 7184 7276 7368 7460 7552 7644 7736 7828 7920 8012 8104 8196 8288 8380 ]
+> [23] rcvbuf=[23 115 207 299 391 483 575 667 759 851 943 1035 1127 1219 1311 1403 1495 1587 1679 1771 1863 1955 2047 2139 2231 2323 2415 2507 2599 2691 2783 2875 2967 3059 3151 3243 3335 3427 3519 3611 3703 3795 3887 3979 4071 4163 4255 4347 4439 4531 4623 4715 4807 4899 4991 5083 5175 5267 5359 5451 5543 5635 5727 5819 5911 6003 6095 6187 6279 6371 6463 6555 6647 6739 6831 6923 7015 7107 7199 7291 7383 7475 7567 7659 7751 7843 7935 8027 8119 8211 8303 8395 ]
+> [21] rcvbuf=[21 113 205 297 389 481 573 665 757 849 941 1033 1125 1217 1309 1401 1493 1585 1677 1769 1861 1953 2045 2137 2229 2321 2413 2505 2597 2689 2781 2873 2965 3057 3149 3241 3333 3425 3517 3609 3701 3793 3885 3977 4069 4161 4253 4345 4437 4529 4621 4713 4805 4897 4989 5081 5173 5265 5357 5449 5541 5633 5725 5817 5909 6001 6093 6185 6277 6369 6461 6553 6645 6737 6829 6921 7013 7105 7197 7289 7381 7473 7565 7657 7749 7841 7933 8025 8117 8209 8301 8393 ]
+> [7] rcvbuf=[7 99 191 283 375 467 559 651 743 835 927 1019 1111 1203 1295 1387 1479 1571 1663 1755 1847 1939 2031 2123 2215 2307 2399 2491 2583 2675 2767 2859 2951 3043 3135 3227 3319 3411 3503 3595 3687 3779 3871 3963 4055 4147 4239 4331 4423 4515 4607 4699 4791 4883 4975 5067 5159 5251 5343 5435 5527 5619 5711 5803 5895 5987 6079 6171 6263 6355 6447 6539 6631 6723 6815 6907 6999 7091 7183 7275 7367 7459 7551 7643 7735 7827 7919 8011 8103 8195 8287 8379 ]
+> [5] rcvbuf=[5 97 189 281 373 465 557 649 741 833 925 1017 1109 1201 1293 1385 1477 1569 1661 1753 1845 1937 2029 2121 2213 2305 2397 2489 2581 2673 2765 2857 2949 3041 3133 3225 3317 3409 3501 3593 3685 3777 3869 3961 4053 4145 4237 4329 4421 4513 4605 4697 4789 4881 4973 5065 5157 5249 5341 5433 5525 5617 5709 5801 5893 5985 6077 6169 6261 6353 6445 6537 6629 6721 6813 6905 6997 7089 7181 7273 7365 7457 7549 7641 7733 7825 7917 8009 8101 8193 8285 8377 ]
+> [18] rcvbuf=[18 110 202 294 386 478 570 662 754 846 938 1030 1122 1214 1306 1398 1490 1582 1674 1766 1858 1950 2042 2134 2226 2318 2410 2502 2594 2686 2778 2870 2962 3054 3146 3238 3330 3422 3514 3606 3698 3790 3882 3974 4066 4158 4250 4342 4434 4526 4618 4710 4802 4894 4986 5078 5170 5262 5354 5446 5538 5630 5722 5814 5906 5998 6090 6182 6274 6366 6458 6550 6642 6734 6826 6918 7010 7102 7194 7286 7378 7470 7562 7654 7746 7838 7930 8022 8114 8206 8298 8390 ]
+> [2] rcvbuf=[2 94 186 278 370 462 554 646 738 830 922 1014 1106 1198 1290 1382 1474 1566 1658 1750 1842 1934 2026 2118 2210 2302 2394 2486 2578 2670 2762 2854 2946 3038 3130 3222 3314 3406 3498 3590 3682 3774 3866 3958 4050 4142 4234 4326 4418 4510 4602 4694 4786 4878 4970 5062 5154 5246 5338 5430 5522 5614 5706 5798 5890 5982 6074 6166 6258 6350 6442 6534 6626 6718 6810 6902 6994 7086 7178 7270 7362 7454 7546 7638 7730 7822 7914 8006 8098 8190 8282 8374 ]
+> [11] rcvbuf=[11 103 195 287 379 471 563 655 747 839 931 1023 1115 1207 1299 1391 1483 1575 1667 1759 1851 1943 2035 2127 2219 2311 2403 2495 2587 2679 2771 2863 2955 3047 3139 3231 3323 3415 3507 3599 3691 3783 3875 3967 4059 4151 4243 4335 4427 4519 4611 4703 4795 4887 4979 5071 5163 5255 5347 5439 5531 5623 5715 5807 5899 5991 6083 6175 6267 6359 6451 6543 6635 6727 6819 6911 7003 7095 7187 7279 7371 7463 7555 7647 7739 7831 7923 8015 8107 8199 8291 8383 ]
+> [9] rcvbuf=[9 101 193 285 377 469 561 653 745 837 929 1021 1113 1205 1297 1389 1481 1573 1665 1757 1849 1941 2033 2125 2217 2309 2401 2493 2585 2677 2769 2861 2953 3045 3137 3229 3321 3413 3505 3597 3689 3781 3873 3965 4057 4149 4241 4333 4425 4517 4609 4701 4793 4885 4977 5069 5161 5253 5345 5437 5529 5621 5713 5805 5897 5989 6081 6173 6265 6357 6449 6541 6633 6725 6817 6909 7001 7093 7185 7277 7369 7461 7553 7645 7737 7829 7921 8013 8105 8197 8289 8381 ]
+> [15] rcvbuf=[15 107 199 291 383 475 567 659 751 843 935 1027 1119 1211 1303 1395 1487 1579 1671 1763 1855 1947 2039 2131 2223 2315 2407 2499 2591 2683 2775 2867 2959 3051 3143 3235 3327 3419 3511 3603 3695 3787 3879 3971 4063 4155 4247 4339 4431 4523 4615 4707 4799 4891 4983 5075 5167 5259 5351 5443 5535 5627 5719 5811 5903 5995 6087 6179 6271 6363 6455 6547 6639 6731 6823 6915 7007 7099 7191 7283 7375 7467 7559 7651 7743 7835 7927 8019 8111 8203 8295 8387 ]
+> [13] rcvbuf=[13 105 197 289 381 473 565 657 749 841 933 1025 1117 1209 1301 1393 1485 1577 1669 1761 1853 1945 2037 2129 2221 2313 2405 2497 2589 2681 2773 2865 2957 3049 3141 3233 3325 3417 3509 3601 3693 3785 3877 3969 4061 4153 4245 4337 4429 4521 4613 4705 4797 4889 4981 5073 5165 5257 5349 5441 5533 5625 5717 5809 5901 5993 6085 6177 6269 6361 6453 6545 6637 6729 6821 6913 7005 7097 7189 7281 7373 7465 7557 7649 7741 7833 7925 8017 8109 8201 8293 8385 ]
+> [22] rcvbuf=[22 114 206 298 390 482 574 666 758 850 942 1034 1126 1218 1310 1402 1494 1586 1678 1770 1862 1954 2046 2138 2230 2322 2414 2506 2598 2690 2782 2874 2966 3058 3150 3242 3334 3426 3518 3610 3702 3794 3886 3978 4070 4162 4254 4346 4438 4530 4622 4714 4806 4898 4990 5082 5174 5266 5358 5450 5542 5634 5726 5818 5910 6002 6094 6186 6278 6370 6462 6554 6646 6738 6830 6922 7014 7106 7198 7290 7382 7474 7566 7658 7750 7842 7934 8026 8118 8210 8302 8394 ]
+> [20] rcvbuf=[20 112 204 296 388 480 572 664 756 848 940 1032 1124 1216 1308 1400 1492 1584 1676 1768 1860 1952 2044 2136 2228 2320 2412 2504 2596 2688 2780 2872 2964 3056 3148 3240 3332 3424 3516 3608 3700 3792 3884 3976 4068 4160 4252 4344 4436 4528 4620 4712 4804 4896 4988 5080 5172 5264 5356 5448 5540 5632 5724 5816 5908 6000 6092 6184 6276 6368 6460 6552 6644 6736 6828 6920 7012 7104 7196 7288 7380 7472 7564 7656 7748 7840 7932 8024 8116 8208 8300 8392 ]
+> [6] rcvbuf=[6 98 190 282 374 466 558 650 742 834 926 1018 1110 1202 1294 1386 1478 1570 1662 1754 1846 1938 2030 2122 2214 2306 2398 2490 2582 2674 2766 2858 2950 3042 3134 3226 3318 3410 3502 3594 3686 3778 3870 3962 4054 4146 4238 4330 4422 4514 4606 4698 4790 4882 4974 5066 5158 5250 5342 5434 5526 5618 5710 5802 5894 5986 6078 6170 6262 6354 6446 6538 6630 6722 6814 6906 6998 7090 7182 7274 7366 7458 7550 7642 7734 7826 7918 8010 8102 8194 8286 8378 ]
+> [4] rcvbuf=[4 96 188 280 372 464 556 648 740 832 924 1016 1108 1200 1292 1384 1476 1568 1660 1752 1844 1936 2028 2120 2212 2304 2396 2488 2580 2672 2764 2856 2948 3040 3132 3224 3316 3408 3500 3592 3684 3776 3868 3960 4052 4144 4236 4328 4420 4512 4604 4696 4788 4880 4972 5064 5156 5248 5340 5432 5524 5616 5708 5800 5892 5984 6076 6168 6260 6352 6444 6536 6628 6720 6812 6904 6996 7088 7180 7272 7364 7456 7548 7640 7732 7824 7916 8008 8100 8192 8284 8376 ]
+> [10] rcvbuf=[10 102 194 286 378 470 562 654 746 838 930 1022 1114 1206 1298 1390 1482 1574 1666 1758 1850 1942 2034 2126 2218 2310 2402 2494 2586 2678 2770 2862 2954 3046 3138 3230 3322 3414 3506 3598 3690 3782 3874 3966 4058 4150 4242 4334 4426 4518 4610 4702 4794 4886 4978 5070 5162 5254 5346 5438 5530 5622 5714 5806 5898 5990 6082 6174 6266 6358 6450 6542 6634 6726 6818 6910 7002 7094 7186 7278 7370 7462 7554 7646 7738 7830 7922 8014 8106 8198 8290 8382 ]
+> [14] rcvbuf=[14 106 198 290 382 474 566 658 750 842 934 1026 1118 1210 1302 1394 1486 1578 1670 1762 1854 1946 2038 2130 2222 2314 2406 2498 2590 2682 2774 2866 2958 3050 3142 3234 3326 3418 3510 3602 3694 3786 3878 3970 4062 4154 4246 4338 4430 4522 4614 4706 4798 4890 4982 5074 5166 5258 5350 5442 5534 5626 5718 5810 5902 5994 6086 6178 6270 6362 6454 6546 6638 6730 6822 6914 7006 7098 7190 7282 7374 7466 7558 7650 7742 7834 7926 8018 8110 8202 8294 8386 ]
+> [12] rcvbuf=[12 104 196 288 380 472 564 656 748 840 932 1024 1116 1208 1300 1392 1484 1576 1668 1760 1852 1944 2036 2128 2220 2312 2404 2496 2588 2680 2772 2864 2956 3048 3140 3232 3324 3416 3508 3600 3692 3784 3876 3968 4060 4152 4244 4336 4428 4520 4612 4704 4796 4888 4980 5072 5164 5256 5348 5440 5532 5624 5716 5808 5900 5992 6084 6176 6268 6360 6452 6544 6636 6728 6820 6912 7004 7096 7188 7280 7372 7464 7556 7648 7740 7832 7924 8016 8108 8200 8292 8384 ]
+> [83] rcvbuf=[83 175 267 359 451 543 635 727 819 911 1003 1095 1187 1279 1371 1463 1555 1647 1739 1831 1923 2015 2107 2199 2291 2383 2475 2567 2659 2751 2843 2935 3027 3119 3211 3303 3395 3487 3579 3671 3763 3855 3947 4039 4131 4223 4315 4407 4499 4591 4683 4775 4867 4959 5051 5143 5235 5327 5419 5511 5603 5695 5787 5879 5971 6063 6155 6247 6339 6431 6523 6615 6707 6799 6891 6983 7075 7167 7259 7351 7443 7535 7627 7719 7811 7903 7995 8087 8179 8271 8363 8455 ]
+> [81] rcvbuf=[81 173 265 357 449 541 633 725 817 909 1001 1093 1185 1277 1369 1461 1553 1645 1737 1829 1921 2013 2105 2197 2289 2381 2473 2565 2657 2749 2841 2933 3025 3117 3209 3301 3393 3485 3577 3669 3761 3853 3945 4037 4129 4221 4313 4405 4497 4589 4681 4773 4865 4957 5049 5141 5233 5325 5417 5509 5601 5693 5785 5877 5969 6061 6153 6245 6337 6429 6521 6613 6705 6797 6889 6981 7073 7165 7257 7349 7441 7533 7625 7717 7809 7901 7993 8085 8177 8269 8361 8453 ]
+> [67] rcvbuf=[67 159 251 343 435 527 619 711 803 895 987 1079 1171 1263 1355 1447 1539 1631 1723 1815 1907 1999 2091 2183 2275 2367 2459 2551 2643 2735 2827 2919 3011 3103 3195 3287 3379 3471 3563 3655 3747 3839 3931 4023 4115 4207 4299 4391 4483 4575 4667 4759 4851 4943 5035 5127 5219 5311 5403 5495 5587 5679 5771 5863 5955 6047 6139 6231 6323 6415 6507 6599 6691 6783 6875 6967 7059 7151 7243 7335 7427 7519 7611 7703 7795 7887 7979 8071 8163 8255 8347 8439 ]
+> [65] rcvbuf=[65 157 249 341 433 525 617 709 801 893 985 1077 1169 1261 1353 1445 1537 1629 1721 1813 1905 1997 2089 2181 2273 2365 2457 2549 2641 2733 2825 2917 3009 3101 3193 3285 3377 3469 3561 3653 3745 3837 3929 4021 4113 4205 4297 4389 4481 4573 4665 4757 4849 4941 5033 5125 5217 5309 5401 5493 5585 5677 5769 5861 5953 6045 6137 6229 6321 6413 6505 6597 6689 6781 6873 6965 7057 7149 7241 7333 7425 7517 7609 7701 7793 7885 7977 8069 8161 8253 8345 8437 ]
+> [57] rcvbuf=[57 149 241 333 425 517 609 701 793 885 977 1069 1161 1253 1345 1437 1529 1621 1713 1805 1897 1989 2081 2173 2265 2357 2449 2541 2633 2725 2817 2909 3001 3093 3185 3277 3369 3461 3553 3645 3737 3829 3921 4013 4105 4197 4289 4381 4473 4565 4657 4749 4841 4933 5025 5117 5209 5301 5393 5485 5577 5669 5761 5853 5945 6037 6129 6221 6313 6405 6497 6589 6681 6773 6865 6957 7049 7141 7233 7325 7417 7509 7601 7693 7785 7877 7969 8061 8153 8245 8337 8429 ]
+> [59] rcvbuf=[59 151 243 335 427 519 611 703 795 887 979 1071 1163 1255 1347 1439 1531 1623 1715 1807 1899 1991 2083 2175 2267 2359 2451 2543 2635 2727 2819 2911 3003 3095 3187 3279 3371 3463 3555 3647 3739 3831 3923 4015 4107 4199 4291 4383 4475 4567 4659 4751 4843 4935 5027 5119 5211 5303 5395 5487 5579 5671 5763 5855 5947 6039 6131 6223 6315 6407 6499 6591 6683 6775 6867 6959 7051 7143 7235 7327 7419 7511 7603 7695 7787 7879 7971 8063 8155 8247 8339 8431 ]
+> [33] rcvbuf=[33 125 217 309 401 493 585 677 769 861 953 1045 1137 1229 1321 1413 1505 1597 1689 1781 1873 1965 2057 2149 2241 2333 2425 2517 2609 2701 2793 2885 2977 3069 3161 3253 3345 3437 3529 3621 3713 3805 3897 3989 4081 4173 4265 4357 4449 4541 4633 4725 4817 4909 5001 5093 5185 5277 5369 5461 5553 5645 5737 5829 5921 6013 6105 6197 6289 6381 6473 6565 6657 6749 6841 6933 7025 7117 7209 7301 7393 7485 7577 7669 7761 7853 7945 8037 8129 8221 8313 8405 ]
+> [35] rcvbuf=[35 127 219 311 403 495 587 679 771 863 955 1047 1139 1231 1323 1415 1507 1599 1691 1783 1875 1967 2059 2151 2243 2335 2427 2519 2611 2703 2795 2887 2979 3071 3163 3255 3347 3439 3531 3623 3715 3807 3899 3991 4083 4175 4267 4359 4451 4543 4635 4727 4819 4911 5003 5095 5187 5279 5371 5463 5555 5647 5739 5831 5923 6015 6107 6199 6291 6383 6475 6567 6659 6751 6843 6935 7027 7119 7211 7303 7395 7487 7579 7671 7763 7855 7947 8039 8131 8223 8315 8407 ]
+> [49] rcvbuf=[49 141 233 325 417 509 601 693 785 877 969 1061 1153 1245 1337 1429 1521 1613 1705 1797 1889 1981 2073 2165 2257 2349 2441 2533 2625 2717 2809 2901 2993 3085 3177 3269 3361 3453 3545 3637 3729 3821 3913 4005 4097 4189 4281 4373 4465 4557 4649 4741 4833 4925 5017 5109 5201 5293 5385 5477 5569 5661 5753 5845 5937 6029 6121 6213 6305 6397 6489 6581 6673 6765 6857 6949 7041 7133 7225 7317 7409 7501 7593 7685 7777 7869 7961 8053 8145 8237 8329 8421 ]
+> [51] rcvbuf=[51 143 235 327 419 511 603 695 787 879 971 1063 1155 1247 1339 1431 1523 1615 1707 1799 1891 1983 2075 2167 2259 2351 2443 2535 2627 2719 2811 2903 2995 3087 3179 3271 3363 3455 3547 3639 3731 3823 3915 4007 4099 4191 4283 4375 4467 4559 4651 4743 4835 4927 5019 5111 5203 5295 5387 5479 5571 5663 5755 5847 5939 6031 6123 6215 6307 6399 6491 6583 6675 6767 6859 6951 7043 7135 7227 7319 7411 7503 7595 7687 7779 7871 7963 8055 8147 8239 8331 8423 ]
+> [58] rcvbuf=[58 150 242 334 426 518 610 702 794 886 978 1070 1162 1254 1346 1438 1530 1622 1714 1806 1898 1990 2082 2174 2266 2358 2450 2542 2634 2726 2818 2910 3002 3094 3186 3278 3370 3462 3554 3646 3738 3830 3922 4014 4106 4198 4290 4382 4474 4566 4658 4750 4842 4934 5026 5118 5210 5302 5394 5486 5578 5670 5762 5854 5946 6038 6130 6222 6314 6406 6498 6590 6682 6774 6866 6958 7050 7142 7234 7326 7418 7510 7602 7694 7786 7878 7970 8062 8154 8246 8338 8430 ]
+> [91] rcvbuf=[91 183 275 367 459 551 643 735 827 919 1011 1103 1195 1287 1379 1471 1563 1655 1747 1839 1931 2023 2115 2207 2299 2391 2483 2575 2667 2759 2851 2943 3035 3127 3219 3311 3403 3495 3587 3679 3771 3863 3955 4047 4139 4231 4323 4415 4507 4599 4691 4783 4875 4967 5059 5151 5243 5335 5427 5519 5611 5703 5795 5887 5979 6071 6163 6255 6347 6439 6531 6623 6715 6807 6899 6991 7083 7175 7267 7359 7451 7543 7635 7727 7819 7911 8003 8095 8187 8279 8371 8463 ]
+> [89] rcvbuf=[89 181 273 365 457 549 641 733 825 917 1009 1101 1193 1285 1377 1469 1561 1653 1745 1837 1929 2021 2113 2205 2297 2389 2481 2573 2665 2757 2849 2941 3033 3125 3217 3309 3401 3493 3585 3677 3769 3861 3953 4045 4137 4229 4321 4413 4505 4597 4689 4781 4873 4965 5057 5149 5241 5333 5425 5517 5609 5701 5793 5885 5977 6069 6161 6253 6345 6437 6529 6621 6713 6805 6897 6989 7081 7173 7265 7357 7449 7541 7633 7725 7817 7909 8001 8093 8185 8277 8369 8461 ]
+> [40] rcvbuf=[40 132 224 316 408 500 592 684 776 868 960 1052 1144 1236 1328 1420 1512 1604 1696 1788 1880 1972 2064 2156 2248 2340 2432 2524 2616 2708 2800 2892 2984 3076 3168 3260 3352 3444 3536 3628 3720 3812 3904 3996 4088 4180 4272 4364 4456 4548 4640 4732 4824 4916 5008 5100 5192 5284 5376 5468 5560 5652 5744 5836 5928 6020 6112 6204 6296 6388 6480 6572 6664 6756 6848 6940 7032 7124 7216 7308 7400 7492 7584 7676 7768 7860 7952 8044 8136 8228 8320 8412 ]
+> [32] rcvbuf=[32 124 216 308 400 492 584 676 768 860 952 1044 1136 1228 1320 1412 1504 1596 1688 1780 1872 1964 2056 2148 2240 2332 2424 2516 2608 2700 2792 2884 2976 3068 3160 3252 3344 3436 3528 3620 3712 3804 3896 3988 4080 4172 4264 4356 4448 4540 4632 4724 4816 4908 5000 5092 5184 5276 5368 5460 5552 5644 5736 5828 5920 6012 6104 6196 6288 6380 6472 6564 6656 6748 6840 6932 7024 7116 7208 7300 7392 7484 7576 7668 7760 7852 7944 8036 8128 8220 8312 8404 ]
+> [56] rcvbuf=[56 148 240 332 424 516 608 700 792 884 976 1068 1160 1252 1344 1436 1528 1620 1712 1804 1896 1988 2080 2172 2264 2356 2448 2540 2632 2724 2816 2908 3000 3092 3184 3276 3368 3460 3552 3644 3736 3828 3920 4012 4104 4196 4288 4380 4472 4564 4656 4748 4840 4932 5024 5116 5208 5300 5392 5484 5576 5668 5760 5852 5944 6036 6128 6220 6312 6404 6496 6588 6680 6772 6864 6956 7048 7140 7232 7324 7416 7508 7600 7692 7784 7876 7968 8060 8152 8244 8336 8428 ]
+> [48] rcvbuf=[48 140 232 324 416 508 600 692 784 876 968 1060 1152 1244 1336 1428 1520 1612 1704 1796 1888 1980 2072 2164 2256 2348 2440 2532 2624 2716 2808 2900 2992 3084 3176 3268 3360 3452 3544 3636 3728 3820 3912 4004 4096 4188 4280 4372 4464 4556 4648 4740 4832 4924 5016 5108 5200 5292 5384 5476 5568 5660 5752 5844 5936 6028 6120 6212 6304 6396 6488 6580 6672 6764 6856 6948 7040 7132 7224 7316 7408 7500 7592 7684 7776 7868 7960 8052 8144 8236 8328 8420 ]
+> [90] rcvbuf=[90 182 274 366 458 550 642 734 826 918 1010 1102 1194 1286 1378 1470 1562 1654 1746 1838 1930 2022 2114 2206 2298 2390 2482 2574 2666 2758 2850 2942 3034 3126 3218 3310 3402 3494 3586 3678 3770 3862 3954 4046 4138 4230 4322 4414 4506 4598 4690 4782 4874 4966 5058 5150 5242 5334 5426 5518 5610 5702 5794 5886 5978 6070 6162 6254 6346 6438 6530 6622 6714 6806 6898 6990 7082 7174 7266 7358 7450 7542 7634 7726 7818 7910 8002 8094 8186 8278 8370 8462 ]
+> [37] rcvbuf=[37 129 221 313 405 497 589 681 773 865 957 1049 1141 1233 1325 1417 1509 1601 1693 1785 1877 1969 2061 2153 2245 2337 2429 2521 2613 2705 2797 2889 2981 3073 3165 3257 3349 3441 3533 3625 3717 3809 3901 3993 4085 4177 4269 4361 4453 4545 4637 4729 4821 4913 5005 5097 5189 5281 5373 5465 5557 5649 5741 5833 5925 6017 6109 6201 6293 6385 6477 6569 6661 6753 6845 6937 7029 7121 7213 7305 7397 7489 7581 7673 7765 7857 7949 8041 8133 8225 8317 8409 ]
+> [39] rcvbuf=[39 131 223 315 407 499 591 683 775 867 959 1051 1143 1235 1327 1419 1511 1603 1695 1787 1879 1971 2063 2155 2247 2339 2431 2523 2615 2707 2799 2891 2983 3075 3167 3259 3351 3443 3535 3627 3719 3811 3903 3995 4087 4179 4271 4363 4455 4547 4639 4731 4823 4915 5007 5099 5191 5283 5375 5467 5559 5651 5743 5835 5927 6019 6111 6203 6295 6387 6479 6571 6663 6755 6847 6939 7031 7123 7215 7307 7399 7491 7583 7675 7767 7859 7951 8043 8135 8227 8319 8411 ]
+> [53] rcvbuf=[53 145 237 329 421 513 605 697 789 881 973 1065 1157 1249 1341 1433 1525 1617 1709 1801 1893 1985 2077 2169 2261 2353 2445 2537 2629 2721 2813 2905 2997 3089 3181 3273 3365 3457 3549 3641 3733 3825 3917 4009 4101 4193 4285 4377 4469 4561 4653 4745 4837 4929 5021 5113 5205 5297 5389 5481 5573 5665 5757 5849 5941 6033 6125 6217 6309 6401 6493 6585 6677 6769 6861 6953 7045 7137 7229 7321 7413 7505 7597 7689 7781 7873 7965 8057 8149 8241 8333 8425 ]
+> [55] rcvbuf=[55 147 239 331 423 515 607 699 791 883 975 1067 1159 1251 1343 1435 1527 1619 1711 1803 1895 1987 2079 2171 2263 2355 2447 2539 2631 2723 2815 2907 2999 3091 3183 3275 3367 3459 3551 3643 3735 3827 3919 4011 4103 4195 4287 4379 4471 4563 4655 4747 4839 4931 5023 5115 5207 5299 5391 5483 5575 5667 5759 5851 5943 6035 6127 6219 6311 6403 6495 6587 6679 6771 6863 6955 7047 7139 7231 7323 7415 7507 7599 7691 7783 7875 7967 8059 8151 8243 8335 8427 ]
+> [80] rcvbuf=[80 172 264 356 448 540 632 724 816 908 1000 1092 1184 1276 1368 1460 1552 1644 1736 1828 1920 2012 2104 2196 2288 2380 2472 2564 2656 2748 2840 2932 3024 3116 3208 3300 3392 3484 3576 3668 3760 3852 3944 4036 4128 4220 4312 4404 4496 4588 4680 4772 4864 4956 5048 5140 5232 5324 5416 5508 5600 5692 5784 5876 5968 6060 6152 6244 6336 6428 6520 6612 6704 6796 6888 6980 7072 7164 7256 7348 7440 7532 7624 7716 7808 7900 7992 8084 8176 8268 8360 8452 ]
+> [88] rcvbuf=[88 180 272 364 456 548 640 732 824 916 1008 1100 1192 1284 1376 1468 1560 1652 1744 1836 1928 2020 2112 2204 2296 2388 2480 2572 2664 2756 2848 2940 3032 3124 3216 3308 3400 3492 3584 3676 3768 3860 3952 4044 4136 4228 4320 4412 4504 4596 4688 4780 4872 4964 5056 5148 5240 5332 5424 5516 5608 5700 5792 5884 5976 6068 6160 6252 6344 6436 6528 6620 6712 6804 6896 6988 7080 7172 7264 7356 7448 7540 7632 7724 7816 7908 8000 8092 8184 8276 8368 8460 ]
+> [64] rcvbuf=[64 156 248 340 432 524 616 708 800 892 984 1076 1168 1260 1352 1444 1536 1628 1720 1812 1904 1996 2088 2180 2272 2364 2456 2548 2640 2732 2824 2916 3008 3100 3192 3284 3376 3468 3560 3652 3744 3836 3928 4020 4112 4204 4296 4388 4480 4572 4664 4756 4848 4940 5032 5124 5216 5308 5400 5492 5584 5676 5768 5860 5952 6044 6136 6228 6320 6412 6504 6596 6688 6780 6872 6964 7056 7148 7240 7332 7424 7516 7608 7700 7792 7884 7976 8068 8160 8252 8344 8436 ]
+> [72] rcvbuf=[72 164 256 348 440 532 624 716 808 900 992 1084 1176 1268 1360 1452 1544 1636 1728 1820 1912 2004 2096 2188 2280 2372 2464 2556 2648 2740 2832 2924 3016 3108 3200 3292 3384 3476 3568 3660 3752 3844 3936 4028 4120 4212 4304 4396 4488 4580 4672 4764 4856 4948 5040 5132 5224 5316 5408 5500 5592 5684 5776 5868 5960 6052 6144 6236 6328 6420 6512 6604 6696 6788 6880 6972 7064 7156 7248 7340 7432 7524 7616 7708 7800 7892 7984 8076 8168 8260 8352 8444 ]
+> [28] rcvbuf=[28 120 212 304 396 488 580 672 764 856 948 1040 1132 1224 1316 1408 1500 1592 1684 1776 1868 1960 2052 2144 2236 2328 2420 2512 2604 2696 2788 2880 2972 3064 3156 3248 3340 3432 3524 3616 3708 3800 3892 3984 4076 4168 4260 4352 4444 4536 4628 4720 4812 4904 4996 5088 5180 5272 5364 5456 5548 5640 5732 5824 5916 6008 6100 6192 6284 6376 6468 6560 6652 6744 6836 6928 7020 7112 7204 7296 7388 7480 7572 7664 7756 7848 7940 8032 8124 8216 8308 8400 ]
+> [87] rcvbuf=[87 179 271 363 455 547 639 731 823 915 1007 1099 1191 1283 1375 1467 1559 1651 1743 1835 1927 2019 2111 2203 2295 2387 2479 2571 2663 2755 2847 2939 3031 3123 3215 3307 3399 3491 3583 3675 3767 3859 3951 4043 4135 4227 4319 4411 4503 4595 4687 4779 4871 4963 5055 5147 5239 5331 5423 5515 5607 5699 5791 5883 5975 6067 6159 6251 6343 6435 6527 6619 6711 6803 6895 6987 7079 7171 7263 7355 7447 7539 7631 7723 7815 7907 7999 8091 8183 8275 8367 8459 ]
+> [85] rcvbuf=[85 177 269 361 453 545 637 729 821 913 1005 1097 1189 1281 1373 1465 1557 1649 1741 1833 1925 2017 2109 2201 2293 2385 2477 2569 2661 2753 2845 2937 3029 3121 3213 3305 3397 3489 3581 3673 3765 3857 3949 4041 4133 4225 4317 4409 4501 4593 4685 4777 4869 4961 5053 5145 5237 5329 5421 5513 5605 5697 5789 5881 5973 6065 6157 6249 6341 6433 6525 6617 6709 6801 6893 6985 7077 7169 7261 7353 7445 7537 7629 7721 7813 7905 7997 8089 8181 8273 8365 8457 ]
+> [71] rcvbuf=[71 163 255 347 439 531 623 715 807 899 991 1083 1175 1267 1359 1451 1543 1635 1727 1819 1911 2003 2095 2187 2279 2371 2463 2555 2647 2739 2831 2923 3015 3107 3199 3291 3383 3475 3567 3659 3751 3843 3935 4027 4119 4211 4303 4395 4487 4579 4671 4763 4855 4947 5039 5131 5223 5315 5407 5499 5591 5683 5775 5867 5959 6051 6143 6235 6327 6419 6511 6603 6695 6787 6879 6971 7063 7155 7247 7339 7431 7523 7615 7707 7799 7891 7983 8075 8167 8259 8351 8443 ]
+> [69] rcvbuf=[69 161 253 345 437 529 621 713 805 897 989 1081 1173 1265 1357 1449 1541 1633 1725 1817 1909 2001 2093 2185 2277 2369 2461 2553 2645 2737 2829 2921 3013 3105 3197 3289 3381 3473 3565 3657 3749 3841 3933 4025 4117 4209 4301 4393 4485 4577 4669 4761 4853 4945 5037 5129 5221 5313 5405 5497 5589 5681 5773 5865 5957 6049 6141 6233 6325 6417 6509 6601 6693 6785 6877 6969 7061 7153 7245 7337 7429 7521 7613 7705 7797 7889 7981 8073 8165 8257 8349 8441 ]
+> [82] rcvbuf=[82 174 266 358 450 542 634 726 818 910 1002 1094 1186 1278 1370 1462 1554 1646 1738 1830 1922 2014 2106 2198 2290 2382 2474 2566 2658 2750 2842 2934 3026 3118 3210 3302 3394 3486 3578 3670 3762 3854 3946 4038 4130 4222 4314 4406 4498 4590 4682 4774 4866 4958 5050 5142 5234 5326 5418 5510 5602 5694 5786 5878 5970 6062 6154 6246 6338 6430 6522 6614 6706 6798 6890 6982 7074 7166 7258 7350 7442 7534 7626 7718 7810 7902 7994 8086 8178 8270 8362 8454 ]
+> [66] rcvbuf=[66 158 250 342 434 526 618 710 802 894 986 1078 1170 1262 1354 1446 1538 1630 1722 1814 1906 1998 2090 2182 2274 2366 2458 2550 2642 2734 2826 2918 3010 3102 3194 3286 3378 3470 3562 3654 3746 3838 3930 4022 4114 4206 4298 4390 4482 4574 4666 4758 4850 4942 5034 5126 5218 5310 5402 5494 5586 5678 5770 5862 5954 6046 6138 6230 6322 6414 6506 6598 6690 6782 6874 6966 7058 7150 7242 7334 7426 7518 7610 7702 7794 7886 7978 8070 8162 8254 8346 8438 ]
+> [75] rcvbuf=[75 167 259 351 443 535 627 719 811 903 995 1087 1179 1271 1363 1455 1547 1639 1731 1823 1915 2007 2099 2191 2283 2375 2467 2559 2651 2743 2835 2927 3019 3111 3203 3295 3387 3479 3571 3663 3755 3847 3939 4031 4123 4215 4307 4399 4491 4583 4675 4767 4859 4951 5043 5135 5227 5319 5411 5503 5595 5687 5779 5871 5963 6055 6147 6239 6331 6423 6515 6607 6699 6791 6883 6975 7067 7159 7251 7343 7435 7527 7619 7711 7803 7895 7987 8079 8171 8263 8355 8447 ]
+> [73] rcvbuf=[73 165 257 349 441 533 625 717 809 901 993 1085 1177 1269 1361 1453 1545 1637 1729 1821 1913 2005 2097 2189 2281 2373 2465 2557 2649 2741 2833 2925 3017 3109 3201 3293 3385 3477 3569 3661 3753 3845 3937 4029 4121 4213 4305 4397 4489 4581 4673 4765 4857 4949 5041 5133 5225 5317 5409 5501 5593 5685 5777 5869 5961 6053 6145 6237 6329 6421 6513 6605 6697 6789 6881 6973 7065 7157 7249 7341 7433 7525 7617 7709 7801 7893 7985 8077 8169 8261 8353 8445 ]
+> [79] rcvbuf=[79 171 263 355 447 539 631 723 815 907 999 1091 1183 1275 1367 1459 1551 1643 1735 1827 1919 2011 2103 2195 2287 2379 2471 2563 2655 2747 2839 2931 3023 3115 3207 3299 3391 3483 3575 3667 3759 3851 3943 4035 4127 4219 4311 4403 4495 4587 4679 4771 4863 4955 5047 5139 5231 5323 5415 5507 5599 5691 5783 5875 5967 6059 6151 6243 6335 6427 6519 6611 6703 6795 6887 6979 7071 7163 7255 7347 7439 7531 7623 7715 7807 7899 7991 8083 8175 8267 8359 8451 ]
+> [77] rcvbuf=[77 169 261 353 445 537 629 721 813 905 997 1089 1181 1273 1365 1457 1549 1641 1733 1825 1917 2009 2101 2193 2285 2377 2469 2561 2653 2745 2837 2929 3021 3113 3205 3297 3389 3481 3573 3665 3757 3849 3941 4033 4125 4217 4309 4401 4493 4585 4677 4769 4861 4953 5045 5137 5229 5321 5413 5505 5597 5689 5781 5873 5965 6057 6149 6241 6333 6425 6517 6609 6701 6793 6885 6977 7069 7161 7253 7345 7437 7529 7621 7713 7805 7897 7989 8081 8173 8265 8357 8449 ]
+> [86] rcvbuf=[86 178 270 362 454 546 638 730 822 914 1006 1098 1190 1282 1374 1466 1558 1650 1742 1834 1926 2018 2110 2202 2294 2386 2478 2570 2662 2754 2846 2938 3030 3122 3214 3306 3398 3490 3582 3674 3766 3858 3950 4042 4134 4226 4318 4410 4502 4594 4686 4778 4870 4962 5054 5146 5238 5330 5422 5514 5606 5698 5790 5882 5974 6066 6158 6250 6342 6434 6526 6618 6710 6802 6894 6986 7078 7170 7262 7354 7446 7538 7630 7722 7814 7906 7998 8090 8182 8274 8366 8458 ]
+> [84] rcvbuf=[84 176 268 360 452 544 636 728 820 912 1004 1096 1188 1280 1372 1464 1556 1648 1740 1832 1924 2016 2108 2200 2292 2384 2476 2568 2660 2752 2844 2936 3028 3120 3212 3304 3396 3488 3580 3672 3764 3856 3948 4040 4132 4224 4316 4408 4500 4592 4684 4776 4868 4960 5052 5144 5236 5328 5420 5512 5604 5696 5788 5880 5972 6064 6156 6248 6340 6432 6524 6616 6708 6800 6892 6984 7076 7168 7260 7352 7444 7536 7628 7720 7812 7904 7996 8088 8180 8272 8364 8456 ]
+> [70] rcvbuf=[70 162 254 346 438 530 622 714 806 898 990 1082 1174 1266 1358 1450 1542 1634 1726 1818 1910 2002 2094 2186 2278 2370 2462 2554 2646 2738 2830 2922 3014 3106 3198 3290 3382 3474 3566 3658 3750 3842 3934 4026 4118 4210 4302 4394 4486 4578 4670 4762 4854 4946 5038 5130 5222 5314 5406 5498 5590 5682 5774 5866 5958 6050 6142 6234 6326 6418 6510 6602 6694 6786 6878 6970 7062 7154 7246 7338 7430 7522 7614 7706 7798 7890 7982 8074 8166 8258 8350 8442 ]
+> [68] rcvbuf=[68 160 252 344 436 528 620 712 804 896 988 1080 1172 1264 1356 1448 1540 1632 1724 1816 1908 2000 2092 2184 2276 2368 2460 2552 2644 2736 2828 2920 3012 3104 3196 3288 3380 3472 3564 3656 3748 3840 3932 4024 4116 4208 4300 4392 4484 4576 4668 4760 4852 4944 5036 5128 5220 5312 5404 5496 5588 5680 5772 5864 5956 6048 6140 6232 6324 6416 6508 6600 6692 6784 6876 6968 7060 7152 7244 7336 7428 7520 7612 7704 7796 7888 7980 8072 8164 8256 8348 8440 ]
+> [34] rcvbuf=[34 126 218 310 402 494 586 678 770 862 954 1046 1138 1230 1322 1414 1506 1598 1690 1782 1874 1966 2058 2150 2242 2334 2426 2518 2610 2702 2794 2886 2978 3070 3162 3254 3346 3438 3530 3622 3714 3806 3898 3990 4082 4174 4266 4358 4450 4542 4634 4726 4818 4910 5002 5094 5186 5278 5370 5462 5554 5646 5738 5830 5922 6014 6106 6198 6290 6382 6474 6566 6658 6750 6842 6934 7026 7118 7210 7302 7394 7486 7578 7670 7762 7854 7946 8038 8130 8222 8314 8406 ]
+> [50] rcvbuf=[50 142 234 326 418 510 602 694 786 878 970 1062 1154 1246 1338 1430 1522 1614 1706 1798 1890 1982 2074 2166 2258 2350 2442 2534 2626 2718 2810 2902 2994 3086 3178 3270 3362 3454 3546 3638 3730 3822 3914 4006 4098 4190 4282 4374 4466 4558 4650 4742 4834 4926 5018 5110 5202 5294 5386 5478 5570 5662 5754 5846 5938 6030 6122 6214 6306 6398 6490 6582 6674 6766 6858 6950 7042 7134 7226 7318 7410 7502 7594 7686 7778 7870 7962 8054 8146 8238 8330 8422 ]
+> [74] rcvbuf=[74 166 258 350 442 534 626 718 810 902 994 1086 1178 1270 1362 1454 1546 1638 1730 1822 1914 2006 2098 2190 2282 2374 2466 2558 2650 2742 2834 2926 3018 3110 3202 3294 3386 3478 3570 3662 3754 3846 3938 4030 4122 4214 4306 4398 4490 4582 4674 4766 4858 4950 5042 5134 5226 5318 5410 5502 5594 5686 5778 5870 5962 6054 6146 6238 6330 6422 6514 6606 6698 6790 6882 6974 7066 7158 7250 7342 7434 7526 7618 7710 7802 7894 7986 8078 8170 8262 8354 8446 ]
+> [76] rcvbuf=[76 168 260 352 444 536 628 720 812 904 996 1088 1180 1272 1364 1456 1548 1640 1732 1824 1916 2008 2100 2192 2284 2376 2468 2560 2652 2744 2836 2928 3020 3112 3204 3296 3388 3480 3572 3664 3756 3848 3940 4032 4124 4216 4308 4400 4492 4584 4676 4768 4860 4952 5044 5136 5228 5320 5412 5504 5596 5688 5780 5872 5964 6056 6148 6240 6332 6424 6516 6608 6700 6792 6884 6976 7068 7160 7252 7344 7436 7528 7620 7712 7804 7896 7988 8080 8172 8264 8356 8448 ]
+> [78] rcvbuf=[78 170 262 354 446 538 630 722 814 906 998 1090 1182 1274 1366 1458 1550 1642 1734 1826 1918 2010 2102 2194 2286 2378 2470 2562 2654 2746 2838 2930 3022 3114 3206 3298 3390 3482 3574 3666 3758 3850 3942 4034 4126 4218 4310 4402 4494 4586 4678 4770 4862 4954 5046 5138 5230 5322 5414 5506 5598 5690 5782 5874 5966 6058 6150 6242 6334 6426 6518 6610 6702 6794 6886 6978 7070 7162 7254 7346 7438 7530 7622 7714 7806 7898 7990 8082 8174 8266 8358 8450 ]
+> [41] rcvbuf=[41 133 225 317 409 501 593 685 777 869 961 1053 1145 1237 1329 1421 1513 1605 1697 1789 1881 1973 2065 2157 2249 2341 2433 2525 2617 2709 2801 2893 2985 3077 3169 3261 3353 3445 3537 3629 3721 3813 3905 3997 4089 4181 4273 4365 4457 4549 4641 4733 4825 4917 5009 5101 5193 5285 5377 5469 5561 5653 5745 5837 5929 6021 6113 6205 6297 6389 6481 6573 6665 6757 6849 6941 7033 7125 7217 7309 7401 7493 7585 7677 7769 7861 7953 8045 8137 8229 8321 8413 ]
+> [43] rcvbuf=[43 135 227 319 411 503 595 687 779 871 963 1055 1147 1239 1331 1423 1515 1607 1699 1791 1883 1975 2067 2159 2251 2343 2435 2527 2619 2711 2803 2895 2987 3079 3171 3263 3355 3447 3539 3631 3723 3815 3907 3999 4091 4183 4275 4367 4459 4551 4643 4735 4827 4919 5011 5103 5195 5287 5379 5471 5563 5655 5747 5839 5931 6023 6115 6207 6299 6391 6483 6575 6667 6759 6851 6943 7035 7127 7219 7311 7403 7495 7587 7679 7771 7863 7955 8047 8139 8231 8323 8415 ]
+> [36] rcvbuf=[36 128 220 312 404 496 588 680 772 864 956 1048 1140 1232 1324 1416 1508 1600 1692 1784 1876 1968 2060 2152 2244 2336 2428 2520 2612 2704 2796 2888 2980 3072 3164 3256 3348 3440 3532 3624 3716 3808 3900 3992 4084 4176 4268 4360 4452 4544 4636 4728 4820 4912 5004 5096 5188 5280 5372 5464 5556 5648 5740 5832 5924 6016 6108 6200 6292 6384 6476 6568 6660 6752 6844 6936 7028 7120 7212 7304 7396 7488 7580 7672 7764 7856 7948 8040 8132 8224 8316 8408 ]
+> [38] rcvbuf=[38 130 222 314 406 498 590 682 774 866 958 1050 1142 1234 1326 1418 1510 1602 1694 1786 1878 1970 2062 2154 2246 2338 2430 2522 2614 2706 2798 2890 2982 3074 3166 3258 3350 3442 3534 3626 3718 3810 3902 3994 4086 4178 4270 4362 4454 4546 4638 4730 4822 4914 5006 5098 5190 5282 5374 5466 5558 5650 5742 5834 5926 6018 6110 6202 6294 6386 6478 6570 6662 6754 6846 6938 7030 7122 7214 7306 7398 7490 7582 7674 7766 7858 7950 8042 8134 8226 8318 8410 ]
+> [52] rcvbuf=[52 144 236 328 420 512 604 696 788 880 972 1064 1156 1248 1340 1432 1524 1616 1708 1800 1892 1984 2076 2168 2260 2352 2444 2536 2628 2720 2812 2904 2996 3088 3180 3272 3364 3456 3548 3640 3732 3824 3916 4008 4100 4192 4284 4376 4468 4560 4652 4744 4836 4928 5020 5112 5204 5296 5388 5480 5572 5664 5756 5848 5940 6032 6124 6216 6308 6400 6492 6584 6676 6768 6860 6952 7044 7136 7228 7320 7412 7504 7596 7688 7780 7872 7964 8056 8148 8240 8332 8424 ]
+> [54] rcvbuf=[54 146 238 330 422 514 606 698 790 882 974 1066 1158 1250 1342 1434 1526 1618 1710 1802 1894 1986 2078 2170 2262 2354 2446 2538 2630 2722 2814 2906 2998 3090 3182 3274 3366 3458 3550 3642 3734 3826 3918 4010 4102 4194 4286 4378 4470 4562 4654 4746 4838 4930 5022 5114 5206 5298 5390 5482 5574 5666 5758 5850 5942 6034 6126 6218 6310 6402 6494 6586 6678 6770 6862 6954 7046 7138 7230 7322 7414 7506 7598 7690 7782 7874 7966 8058 8150 8242 8334 8426 ]
+> [29] rcvbuf=[29 121 213 305 397 489 581 673 765 857 949 1041 1133 1225 1317 1409 1501 1593 1685 1777 1869 1961 2053 2145 2237 2329 2421 2513 2605 2697 2789 2881 2973 3065 3157 3249 3341 3433 3525 3617 3709 3801 3893 3985 4077 4169 4261 4353 4445 4537 4629 4721 4813 4905 4997 5089 5181 5273 5365 5457 5549 5641 5733 5825 5917 6009 6101 6193 6285 6377 6469 6561 6653 6745 6837 6929 7021 7113 7205 7297 7389 7481 7573 7665 7757 7849 7941 8033 8125 8217 8309 8401 ]
+> [31] rcvbuf=[31 123 215 307 399 491 583 675 767 859 951 1043 1135 1227 1319 1411 1503 1595 1687 1779 1871 1963 2055 2147 2239 2331 2423 2515 2607 2699 2791 2883 2975 3067 3159 3251 3343 3435 3527 3619 3711 3803 3895 3987 4079 4171 4263 4355 4447 4539 4631 4723 4815 4907 4999 5091 5183 5275 5367 5459 5551 5643 5735 5827 5919 6011 6103 6195 6287 6379 6471 6563 6655 6747 6839 6931 7023 7115 7207 7299 7391 7483 7575 7667 7759 7851 7943 8035 8127 8219 8311 8403 ]
+> [45] rcvbuf=[45 137 229 321 413 505 597 689 781 873 965 1057 1149 1241 1333 1425 1517 1609 1701 1793 1885 1977 2069 2161 2253 2345 2437 2529 2621 2713 2805 2897 2989 3081 3173 3265 3357 3449 3541 3633 3725 3817 3909 4001 4093 4185 4277 4369 4461 4553 4645 4737 4829 4921 5013 5105 5197 5289 5381 5473 5565 5657 5749 5841 5933 6025 6117 6209 6301 6393 6485 6577 6669 6761 6853 6945 7037 7129 7221 7313 7405 7497 7589 7681 7773 7865 7957 8049 8141 8233 8325 8417 ]
+> [47] rcvbuf=[47 139 231 323 415 507 599 691 783 875 967 1059 1151 1243 1335 1427 1519 1611 1703 1795 1887 1979 2071 2163 2255 2347 2439 2531 2623 2715 2807 2899 2991 3083 3175 3267 3359 3451 3543 3635 3727 3819 3911 4003 4095 4187 4279 4371 4463 4555 4647 4739 4831 4923 5015 5107 5199 5291 5383 5475 5567 5659 5751 5843 5935 6027 6119 6211 6303 6395 6487 6579 6671 6763 6855 6947 7039 7131 7223 7315 7407 7499 7591 7683 7775 7867 7959 8051 8143 8235 8327 8419 ]
+> [42] rcvbuf=[42 134 226 318 410 502 594 686 778 870 962 1054 1146 1238 1330 1422 1514 1606 1698 1790 1882 1974 2066 2158 2250 2342 2434 2526 2618 2710 2802 2894 2986 3078 3170 3262 3354 3446 3538 3630 3722 3814 3906 3998 4090 4182 4274 4366 4458 4550 4642 4734 4826 4918 5010 5102 5194 5286 5378 5470 5562 5654 5746 5838 5930 6022 6114 6206 6298 6390 6482 6574 6666 6758 6850 6942 7034 7126 7218 7310 7402 7494 7586 7678 7770 7862 7954 8046 8138 8230 8322 8414 ]
+> [44] rcvbuf=[44 136 228 320 412 504 596 688 780 872 964 1056 1148 1240 1332 1424 1516 1608 1700 1792 1884 1976 2068 2160 2252 2344 2436 2528 2620 2712 2804 2896 2988 3080 3172 3264 3356 3448 3540 3632 3724 3816 3908 4000 4092 4184 4276 4368 4460 4552 4644 4736 4828 4920 5012 5104 5196 5288 5380 5472 5564 5656 5748 5840 5932 6024 6116 6208 6300 6392 6484 6576 6668 6760 6852 6944 7036 7128 7220 7312 7404 7496 7588 7680 7772 7864 7956 8048 8140 8232 8324 8416 ]
+> [30] rcvbuf=[30 122 214 306 398 490 582 674 766 858 950 1042 1134 1226 1318 1410 1502 1594 1686 1778 1870 1962 2054 2146 2238 2330 2422 2514 2606 2698 2790 2882 2974 3066 3158 3250 3342 3434 3526 3618 3710 3802 3894 3986 4078 4170 4262 4354 4446 4538 4630 4722 4814 4906 4998 5090 5182 5274 5366 5458 5550 5642 5734 5826 5918 6010 6102 6194 6286 6378 6470 6562 6654 6746 6838 6930 7022 7114 7206 7298 7390 7482 7574 7666 7758 7850 7942 8034 8126 8218 8310 8402 ]
+> [46] rcvbuf=[46 138 230 322 414 506 598 690 782 874 966 1058 1150 1242 1334 1426 1518 1610 1702 1794 1886 1978 2070 2162 2254 2346 2438 2530 2622 2714 2806 2898 2990 3082 3174 3266 3358 3450 3542 3634 3726 3818 3910 4002 4094 4186 4278 4370 4462 4554 4646 4738 4830 4922 5014 5106 5198 5290 5382 5474 5566 5658 5750 5842 5934 6026 6118 6210 6302 6394 6486 6578 6670 6762 6854 6946 7038 7130 7222 7314 7406 7498 7590 7682 7774 7866 7958 8050 8142 8234 8326 8418 ]
+> [63] rcvbuf=[63 155 247 339 431 523 615 707 799 891 983 1075 1167 1259 1351 1443 1535 1627 1719 1811 1903 1995 2087 2179 2271 2363 2455 2547 2639 2731 2823 2915 3007 3099 3191 3283 3375 3467 3559 3651 3743 3835 3927 4019 4111 4203 4295 4387 4479 4571 4663 4755 4847 4939 5031 5123 5215 5307 5399 5491 5583 5675 5767 5859 5951 6043 6135 6227 6319 6411 6503 6595 6687 6779 6871 6963 7055 7147 7239 7331 7423 7515 7607 7699 7791 7883 7975 8067 8159 8251 8343 8435 ]
+> [61] rcvbuf=[61 153 245 337 429 521 613 705 797 889 981 1073 1165 1257 1349 1441 1533 1625 1717 1809 1901 1993 2085 2177 2269 2361 2453 2545 2637 2729 2821 2913 3005 3097 3189 3281 3373 3465 3557 3649 3741 3833 3925 4017 4109 4201 4293 4385 4477 4569 4661 4753 4845 4937 5029 5121 5213 5305 5397 5489 5581 5673 5765 5857 5949 6041 6133 6225 6317 6409 6501 6593 6685 6777 6869 6961 7053 7145 7237 7329 7421 7513 7605 7697 7789 7881 7973 8065 8157 8249 8341 8433 ]
+> [60] rcvbuf=[60 152 244 336 428 520 612 704 796 888 980 1072 1164 1256 1348 1440 1532 1624 1716 1808 1900 1992 2084 2176 2268 2360 2452 2544 2636 2728 2820 2912 3004 3096 3188 3280 3372 3464 3556 3648 3740 3832 3924 4016 4108 4200 4292 4384 4476 4568 4660 4752 4844 4936 5028 5120 5212 5304 5396 5488 5580 5672 5764 5856 5948 6040 6132 6224 6316 6408 6500 6592 6684 6776 6868 6960 7052 7144 7236 7328 7420 7512 7604 7696 7788 7880 7972 8064 8156 8248 8340 8432 ]
+> [62] rcvbuf=[62 154 246 338 430 522 614 706 798 890 982 1074 1166 1258 1350 1442 1534 1626 1718 1810 1902 1994 2086 2178 2270 2362 2454 2546 2638 2730 2822 2914 3006 3098 3190 3282 3374 3466 3558 3650 3742 3834 3926 4018 4110 4202 4294 4386 4478 4570 4662 4754 4846 4938 5030 5122 5214 5306 5398 5490 5582 5674 5766 5858 5950 6042 6134 6226 6318 6410 6502 6594 6686 6778 6870 6962 7054 7146 7238 7330 7422 7514 7606 7698 7790 7882 7974 8066 8158 8250 8342 8434 ]
+
index 90d07e8..b54076b 100644 (file)
@@ -73,5 +73,5 @@ int main(int argc, char *argv[])
   xbt_free(sb);
   xbt_free(rb);
   MPI_Finalize();
-  return (EXIT_SUCCESS);
+  return EXIT_SUCCESS;
 }
index 29b9bae..a309812 100644 (file)
@@ -3,22 +3,22 @@
 
 p Test all to all
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${bindir:=.}/../hostfile_coll -platform ${platfdir}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
 > [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ]
 > [1] sndbuf=[16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
 > [2] sndbuf=[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ]
diff --git a/teshsuite/smpi/coll-alltoall/griffon.tesh b/teshsuite/smpi/coll-alltoall/griffon.tesh
new file mode 100644 (file)
index 0000000..46aec20
--- /dev/null
@@ -0,0 +1,521 @@
+# Smpi Alltoall on various cluster files, with several routings
+! output sort
+
+p Test classic - backbone
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${bindir}/../hostfile_cluster -platform ${platfdir:=.}/cluster_backbone.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
+> [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
+> [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
+> [3] sndbuf=[36 37 38 39 40 41 42 43 44 45 46 47 ]
+> [4] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 ]
+> [5] sndbuf=[60 61 62 63 64 65 66 67 68 69 70 71 ]
+> [6] sndbuf=[72 73 74 75 76 77 78 79 80 81 82 83 ]
+> [7] sndbuf=[84 85 86 87 88 89 90 91 92 93 94 95 ]
+> [8] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 ]
+> [9] sndbuf=[108 109 110 111 112 113 114 115 116 117 118 119 ]
+> [10] sndbuf=[120 121 122 123 124 125 126 127 128 129 130 131 ]
+> [11] sndbuf=[132 133 134 135 136 137 138 139 140 141 142 143 ]
+> [0] rcvbuf=[0 12 24 36 48 60 72 84 96 108 120 132 ]
+> [10] rcvbuf=[10 22 34 46 58 70 82 94 106 118 130 142 ]
+> [11] rcvbuf=[11 23 35 47 59 71 83 95 107 119 131 143 ]
+> [8] rcvbuf=[8 20 32 44 56 68 80 92 104 116 128 140 ]
+> [3] rcvbuf=[3 15 27 39 51 63 75 87 99 111 123 135 ]
+> [2] rcvbuf=[2 14 26 38 50 62 74 86 98 110 122 134 ]
+> [6] rcvbuf=[6 18 30 42 54 66 78 90 102 114 126 138 ]
+> [7] rcvbuf=[7 19 31 43 55 67 79 91 103 115 127 139 ]
+> [4] rcvbuf=[4 16 28 40 52 64 76 88 100 112 124 136 ]
+> [9] rcvbuf=[9 21 33 45 57 69 81 93 105 117 129 141 ]
+> [5] rcvbuf=[5 17 29 41 53 65 77 89 101 113 125 137 ]
+> [1] rcvbuf=[1 13 25 37 49 61 73 85 97 109 121 133 ]
+
+! output sort
+p Test separate clusters
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -platform ${platfdir:=.}/cluster_multi.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.1core.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.1core.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.1core.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.1core.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.1core.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.1core.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.1core.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-0.2cores.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-1.2cores.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-2.2cores.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-3.2cores.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-4.2cores.org
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
+> [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
+> [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
+> [3] sndbuf=[36 37 38 39 40 41 42 43 44 45 46 47 ]
+> [4] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 ]
+> [5] sndbuf=[60 61 62 63 64 65 66 67 68 69 70 71 ]
+> [6] sndbuf=[72 73 74 75 76 77 78 79 80 81 82 83 ]
+> [7] sndbuf=[84 85 86 87 88 89 90 91 92 93 94 95 ]
+> [8] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 ]
+> [9] sndbuf=[108 109 110 111 112 113 114 115 116 117 118 119 ]
+> [10] sndbuf=[120 121 122 123 124 125 126 127 128 129 130 131 ]
+> [11] sndbuf=[132 133 134 135 136 137 138 139 140 141 142 143 ]
+> [0] rcvbuf=[0 12 24 36 48 60 72 84 96 108 120 132 ]
+> [10] rcvbuf=[10 22 34 46 58 70 82 94 106 118 130 142 ]
+> [11] rcvbuf=[11 23 35 47 59 71 83 95 107 119 131 143 ]
+> [8] rcvbuf=[8 20 32 44 56 68 80 92 104 116 128 140 ]
+> [3] rcvbuf=[3 15 27 39 51 63 75 87 99 111 123 135 ]
+> [2] rcvbuf=[2 14 26 38 50 62 74 86 98 110 122 134 ]
+> [6] rcvbuf=[6 18 30 42 54 66 78 90 102 114 126 138 ]
+> [7] rcvbuf=[7 19 31 43 55 67 79 91 103 115 127 139 ]
+> [4] rcvbuf=[4 16 28 40 52 64 76 88 100 112 124 136 ]
+> [9] rcvbuf=[9 21 33 45 57 69 81 93 105 117 129 141 ]
+> [5] rcvbuf=[5 17 29 41 53 65 77 89 101 113 125 137 ]
+> [1] rcvbuf=[1 13 25 37 49 61 73 85 97 109 121 133 ]
+
+! output sort
+p Test torus
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_cluster -platform ${platfdir:=.}/cluster_torus.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
+> [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
+> [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
+> [3] sndbuf=[36 37 38 39 40 41 42 43 44 45 46 47 ]
+> [4] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 ]
+> [5] sndbuf=[60 61 62 63 64 65 66 67 68 69 70 71 ]
+> [6] sndbuf=[72 73 74 75 76 77 78 79 80 81 82 83 ]
+> [7] sndbuf=[84 85 86 87 88 89 90 91 92 93 94 95 ]
+> [8] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 ]
+> [9] sndbuf=[108 109 110 111 112 113 114 115 116 117 118 119 ]
+> [10] sndbuf=[120 121 122 123 124 125 126 127 128 129 130 131 ]
+> [11] sndbuf=[132 133 134 135 136 137 138 139 140 141 142 143 ]
+> [0] rcvbuf=[0 12 24 36 48 60 72 84 96 108 120 132 ]
+> [10] rcvbuf=[10 22 34 46 58 70 82 94 106 118 130 142 ]
+> [11] rcvbuf=[11 23 35 47 59 71 83 95 107 119 131 143 ]
+> [8] rcvbuf=[8 20 32 44 56 68 80 92 104 116 128 140 ]
+> [3] rcvbuf=[3 15 27 39 51 63 75 87 99 111 123 135 ]
+> [2] rcvbuf=[2 14 26 38 50 62 74 86 98 110 122 134 ]
+> [6] rcvbuf=[6 18 30 42 54 66 78 90 102 114 126 138 ]
+> [7] rcvbuf=[7 19 31 43 55 67 79 91 103 115 127 139 ]
+> [4] rcvbuf=[4 16 28 40 52 64 76 88 100 112 124 136 ]
+> [9] rcvbuf=[9 21 33 45 57 69 81 93 105 117 129 141 ]
+> [5] rcvbuf=[5 17 29 41 53 65 77 89 101 113 125 137 ]
+> [1] rcvbuf=[1 13 25 37 49 61 73 85 97 109 121 133 ]
+
+! output sort
+p Test fat tree
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_cluster -platform ${platfdir:=.}/cluster_fat_tree.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
+> [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
+> [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
+> [3] sndbuf=[36 37 38 39 40 41 42 43 44 45 46 47 ]
+> [4] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 ]
+> [5] sndbuf=[60 61 62 63 64 65 66 67 68 69 70 71 ]
+> [6] sndbuf=[72 73 74 75 76 77 78 79 80 81 82 83 ]
+> [7] sndbuf=[84 85 86 87 88 89 90 91 92 93 94 95 ]
+> [8] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 ]
+> [9] sndbuf=[108 109 110 111 112 113 114 115 116 117 118 119 ]
+> [10] sndbuf=[120 121 122 123 124 125 126 127 128 129 130 131 ]
+> [11] sndbuf=[132 133 134 135 136 137 138 139 140 141 142 143 ]
+> [0] rcvbuf=[0 12 24 36 48 60 72 84 96 108 120 132 ]
+> [10] rcvbuf=[10 22 34 46 58 70 82 94 106 118 130 142 ]
+> [11] rcvbuf=[11 23 35 47 59 71 83 95 107 119 131 143 ]
+> [8] rcvbuf=[8 20 32 44 56 68 80 92 104 116 128 140 ]
+> [3] rcvbuf=[3 15 27 39 51 63 75 87 99 111 123 135 ]
+> [2] rcvbuf=[2 14 26 38 50 62 74 86 98 110 122 134 ]
+> [6] rcvbuf=[6 18 30 42 54 66 78 90 102 114 126 138 ]
+> [7] rcvbuf=[7 19 31 43 55 67 79 91 103 115 127 139 ]
+> [4] rcvbuf=[4 16 28 40 52 64 76 88 100 112 124 136 ]
+> [9] rcvbuf=[9 21 33 45 57 69 81 93 105 117 129 141 ]
+> [5] rcvbuf=[5 17 29 41 53 65 77 89 101 113 125 137 ]
+> [1] rcvbuf=[1 13 25 37 49 61 73 85 97 109 121 133 ]
+
+! output sort
+p Test fat tree IB
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_cluster -platform ${platfdir:=.}/cluster_fat_tree.xml -np 12 --cfg=network/model:IB --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
+> [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
+> [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
+> [3] sndbuf=[36 37 38 39 40 41 42 43 44 45 46 47 ]
+> [4] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 ]
+> [5] sndbuf=[60 61 62 63 64 65 66 67 68 69 70 71 ]
+> [6] sndbuf=[72 73 74 75 76 77 78 79 80 81 82 83 ]
+> [7] sndbuf=[84 85 86 87 88 89 90 91 92 93 94 95 ]
+> [8] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 ]
+> [9] sndbuf=[108 109 110 111 112 113 114 115 116 117 118 119 ]
+> [10] sndbuf=[120 121 122 123 124 125 126 127 128 129 130 131 ]
+> [11] sndbuf=[132 133 134 135 136 137 138 139 140 141 142 143 ]
+> [0] rcvbuf=[0 12 24 36 48 60 72 84 96 108 120 132 ]
+> [10] rcvbuf=[10 22 34 46 58 70 82 94 106 118 130 142 ]
+> [11] rcvbuf=[11 23 35 47 59 71 83 95 107 119 131 143 ]
+> [8] rcvbuf=[8 20 32 44 56 68 80 92 104 116 128 140 ]
+> [3] rcvbuf=[3 15 27 39 51 63 75 87 99 111 123 135 ]
+> [2] rcvbuf=[2 14 26 38 50 62 74 86 98 110 122 134 ]
+> [6] rcvbuf=[6 18 30 42 54 66 78 90 102 114 126 138 ]
+> [7] rcvbuf=[7 19 31 43 55 67 79 91 103 115 127 139 ]
+> [4] rcvbuf=[4 16 28 40 52 64 76 88 100 112 124 136 ]
+> [9] rcvbuf=[9 21 33 45 57 69 81 93 105 117 129 141 ]
+> [5] rcvbuf=[5 17 29 41 53 65 77 89 101 113 125 137 ]
+> [1] rcvbuf=[1 13 25 37 49 61 73 85 97 109 121 133 ]
+
+! output sort
+p Test Dragonfly
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_cluster -platform ${platfdir:=.}/cluster_dragonfly.xml -np 12 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> node-0.simgrid.org
+> [0.000000] [smpi/INFO] [rank 1] -> node-1.simgrid.org
+> [0.000000] [smpi/INFO] [rank 2] -> node-2.simgrid.org
+> [0.000000] [smpi/INFO] [rank 3] -> node-3.simgrid.org
+> [0.000000] [smpi/INFO] [rank 4] -> node-4.simgrid.org
+> [0.000000] [smpi/INFO] [rank 5] -> node-5.simgrid.org
+> [0.000000] [smpi/INFO] [rank 6] -> node-6.simgrid.org
+> [0.000000] [smpi/INFO] [rank 7] -> node-7.simgrid.org
+> [0.000000] [smpi/INFO] [rank 8] -> node-8.simgrid.org
+> [0.000000] [smpi/INFO] [rank 9] -> node-9.simgrid.org
+> [0.000000] [smpi/INFO] [rank 10] -> node-10.simgrid.org
+> [0.000000] [smpi/INFO] [rank 11] -> node-11.simgrid.org
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 ]
+> [1] sndbuf=[12 13 14 15 16 17 18 19 20 21 22 23 ]
+> [2] sndbuf=[24 25 26 27 28 29 30 31 32 33 34 35 ]
+> [3] sndbuf=[36 37 38 39 40 41 42 43 44 45 46 47 ]
+> [4] sndbuf=[48 49 50 51 52 53 54 55 56 57 58 59 ]
+> [5] sndbuf=[60 61 62 63 64 65 66 67 68 69 70 71 ]
+> [6] sndbuf=[72 73 74 75 76 77 78 79 80 81 82 83 ]
+> [7] sndbuf=[84 85 86 87 88 89 90 91 92 93 94 95 ]
+> [8] sndbuf=[96 97 98 99 100 101 102 103 104 105 106 107 ]
+> [9] sndbuf=[108 109 110 111 112 113 114 115 116 117 118 119 ]
+> [10] sndbuf=[120 121 122 123 124 125 126 127 128 129 130 131 ]
+> [11] sndbuf=[132 133 134 135 136 137 138 139 140 141 142 143 ]
+> [0] rcvbuf=[0 12 24 36 48 60 72 84 96 108 120 132 ]
+> [10] rcvbuf=[10 22 34 46 58 70 82 94 106 118 130 142 ]
+> [11] rcvbuf=[11 23 35 47 59 71 83 95 107 119 131 143 ]
+> [8] rcvbuf=[8 20 32 44 56 68 80 92 104 116 128 140 ]
+> [3] rcvbuf=[3 15 27 39 51 63 75 87 99 111 123 135 ]
+> [2] rcvbuf=[2 14 26 38 50 62 74 86 98 110 122 134 ]
+> [6] rcvbuf=[6 18 30 42 54 66 78 90 102 114 126 138 ]
+> [7] rcvbuf=[7 19 31 43 55 67 79 91 103 115 127 139 ]
+> [4] rcvbuf=[4 16 28 40 52 64 76 88 100 112 124 136 ]
+> [9] rcvbuf=[9 21 33 45 57 69 81 93 105 117 129 141 ]
+> [5] rcvbuf=[5 17 29 41 53 65 77 89 101 113 125 137 ]
+> [1] rcvbuf=[1 13 25 37 49 61 73 85 97 109 121 133 ]
+
+! output sort
+p Test Griffon
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_griffon -platform ${platfdir:=.}/griffon.xml -np 92 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoall -q --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
+> [0.000000] [smpi/INFO] [rank 0] -> griffon-1.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 1] -> griffon-2.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 2] -> griffon-3.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 3] -> griffon-4.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 4] -> griffon-5.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 5] -> griffon-6.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 6] -> griffon-7.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 7] -> griffon-8.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 8] -> griffon-9.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 9] -> griffon-10.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 10] -> griffon-11.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 11] -> griffon-12.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 12] -> griffon-13.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 13] -> griffon-14.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 14] -> griffon-15.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 15] -> griffon-16.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 16] -> griffon-17.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 17] -> griffon-18.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 18] -> griffon-19.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 19] -> griffon-20.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 20] -> griffon-21.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 21] -> griffon-22.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 22] -> griffon-23.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 23] -> griffon-24.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 24] -> griffon-25.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 25] -> griffon-26.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 26] -> griffon-27.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 27] -> griffon-28.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 28] -> griffon-29.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 29] -> griffon-30.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 30] -> griffon-31.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 31] -> griffon-32.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 32] -> griffon-33.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 33] -> griffon-34.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 34] -> griffon-35.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 35] -> griffon-36.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 36] -> griffon-37.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 37] -> griffon-38.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 38] -> griffon-39.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 39] -> griffon-40.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 40] -> griffon-41.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 41] -> griffon-42.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 42] -> griffon-43.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 43] -> griffon-44.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 44] -> griffon-45.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 45] -> griffon-46.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 46] -> griffon-47.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 47] -> griffon-48.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 48] -> griffon-49.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 49] -> griffon-50.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 50] -> griffon-51.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 51] -> griffon-52.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 52] -> griffon-53.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 53] -> griffon-54.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 54] -> griffon-55.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 55] -> griffon-56.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 56] -> griffon-57.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 57] -> griffon-58.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 58] -> griffon-59.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 59] -> griffon-60.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 60] -> griffon-61.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 61] -> griffon-62.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 62] -> griffon-63.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 63] -> griffon-64.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 64] -> griffon-65.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 65] -> griffon-66.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 66] -> griffon-67.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 67] -> griffon-68.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 68] -> griffon-69.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 69] -> griffon-70.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 70] -> griffon-71.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 71] -> griffon-72.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 72] -> griffon-73.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 73] -> griffon-74.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 74] -> griffon-75.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 75] -> griffon-76.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 76] -> griffon-77.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 77] -> griffon-78.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 78] -> griffon-79.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 79] -> griffon-80.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 80] -> griffon-81.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 81] -> griffon-82.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 82] -> griffon-83.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 83] -> griffon-84.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 84] -> griffon-85.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 85] -> griffon-86.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 86] -> griffon-87.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 87] -> griffon-88.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 88] -> griffon-89.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 89] -> griffon-90.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 90] -> griffon-91.nancy.grid5000.fr
+> [0.000000] [smpi/INFO] [rank 91] -> griffon-92.nancy.grid5000.fr
+> [0] sndbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 ]
+> [1] sndbuf=[92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 ]
+> [2] sndbuf=[184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 ]
+> [3] sndbuf=[276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 ]
+> [4] sndbuf=[368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 ]
+> [5] sndbuf=[460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 ]
+> [6] sndbuf=[552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 ]
+> [7] sndbuf=[644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 ]
+> [8] sndbuf=[736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 ]
+> [9] sndbuf=[828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 ]
+> [10] sndbuf=[920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 ]
+> [11] sndbuf=[1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 ]
+> [12] sndbuf=[1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 ]
+> [13] sndbuf=[1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 ]
+> [14] sndbuf=[1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 ]
+> [15] sndbuf=[1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 ]
+> [16] sndbuf=[1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 ]
+> [17] sndbuf=[1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 ]
+> [18] sndbuf=[1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 ]
+> [19] sndbuf=[1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 ]
+> [20] sndbuf=[1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 ]
+> [21] sndbuf=[1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 ]
+> [22] sndbuf=[2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 ]
+> [23] sndbuf=[2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 ]
+> [24] sndbuf=[2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 ]
+> [25] sndbuf=[2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 ]
+> [26] sndbuf=[2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 ]
+> [27] sndbuf=[2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 ]
+> [28] sndbuf=[2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 ]
+> [29] sndbuf=[2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 ]
+> [30] sndbuf=[2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 ]
+> [31] sndbuf=[2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 ]
+> [32] sndbuf=[2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 ]
+> [33] sndbuf=[3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 ]
+> [34] sndbuf=[3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 ]
+> [35] sndbuf=[3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 ]
+> [36] sndbuf=[3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 ]
+> [37] sndbuf=[3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 ]
+> [38] sndbuf=[3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 ]
+> [39] sndbuf=[3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 ]
+> [40] sndbuf=[3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 ]
+> [41] sndbuf=[3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 ]
+> [42] sndbuf=[3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 ]
+> [43] sndbuf=[3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 ]
+> [44] sndbuf=[4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 ]
+> [45] sndbuf=[4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 ]
+> [46] sndbuf=[4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 ]
+> [47] sndbuf=[4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 ]
+> [48] sndbuf=[4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 ]
+> [49] sndbuf=[4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 ]
+> [50] sndbuf=[4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 ]
+> [51] sndbuf=[4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 ]
+> [52] sndbuf=[4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 ]
+> [53] sndbuf=[4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 ]
+> [54] sndbuf=[4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 ]
+> [55] sndbuf=[5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 ]
+> [56] sndbuf=[5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 ]
+> [57] sndbuf=[5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 ]
+> [58] sndbuf=[5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 ]
+> [59] sndbuf=[5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 ]
+> [60] sndbuf=[5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 ]
+> [61] sndbuf=[5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 ]
+> [62] sndbuf=[5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 ]
+> [63] sndbuf=[5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 ]
+> [64] sndbuf=[5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 ]
+> [65] sndbuf=[5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 ]
+> [66] sndbuf=[6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 ]
+> [67] sndbuf=[6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 ]
+> [68] sndbuf=[6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 ]
+> [69] sndbuf=[6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 ]
+> [70] sndbuf=[6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 ]
+> [71] sndbuf=[6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 ]
+> [72] sndbuf=[6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 ]
+> [73] sndbuf=[6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 ]
+> [74] sndbuf=[6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 ]
+> [75] sndbuf=[6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 ]
+> [76] sndbuf=[6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 ]
+> [77] sndbuf=[7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 ]
+> [78] sndbuf=[7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 ]
+> [79] sndbuf=[7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 ]
+> [80] sndbuf=[7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 ]
+> [81] sndbuf=[7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 ]
+> [82] sndbuf=[7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 ]
+> [83] sndbuf=[7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 ]
+> [84] sndbuf=[7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 ]
+> [85] sndbuf=[7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 ]
+> [86] sndbuf=[7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 ]
+> [87] sndbuf=[8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 ]
+> [88] sndbuf=[8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 ]
+> [89] sndbuf=[8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 ]
+> [90] sndbuf=[8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 ]
+> [91] sndbuf=[8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 ]
+> [19] rcvbuf=[19 111 203 295 387 479 571 663 755 847 939 1031 1123 1215 1307 1399 1491 1583 1675 1767 1859 1951 2043 2135 2227 2319 2411 2503 2595 2687 2779 2871 2963 3055 3147 3239 3331 3423 3515 3607 3699 3791 3883 3975 4067 4159 4251 4343 4435 4527 4619 4711 4803 4895 4987 5079 5171 5263 5355 5447 5539 5631 5723 5815 5907 5999 6091 6183 6275 6367 6459 6551 6643 6735 6827 6919 7011 7103 7195 7287 7379 7471 7563 7655 7747 7839 7931 8023 8115 8207 8299 8391 ]
+> [17] rcvbuf=[17 109 201 293 385 477 569 661 753 845 937 1029 1121 1213 1305 1397 1489 1581 1673 1765 1857 1949 2041 2133 2225 2317 2409 2501 2593 2685 2777 2869 2961 3053 3145 3237 3329 3421 3513 3605 3697 3789 3881 3973 4065 4157 4249 4341 4433 4525 4617 4709 4801 4893 4985 5077 5169 5261 5353 5445 5537 5629 5721 5813 5905 5997 6089 6181 6273 6365 6457 6549 6641 6733 6825 6917 7009 7101 7193 7285 7377 7469 7561 7653 7745 7837 7929 8021 8113 8205 8297 8389 ]
+> [3] rcvbuf=[3 95 187 279 371 463 555 647 739 831 923 1015 1107 1199 1291 1383 1475 1567 1659 1751 1843 1935 2027 2119 2211 2303 2395 2487 2579 2671 2763 2855 2947 3039 3131 3223 3315 3407 3499 3591 3683 3775 3867 3959 4051 4143 4235 4327 4419 4511 4603 4695 4787 4879 4971 5063 5155 5247 5339 5431 5523 5615 5707 5799 5891 5983 6075 6167 6259 6351 6443 6535 6627 6719 6811 6903 6995 7087 7179 7271 7363 7455 7547 7639 7731 7823 7915 8007 8099 8191 8283 8375 ]
+> [1] rcvbuf=[1 93 185 277 369 461 553 645 737 829 921 1013 1105 1197 1289 1381 1473 1565 1657 1749 1841 1933 2025 2117 2209 2301 2393 2485 2577 2669 2761 2853 2945 3037 3129 3221 3313 3405 3497 3589 3681 3773 3865 3957 4049 4141 4233 4325 4417 4509 4601 4693 4785 4877 4969 5061 5153 5245 5337 5429 5521 5613 5705 5797 5889 5981 6073 6165 6257 6349 6441 6533 6625 6717 6809 6901 6993 7085 7177 7269 7361 7453 7545 7637 7729 7821 7913 8005 8097 8189 8281 8373 ]
+> [27] rcvbuf=[27 119 211 303 395 487 579 671 763 855 947 1039 1131 1223 1315 1407 1499 1591 1683 1775 1867 1959 2051 2143 2235 2327 2419 2511 2603 2695 2787 2879 2971 3063 3155 3247 3339 3431 3523 3615 3707 3799 3891 3983 4075 4167 4259 4351 4443 4535 4627 4719 4811 4903 4995 5087 5179 5271 5363 5455 5547 5639 5731 5823 5915 6007 6099 6191 6283 6375 6467 6559 6651 6743 6835 6927 7019 7111 7203 7295 7387 7479 7571 7663 7755 7847 7939 8031 8123 8215 8307 8399 ]
+> [25] rcvbuf=[25 117 209 301 393 485 577 669 761 853 945 1037 1129 1221 1313 1405 1497 1589 1681 1773 1865 1957 2049 2141 2233 2325 2417 2509 2601 2693 2785 2877 2969 3061 3153 3245 3337 3429 3521 3613 3705 3797 3889 3981 4073 4165 4257 4349 4441 4533 4625 4717 4809 4901 4993 5085 5177 5269 5361 5453 5545 5637 5729 5821 5913 6005 6097 6189 6281 6373 6465 6557 6649 6741 6833 6925 7017 7109 7201 7293 7385 7477 7569 7661 7753 7845 7937 8029 8121 8213 8305 8397 ]
+> [26] rcvbuf=[26 118 210 302 394 486 578 670 762 854 946 1038 1130 1222 1314 1406 1498 1590 1682 1774 1866 1958 2050 2142 2234 2326 2418 2510 2602 2694 2786 2878 2970 3062 3154 3246 3338 3430 3522 3614 3706 3798 3890 3982 4074 4166 4258 4350 4442 4534 4626 4718 4810 4902 4994 5086 5178 5270 5362 5454 5546 5638 5730 5822 5914 6006 6098 6190 6282 6374 6466 6558 6650 6742 6834 6926 7018 7110 7202 7294 7386 7478 7570 7662 7754 7846 7938 8030 8122 8214 8306 8398 ]
+> [16] rcvbuf=[16 108 200 292 384 476 568 660 752 844 936 1028 1120 1212 1304 1396 1488 1580 1672 1764 1856 1948 2040 2132 2224 2316 2408 2500 2592 2684 2776 2868 2960 3052 3144 3236 3328 3420 3512 3604 3696 3788 3880 3972 4064 4156 4248 4340 4432 4524 4616 4708 4800 4892 4984 5076 5168 5260 5352 5444 5536 5628 5720 5812 5904 5996 6088 6180 6272 6364 6456 6548 6640 6732 6824 6916 7008 7100 7192 7284 7376 7468 7560 7652 7744 7836 7928 8020 8112 8204 8296 8388 ]
+> [24] rcvbuf=[24 116 208 300 392 484 576 668 760 852 944 1036 1128 1220 1312 1404 1496 1588 1680 1772 1864 1956 2048 2140 2232 2324 2416 2508 2600 2692 2784 2876 2968 3060 3152 3244 3336 3428 3520 3612 3704 3796 3888 3980 4072 4164 4256 4348 4440 4532 4624 4716 4808 4900 4992 5084 5176 5268 5360 5452 5544 5636 5728 5820 5912 6004 6096 6188 6280 6372 6464 6556 6648 6740 6832 6924 7016 7108 7200 7292 7384 7476 7568 7660 7752 7844 7936 8028 8120 8212 8304 8396 ]
+> [0] rcvbuf=[0 92 184 276 368 460 552 644 736 828 920 1012 1104 1196 1288 1380 1472 1564 1656 1748 1840 1932 2024 2116 2208 2300 2392 2484 2576 2668 2760 2852 2944 3036 3128 3220 3312 3404 3496 3588 3680 3772 3864 3956 4048 4140 4232 4324 4416 4508 4600 4692 4784 4876 4968 5060 5152 5244 5336 5428 5520 5612 5704 5796 5888 5980 6072 6164 6256 6348 6440 6532 6624 6716 6808 6900 6992 7084 7176 7268 7360 7452 7544 7636 7728 7820 7912 8004 8096 8188 8280 8372 ]
+> [8] rcvbuf=[8 100 192 284 376 468 560 652 744 836 928 1020 1112 1204 1296 1388 1480 1572 1664 1756 1848 1940 2032 2124 2216 2308 2400 2492 2584 2676 2768 2860 2952 3044 3136 3228 3320 3412 3504 3596 3688 3780 3872 3964 4056 4148 4240 4332 4424 4516 4608 4700 4792 4884 4976 5068 5160 5252 5344 5436 5528 5620 5712 5804 5896 5988 6080 6172 6264 6356 6448 6540 6632 6724 6816 6908 7000 7092 7184 7276 7368 7460 7552 7644 7736 7828 7920 8012 8104 8196 8288 8380 ]
+> [23] rcvbuf=[23 115 207 299 391 483 575 667 759 851 943 1035 1127 1219 1311 1403 1495 1587 1679 1771 1863 1955 2047 2139 2231 2323 2415 2507 2599 2691 2783 2875 2967 3059 3151 3243 3335 3427 3519 3611 3703 3795 3887 3979 4071 4163 4255 4347 4439 4531 4623 4715 4807 4899 4991 5083 5175 5267 5359 5451 5543 5635 5727 5819 5911 6003 6095 6187 6279 6371 6463 6555 6647 6739 6831 6923 7015 7107 7199 7291 7383 7475 7567 7659 7751 7843 7935 8027 8119 8211 8303 8395 ]
+> [21] rcvbuf=[21 113 205 297 389 481 573 665 757 849 941 1033 1125 1217 1309 1401 1493 1585 1677 1769 1861 1953 2045 2137 2229 2321 2413 2505 2597 2689 2781 2873 2965 3057 3149 3241 3333 3425 3517 3609 3701 3793 3885 3977 4069 4161 4253 4345 4437 4529 4621 4713 4805 4897 4989 5081 5173 5265 5357 5449 5541 5633 5725 5817 5909 6001 6093 6185 6277 6369 6461 6553 6645 6737 6829 6921 7013 7105 7197 7289 7381 7473 7565 7657 7749 7841 7933 8025 8117 8209 8301 8393 ]
+> [7] rcvbuf=[7 99 191 283 375 467 559 651 743 835 927 1019 1111 1203 1295 1387 1479 1571 1663 1755 1847 1939 2031 2123 2215 2307 2399 2491 2583 2675 2767 2859 2951 3043 3135 3227 3319 3411 3503 3595 3687 3779 3871 3963 4055 4147 4239 4331 4423 4515 4607 4699 4791 4883 4975 5067 5159 5251 5343 5435 5527 5619 5711 5803 5895 5987 6079 6171 6263 6355 6447 6539 6631 6723 6815 6907 6999 7091 7183 7275 7367 7459 7551 7643 7735 7827 7919 8011 8103 8195 8287 8379 ]
+> [5] rcvbuf=[5 97 189 281 373 465 557 649 741 833 925 1017 1109 1201 1293 1385 1477 1569 1661 1753 1845 1937 2029 2121 2213 2305 2397 2489 2581 2673 2765 2857 2949 3041 3133 3225 3317 3409 3501 3593 3685 3777 3869 3961 4053 4145 4237 4329 4421 4513 4605 4697 4789 4881 4973 5065 5157 5249 5341 5433 5525 5617 5709 5801 5893 5985 6077 6169 6261 6353 6445 6537 6629 6721 6813 6905 6997 7089 7181 7273 7365 7457 7549 7641 7733 7825 7917 8009 8101 8193 8285 8377 ]
+> [18] rcvbuf=[18 110 202 294 386 478 570 662 754 846 938 1030 1122 1214 1306 1398 1490 1582 1674 1766 1858 1950 2042 2134 2226 2318 2410 2502 2594 2686 2778 2870 2962 3054 3146 3238 3330 3422 3514 3606 3698 3790 3882 3974 4066 4158 4250 4342 4434 4526 4618 4710 4802 4894 4986 5078 5170 5262 5354 5446 5538 5630 5722 5814 5906 5998 6090 6182 6274 6366 6458 6550 6642 6734 6826 6918 7010 7102 7194 7286 7378 7470 7562 7654 7746 7838 7930 8022 8114 8206 8298 8390 ]
+> [2] rcvbuf=[2 94 186 278 370 462 554 646 738 830 922 1014 1106 1198 1290 1382 1474 1566 1658 1750 1842 1934 2026 2118 2210 2302 2394 2486 2578 2670 2762 2854 2946 3038 3130 3222 3314 3406 3498 3590 3682 3774 3866 3958 4050 4142 4234 4326 4418 4510 4602 4694 4786 4878 4970 5062 5154 5246 5338 5430 5522 5614 5706 5798 5890 5982 6074 6166 6258 6350 6442 6534 6626 6718 6810 6902 6994 7086 7178 7270 7362 7454 7546 7638 7730 7822 7914 8006 8098 8190 8282 8374 ]
+> [11] rcvbuf=[11 103 195 287 379 471 563 655 747 839 931 1023 1115 1207 1299 1391 1483 1575 1667 1759 1851 1943 2035 2127 2219 2311 2403 2495 2587 2679 2771 2863 2955 3047 3139 3231 3323 3415 3507 3599 3691 3783 3875 3967 4059 4151 4243 4335 4427 4519 4611 4703 4795 4887 4979 5071 5163 5255 5347 5439 5531 5623 5715 5807 5899 5991 6083 6175 6267 6359 6451 6543 6635 6727 6819 6911 7003 7095 7187 7279 7371 7463 7555 7647 7739 7831 7923 8015 8107 8199 8291 8383 ]
+> [9] rcvbuf=[9 101 193 285 377 469 561 653 745 837 929 1021 1113 1205 1297 1389 1481 1573 1665 1757 1849 1941 2033 2125 2217 2309 2401 2493 2585 2677 2769 2861 2953 3045 3137 3229 3321 3413 3505 3597 3689 3781 3873 3965 4057 4149 4241 4333 4425 4517 4609 4701 4793 4885 4977 5069 5161 5253 5345 5437 5529 5621 5713 5805 5897 5989 6081 6173 6265 6357 6449 6541 6633 6725 6817 6909 7001 7093 7185 7277 7369 7461 7553 7645 7737 7829 7921 8013 8105 8197 8289 8381 ]
+> [15] rcvbuf=[15 107 199 291 383 475 567 659 751 843 935 1027 1119 1211 1303 1395 1487 1579 1671 1763 1855 1947 2039 2131 2223 2315 2407 2499 2591 2683 2775 2867 2959 3051 3143 3235 3327 3419 3511 3603 3695 3787 3879 3971 4063 4155 4247 4339 4431 4523 4615 4707 4799 4891 4983 5075 5167 5259 5351 5443 5535 5627 5719 5811 5903 5995 6087 6179 6271 6363 6455 6547 6639 6731 6823 6915 7007 7099 7191 7283 7375 7467 7559 7651 7743 7835 7927 8019 8111 8203 8295 8387 ]
+> [13] rcvbuf=[13 105 197 289 381 473 565 657 749 841 933 1025 1117 1209 1301 1393 1485 1577 1669 1761 1853 1945 2037 2129 2221 2313 2405 2497 2589 2681 2773 2865 2957 3049 3141 3233 3325 3417 3509 3601 3693 3785 3877 3969 4061 4153 4245 4337 4429 4521 4613 4705 4797 4889 4981 5073 5165 5257 5349 5441 5533 5625 5717 5809 5901 5993 6085 6177 6269 6361 6453 6545 6637 6729 6821 6913 7005 7097 7189 7281 7373 7465 7557 7649 7741 7833 7925 8017 8109 8201 8293 8385 ]
+> [22] rcvbuf=[22 114 206 298 390 482 574 666 758 850 942 1034 1126 1218 1310 1402 1494 1586 1678 1770 1862 1954 2046 2138 2230 2322 2414 2506 2598 2690 2782 2874 2966 3058 3150 3242 3334 3426 3518 3610 3702 3794 3886 3978 4070 4162 4254 4346 4438 4530 4622 4714 4806 4898 4990 5082 5174 5266 5358 5450 5542 5634 5726 5818 5910 6002 6094 6186 6278 6370 6462 6554 6646 6738 6830 6922 7014 7106 7198 7290 7382 7474 7566 7658 7750 7842 7934 8026 8118 8210 8302 8394 ]
+> [20] rcvbuf=[20 112 204 296 388 480 572 664 756 848 940 1032 1124 1216 1308 1400 1492 1584 1676 1768 1860 1952 2044 2136 2228 2320 2412 2504 2596 2688 2780 2872 2964 3056 3148 3240 3332 3424 3516 3608 3700 3792 3884 3976 4068 4160 4252 4344 4436 4528 4620 4712 4804 4896 4988 5080 5172 5264 5356 5448 5540 5632 5724 5816 5908 6000 6092 6184 6276 6368 6460 6552 6644 6736 6828 6920 7012 7104 7196 7288 7380 7472 7564 7656 7748 7840 7932 8024 8116 8208 8300 8392 ]
+> [6] rcvbuf=[6 98 190 282 374 466 558 650 742 834 926 1018 1110 1202 1294 1386 1478 1570 1662 1754 1846 1938 2030 2122 2214 2306 2398 2490 2582 2674 2766 2858 2950 3042 3134 3226 3318 3410 3502 3594 3686 3778 3870 3962 4054 4146 4238 4330 4422 4514 4606 4698 4790 4882 4974 5066 5158 5250 5342 5434 5526 5618 5710 5802 5894 5986 6078 6170 6262 6354 6446 6538 6630 6722 6814 6906 6998 7090 7182 7274 7366 7458 7550 7642 7734 7826 7918 8010 8102 8194 8286 8378 ]
+> [4] rcvbuf=[4 96 188 280 372 464 556 648 740 832 924 1016 1108 1200 1292 1384 1476 1568 1660 1752 1844 1936 2028 2120 2212 2304 2396 2488 2580 2672 2764 2856 2948 3040 3132 3224 3316 3408 3500 3592 3684 3776 3868 3960 4052 4144 4236 4328 4420 4512 4604 4696 4788 4880 4972 5064 5156 5248 5340 5432 5524 5616 5708 5800 5892 5984 6076 6168 6260 6352 6444 6536 6628 6720 6812 6904 6996 7088 7180 7272 7364 7456 7548 7640 7732 7824 7916 8008 8100 8192 8284 8376 ]
+> [10] rcvbuf=[10 102 194 286 378 470 562 654 746 838 930 1022 1114 1206 1298 1390 1482 1574 1666 1758 1850 1942 2034 2126 2218 2310 2402 2494 2586 2678 2770 2862 2954 3046 3138 3230 3322 3414 3506 3598 3690 3782 3874 3966 4058 4150 4242 4334 4426 4518 4610 4702 4794 4886 4978 5070 5162 5254 5346 5438 5530 5622 5714 5806 5898 5990 6082 6174 6266 6358 6450 6542 6634 6726 6818 6910 7002 7094 7186 7278 7370 7462 7554 7646 7738 7830 7922 8014 8106 8198 8290 8382 ]
+> [14] rcvbuf=[14 106 198 290 382 474 566 658 750 842 934 1026 1118 1210 1302 1394 1486 1578 1670 1762 1854 1946 2038 2130 2222 2314 2406 2498 2590 2682 2774 2866 2958 3050 3142 3234 3326 3418 3510 3602 3694 3786 3878 3970 4062 4154 4246 4338 4430 4522 4614 4706 4798 4890 4982 5074 5166 5258 5350 5442 5534 5626 5718 5810 5902 5994 6086 6178 6270 6362 6454 6546 6638 6730 6822 6914 7006 7098 7190 7282 7374 7466 7558 7650 7742 7834 7926 8018 8110 8202 8294 8386 ]
+> [12] rcvbuf=[12 104 196 288 380 472 564 656 748 840 932 1024 1116 1208 1300 1392 1484 1576 1668 1760 1852 1944 2036 2128 2220 2312 2404 2496 2588 2680 2772 2864 2956 3048 3140 3232 3324 3416 3508 3600 3692 3784 3876 3968 4060 4152 4244 4336 4428 4520 4612 4704 4796 4888 4980 5072 5164 5256 5348 5440 5532 5624 5716 5808 5900 5992 6084 6176 6268 6360 6452 6544 6636 6728 6820 6912 7004 7096 7188 7280 7372 7464 7556 7648 7740 7832 7924 8016 8108 8200 8292 8384 ]
+> [83] rcvbuf=[83 175 267 359 451 543 635 727 819 911 1003 1095 1187 1279 1371 1463 1555 1647 1739 1831 1923 2015 2107 2199 2291 2383 2475 2567 2659 2751 2843 2935 3027 3119 3211 3303 3395 3487 3579 3671 3763 3855 3947 4039 4131 4223 4315 4407 4499 4591 4683 4775 4867 4959 5051 5143 5235 5327 5419 5511 5603 5695 5787 5879 5971 6063 6155 6247 6339 6431 6523 6615 6707 6799 6891 6983 7075 7167 7259 7351 7443 7535 7627 7719 7811 7903 7995 8087 8179 8271 8363 8455 ]
+> [81] rcvbuf=[81 173 265 357 449 541 633 725 817 909 1001 1093 1185 1277 1369 1461 1553 1645 1737 1829 1921 2013 2105 2197 2289 2381 2473 2565 2657 2749 2841 2933 3025 3117 3209 3301 3393 3485 3577 3669 3761 3853 3945 4037 4129 4221 4313 4405 4497 4589 4681 4773 4865 4957 5049 5141 5233 5325 5417 5509 5601 5693 5785 5877 5969 6061 6153 6245 6337 6429 6521 6613 6705 6797 6889 6981 7073 7165 7257 7349 7441 7533 7625 7717 7809 7901 7993 8085 8177 8269 8361 8453 ]
+> [67] rcvbuf=[67 159 251 343 435 527 619 711 803 895 987 1079 1171 1263 1355 1447 1539 1631 1723 1815 1907 1999 2091 2183 2275 2367 2459 2551 2643 2735 2827 2919 3011 3103 3195 3287 3379 3471 3563 3655 3747 3839 3931 4023 4115 4207 4299 4391 4483 4575 4667 4759 4851 4943 5035 5127 5219 5311 5403 5495 5587 5679 5771 5863 5955 6047 6139 6231 6323 6415 6507 6599 6691 6783 6875 6967 7059 7151 7243 7335 7427 7519 7611 7703 7795 7887 7979 8071 8163 8255 8347 8439 ]
+> [65] rcvbuf=[65 157 249 341 433 525 617 709 801 893 985 1077 1169 1261 1353 1445 1537 1629 1721 1813 1905 1997 2089 2181 2273 2365 2457 2549 2641 2733 2825 2917 3009 3101 3193 3285 3377 3469 3561 3653 3745 3837 3929 4021 4113 4205 4297 4389 4481 4573 4665 4757 4849 4941 5033 5125 5217 5309 5401 5493 5585 5677 5769 5861 5953 6045 6137 6229 6321 6413 6505 6597 6689 6781 6873 6965 7057 7149 7241 7333 7425 7517 7609 7701 7793 7885 7977 8069 8161 8253 8345 8437 ]
+> [57] rcvbuf=[57 149 241 333 425 517 609 701 793 885 977 1069 1161 1253 1345 1437 1529 1621 1713 1805 1897 1989 2081 2173 2265 2357 2449 2541 2633 2725 2817 2909 3001 3093 3185 3277 3369 3461 3553 3645 3737 3829 3921 4013 4105 4197 4289 4381 4473 4565 4657 4749 4841 4933 5025 5117 5209 5301 5393 5485 5577 5669 5761 5853 5945 6037 6129 6221 6313 6405 6497 6589 6681 6773 6865 6957 7049 7141 7233 7325 7417 7509 7601 7693 7785 7877 7969 8061 8153 8245 8337 8429 ]
+> [59] rcvbuf=[59 151 243 335 427 519 611 703 795 887 979 1071 1163 1255 1347 1439 1531 1623 1715 1807 1899 1991 2083 2175 2267 2359 2451 2543 2635 2727 2819 2911 3003 3095 3187 3279 3371 3463 3555 3647 3739 3831 3923 4015 4107 4199 4291 4383 4475 4567 4659 4751 4843 4935 5027 5119 5211 5303 5395 5487 5579 5671 5763 5855 5947 6039 6131 6223 6315 6407 6499 6591 6683 6775 6867 6959 7051 7143 7235 7327 7419 7511 7603 7695 7787 7879 7971 8063 8155 8247 8339 8431 ]
+> [33] rcvbuf=[33 125 217 309 401 493 585 677 769 861 953 1045 1137 1229 1321 1413 1505 1597 1689 1781 1873 1965 2057 2149 2241 2333 2425 2517 2609 2701 2793 2885 2977 3069 3161 3253 3345 3437 3529 3621 3713 3805 3897 3989 4081 4173 4265 4357 4449 4541 4633 4725 4817 4909 5001 5093 5185 5277 5369 5461 5553 5645 5737 5829 5921 6013 6105 6197 6289 6381 6473 6565 6657 6749 6841 6933 7025 7117 7209 7301 7393 7485 7577 7669 7761 7853 7945 8037 8129 8221 8313 8405 ]
+> [35] rcvbuf=[35 127 219 311 403 495 587 679 771 863 955 1047 1139 1231 1323 1415 1507 1599 1691 1783 1875 1967 2059 2151 2243 2335 2427 2519 2611 2703 2795 2887 2979 3071 3163 3255 3347 3439 3531 3623 3715 3807 3899 3991 4083 4175 4267 4359 4451 4543 4635 4727 4819 4911 5003 5095 5187 5279 5371 5463 5555 5647 5739 5831 5923 6015 6107 6199 6291 6383 6475 6567 6659 6751 6843 6935 7027 7119 7211 7303 7395 7487 7579 7671 7763 7855 7947 8039 8131 8223 8315 8407 ]
+> [49] rcvbuf=[49 141 233 325 417 509 601 693 785 877 969 1061 1153 1245 1337 1429 1521 1613 1705 1797 1889 1981 2073 2165 2257 2349 2441 2533 2625 2717 2809 2901 2993 3085 3177 3269 3361 3453 3545 3637 3729 3821 3913 4005 4097 4189 4281 4373 4465 4557 4649 4741 4833 4925 5017 5109 5201 5293 5385 5477 5569 5661 5753 5845 5937 6029 6121 6213 6305 6397 6489 6581 6673 6765 6857 6949 7041 7133 7225 7317 7409 7501 7593 7685 7777 7869 7961 8053 8145 8237 8329 8421 ]
+> [51] rcvbuf=[51 143 235 327 419 511 603 695 787 879 971 1063 1155 1247 1339 1431 1523 1615 1707 1799 1891 1983 2075 2167 2259 2351 2443 2535 2627 2719 2811 2903 2995 3087 3179 3271 3363 3455 3547 3639 3731 3823 3915 4007 4099 4191 4283 4375 4467 4559 4651 4743 4835 4927 5019 5111 5203 5295 5387 5479 5571 5663 5755 5847 5939 6031 6123 6215 6307 6399 6491 6583 6675 6767 6859 6951 7043 7135 7227 7319 7411 7503 7595 7687 7779 7871 7963 8055 8147 8239 8331 8423 ]
+> [58] rcvbuf=[58 150 242 334 426 518 610 702 794 886 978 1070 1162 1254 1346 1438 1530 1622 1714 1806 1898 1990 2082 2174 2266 2358 2450 2542 2634 2726 2818 2910 3002 3094 3186 3278 3370 3462 3554 3646 3738 3830 3922 4014 4106 4198 4290 4382 4474 4566 4658 4750 4842 4934 5026 5118 5210 5302 5394 5486 5578 5670 5762 5854 5946 6038 6130 6222 6314 6406 6498 6590 6682 6774 6866 6958 7050 7142 7234 7326 7418 7510 7602 7694 7786 7878 7970 8062 8154 8246 8338 8430 ]
+> [91] rcvbuf=[91 183 275 367 459 551 643 735 827 919 1011 1103 1195 1287 1379 1471 1563 1655 1747 1839 1931 2023 2115 2207 2299 2391 2483 2575 2667 2759 2851 2943 3035 3127 3219 3311 3403 3495 3587 3679 3771 3863 3955 4047 4139 4231 4323 4415 4507 4599 4691 4783 4875 4967 5059 5151 5243 5335 5427 5519 5611 5703 5795 5887 5979 6071 6163 6255 6347 6439 6531 6623 6715 6807 6899 6991 7083 7175 7267 7359 7451 7543 7635 7727 7819 7911 8003 8095 8187 8279 8371 8463 ]
+> [89] rcvbuf=[89 181 273 365 457 549 641 733 825 917 1009 1101 1193 1285 1377 1469 1561 1653 1745 1837 1929 2021 2113 2205 2297 2389 2481 2573 2665 2757 2849 2941 3033 3125 3217 3309 3401 3493 3585 3677 3769 3861 3953 4045 4137 4229 4321 4413 4505 4597 4689 4781 4873 4965 5057 5149 5241 5333 5425 5517 5609 5701 5793 5885 5977 6069 6161 6253 6345 6437 6529 6621 6713 6805 6897 6989 7081 7173 7265 7357 7449 7541 7633 7725 7817 7909 8001 8093 8185 8277 8369 8461 ]
+> [40] rcvbuf=[40 132 224 316 408 500 592 684 776 868 960 1052 1144 1236 1328 1420 1512 1604 1696 1788 1880 1972 2064 2156 2248 2340 2432 2524 2616 2708 2800 2892 2984 3076 3168 3260 3352 3444 3536 3628 3720 3812 3904 3996 4088 4180 4272 4364 4456 4548 4640 4732 4824 4916 5008 5100 5192 5284 5376 5468 5560 5652 5744 5836 5928 6020 6112 6204 6296 6388 6480 6572 6664 6756 6848 6940 7032 7124 7216 7308 7400 7492 7584 7676 7768 7860 7952 8044 8136 8228 8320 8412 ]
+> [32] rcvbuf=[32 124 216 308 400 492 584 676 768 860 952 1044 1136 1228 1320 1412 1504 1596 1688 1780 1872 1964 2056 2148 2240 2332 2424 2516 2608 2700 2792 2884 2976 3068 3160 3252 3344 3436 3528 3620 3712 3804 3896 3988 4080 4172 4264 4356 4448 4540 4632 4724 4816 4908 5000 5092 5184 5276 5368 5460 5552 5644 5736 5828 5920 6012 6104 6196 6288 6380 6472 6564 6656 6748 6840 6932 7024 7116 7208 7300 7392 7484 7576 7668 7760 7852 7944 8036 8128 8220 8312 8404 ]
+> [56] rcvbuf=[56 148 240 332 424 516 608 700 792 884 976 1068 1160 1252 1344 1436 1528 1620 1712 1804 1896 1988 2080 2172 2264 2356 2448 2540 2632 2724 2816 2908 3000 3092 3184 3276 3368 3460 3552 3644 3736 3828 3920 4012 4104 4196 4288 4380 4472 4564 4656 4748 4840 4932 5024 5116 5208 5300 5392 5484 5576 5668 5760 5852 5944 6036 6128 6220 6312 6404 6496 6588 6680 6772 6864 6956 7048 7140 7232 7324 7416 7508 7600 7692 7784 7876 7968 8060 8152 8244 8336 8428 ]
+> [48] rcvbuf=[48 140 232 324 416 508 600 692 784 876 968 1060 1152 1244 1336 1428 1520 1612 1704 1796 1888 1980 2072 2164 2256 2348 2440 2532 2624 2716 2808 2900 2992 3084 3176 3268 3360 3452 3544 3636 3728 3820 3912 4004 4096 4188 4280 4372 4464 4556 4648 4740 4832 4924 5016 5108 5200 5292 5384 5476 5568 5660 5752 5844 5936 6028 6120 6212 6304 6396 6488 6580 6672 6764 6856 6948 7040 7132 7224 7316 7408 7500 7592 7684 7776 7868 7960 8052 8144 8236 8328 8420 ]
+> [90] rcvbuf=[90 182 274 366 458 550 642 734 826 918 1010 1102 1194 1286 1378 1470 1562 1654 1746 1838 1930 2022 2114 2206 2298 2390 2482 2574 2666 2758 2850 2942 3034 3126 3218 3310 3402 3494 3586 3678 3770 3862 3954 4046 4138 4230 4322 4414 4506 4598 4690 4782 4874 4966 5058 5150 5242 5334 5426 5518 5610 5702 5794 5886 5978 6070 6162 6254 6346 6438 6530 6622 6714 6806 6898 6990 7082 7174 7266 7358 7450 7542 7634 7726 7818 7910 8002 8094 8186 8278 8370 8462 ]
+> [37] rcvbuf=[37 129 221 313 405 497 589 681 773 865 957 1049 1141 1233 1325 1417 1509 1601 1693 1785 1877 1969 2061 2153 2245 2337 2429 2521 2613 2705 2797 2889 2981 3073 3165 3257 3349 3441 3533 3625 3717 3809 3901 3993 4085 4177 4269 4361 4453 4545 4637 4729 4821 4913 5005 5097 5189 5281 5373 5465 5557 5649 5741 5833 5925 6017 6109 6201 6293 6385 6477 6569 6661 6753 6845 6937 7029 7121 7213 7305 7397 7489 7581 7673 7765 7857 7949 8041 8133 8225 8317 8409 ]
+> [39] rcvbuf=[39 131 223 315 407 499 591 683 775 867 959 1051 1143 1235 1327 1419 1511 1603 1695 1787 1879 1971 2063 2155 2247 2339 2431 2523 2615 2707 2799 2891 2983 3075 3167 3259 3351 3443 3535 3627 3719 3811 3903 3995 4087 4179 4271 4363 4455 4547 4639 4731 4823 4915 5007 5099 5191 5283 5375 5467 5559 5651 5743 5835 5927 6019 6111 6203 6295 6387 6479 6571 6663 6755 6847 6939 7031 7123 7215 7307 7399 7491 7583 7675 7767 7859 7951 8043 8135 8227 8319 8411 ]
+> [53] rcvbuf=[53 145 237 329 421 513 605 697 789 881 973 1065 1157 1249 1341 1433 1525 1617 1709 1801 1893 1985 2077 2169 2261 2353 2445 2537 2629 2721 2813 2905 2997 3089 3181 3273 3365 3457 3549 3641 3733 3825 3917 4009 4101 4193 4285 4377 4469 4561 4653 4745 4837 4929 5021 5113 5205 5297 5389 5481 5573 5665 5757 5849 5941 6033 6125 6217 6309 6401 6493 6585 6677 6769 6861 6953 7045 7137 7229 7321 7413 7505 7597 7689 7781 7873 7965 8057 8149 8241 8333 8425 ]
+> [55] rcvbuf=[55 147 239 331 423 515 607 699 791 883 975 1067 1159 1251 1343 1435 1527 1619 1711 1803 1895 1987 2079 2171 2263 2355 2447 2539 2631 2723 2815 2907 2999 3091 3183 3275 3367 3459 3551 3643 3735 3827 3919 4011 4103 4195 4287 4379 4471 4563 4655 4747 4839 4931 5023 5115 5207 5299 5391 5483 5575 5667 5759 5851 5943 6035 6127 6219 6311 6403 6495 6587 6679 6771 6863 6955 7047 7139 7231 7323 7415 7507 7599 7691 7783 7875 7967 8059 8151 8243 8335 8427 ]
+> [80] rcvbuf=[80 172 264 356 448 540 632 724 816 908 1000 1092 1184 1276 1368 1460 1552 1644 1736 1828 1920 2012 2104 2196 2288 2380 2472 2564 2656 2748 2840 2932 3024 3116 3208 3300 3392 3484 3576 3668 3760 3852 3944 4036 4128 4220 4312 4404 4496 4588 4680 4772 4864 4956 5048 5140 5232 5324 5416 5508 5600 5692 5784 5876 5968 6060 6152 6244 6336 6428 6520 6612 6704 6796 6888 6980 7072 7164 7256 7348 7440 7532 7624 7716 7808 7900 7992 8084 8176 8268 8360 8452 ]
+> [88] rcvbuf=[88 180 272 364 456 548 640 732 824 916 1008 1100 1192 1284 1376 1468 1560 1652 1744 1836 1928 2020 2112 2204 2296 2388 2480 2572 2664 2756 2848 2940 3032 3124 3216 3308 3400 3492 3584 3676 3768 3860 3952 4044 4136 4228 4320 4412 4504 4596 4688 4780 4872 4964 5056 5148 5240 5332 5424 5516 5608 5700 5792 5884 5976 6068 6160 6252 6344 6436 6528 6620 6712 6804 6896 6988 7080 7172 7264 7356 7448 7540 7632 7724 7816 7908 8000 8092 8184 8276 8368 8460 ]
+> [64] rcvbuf=[64 156 248 340 432 524 616 708 800 892 984 1076 1168 1260 1352 1444 1536 1628 1720 1812 1904 1996 2088 2180 2272 2364 2456 2548 2640 2732 2824 2916 3008 3100 3192 3284 3376 3468 3560 3652 3744 3836 3928 4020 4112 4204 4296 4388 4480 4572 4664 4756 4848 4940 5032 5124 5216 5308 5400 5492 5584 5676 5768 5860 5952 6044 6136 6228 6320 6412 6504 6596 6688 6780 6872 6964 7056 7148 7240 7332 7424 7516 7608 7700 7792 7884 7976 8068 8160 8252 8344 8436 ]
+> [72] rcvbuf=[72 164 256 348 440 532 624 716 808 900 992 1084 1176 1268 1360 1452 1544 1636 1728 1820 1912 2004 2096 2188 2280 2372 2464 2556 2648 2740 2832 2924 3016 3108 3200 3292 3384 3476 3568 3660 3752 3844 3936 4028 4120 4212 4304 4396 4488 4580 4672 4764 4856 4948 5040 5132 5224 5316 5408 5500 5592 5684 5776 5868 5960 6052 6144 6236 6328 6420 6512 6604 6696 6788 6880 6972 7064 7156 7248 7340 7432 7524 7616 7708 7800 7892 7984 8076 8168 8260 8352 8444 ]
+> [28] rcvbuf=[28 120 212 304 396 488 580 672 764 856 948 1040 1132 1224 1316 1408 1500 1592 1684 1776 1868 1960 2052 2144 2236 2328 2420 2512 2604 2696 2788 2880 2972 3064 3156 3248 3340 3432 3524 3616 3708 3800 3892 3984 4076 4168 4260 4352 4444 4536 4628 4720 4812 4904 4996 5088 5180 5272 5364 5456 5548 5640 5732 5824 5916 6008 6100 6192 6284 6376 6468 6560 6652 6744 6836 6928 7020 7112 7204 7296 7388 7480 7572 7664 7756 7848 7940 8032 8124 8216 8308 8400 ]
+> [87] rcvbuf=[87 179 271 363 455 547 639 731 823 915 1007 1099 1191 1283 1375 1467 1559 1651 1743 1835 1927 2019 2111 2203 2295 2387 2479 2571 2663 2755 2847 2939 3031 3123 3215 3307 3399 3491 3583 3675 3767 3859 3951 4043 4135 4227 4319 4411 4503 4595 4687 4779 4871 4963 5055 5147 5239 5331 5423 5515 5607 5699 5791 5883 5975 6067 6159 6251 6343 6435 6527 6619 6711 6803 6895 6987 7079 7171 7263 7355 7447 7539 7631 7723 7815 7907 7999 8091 8183 8275 8367 8459 ]
+> [85] rcvbuf=[85 177 269 361 453 545 637 729 821 913 1005 1097 1189 1281 1373 1465 1557 1649 1741 1833 1925 2017 2109 2201 2293 2385 2477 2569 2661 2753 2845 2937 3029 3121 3213 3305 3397 3489 3581 3673 3765 3857 3949 4041 4133 4225 4317 4409 4501 4593 4685 4777 4869 4961 5053 5145 5237 5329 5421 5513 5605 5697 5789 5881 5973 6065 6157 6249 6341 6433 6525 6617 6709 6801 6893 6985 7077 7169 7261 7353 7445 7537 7629 7721 7813 7905 7997 8089 8181 8273 8365 8457 ]
+> [71] rcvbuf=[71 163 255 347 439 531 623 715 807 899 991 1083 1175 1267 1359 1451 1543 1635 1727 1819 1911 2003 2095 2187 2279 2371 2463 2555 2647 2739 2831 2923 3015 3107 3199 3291 3383 3475 3567 3659 3751 3843 3935 4027 4119 4211 4303 4395 4487 4579 4671 4763 4855 4947 5039 5131 5223 5315 5407 5499 5591 5683 5775 5867 5959 6051 6143 6235 6327 6419 6511 6603 6695 6787 6879 6971 7063 7155 7247 7339 7431 7523 7615 7707 7799 7891 7983 8075 8167 8259 8351 8443 ]
+> [69] rcvbuf=[69 161 253 345 437 529 621 713 805 897 989 1081 1173 1265 1357 1449 1541 1633 1725 1817 1909 2001 2093 2185 2277 2369 2461 2553 2645 2737 2829 2921 3013 3105 3197 3289 3381 3473 3565 3657 3749 3841 3933 4025 4117 4209 4301 4393 4485 4577 4669 4761 4853 4945 5037 5129 5221 5313 5405 5497 5589 5681 5773 5865 5957 6049 6141 6233 6325 6417 6509 6601 6693 6785 6877 6969 7061 7153 7245 7337 7429 7521 7613 7705 7797 7889 7981 8073 8165 8257 8349 8441 ]
+> [82] rcvbuf=[82 174 266 358 450 542 634 726 818 910 1002 1094 1186 1278 1370 1462 1554 1646 1738 1830 1922 2014 2106 2198 2290 2382 2474 2566 2658 2750 2842 2934 3026 3118 3210 3302 3394 3486 3578 3670 3762 3854 3946 4038 4130 4222 4314 4406 4498 4590 4682 4774 4866 4958 5050 5142 5234 5326 5418 5510 5602 5694 5786 5878 5970 6062 6154 6246 6338 6430 6522 6614 6706 6798 6890 6982 7074 7166 7258 7350 7442 7534 7626 7718 7810 7902 7994 8086 8178 8270 8362 8454 ]
+> [66] rcvbuf=[66 158 250 342 434 526 618 710 802 894 986 1078 1170 1262 1354 1446 1538 1630 1722 1814 1906 1998 2090 2182 2274 2366 2458 2550 2642 2734 2826 2918 3010 3102 3194 3286 3378 3470 3562 3654 3746 3838 3930 4022 4114 4206 4298 4390 4482 4574 4666 4758 4850 4942 5034 5126 5218 5310 5402 5494 5586 5678 5770 5862 5954 6046 6138 6230 6322 6414 6506 6598 6690 6782 6874 6966 7058 7150 7242 7334 7426 7518 7610 7702 7794 7886 7978 8070 8162 8254 8346 8438 ]
+> [75] rcvbuf=[75 167 259 351 443 535 627 719 811 903 995 1087 1179 1271 1363 1455 1547 1639 1731 1823 1915 2007 2099 2191 2283 2375 2467 2559 2651 2743 2835 2927 3019 3111 3203 3295 3387 3479 3571 3663 3755 3847 3939 4031 4123 4215 4307 4399 4491 4583 4675 4767 4859 4951 5043 5135 5227 5319 5411 5503 5595 5687 5779 5871 5963 6055 6147 6239 6331 6423 6515 6607 6699 6791 6883 6975 7067 7159 7251 7343 7435 7527 7619 7711 7803 7895 7987 8079 8171 8263 8355 8447 ]
+> [73] rcvbuf=[73 165 257 349 441 533 625 717 809 901 993 1085 1177 1269 1361 1453 1545 1637 1729 1821 1913 2005 2097 2189 2281 2373 2465 2557 2649 2741 2833 2925 3017 3109 3201 3293 3385 3477 3569 3661 3753 3845 3937 4029 4121 4213 4305 4397 4489 4581 4673 4765 4857 4949 5041 5133 5225 5317 5409 5501 5593 5685 5777 5869 5961 6053 6145 6237 6329 6421 6513 6605 6697 6789 6881 6973 7065 7157 7249 7341 7433 7525 7617 7709 7801 7893 7985 8077 8169 8261 8353 8445 ]
+> [79] rcvbuf=[79 171 263 355 447 539 631 723 815 907 999 1091 1183 1275 1367 1459 1551 1643 1735 1827 1919 2011 2103 2195 2287 2379 2471 2563 2655 2747 2839 2931 3023 3115 3207 3299 3391 3483 3575 3667 3759 3851 3943 4035 4127 4219 4311 4403 4495 4587 4679 4771 4863 4955 5047 5139 5231 5323 5415 5507 5599 5691 5783 5875 5967 6059 6151 6243 6335 6427 6519 6611 6703 6795 6887 6979 7071 7163 7255 7347 7439 7531 7623 7715 7807 7899 7991 8083 8175 8267 8359 8451 ]
+> [77] rcvbuf=[77 169 261 353 445 537 629 721 813 905 997 1089 1181 1273 1365 1457 1549 1641 1733 1825 1917 2009 2101 2193 2285 2377 2469 2561 2653 2745 2837 2929 3021 3113 3205 3297 3389 3481 3573 3665 3757 3849 3941 4033 4125 4217 4309 4401 4493 4585 4677 4769 4861 4953 5045 5137 5229 5321 5413 5505 5597 5689 5781 5873 5965 6057 6149 6241 6333 6425 6517 6609 6701 6793 6885 6977 7069 7161 7253 7345 7437 7529 7621 7713 7805 7897 7989 8081 8173 8265 8357 8449 ]
+> [86] rcvbuf=[86 178 270 362 454 546 638 730 822 914 1006 1098 1190 1282 1374 1466 1558 1650 1742 1834 1926 2018 2110 2202 2294 2386 2478 2570 2662 2754 2846 2938 3030 3122 3214 3306 3398 3490 3582 3674 3766 3858 3950 4042 4134 4226 4318 4410 4502 4594 4686 4778 4870 4962 5054 5146 5238 5330 5422 5514 5606 5698 5790 5882 5974 6066 6158 6250 6342 6434 6526 6618 6710 6802 6894 6986 7078 7170 7262 7354 7446 7538 7630 7722 7814 7906 7998 8090 8182 8274 8366 8458 ]
+> [84] rcvbuf=[84 176 268 360 452 544 636 728 820 912 1004 1096 1188 1280 1372 1464 1556 1648 1740 1832 1924 2016 2108 2200 2292 2384 2476 2568 2660 2752 2844 2936 3028 3120 3212 3304 3396 3488 3580 3672 3764 3856 3948 4040 4132 4224 4316 4408 4500 4592 4684 4776 4868 4960 5052 5144 5236 5328 5420 5512 5604 5696 5788 5880 5972 6064 6156 6248 6340 6432 6524 6616 6708 6800 6892 6984 7076 7168 7260 7352 7444 7536 7628 7720 7812 7904 7996 8088 8180 8272 8364 8456 ]
+> [70] rcvbuf=[70 162 254 346 438 530 622 714 806 898 990 1082 1174 1266 1358 1450 1542 1634 1726 1818 1910 2002 2094 2186 2278 2370 2462 2554 2646 2738 2830 2922 3014 3106 3198 3290 3382 3474 3566 3658 3750 3842 3934 4026 4118 4210 4302 4394 4486 4578 4670 4762 4854 4946 5038 5130 5222 5314 5406 5498 5590 5682 5774 5866 5958 6050 6142 6234 6326 6418 6510 6602 6694 6786 6878 6970 7062 7154 7246 7338 7430 7522 7614 7706 7798 7890 7982 8074 8166 8258 8350 8442 ]
+> [68] rcvbuf=[68 160 252 344 436 528 620 712 804 896 988 1080 1172 1264 1356 1448 1540 1632 1724 1816 1908 2000 2092 2184 2276 2368 2460 2552 2644 2736 2828 2920 3012 3104 3196 3288 3380 3472 3564 3656 3748 3840 3932 4024 4116 4208 4300 4392 4484 4576 4668 4760 4852 4944 5036 5128 5220 5312 5404 5496 5588 5680 5772 5864 5956 6048 6140 6232 6324 6416 6508 6600 6692 6784 6876 6968 7060 7152 7244 7336 7428 7520 7612 7704 7796 7888 7980 8072 8164 8256 8348 8440 ]
+> [34] rcvbuf=[34 126 218 310 402 494 586 678 770 862 954 1046 1138 1230 1322 1414 1506 1598 1690 1782 1874 1966 2058 2150 2242 2334 2426 2518 2610 2702 2794 2886 2978 3070 3162 3254 3346 3438 3530 3622 3714 3806 3898 3990 4082 4174 4266 4358 4450 4542 4634 4726 4818 4910 5002 5094 5186 5278 5370 5462 5554 5646 5738 5830 5922 6014 6106 6198 6290 6382 6474 6566 6658 6750 6842 6934 7026 7118 7210 7302 7394 7486 7578 7670 7762 7854 7946 8038 8130 8222 8314 8406 ]
+> [50] rcvbuf=[50 142 234 326 418 510 602 694 786 878 970 1062 1154 1246 1338 1430 1522 1614 1706 1798 1890 1982 2074 2166 2258 2350 2442 2534 2626 2718 2810 2902 2994 3086 3178 3270 3362 3454 3546 3638 3730 3822 3914 4006 4098 4190 4282 4374 4466 4558 4650 4742 4834 4926 5018 5110 5202 5294 5386 5478 5570 5662 5754 5846 5938 6030 6122 6214 6306 6398 6490 6582 6674 6766 6858 6950 7042 7134 7226 7318 7410 7502 7594 7686 7778 7870 7962 8054 8146 8238 8330 8422 ]
+> [74] rcvbuf=[74 166 258 350 442 534 626 718 810 902 994 1086 1178 1270 1362 1454 1546 1638 1730 1822 1914 2006 2098 2190 2282 2374 2466 2558 2650 2742 2834 2926 3018 3110 3202 3294 3386 3478 3570 3662 3754 3846 3938 4030 4122 4214 4306 4398 4490 4582 4674 4766 4858 4950 5042 5134 5226 5318 5410 5502 5594 5686 5778 5870 5962 6054 6146 6238 6330 6422 6514 6606 6698 6790 6882 6974 7066 7158 7250 7342 7434 7526 7618 7710 7802 7894 7986 8078 8170 8262 8354 8446 ]
+> [76] rcvbuf=[76 168 260 352 444 536 628 720 812 904 996 1088 1180 1272 1364 1456 1548 1640 1732 1824 1916 2008 2100 2192 2284 2376 2468 2560 2652 2744 2836 2928 3020 3112 3204 3296 3388 3480 3572 3664 3756 3848 3940 4032 4124 4216 4308 4400 4492 4584 4676 4768 4860 4952 5044 5136 5228 5320 5412 5504 5596 5688 5780 5872 5964 6056 6148 6240 6332 6424 6516 6608 6700 6792 6884 6976 7068 7160 7252 7344 7436 7528 7620 7712 7804 7896 7988 8080 8172 8264 8356 8448 ]
+> [78] rcvbuf=[78 170 262 354 446 538 630 722 814 906 998 1090 1182 1274 1366 1458 1550 1642 1734 1826 1918 2010 2102 2194 2286 2378 2470 2562 2654 2746 2838 2930 3022 3114 3206 3298 3390 3482 3574 3666 3758 3850 3942 4034 4126 4218 4310 4402 4494 4586 4678 4770 4862 4954 5046 5138 5230 5322 5414 5506 5598 5690 5782 5874 5966 6058 6150 6242 6334 6426 6518 6610 6702 6794 6886 6978 7070 7162 7254 7346 7438 7530 7622 7714 7806 7898 7990 8082 8174 8266 8358 8450 ]
+> [41] rcvbuf=[41 133 225 317 409 501 593 685 777 869 961 1053 1145 1237 1329 1421 1513 1605 1697 1789 1881 1973 2065 2157 2249 2341 2433 2525 2617 2709 2801 2893 2985 3077 3169 3261 3353 3445 3537 3629 3721 3813 3905 3997 4089 4181 4273 4365 4457 4549 4641 4733 4825 4917 5009 5101 5193 5285 5377 5469 5561 5653 5745 5837 5929 6021 6113 6205 6297 6389 6481 6573 6665 6757 6849 6941 7033 7125 7217 7309 7401 7493 7585 7677 7769 7861 7953 8045 8137 8229 8321 8413 ]
+> [43] rcvbuf=[43 135 227 319 411 503 595 687 779 871 963 1055 1147 1239 1331 1423 1515 1607 1699 1791 1883 1975 2067 2159 2251 2343 2435 2527 2619 2711 2803 2895 2987 3079 3171 3263 3355 3447 3539 3631 3723 3815 3907 3999 4091 4183 4275 4367 4459 4551 4643 4735 4827 4919 5011 5103 5195 5287 5379 5471 5563 5655 5747 5839 5931 6023 6115 6207 6299 6391 6483 6575 6667 6759 6851 6943 7035 7127 7219 7311 7403 7495 7587 7679 7771 7863 7955 8047 8139 8231 8323 8415 ]
+> [36] rcvbuf=[36 128 220 312 404 496 588 680 772 864 956 1048 1140 1232 1324 1416 1508 1600 1692 1784 1876 1968 2060 2152 2244 2336 2428 2520 2612 2704 2796 2888 2980 3072 3164 3256 3348 3440 3532 3624 3716 3808 3900 3992 4084 4176 4268 4360 4452 4544 4636 4728 4820 4912 5004 5096 5188 5280 5372 5464 5556 5648 5740 5832 5924 6016 6108 6200 6292 6384 6476 6568 6660 6752 6844 6936 7028 7120 7212 7304 7396 7488 7580 7672 7764 7856 7948 8040 8132 8224 8316 8408 ]
+> [38] rcvbuf=[38 130 222 314 406 498 590 682 774 866 958 1050 1142 1234 1326 1418 1510 1602 1694 1786 1878 1970 2062 2154 2246 2338 2430 2522 2614 2706 2798 2890 2982 3074 3166 3258 3350 3442 3534 3626 3718 3810 3902 3994 4086 4178 4270 4362 4454 4546 4638 4730 4822 4914 5006 5098 5190 5282 5374 5466 5558 5650 5742 5834 5926 6018 6110 6202 6294 6386 6478 6570 6662 6754 6846 6938 7030 7122 7214 7306 7398 7490 7582 7674 7766 7858 7950 8042 8134 8226 8318 8410 ]
+> [52] rcvbuf=[52 144 236 328 420 512 604 696 788 880 972 1064 1156 1248 1340 1432 1524 1616 1708 1800 1892 1984 2076 2168 2260 2352 2444 2536 2628 2720 2812 2904 2996 3088 3180 3272 3364 3456 3548 3640 3732 3824 3916 4008 4100 4192 4284 4376 4468 4560 4652 4744 4836 4928 5020 5112 5204 5296 5388 5480 5572 5664 5756 5848 5940 6032 6124 6216 6308 6400 6492 6584 6676 6768 6860 6952 7044 7136 7228 7320 7412 7504 7596 7688 7780 7872 7964 8056 8148 8240 8332 8424 ]
+> [54] rcvbuf=[54 146 238 330 422 514 606 698 790 882 974 1066 1158 1250 1342 1434 1526 1618 1710 1802 1894 1986 2078 2170 2262 2354 2446 2538 2630 2722 2814 2906 2998 3090 3182 3274 3366 3458 3550 3642 3734 3826 3918 4010 4102 4194 4286 4378 4470 4562 4654 4746 4838 4930 5022 5114 5206 5298 5390 5482 5574 5666 5758 5850 5942 6034 6126 6218 6310 6402 6494 6586 6678 6770 6862 6954 7046 7138 7230 7322 7414 7506 7598 7690 7782 7874 7966 8058 8150 8242 8334 8426 ]
+> [29] rcvbuf=[29 121 213 305 397 489 581 673 765 857 949 1041 1133 1225 1317 1409 1501 1593 1685 1777 1869 1961 2053 2145 2237 2329 2421 2513 2605 2697 2789 2881 2973 3065 3157 3249 3341 3433 3525 3617 3709 3801 3893 3985 4077 4169 4261 4353 4445 4537 4629 4721 4813 4905 4997 5089 5181 5273 5365 5457 5549 5641 5733 5825 5917 6009 6101 6193 6285 6377 6469 6561 6653 6745 6837 6929 7021 7113 7205 7297 7389 7481 7573 7665 7757 7849 7941 8033 8125 8217 8309 8401 ]
+> [31] rcvbuf=[31 123 215 307 399 491 583 675 767 859 951 1043 1135 1227 1319 1411 1503 1595 1687 1779 1871 1963 2055 2147 2239 2331 2423 2515 2607 2699 2791 2883 2975 3067 3159 3251 3343 3435 3527 3619 3711 3803 3895 3987 4079 4171 4263 4355 4447 4539 4631 4723 4815 4907 4999 5091 5183 5275 5367 5459 5551 5643 5735 5827 5919 6011 6103 6195 6287 6379 6471 6563 6655 6747 6839 6931 7023 7115 7207 7299 7391 7483 7575 7667 7759 7851 7943 8035 8127 8219 8311 8403 ]
+> [45] rcvbuf=[45 137 229 321 413 505 597 689 781 873 965 1057 1149 1241 1333 1425 1517 1609 1701 1793 1885 1977 2069 2161 2253 2345 2437 2529 2621 2713 2805 2897 2989 3081 3173 3265 3357 3449 3541 3633 3725 3817 3909 4001 4093 4185 4277 4369 4461 4553 4645 4737 4829 4921 5013 5105 5197 5289 5381 5473 5565 5657 5749 5841 5933 6025 6117 6209 6301 6393 6485 6577 6669 6761 6853 6945 7037 7129 7221 7313 7405 7497 7589 7681 7773 7865 7957 8049 8141 8233 8325 8417 ]
+> [47] rcvbuf=[47 139 231 323 415 507 599 691 783 875 967 1059 1151 1243 1335 1427 1519 1611 1703 1795 1887 1979 2071 2163 2255 2347 2439 2531 2623 2715 2807 2899 2991 3083 3175 3267 3359 3451 3543 3635 3727 3819 3911 4003 4095 4187 4279 4371 4463 4555 4647 4739 4831 4923 5015 5107 5199 5291 5383 5475 5567 5659 5751 5843 5935 6027 6119 6211 6303 6395 6487 6579 6671 6763 6855 6947 7039 7131 7223 7315 7407 7499 7591 7683 7775 7867 7959 8051 8143 8235 8327 8419 ]
+> [42] rcvbuf=[42 134 226 318 410 502 594 686 778 870 962 1054 1146 1238 1330 1422 1514 1606 1698 1790 1882 1974 2066 2158 2250 2342 2434 2526 2618 2710 2802 2894 2986 3078 3170 3262 3354 3446 3538 3630 3722 3814 3906 3998 4090 4182 4274 4366 4458 4550 4642 4734 4826 4918 5010 5102 5194 5286 5378 5470 5562 5654 5746 5838 5930 6022 6114 6206 6298 6390 6482 6574 6666 6758 6850 6942 7034 7126 7218 7310 7402 7494 7586 7678 7770 7862 7954 8046 8138 8230 8322 8414 ]
+> [44] rcvbuf=[44 136 228 320 412 504 596 688 780 872 964 1056 1148 1240 1332 1424 1516 1608 1700 1792 1884 1976 2068 2160 2252 2344 2436 2528 2620 2712 2804 2896 2988 3080 3172 3264 3356 3448 3540 3632 3724 3816 3908 4000 4092 4184 4276 4368 4460 4552 4644 4736 4828 4920 5012 5104 5196 5288 5380 5472 5564 5656 5748 5840 5932 6024 6116 6208 6300 6392 6484 6576 6668 6760 6852 6944 7036 7128 7220 7312 7404 7496 7588 7680 7772 7864 7956 8048 8140 8232 8324 8416 ]
+> [30] rcvbuf=[30 122 214 306 398 490 582 674 766 858 950 1042 1134 1226 1318 1410 1502 1594 1686 1778 1870 1962 2054 2146 2238 2330 2422 2514 2606 2698 2790 2882 2974 3066 3158 3250 3342 3434 3526 3618 3710 3802 3894 3986 4078 4170 4262 4354 4446 4538 4630 4722 4814 4906 4998 5090 5182 5274 5366 5458 5550 5642 5734 5826 5918 6010 6102 6194 6286 6378 6470 6562 6654 6746 6838 6930 7022 7114 7206 7298 7390 7482 7574 7666 7758 7850 7942 8034 8126 8218 8310 8402 ]
+> [46] rcvbuf=[46 138 230 322 414 506 598 690 782 874 966 1058 1150 1242 1334 1426 1518 1610 1702 1794 1886 1978 2070 2162 2254 2346 2438 2530 2622 2714 2806 2898 2990 3082 3174 3266 3358 3450 3542 3634 3726 3818 3910 4002 4094 4186 4278 4370 4462 4554 4646 4738 4830 4922 5014 5106 5198 5290 5382 5474 5566 5658 5750 5842 5934 6026 6118 6210 6302 6394 6486 6578 6670 6762 6854 6946 7038 7130 7222 7314 7406 7498 7590 7682 7774 7866 7958 8050 8142 8234 8326 8418 ]
+> [63] rcvbuf=[63 155 247 339 431 523 615 707 799 891 983 1075 1167 1259 1351 1443 1535 1627 1719 1811 1903 1995 2087 2179 2271 2363 2455 2547 2639 2731 2823 2915 3007 3099 3191 3283 3375 3467 3559 3651 3743 3835 3927 4019 4111 4203 4295 4387 4479 4571 4663 4755 4847 4939 5031 5123 5215 5307 5399 5491 5583 5675 5767 5859 5951 6043 6135 6227 6319 6411 6503 6595 6687 6779 6871 6963 7055 7147 7239 7331 7423 7515 7607 7699 7791 7883 7975 8067 8159 8251 8343 8435 ]
+> [61] rcvbuf=[61 153 245 337 429 521 613 705 797 889 981 1073 1165 1257 1349 1441 1533 1625 1717 1809 1901 1993 2085 2177 2269 2361 2453 2545 2637 2729 2821 2913 3005 3097 3189 3281 3373 3465 3557 3649 3741 3833 3925 4017 4109 4201 4293 4385 4477 4569 4661 4753 4845 4937 5029 5121 5213 5305 5397 5489 5581 5673 5765 5857 5949 6041 6133 6225 6317 6409 6501 6593 6685 6777 6869 6961 7053 7145 7237 7329 7421 7513 7605 7697 7789 7881 7973 8065 8157 8249 8341 8433 ]
+> [60] rcvbuf=[60 152 244 336 428 520 612 704 796 888 980 1072 1164 1256 1348 1440 1532 1624 1716 1808 1900 1992 2084 2176 2268 2360 2452 2544 2636 2728 2820 2912 3004 3096 3188 3280 3372 3464 3556 3648 3740 3832 3924 4016 4108 4200 4292 4384 4476 4568 4660 4752 4844 4936 5028 5120 5212 5304 5396 5488 5580 5672 5764 5856 5948 6040 6132 6224 6316 6408 6500 6592 6684 6776 6868 6960 7052 7144 7236 7328 7420 7512 7604 7696 7788 7880 7972 8064 8156 8248 8340 8432 ]
+> [62] rcvbuf=[62 154 246 338 430 522 614 706 798 890 982 1074 1166 1258 1350 1442 1534 1626 1718 1810 1902 1994 2086 2178 2270 2362 2454 2546 2638 2730 2822 2914 3006 3098 3190 3282 3374 3466 3558 3650 3742 3834 3926 4018 4110 4202 4294 4386 4478 4570 4662 4754 4846 4938 5030 5122 5214 5306 5398 5490 5582 5674 5766 5858 5950 6042 6134 6226 6318 6410 6502 6594 6686 6778 6870 6962 7054 7146 7238 7330 7422 7514 7606 7698 7790 7882 7974 8066 8158 8250 8342 8434 ]
index 8e8be05..493d4ee 100644 (file)
@@ -3,22 +3,22 @@
 
 p Test all to all
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-alltoallv --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
 > [0] rbuf: (#256): [-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1][-1]
 > [0] rcount: (#16): [0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
 > [0] rdisp: (#16): [0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0]
index 4daf765..8c0ae23 100644 (file)
@@ -4,19 +4,19 @@
 p Test barrier
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-barrier --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
 > ... Barrier ....
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
index 898163c..529ccb1 100644 (file)
@@ -2,22 +2,22 @@ p Test Broadcast with more processes than hosts
 ! output sort
 
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-bcast --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
 > [0] number of values equals to 17: 2048
 > [0] number of values equals to 17: 4096
 > [10] number of values equals to 17: 2048
index 4ca54f0..6f8077f 100644 (file)
@@ -73,5 +73,5 @@ int main(int argc, char *argv[])
   xbt_free(rb);
   MPI_Barrier(MPI_COMM_WORLD);
   MPI_Finalize();
-  return (EXIT_SUCCESS);
+  return EXIT_SUCCESS;
 }
index cd3d632..0b18256 100644 (file)
@@ -4,22 +4,22 @@
 
 p Test all to all
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-gather --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
-> [rank 0] -> Tremblay
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
 > [0] rcvbuf=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]
 > [0] sndbuf=[0 1 ]
 > [1] sndbuf=[2 3 ]
index df17382..f387207 100644 (file)
@@ -4,19 +4,19 @@
 p Test reduce_scatter
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll -platform ${platfdir:=.}/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ${bindir:=.}/coll-reduce-scatter --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error
 >  No Errors
-> [rank 0] -> Tremblay
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
index da06af8..670aafa 100644 (file)
@@ -93,5 +93,5 @@ int main(int argc, char *argv[])
   free(sb);
   free(rb);
   MPI_Finalize();
-  return (EXIT_SUCCESS);
+  return EXIT_SUCCESS;
 }
index abfbe3a..fe5435d 100644 (file)
@@ -37,19 +37,19 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll
 > [8] sndbuf=[128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 ]
 > [9] second sndbuf=[144 ]
 > [9] sndbuf=[144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 ]
-> [rank 0] -> Tremblay
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
index d63d1a6..bfe347c 100644 (file)
@@ -20,19 +20,19 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_coll
 >      [8] ok.
 >      [9] ok.
 > ** Small Test Result: ...
-> [rank 0] -> Tremblay
-> [rank 10] -> Fafard
-> [rank 11] -> Fafard
-> [rank 12] -> Ginette
-> [rank 13] -> Ginette
-> [rank 14] -> Ginette
-> [rank 15] -> Ginette
-> [rank 1] -> Tremblay
-> [rank 2] -> Tremblay
-> [rank 3] -> Tremblay
-> [rank 4] -> Jupiter
-> [rank 5] -> Jupiter
-> [rank 6] -> Jupiter
-> [rank 7] -> Jupiter
-> [rank 8] -> Fafard
-> [rank 9] -> Fafard
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 10] -> Fafard
+> [0.000000] [smpi/INFO] [rank 11] -> Fafard
+> [0.000000] [smpi/INFO] [rank 12] -> Ginette
+> [0.000000] [smpi/INFO] [rank 13] -> Ginette
+> [0.000000] [smpi/INFO] [rank 14] -> Ginette
+> [0.000000] [smpi/INFO] [rank 15] -> Ginette
+> [0.000000] [smpi/INFO] [rank 1] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 2] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 3] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 4] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 5] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 6] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 7] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 8] -> Fafard
+> [0.000000] [smpi/INFO] [rank 9] -> Fafard
index dfd5308..5d13591 100644 (file)
@@ -1,3 +1,8 @@
+! Copyright (c) 2018-2021. The SimGrid Team. All rights reserved.
+
+! This program is free software; you can redistribute it and/or modify it
+! under the terms of the license (GNU LGPL) which comes with this package.
+
 ! Check that getarg does something sensible.
 program getarg_1
   use mpi
index 6979fbf..ea08d37 100644 (file)
@@ -1,5 +1,5 @@
 p Test fortran params
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ${platfdir}/small_platform.xml -np 2 ${bindir:=.}/fort_args 'a' 3 -q --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
index 3a4252b..322cc30 100644 (file)
@@ -9,7 +9,7 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -np 2 -platform ${platfdir:=.}/s
 > [Jupiter:wait recv:(4) 0.000000] [smpi_test/INFO] new thread has parameter rank 1 and global variable rank 1
 > [Jupiter:wait recv:(4) 0.000000] [smpi_test/INFO] 1 has MPI rank 1 and global variable rank 1
 > [Jupiter:wait recv:(4) 0.000000] [smpi_test/INFO] 1 waiting request
-> [Jupiter:wait recv:(4) 0.002947] [smpi_test/INFO] 1 request done, return MPI_SUCCESS
-> [Jupiter:wait recv:(4) 0.002947] [smpi_test/INFO] 1 still has MPI rank 1 and global variable 1
+> [Jupiter:wait recv:(4) 0.002948] [smpi_test/INFO] 1 request done, return MPI_SUCCESS
+> [Jupiter:wait recv:(4) 0.002948] [smpi_test/INFO] 1 still has MPI rank 1 and global variable 1
 > [Tremblay:0:(1) 1.000000] [smpi_test/INFO] finally 42
 > [Jupiter:1:(2) 2.000000] [smpi_test/INFO] finally 42
diff --git a/teshsuite/smpi/hostfile_griffon b/teshsuite/smpi/hostfile_griffon
new file mode 100644 (file)
index 0000000..7984701
--- /dev/null
@@ -0,0 +1,92 @@
+griffon-1.nancy.grid5000.fr
+griffon-2.nancy.grid5000.fr
+griffon-3.nancy.grid5000.fr
+griffon-4.nancy.grid5000.fr
+griffon-5.nancy.grid5000.fr
+griffon-6.nancy.grid5000.fr
+griffon-7.nancy.grid5000.fr
+griffon-8.nancy.grid5000.fr
+griffon-9.nancy.grid5000.fr
+griffon-10.nancy.grid5000.fr
+griffon-11.nancy.grid5000.fr
+griffon-12.nancy.grid5000.fr
+griffon-13.nancy.grid5000.fr
+griffon-14.nancy.grid5000.fr
+griffon-15.nancy.grid5000.fr
+griffon-16.nancy.grid5000.fr
+griffon-17.nancy.grid5000.fr
+griffon-18.nancy.grid5000.fr
+griffon-19.nancy.grid5000.fr
+griffon-20.nancy.grid5000.fr
+griffon-21.nancy.grid5000.fr
+griffon-22.nancy.grid5000.fr
+griffon-23.nancy.grid5000.fr
+griffon-24.nancy.grid5000.fr
+griffon-25.nancy.grid5000.fr
+griffon-26.nancy.grid5000.fr
+griffon-27.nancy.grid5000.fr
+griffon-28.nancy.grid5000.fr
+griffon-29.nancy.grid5000.fr
+griffon-30.nancy.grid5000.fr
+griffon-31.nancy.grid5000.fr
+griffon-32.nancy.grid5000.fr
+griffon-33.nancy.grid5000.fr
+griffon-34.nancy.grid5000.fr
+griffon-35.nancy.grid5000.fr
+griffon-36.nancy.grid5000.fr
+griffon-37.nancy.grid5000.fr
+griffon-38.nancy.grid5000.fr
+griffon-39.nancy.grid5000.fr
+griffon-40.nancy.grid5000.fr
+griffon-41.nancy.grid5000.fr
+griffon-42.nancy.grid5000.fr
+griffon-43.nancy.grid5000.fr
+griffon-44.nancy.grid5000.fr
+griffon-45.nancy.grid5000.fr
+griffon-46.nancy.grid5000.fr
+griffon-47.nancy.grid5000.fr
+griffon-48.nancy.grid5000.fr
+griffon-49.nancy.grid5000.fr
+griffon-50.nancy.grid5000.fr
+griffon-51.nancy.grid5000.fr
+griffon-52.nancy.grid5000.fr
+griffon-53.nancy.grid5000.fr
+griffon-54.nancy.grid5000.fr
+griffon-55.nancy.grid5000.fr
+griffon-56.nancy.grid5000.fr
+griffon-57.nancy.grid5000.fr
+griffon-58.nancy.grid5000.fr
+griffon-59.nancy.grid5000.fr
+griffon-60.nancy.grid5000.fr
+griffon-61.nancy.grid5000.fr
+griffon-62.nancy.grid5000.fr
+griffon-63.nancy.grid5000.fr
+griffon-64.nancy.grid5000.fr
+griffon-65.nancy.grid5000.fr
+griffon-66.nancy.grid5000.fr
+griffon-67.nancy.grid5000.fr
+griffon-68.nancy.grid5000.fr
+griffon-69.nancy.grid5000.fr
+griffon-70.nancy.grid5000.fr
+griffon-71.nancy.grid5000.fr
+griffon-72.nancy.grid5000.fr
+griffon-73.nancy.grid5000.fr
+griffon-74.nancy.grid5000.fr
+griffon-75.nancy.grid5000.fr
+griffon-76.nancy.grid5000.fr
+griffon-77.nancy.grid5000.fr
+griffon-78.nancy.grid5000.fr
+griffon-79.nancy.grid5000.fr
+griffon-80.nancy.grid5000.fr
+griffon-81.nancy.grid5000.fr
+griffon-82.nancy.grid5000.fr
+griffon-83.nancy.grid5000.fr
+griffon-84.nancy.grid5000.fr
+griffon-85.nancy.grid5000.fr
+griffon-86.nancy.grid5000.fr
+griffon-87.nancy.grid5000.fr
+griffon-88.nancy.grid5000.fr
+griffon-89.nancy.grid5000.fr
+griffon-90.nancy.grid5000.fr
+griffon-91.nancy.grid5000.fr
+griffon-92.nancy.grid5000.fr
index b977265..1d8cade 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "mpi.h"
 #include <stdio.h>
 #include <stdlib.h>
index 91c3f52..a16c8b2 100644 (file)
@@ -1,10 +1,10 @@
 # Test for MPI_File_read and MPI_File_write
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_io -platform ${platfdir:=.}/hosts_with_disks.xml -np 4 --log=xbt_cfg.thres:critical --log=smpi_config.thres:warning --log=smpi_mpi.thres:error --log=s4u_file.thres:error --log=smpi_io.thres:verbose "--log=root.fmt:(%a@%h)%e%m%n" --cfg=smpi/simulate-computation:0 ${bindir:=.}/io-all-at
-> [rank 0] -> bob
-> [rank 1] -> carl
-> [rank 2] -> bob
-> [rank 3] -> carl
+> (maestro@) [rank 0] -> bob
+> (maestro@) [rank 1] -> carl
+> (maestro@) [rank 2] -> bob
+> (maestro@) [rank 3] -> carl
 > (0@bob) Seeking in MPI_File /scratch/testfile, setting offset 0
 > (2@bob) Seeking in MPI_File /scratch/testfile, setting offset 8
 > (3@carl) Seeking in MPI_File /scratch/testfile, setting offset 12
index a05c21f..884bfdd 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "mpi.h"
 #include <stdio.h>
 #include <stdlib.h>
index ace131b..fe91aa9 100644 (file)
@@ -1,10 +1,10 @@
 # Test for MPI_File_read and MPI_File_write
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_io -platform ${platfdir:=.}/hosts_with_disks.xml -np 4 --log=xbt_cfg.thres:critical --log=smpi_config.thres:warning --log=smpi_mpi.thres:error --log=s4u_file.thres:error --log=smpi_io.thres:verbose "--log=root.fmt:(%a@%h)%e%m%n" --cfg=smpi/simulate-computation:0 ${bindir:=.}/io-all
-> [rank 0] -> bob
-> [rank 1] -> carl
-> [rank 2] -> bob
-> [rank 3] -> carl
+> (maestro@) [rank 0] -> bob
+> (maestro@) [rank 1] -> carl
+> (maestro@) [rank 2] -> bob
+> (maestro@) [rank 3] -> carl
 > (0@bob) Seeking in MPI_File /scratch/testfile, setting offset 0
 > (2@bob) Seeking in MPI_File /scratch/testfile, setting offset 8
 > (3@carl) Seeking in MPI_File /scratch/testfile, setting offset 12
index 6423f5b..d7b6f76 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "mpi.h"
 #include <stdio.h>
 #include <stdlib.h>
index be0c294..de8aa49 100644 (file)
@@ -1,10 +1,10 @@
 # Test for MPI_File_read and MPI_File_write
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_io -platform ${platfdir:=.}/hosts_with_disks.xml -np 4 --log=xbt_cfg.thres:critical --log=smpi_config.thres:warning --log=smpi_mpi.thres:error --log=s4u_file.thres:error --log=smpi_io.thres:verbose "--log=root.fmt:(%a@%h)%e%m%n" --cfg=smpi/simulate-computation:0 ${bindir:=.}/io-ordered
-> [rank 0] -> bob
-> [rank 1] -> carl
-> [rank 2] -> bob
-> [rank 3] -> carl
+> (maestro@) [rank 0] -> bob
+> (maestro@) [rank 1] -> carl
+> (maestro@) [rank 2] -> bob
+> (maestro@) [rank 3] -> carl
 > (0@bob) Seeking in MPI_File /scratch/testfile, setting offset 0
 > (2@bob) Seeking in MPI_File /scratch/testfile, setting offset 80
 > (1@carl) Seeking in MPI_File /scratch/testfile, setting offset 40
index d3cb157..84fe25d 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "mpi.h"
 #include <stdio.h>
 #include <stdlib.h>
index 7ea519f..15e8501 100644 (file)
@@ -1,10 +1,10 @@
 # Test for MPI_File_read and MPI_File_write
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_io -platform ${platfdir:=.}/hosts_with_disks.xml -np 4 --log=xbt_cfg.thres:critical --log=smpi_config.thres:warning --log=smpi_mpi.thres:error --log=s4u_file.thres:error --log=smpi_io.thres:verbose "--log=root.fmt:(%a@%h)%e%m%n" --cfg=smpi/simulate-computation:0 ${bindir:=.}/io-shared
-> [rank 0] -> bob
-> [rank 1] -> carl
-> [rank 2] -> bob
-> [rank 3] -> carl
+> (maestro@) [rank 0] -> bob
+> (maestro@) [rank 1] -> carl
+> (maestro@) [rank 2] -> bob
+> (maestro@) [rank 3] -> carl
 > (0@bob) Seeking in MPI_File /scratch/testfile, setting offset 0
 > (2@bob) Seeking in MPI_File /scratch/testfile, setting offset 0
 > (3@carl) Seeking in MPI_File /scratch/testfile, setting offset 0
index fecb251..a9b6fcd 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "mpi.h"
 #include <stdio.h>
 #include <stdlib.h>
index b7f7d87..748e012 100644 (file)
@@ -1,10 +1,10 @@
 # Test for MPI_File_read and MPI_File_write
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_io -platform ${platfdir:=.}/hosts_with_disks.xml -np 4 --log=xbt_cfg.thres:critical --log=smpi_config.thres:warning --log=smpi_mpi.thres:error --log=s4u_file.thres:error --log=smpi_io.thres:verbose "--log=root.fmt:(%a@%h)%e%m%n" --cfg=smpi/simulate-computation:0 ${bindir:=.}/io-simple-at
-> [rank 0] -> bob
-> [rank 1] -> carl
-> [rank 2] -> bob
-> [rank 3] -> carl
+> (maestro@) [rank 0] -> bob
+> (maestro@) [rank 1] -> carl
+> (maestro@) [rank 2] -> bob
+> (maestro@) [rank 3] -> carl
 > (0@bob) Seeking in MPI_File /scratch/testfile, setting offset 0
 > (2@bob) Seeking in MPI_File /scratch/testfile, setting offset 8
 > (0@bob) Write in MPI_File /scratch/testfile, 4 bytes written, readsize 4 bytes, movesize 4
index 4a3858e..1d0cc7a 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "mpi.h"
 #include <stdio.h>
 #include <stdlib.h>
index 48371d8..7620831 100644 (file)
@@ -1,10 +1,10 @@
 # Test for MPI_File_read and MPI_File_write
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile_io -platform ${platfdir:=.}/hosts_with_disks.xml -np 4 --log=xbt_cfg.thres:critical --log=smpi_config.thres:warning --log=smpi_mpi.thres:error --log=s4u_file.thres:error --log=smpi_io.thres:verbose "--log=root.fmt:(%a@%h)%e%m%n" --cfg=smpi/simulate-computation:0 ${bindir:=.}/io-simple
-> [rank 0] -> bob
-> [rank 1] -> carl
-> [rank 2] -> bob
-> [rank 3] -> carl
+> (maestro@) [rank 0] -> bob
+> (maestro@) [rank 1] -> carl
+> (maestro@) [rank 2] -> bob
+> (maestro@) [rank 3] -> carl
 > (0@bob) Seeking in MPI_File /scratch/testfile, setting offset 0
 > (2@bob) Seeking in MPI_File /scratch/testfile, setting offset 8
 > (0@bob) Write in MPI_File /scratch/testfile, 4 bytes written, readsize 4 bytes, movesize 4
diff --git a/teshsuite/smpi/isp/umpire/.gitignore b/teshsuite/smpi/isp/umpire/.gitignore
deleted file mode 100644 (file)
index 06fb7b0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-*.tesh
index db02743..afd2b4e 100644 (file)
@@ -197,13 +197,16 @@ set(txt_files ${txt_files} ${sources} PARENT_SCOPE)
 # Build the tests
 #################
 
-if(enable_smpi AND enable_model-checking AND enable_smpi_ISP_testsuite)
+if(enable_smpi AND enable_smpi_ISP_testsuite)
   set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc")
   set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff")
-
+  set(umpire_tests_to_run ${umpire_tests_passing})
+  if (enable_model-checking)
+    set(umpire_tests_to_run ${umpire_tests_to_run}  ${umpire_tests_deadlock} ${umpire_tests_problematic})
+  endif()
   include_directories(BEFORE "${CMAKE_HOME_DIRECTORY}/include/smpi")
 
-  foreach (test ${umpire_tests_passing} ${umpire_tests_deadlock} ${umpire_tests_problematic} )
+  foreach (test ${umpire_tests_to_run})
     add_executable(${test} EXCLUDE_FROM_ALL ${test}.c)
     add_dependencies(tests-mc ${test})
     target_link_libraries(${test} simgrid)
@@ -217,21 +220,26 @@ if(enable_smpi AND enable_model-checking AND enable_smpi_ISP_testsuite)
   foreach (test ${umpire_tests_passing})
     write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! timeout 30")
     write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! output display" APPEND)
-    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../smpi_script/bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/host-speed:1Gf --cfg=smpi/coll-selector:ompi \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
+    if(enable_model-checking)
+      set(wrapper "-wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\"")
+    endif()
+    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../smpi_script/bin/smpirun ${wrapper} -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/host-speed:1Gf --cfg=smpi/coll-selector:ompi \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
   endforeach()
 
-  foreach (test ${umpire_tests_deadlock} ${umpire_tests_problematic} )
-    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! timeout 30"     )
-    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! expect return 3" APPEND)
-    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! output display"  APPEND)
-    write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../smpi_script/bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/buffering:zero --cfg=smpi/coll-selector:ompi \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
-  endforeach()
+  if (enable_model-checking)
+    foreach (test ${umpire_tests_deadlock} ${umpire_tests_problematic} )
+      write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! timeout 30"     )
+      write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! expect return 3" APPEND)
+      write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "! output display"  APPEND)
+      write_file(${CMAKE_CURRENT_BINARY_DIR}/${test}.tesh "\$ \${bindir:=.}/../../../../smpi_script/bin/smpirun -wrapper \"\${bindir:=.}/../../../../bin/simgrid-mc\" -hostfile ../../hostfile -platform ../../../../examples/platforms/small_platform.xml --log=xbt_cfg.thresh:warning -np 3 --cfg=smpi/buffering:zero --cfg=smpi/coll-selector:ompi \${bindir:=.}/${test} --log=smpi_coll.thresh:error" APPEND)
+    endforeach()
+  endif()
 endif()
 
 # Erase all tesh files on cleanup: they are generated anyway
 set_directory_properties ( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${files_to_clean}" )
 
-if(enable_smpi AND enable_model-checking AND enable_smpi_ISP_testsuite)
+if(enable_smpi AND enable_smpi_ISP_testsuite)
   foreach (tesh ${umpire_tesh})
     ADD_TESH(mc-umpire-${tesh}
       --setenv srcdir=${CMAKE_CURRENT_SOURCE_DIR}
index 9df719c..429d87a 100644 (file)
@@ -43,7 +43,23 @@ int main(int argc, char *argv[])
       d = compute(2.0);
   }
 
+  //tagged version, should differentiate between two different calls to the same kernel and run calibration even on the second one
+  for (int tag=0; tag < 4; tag++){
+    char ctag [8];
+    //run twice with the same tag, test should skip 1 and 3, as they were already benched.
+    sprintf(ctag, "%d", tag - tag%2);
+    SMPI_SAMPLE_GLOBAL_TAG(int i = 0, i < 500, i++, 2, 0.1, ctag){
+        if (verbose)
+          fprintf(stderr, "(%12.6f) [rank:%d]", MPI_Wtime(), rank);
+        else
+          fprintf(stderr, "(0)");
+        fprintf(stderr, " Run the computation %d with tag %d\n", tag, tag- tag%2);
+        d = compute(2.0);
+    }
+  }
+
   n = 0;
+  //Use 0 as max iter, but one will always be performed by design.
   SMPI_SAMPLE_LOCAL (int i = 0, i < 5, i++,0, 0.1){
       if (verbose || n < 2) {
         n++;
index 5831dc4..a795f92 100644 (file)
@@ -7,11 +7,12 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ../hostfile -platform
 > (0) Run the first computation. It's globally benched, and I want no more than 4 benchmarks (thres<0)
 > (0) Run the first computation. It's globally benched, and I want no more than 4 benchmarks (thres<0)
 > (1) [rank:0] Run the second (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
-> (1) [rank:0] Run the second (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
-> (1) [rank:1] Run the second (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
 > (1) [rank:1] Run the second (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
 > (1) [rank:2] Run the second (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
-> (1) [rank:2] Run the second (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)
+> (0) Run the computation 0 with tag 0
+> (0) Run the computation 0 with tag 0
+> (0) Run the computation 2 with tag 2
+> (0) Run the computation 2 with tag 2
 > (2) [rank:0] Done.
 > (2) [rank:1] Done.
 > (2) [rank:2] Done.
index e99e18e..9d285f3 100644 (file)
 int main(int argc, char *argv[])
 {
     MPI_Datatype column[LOOPS], xpose[LOOPS];
-    double t[NUM_SIZES], ttmp, tmean;
+    double t[NUM_SIZES], ttmp;
     double tMeanLower, tMeanHigher;
     int size;
     int i, j, errs = 0, nrows, ncols;
 
     MPI_Init(&argc, &argv);
 
-    tmean = 0;
     size = 1;
     for (i = -SKIP; i < NUM_SIZES; i++) {
         nrows = ncols = size;
@@ -59,7 +58,6 @@ int main(int argc, char *argv[])
                  * time large enough */
                 t[i] = 0;
             }
-            tmean += t[i];
         }
 
         for (j = 0; j < LOOPS; j++) {
@@ -70,7 +68,6 @@ int main(int argc, char *argv[])
         if (i >= 0)
             size *= 2;
     }
-    tmean /= NUM_SIZES;
 
     /* Now, analyze the times to see that they do not grow too fast
      * as a function of size.  As that is a vague criteria, we do the
index d4b2710..38f586c 100644 (file)
@@ -19,13 +19,13 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite)
      strided_acc_onelock strided_get_indexed strided_putget_indexed contention_put contention_putget lockcontention3
      adlb_mimic1 lock_contention_dt acc-loc get_acc_local get_accumulate put_base put_bottom
      linked_list_bench_lock_all linked_list_bench_lock_excl manyrma2 pscw_ordering rma-contig get-struct
-     rput_local_comp racc_local_comp rget-testall win_shared win_shared_put_flush_get)
+     rput_local_comp racc_local_comp rget-testall win_shared win_shared_put_flush_get atomic_get)
     # fence_shm fetchandadd_am fetchandadd fetchandadd_tree_am fetchandadd_tree 
-    #  linked_list_bench_lock_shr linked_list linked_list_fop linked_list_lockall 
+    # linked_list_bench_lock_shr linked_list linked_list_fop linked_list_lockall
     #   mcs-mutex mixedsync mutex_bench  reqops
     # strided_getacc_indexed_shared rget-unlock 
     # win_flavors win_shared_zerobyte win_shared_noncontig win_shared_noncontig_put 
-    # win_large_shm win_zero wintest  atomic_rmw_fop atomic_rmw_gacc  atomic_get atomic_rmw_cas
+    # win_large_shm win_zero wintest  atomic_rmw_fop atomic_rmw_gacc atomic_rmw_cas
     # aint derived-acc-flush_local large-acc-flush_local
     #  win_shared_create win_shared_put_flush_get win_shared_rma_flush_load
     # wrma_flush_get
index 54bffa6..dc18d6a 100644 (file)
@@ -18,9 +18,9 @@
 #include "mpi.h"
 #include <stdio.h>
 
-#define LOOP 100
+#define LOOP 10
 #define DATA_SIZE 100
-#define OPS_NUM 10000
+#define OPS_NUM 1000
 #define GACC_SZ 10
 
 typedef struct pair_struct {
index 1587579..52683c4 100644 (file)
@@ -264,6 +264,7 @@ int main(int argc, char **argv)
     /* Free all the elements in the list */
     for (; my_elems_count > 0; my_elems_count--)
         MPI_Free_mem(my_elems[my_elems_count - 1]);
+    free(my_elems);
 
     MPI_Finalize();
     return 0;
index 1f30b04..b879543 100644 (file)
@@ -267,6 +267,7 @@ int main(int argc, char **argv)
     /* Free all the elements in the list */
     for (; my_elems_count > 0; my_elems_count--)
         MPI_Free_mem(my_elems[my_elems_count - 1]);
+    free(my_elems);
 
     MPI_Finalize();
     return 0;
index 6f920ef..c49b81f 100644 (file)
@@ -137,7 +137,7 @@ at_complete 2
 #atomic_rmw_fop 3
 #atomic_rmw_cas 3
 #atomic_rmw_gacc 3
-#atomic_get 3 mpiversion=3.0 timeLimit=300
+atomic_get 3 mpiversion=3.0 timeLimit=300
 #aint 2 mpiversion=3.1
 #acc-pairtype 2
 manyget 2
index ec4509a..3130530 100644 (file)
@@ -1,3 +1,7 @@
+/* Copyright (c) 2017-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <stdio.h>
 #include <stdlib.h>
index 7c579eb..2f1ca5d 100644 (file)
@@ -1,4 +1,4 @@
 p Test privatization
 ! timeout 5
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ../hostfile -platform ${platfdir:=.}/small_platform.xml -np 32 ${bindir:=.}/privatization -s -long --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/privatization:${privatization:=1} --log=simix_context.thres:error --log=xbt_memory_map.thres:critical
-> You requested to use 32 ranks, but there is only 5 processes in your hostfile...
+> [0.000000] [smpi/INFO] You requested to use 32 ranks, but there is only 5 processes in your hostfile...
index 675262e..c887c4d 100644 (file)
@@ -1,10 +1,10 @@
 p Test dsend
 ! output sort
-$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${bindir:=.}/../hostfile -platform ${platfdir}/small_platform.xml -np 2 ${bindir:=.}/pt2pt-dsend -s --long --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/simulate-computation:no
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${bindir:=.}/../hostfile -platform ${platfdir}/small_platform.xml -np 2 ${bindir:=.}/pt2pt-dsend -s --long --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/simulate-computation:no --cfg=smpi/finalization-barrier:on
 > [Jupiter:1:(2) 0.000000] [dsend/INFO] rank 1: data exchanged
 > [Tremblay:0:(1) 0.005896] [dsend/INFO] rank 0: data exchanged
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
 
 p Test dsend with timings injection
 p message size is 4 bytes
@@ -14,5 +14,5 @@ p process 2 will finish at 0.5+2*4 (time before first send) + 2*(1+0.5*4) (recv+
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ${bindir:=.}/../hostfile -platform ${platfdir}/small_platform.xml -np 2 ${bindir:=.}/pt2pt-dsend -s --long --log=smpi_config.thres:warning --cfg=smpi/or:0:1:0.5 --cfg=smpi/os:0:0.5:2 --cfg=smpi/ois:0:1:0.1 --cfg=smpi/simulate-computation:no --log=xbt_cfg.thres:warning
 > [Jupiter:1:(2) 9.900000] [dsend/INFO] rank 1: data exchanged
 > [Tremblay:0:(1) 14.505896] [dsend/INFO] rank 0: data exchanged
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
index b37d99c..9ca1a69 100644 (file)
@@ -29,16 +29,16 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename
 > [3] About to send back message '102' to process [2]
 > [3] Received 1st message '101' from process [2]
 > [3] increment message's value to  '102'
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
-> [rank 2] -> Fafard
-> [rank 3] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 2] -> Fafard
+> [0.000000] [smpi/INFO] [rank 3] -> Ginette
 
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -no-privatize -replay ./out_in_ti.txt --log=replay.:critical -trace-ti --cfg=tracing/filename:out_ti.txt --cfg=smpi/simulate-computation:no -map -hostfile ${srcdir:=.}/../hostfile -platform ${platfdir:=.}/small_platform.xml -np 4 ${bindir:=.}/../../../examples/smpi/replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
-> [rank 2] -> Fafard
-> [rank 3] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 2] -> Fafard
+> [0.000000] [smpi/INFO] [rank 3] -> Ginette
 > [Jupiter:1:(2) 0.016806] [smpi_replay/INFO] Simulation time 0.016806
 
 ! output sort
@@ -120,16 +120,16 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -trace-ti --cfg=tracing/filename
 > [3] About to send back message '102' to process [2]
 > [3] Received 1st message '101' from process [2]
 > [3] increment message's value to  '102'
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
-> [rank 2] -> Fafard
-> [rank 3] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 2] -> Fafard
+> [0.000000] [smpi/INFO] [rank 3] -> Ginette
 
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -no-privatize -replay ./out_in_ti.txt --log=replay.:critical -trace-ti --cfg=tracing/filename:out_ti.txt --cfg=tracing/smpi/format/ti-one-file:yes --cfg=smpi/simulate-computation:no -map -hostfile ${srcdir:=.}/../hostfile -platform ${platfdir:=.}/small_platform.xml -np 4 ${bindir:=.}/../../../examples/smpi/replay/smpi_replay --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
-> [rank 2] -> Fafard
-> [rank 3] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 2] -> Fafard
+> [0.000000] [smpi/INFO] [rank 3] -> Ginette
 > [Jupiter:1:(2) 0.016806] [smpi_replay/INFO] Simulation time 0.016806
 
 $ rm -rf ./out_ti.txt_files
index 69a4b62..94789ef 100644 (file)
@@ -1,6 +1,8 @@
-! expect return 1
-$ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ../hostfile_empty  -platform ${platfdir:=.}/small_platform.xml -np 4 ${bindir:=.}/pt2pt-pingpong -s --log=smpi_config.thres:warning
-> [smpirun] ** error: the hostfile '../hostfile_empty' is empty. Aborting.
+! ignore .*Aborted.*
+! expect return 134
+$ $VALGRIND_NO_LEAK_CHECK ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ../hostfile_empty -quiet -platform ${platfdir:=.}/small_platform.xml -np 4 ${bindir:=.}/pt2pt-pingpong -s --log=smpi_config.thres:warning --log=xbt_cfg.thres=warning --log=no_loc
+> [0.000000] [root/CRITICAL] smpirun: the hostfile '../hostfile_empty' is empty
+> Execution failed with code 134.
 
 ! expect return 1
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile hostfile-does-not-exist.txt -platform ${platfdir:=.}/small_platform.xml -np 4 ${bindir:=.}/pt2pt-pingpong -s --log=smpi_config.thres:warning
index c24bb71..cf4188a 100644 (file)
@@ -25,7 +25,7 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -plat
 > [3] About to send back message '102' to process [2]
 > [3] Received 1st message '101' from process [2]
 > [3] increment message's value to  '102'
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
-> [rank 2] -> Fafard
-> [rank 3] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 2] -> Fafard
+> [0.000000] [smpi/INFO] [rank 3] -> Ginette
diff --git a/teshsuite/smpi/replay-ti-colls/replay-ti-colls.c b/teshsuite/smpi/replay-ti-colls/replay-ti-colls.c
new file mode 100644 (file)
index 0000000..b7d24b0
--- /dev/null
@@ -0,0 +1,90 @@
+#include "mpi.h"
+#include <stdio.h>
+#include <string.h>
+
+#define BUFSIZE (1024 * 1024)
+#define BOUNDED(sz) ((sz) < BUFSIZE ? (sz) : BUFSIZE)
+
+static void setup_recvbuf(int nprocs, int** recvbuf, int** displs, int** counts, int** rcounts)
+{
+  *recvbuf = malloc(BUFSIZE * nprocs * sizeof(int));
+  for (int i = 0; i < BUFSIZE * nprocs; i++)
+    (*recvbuf)[i] = i;
+
+  *displs  = malloc(nprocs * sizeof(int));
+  *counts  = malloc(nprocs * sizeof(int));
+  *rcounts = malloc(nprocs * sizeof(int));
+  for (int i = 0; i < nprocs; i++) {
+    (*displs)[i]  = i * BUFSIZE;
+    (*counts)[i]  = BOUNDED(i);
+    (*rcounts)[i] = (*counts)[i];
+  }
+}
+
+int main(int argc, char** argv)
+{
+  int nprocs = -1;
+  int rank   = -1;
+
+  /* init */
+  MPI_Init(&argc, &argv);
+  MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
+  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+  int* sendbuf = malloc(BUFSIZE * nprocs * sizeof(int));
+  for (int i = 0; i < BUFSIZE * nprocs; i++)
+    sendbuf[i] = rank;
+
+  int* alltoallvcounts = malloc(nprocs * sizeof(int));
+  for (int i = 0; i < nprocs; i++)
+    alltoallvcounts[i] = BOUNDED(i + rank);
+
+  int* dummy_buffer = malloc(sizeof(int));
+  // initialize buffers with an invalid value (we want to trigger a valgrind error if they are used)
+  int* recvbuf      = dummy_buffer + 1;
+  int* displs       = dummy_buffer + 1;
+  int* counts       = dummy_buffer + 1;
+  int* rcounts      = dummy_buffer + 1;
+  if (rank == 0)
+    setup_recvbuf(nprocs, &recvbuf, &displs, &counts, &rcounts);
+
+  // first test, with unallocated non significative buffers
+  MPI_Barrier(MPI_COMM_WORLD);
+  MPI_Bcast(sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Gather(&sendbuf[rank * BUFSIZE], BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Scatter(recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Gatherv(&sendbuf[rank * BUFSIZE], BOUNDED(rank), MPI_INT, recvbuf, rcounts, displs, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Scatterv(recvbuf, counts, displs, MPI_INT, sendbuf, BOUNDED(rank), MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Reduce(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
+
+  free(dummy_buffer);
+  if (rank != 0)
+    setup_recvbuf(nprocs, &recvbuf, &displs, &counts, &rcounts);
+
+  MPI_Barrier(MPI_COMM_WORLD);
+  MPI_Bcast(sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Gather(&sendbuf[rank * BUFSIZE], BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Scatter(recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Gatherv(&sendbuf[rank * BUFSIZE], BOUNDED(rank), MPI_INT, recvbuf, rcounts, displs, MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Scatterv(recvbuf, counts, displs, MPI_INT, sendbuf, BOUNDED(rank), MPI_INT, 0, MPI_COMM_WORLD);
+  MPI_Reduce(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
+  MPI_Allgather(sendbuf, BUFSIZE, MPI_INT, recvbuf, BUFSIZE, MPI_INT, MPI_COMM_WORLD);
+  MPI_Alltoall(recvbuf, BUFSIZE, MPI_INT, sendbuf, BUFSIZE, MPI_INT, MPI_COMM_WORLD);
+  MPI_Allgatherv(sendbuf, BOUNDED(rank), MPI_INT, recvbuf, rcounts, displs, MPI_INT, MPI_COMM_WORLD);
+  MPI_Alltoallv(recvbuf, alltoallvcounts, displs, MPI_INT, sendbuf, alltoallvcounts, displs, MPI_INT, MPI_COMM_WORLD);
+  MPI_Allreduce(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
+  MPI_Reduce_scatter(sendbuf, recvbuf, rcounts, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
+  MPI_Scan(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
+  MPI_Exscan(sendbuf, recvbuf, BUFSIZE, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
+  MPI_Barrier(MPI_COMM_WORLD);
+
+  free(alltoallvcounts);
+  free(sendbuf);
+  free(recvbuf);
+  free(displs);
+  free(counts);
+  free(rcounts);
+
+  MPI_Finalize();
+  return 0;
+}
diff --git a/teshsuite/smpi/replay-ti-colls/replay-ti-colls.tesh b/teshsuite/smpi/replay-ti-colls/replay-ti-colls.tesh
new file mode 100644 (file)
index 0000000..22f8e65
--- /dev/null
@@ -0,0 +1,15 @@
+# Replay test with all collectives, and two runs to 
+! output sort
+
+p First test
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ${bindir:=.}/../hostfile_coll -platform ${platfdir}/small_platform.xml -np 4 --log=xbt_cfg.thres:critical --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error --cfg=smpi/simulate-computation:false -trace-ti --cfg=tracing/filename:trace1 ${bindir:=.}/replay-ti-colls
+
+p Replay
+$ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ${bindir:=.}/../hostfile_coll -platform ${platfdir}/small_platform.xml -np 4 --log=xbt_cfg.thres:critical --log=smpi_config.thres:warning --log=smpi_coll.thres:error --log=smpi_mpi.thres:error --log=smpi_pmpi.thres:error --cfg=smpi/simulate-computation:false -trace-ti --cfg=tracing/filename:trace2 -replay ${bindir:=.}/trace1
+> [Tremblay:1:(2) 0.173855] [smpi_replay/INFO] Simulation time 0.173855
+
+p Compare traces
+$ sh -c "diff trace1_files/*1.txt trace2_files/*1.txt"
+
+$ sh -c "rm -rf trace1* trace2*"
+
index a347934..3ec1c5d 100644 (file)
@@ -1,3 +1,8 @@
+/* Copyright (c) 2016-2021. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
 #include "mpi.h"
 #include <stdio.h>
 #include <stdlib.h>
index 7dfbcb8..a25bc88 100644 (file)
@@ -1,4 +1,4 @@
 p Test timers
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ${platfdir:=.}/small_platform.xml -np 1 ${bindir:=.}/timers -q --log=smpi_config.thres:warning --cfg=smpi/simulate-computation:no --cfg=smpi/host-speed:100Gf --log=xbt_cfg.thres:warning --cfg=smpi/wtime:0
-> [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
 
index 2aaf9a4..02715d3 100644 (file)
@@ -1,9 +1,9 @@
 p Test cart_sub
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ${platfdir:=.}/small_platform.xml -np 4 ${bindir:=.}/topo-cart-sub -q --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
-> [rank 2] -> Fafard
-> [rank 3] -> Ginette
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 2] -> Fafard
+> [0.000000] [smpi/INFO] [rank 3] -> Ginette
 > rank 0: Alive 
 > rank 1: Alive 
 > rank 2: Alive 
index 38de0ae..f3d47a1 100644 (file)
@@ -1,8 +1,8 @@
 p Test hvector
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ${platfdir:=.}/small_platform.xml -np 2 ${bindir:=.}/type-hvector -q --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
 > rank= 0, a[0][0]=0.000000
 > rank= 0, a[0][1]=1.000000
 > rank= 0, a[0][2]=2.000000
index 56dda69..5dd0da9 100644 (file)
@@ -1,8 +1,8 @@
 p Test indexed
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ${platfdir:=.}/small_platform.xml -np 2 ${bindir:=.}/type-indexed -q --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
 > buffer[0] = 0
 > buffer[10] = 10
 > buffer[11] = 11
index 9237c19..bbb37f7 100644 (file)
@@ -1,7 +1,7 @@
 p Test struct
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ${platfdir:=.}/small_platform.xml -np 2 ${bindir:=.}/type-struct -q --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
 > Process 0 got -2 (-2?) and 8.000000 (8.0?), tab (should be all 0): 0 0 0 0 0 0 
 > Process 1 got -2 (-2?) and 8.000000 (8.0?), tab (should be all 0): 0 0 0 0 0 0 
index 9b8a637..c05bbb7 100644 (file)
@@ -1,8 +1,8 @@
 p Test vector
 ! output sort
 $ ${bindir:=.}/../../../smpi_script/bin/smpirun -map -hostfile ../hostfile -platform ${platfdir}/small_platform.xml -np 2 ${bindir:=.}/type-vector -q --log=smpi_config.thres:warning --log=xbt_cfg.thres:warning
-> [rank 0] -> Tremblay
-> [rank 1] -> Jupiter
+> [0.000000] [smpi/INFO] [rank 0] -> Tremblay
+> [0.000000] [smpi/INFO] [rank 1] -> Jupiter
 > rank= 0, a[0][0]=0.000000
 > rank= 0, a[0][1]=1.000000
 > rank= 0, a[0][2]=2.000000
index 5cf04a0..5135d17 100644 (file)
@@ -52,9 +52,9 @@ int main(int argc, char** argv)
   simgrid::s4u::Host* hostB = sg_host_by_name("Cpu B");
 
   /* Let's do something on it */
-  const simgrid::kernel::resource::Action* actionA = hostA->pimpl_cpu->execution_start(1000.0);
-  const simgrid::kernel::resource::Action* actionB = hostB->pimpl_cpu->execution_start(1000.0);
-  const simgrid::kernel::resource::Action* actionC = hostB->pimpl_cpu->sleep(7.32);
+  const simgrid::kernel::resource::Action* actionA = hostA->get_cpu()->execution_start(1000.0, -1);
+  const simgrid::kernel::resource::Action* actionB = hostB->get_cpu()->execution_start(1000.0, -1);
+  const simgrid::kernel::resource::Action* actionC = hostB->get_cpu()->sleep(7.32);
 
   simgrid::kernel::resource::Action::State stateActionA = actionA->get_state();
   simgrid::kernel::resource::Action::State stateActionB = actionB->get_state();
index c79d19b..f62da2b 100644 (file)
@@ -34,9 +34,9 @@ int main(int argc, char** argv)
   simgrid::s4u::Host* hostB = sg_host_by_name("Cpu B");
 
   /* Let's do something on it */
-  hostA->pimpl_cpu->execution_start(1000.0);
-  hostB->pimpl_cpu->execution_start(1000.0);
-  hostB->pimpl_cpu->sleep(7.32);
+  hostA->get_cpu()->execution_start(1000.0, -1);
+  hostB->get_cpu()->execution_start(1000.0, -1);
+  hostB->get_cpu()->sleep(7.32);
 
   const_sg_netzone_t as_zone = sg_zone_get_by_name("AS0");
   auto net_model             = as_zone->get_impl()->get_network_model();
@@ -51,7 +51,7 @@ int main(int argc, char** argv)
     XBT_INFO("Next Event : %g", now);
 
     for (auto const& model : simgrid::kernel::EngineImpl::get_instance()->get_all_models()) {
-      if (model->get_started_action_set()->size() != 0) {
+      if (not model->get_started_action_set()->empty()) {
         XBT_DEBUG("\t Running that model");
         running = 1;
       }
index 1a370eb..76196b8 100644 (file)
@@ -39,7 +39,7 @@ int main(int argc, char**argv)
   XBT_INFO("Allocating a new heap");
   unsigned long mask = ~((unsigned long)xbt_pagesize - 1);
   auto* addr         = reinterpret_cast<void*>(((unsigned long)sbrk(0) + BUFFSIZE) & mask);
-  heapA = xbt_mheap_new(-1, addr);
+  heapA              = xbt_mheap_new(addr, 0);
   if (heapA == nullptr) {
     perror("attach 1 failed");
     fprintf(stderr, "bye\n");
index 9f92cf6..3533acd 100644 (file)
@@ -41,6 +41,9 @@ set(EXTRA_DIST
   src/surf/network_cm02.hpp
   src/surf/network_constant.hpp
   src/surf/network_interface.hpp
+  src/surf/LinkImpl.hpp
+  src/surf/LinkImplIntf.hpp
+  src/surf/SplitDuplexLinkImpl.hpp
   src/surf/network_ns3.hpp
   src/surf/network_smpi.hpp
   src/surf/network_ib.hpp
@@ -80,7 +83,6 @@ set(EXTRA_DIST
   tools/lualib.patch
   teshsuite/lua/lua_platforms.tesh
   examples/smpi/mc/only_send_deterministic.tesh
-  examples/smpi/mc/non_deterministic.tesh
   )
 
 set(SMPI_SRC
@@ -317,6 +319,7 @@ set(SURF_SRC
   src/kernel/resource/profile/Event.hpp
   src/kernel/resource/profile/FutureEvtSet.cpp
   src/kernel/resource/profile/FutureEvtSet.hpp
+  src/kernel/resource/profile/ProfileBuilder.cpp
   src/kernel/resource/profile/Profile.cpp
   src/kernel/resource/profile/Profile.hpp
   src/kernel/resource/profile/StochasticDatedValue.cpp
@@ -349,6 +352,8 @@ set(SURF_SRC
   src/surf/network_cm02.cpp
   src/surf/network_constant.cpp
   src/surf/network_interface.cpp
+  src/surf/LinkImpl.cpp
+  src/surf/SplitDuplexLinkImpl.cpp
   src/surf/network_wifi.cpp
   src/surf/sg_platf.cpp
   src/surf/surf_c_bindings.cpp
@@ -395,7 +400,6 @@ set(SIMIX_SRC
   src/kernel/context/ContextSwapped.hpp
   src/kernel/context/ContextThread.cpp
   src/kernel/context/ContextThread.hpp
-  src/simix/smx_deployment.cpp
   src/simix/smx_global.cpp
   src/simix/popping.cpp
   src/kernel/activity/ActivityImpl.cpp
@@ -690,6 +694,7 @@ set(headers_to_install
   include/simgrid/forward.h
   include/simgrid/simix.h
   include/simgrid/simix.hpp
+  include/simgrid/kernel/ProfileBuilder.hpp
   include/simgrid/kernel/Timer.hpp
   include/simgrid/kernel/future.hpp
   include/simgrid/disk.h
@@ -855,11 +860,9 @@ set(DOC_SOURCES
   doc/doxygen/module-sd.doc
   doc/doxygen/module-surf.doc
   doc/doxygen/module-trace.doc
-  doc/doxygen/module-xbt.doc
   doc/doxygen/module-index.doc
   doc/doxygen/outcomes_vizu.doc
   doc/doxygen/platform.doc
-  doc/doxygen/platform_lua.doc
   doc/doxygen/uhood.doc
   doc/doxygen/uhood_switch.doc
   doc/doxygen/uhood_arch.doc
@@ -907,9 +910,14 @@ set(DOC_SOURCES
   docs/source/img/graphical-toc.svg
   docs/source/img/smpi_simgrid_alltoall_pair_16.png
   docs/source/img/smpi_simgrid_alltoall_ring_16.png
+  docs/source/img/starzone.drawio
+  docs/source/img/starzone.svg
   docs/source/img/zone_hierarchy.png
+  docs/source/img/zone_tree.drawio
+  docs/source/img/zone_tree.svg
+  docs/source/img/zoom_comm.drawio
+  docs/source/img/zoom_comm.svg
 
-  docs/ignored_symbols
   docs/source/application.rst
   docs/source/app_msg.rst
   docs/source/app_s4u.rst
@@ -927,10 +935,12 @@ set(DOC_SOURCES
   docs/source/Models.rst
   docs/source/Outcomes.rst
   docs/source/Platform.rst
+  docs/source/Platform_cpp.rst
   docs/source/Platform_examples.rst
   docs/source/Platform_howtos.rst
   docs/source/Platform_routing.rst
   docs/source/Plugins.rst
+  docs/source/Release_Notes.rst
   docs/source/XML_reference.rst
   docs/source/Design_goals.rst
 
@@ -958,6 +968,19 @@ set(DOC_SOURCES
   docs/source/tuto_smpi/gemm_mpi.cpp
   docs/source/tuto_smpi/roundtrip.c
 
+  docs/source/tuto_disk/analysis.org
+  docs/source/tuto_disk/analysis.rst
+  docs/source/tuto_disk/CMakeLists.txt
+  docs/source/tuto_disk/Dockerfile
+  docs/source/tuto_disk/fig/edel_read_dhist.png
+  docs/source/tuto_disk/fig/edel_write_dhist.png
+  docs/source/tuto_disk/fig/griffon_deg.png
+  docs/source/tuto_disk/fig/griffon_read_dhist.png
+  docs/source/tuto_disk/fig/griffon_write_dhist.png
+  docs/source/tuto_disk/fig/simgrid_results.png
+  docs/source/tuto_disk/init.el
+  docs/source/tuto_disk/tuto_disk.cpp
+
   docs/source/Tutorial_Model-checking.rst
 
   CITATION.bib
@@ -998,6 +1021,7 @@ set(txt_files
 # The list of cmake build directories is constructed from the following list.
 # Add your CMakeLists file here to see your subdir built.
 set(CMAKEFILES_TXT
+  examples/platforms/CMakeLists.txt
   examples/c/CMakeLists.txt
   examples/cpp/CMakeLists.txt
   examples/smpi/CMakeLists.txt
@@ -1151,6 +1175,7 @@ set(PLATFORMS_EXAMPLES
   examples/platforms/energy_cluster.xml
   examples/platforms/faulty_host.xml
   examples/platforms/g5k.xml
+  examples/platforms/griffon.cpp
   examples/platforms/griffon.xml
   examples/platforms/hosts_with_disks.xml
   examples/platforms/meta_cluster.xml
@@ -1161,6 +1186,7 @@ set(PLATFORMS_EXAMPLES
   examples/platforms/prop.xml
   examples/platforms/routing_cluster.xml
   examples/platforms/routing_cluster.lua
+  examples/platforms/routing_cluster.cpp
   examples/platforms/routing_none.xml
   examples/platforms/simulacrum_7_hosts.xml
   examples/platforms/storage/content/small_content.txt
index 0a195ec..4d6b380 100644 (file)
@@ -176,15 +176,20 @@ if(enable_model-checking AND enable_compile_optimizations)
   # Forget it, do not optimize the code (because it confuses the MC):
   set(optCFLAGS "-O0")
   # But you can still optimize this:
-  foreach(s
-      src/simix/popping.cpp src/simix/popping_generated.cpp src/simix/smx_global.cpp
-      ${SURF_SRC} ${TRACING_SRC} ${XBT_SRC}
-      ${MC_SRC_BASE} ${MC_SRC})
+  set(src_list ${simgrid_sources})
+  # except...
+  list(REMOVE_ITEM src_list ${SIMIX_SRC} ${S4U_SRC})
+  # but...
+  list(APPEND src_list
+    src/simix/popping.cpp
+    src/simix/popping_generated.cpp
+    src/simix/smx_global.cpp)
+  foreach(src ${src_list})
       set (mcCFLAGS "-O3 -funroll-loops -fno-strict-aliasing")
       if(CMAKE_COMPILER_IS_GNUCC)
         set (mcCFLAGS "${mcCFLAGS} -finline-functions")
       endif()
-      set_source_files_properties(${s} PROPERTIES COMPILE_FLAGS ${mcCFLAGS})
+      set_source_files_properties(${src} PROPERTIES COMPILE_FLAGS ${mcCFLAGS})
   endforeach()
 endif()
 
index 198d031..e46a56a 100644 (file)
@@ -67,7 +67,7 @@ if(SIMGRID_HAVE_LUA)
   ADD_CUSTOM_TARGET(link_simgrid_lua ALL
     DEPENDS    simgrid
     )
-  SET(SIMGRID_DEP "${SIMGRID_DEP} ${LUA_LIBRARY} ${DL_LIBRARY}")
+  SET(SIMGRID_DEP "${SIMGRID_DEP} ${LUA_LIBRARY}")
 endif()
 
 if(HAVE_PAPI)
@@ -84,7 +84,7 @@ if(HAVE_GRAPHVIZ)
   endif()
 endif()
 
-if(SIMGRID_HAVE_MC AND NOT ${DL_LIBRARY} STREQUAL "")
+if(NOT ${DL_LIBRARY} STREQUAL "")
   SET(SIMGRID_DEP "${SIMGRID_DEP} ${DL_LIBRARY}")
 endif()
 
@@ -100,10 +100,6 @@ endif()
 ##################################
 
 if(enable_smpi)
-  if(NOT ${DL_LIBRARY} STREQUAL "")
-    set(SIMGRID_DEP "${SIMGRID_DEP} ${DL_LIBRARY}") # for privatization
-  endif()
-
   add_executable(smpimain src/smpi/smpi_main.c)
   target_link_libraries(smpimain simgrid)
   set_target_properties(smpimain
index 11ea8e0..9929e62 100644 (file)
 set(SIMGRID_HAVE_NS3 0)
 set(NS3_HINT ${ns3_path} CACHE PATH "Path to search for NS3 lib and include")
 
+set(NS3_KNOWN_VERSIONS "3.22" "3.23" "3.24" "3.25" "3.26" "3.27" "3.28" "3.29" "3.30" "3.31" "3.32" "3.33" "3.34" "3.35" "3.36" "3.37" "3.38" "3.39" "3.40")
+
+foreach (_ns3_ver ${NS3_KNOWN_VERSIONS})
+  list(APPEND _ns3_LIB_SEARCH_DIRS "ns${_ns3_ver}-core" "ns${_ns3_ver}-core-optimized" "ns${_ns3_ver}-core-debug")
+  list(APPEND _ns3_INCLUDE_SEARCH_DIRS "include/ns${_ns3_ver}")
+endforeach()
+
 find_library(NS3_LIBRARIES
   NAME ns3-core
-       ns3.22-core ns3.22-core-optimized ns3.22-core-debug
-       ns3.23-core ns3.23-core-optimized ns3.23-core-debug
-       ns3.24-core ns3.24-core-optimized ns3.24-core-debug
-       ns3.25-core ns3.25-core-optimized ns3.25-core-debug
-       ns3.26-core ns3.26-core-optimized ns3.26-core-debug
-       ns3.27-core ns3.27-core-optimized ns3.27-core-debug
-       ns3.28-core ns3.28-core-optimized ns3.28-core-debug
-       ns3.29-core ns3.29-core-optimized ns3.29-core-debug
-       ns3.30-core ns3.30-core-optimized ns3.30-core-debug
-       ns3.31-core ns3.31-core-optimized ns3.31-core-debug
-       ns3.32-core ns3.32-core-optimized ns3.32-core-debug
-       ns3.33-core ns3.33-core-optimized ns3.33-core-debug
-       ns3.34-core ns3.34-core-optimized ns3.34-core-debug
+      ${_ns3_LIB_SEARCH_DIRS}
   PATH_SUFFIXES lib64 lib ns3/lib
   PATHS
   ${NS3_HINT}
@@ -41,9 +36,8 @@ find_library(NS3_LIBRARIES
 
 find_path(NS3_INCLUDE_DIR
   NAME ns3/core-module.h
-  PATH_SUFFIXES include ns3/include 
-                include/ns3.22 include/ns3.23 include/ns3.24 include/ns3.25 include/ns3.26 include/ns3.27 include/ns3.28 include/ns3.29 include/ns3.30
-                include/ns3.31 include/ns3.32 include/ns3.33 include/ns3.34
+  PATH_SUFFIXES include ns3/include
+                ${_ns3_INCLUDE_SEARCH_DIRS}
   PATHS
   ${NS3_HINT}
   )
index 2c6ea4c..47e378e 100644 (file)
@@ -132,6 +132,7 @@ set(UNIT_TESTS  src/xbt/unit-tests_main.cpp
                 src/kernel/routing/FullZone_test.cpp
                 src/kernel/routing/StarZone_test.cpp
                 src/kernel/routing/TorusZone_test.cpp
+                src/surf/SplitDuplexLinkImpl_test.cpp
                 src/xbt/config_test.cpp
                 src/xbt/dict_test.cpp
                 src/xbt/dynar_test.cpp
@@ -143,6 +144,7 @@ if (SIMGRID_HAVE_MC)
 else()
   set(EXTRA_DIST ${EXTRA_DIST} src/mc/sosp/Snapshot_test.cpp src/mc/sosp/PageStore_test.cpp)
 endif()  
+set(EXTRA_DIST ${EXTRA_DIST} src/kernel/routing/NetZone_test.hpp)
 
 add_executable       (unit-tests EXCLUDE_FROM_ALL ${UNIT_TESTS})
 add_dependencies     (tests unit-tests)
diff --git a/tools/docker/.gitignore b/tools/docker/.gitignore
deleted file mode 100644 (file)
index 397b4a7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-*.log
index f8e4e63..59c45a3 100644 (file)
@@ -1,12 +1,12 @@
-# Base image 
-FROM debian:testing
+# Base image: use a named release to avoid names clashes when calling apt upgrade on the resulting image
+FROM debian:11 #  Bullseye, release 2021-08-14
 
 ARG DLURL
 
 # - Install SimGrid's dependencies
 # - Compile and install SimGrid itself
 RUN echo "DOWNLOAD_URL: ${DLURL}" && \
-    apt-get --allow-releaseinfo-change update && apt upgrade -y && apt install -y wget && \
+    apt-get update && apt upgrade -y && apt install -y wget && \
     mkdir /source && cd /source && \
     wget https://framagit.org/${DLURL} && \
     tar xf simgrid-* && rm simgrid-*tar.gz && \
index 1a686fe..ee35b96 100644 (file)
@@ -1,7 +1,7 @@
 # Base image 
 FROM simgrid/stable
 
-RUN apt update && apt -y upgrade 
+RUN apt update && apt -y upgrade
 
 RUN apt install -y sudo && \
     groupadd -g 999 user && \
@@ -13,7 +13,7 @@ RUN apt install -y sudo && \
 
 # - Clone simgrid-template-s4u, as it is needed by the tutorial
 # - Add an empty makefile advising to run cmake before make, just in case
-RUN apt install -y pajeng r-base r-cran-ggplot2 r-cran-dplyr r-cran-devtools cmake g++ git libboost-dev flex bison libfmt-dev&& \
+RUN apt install -y pajeng r-base r-cran-tidyverse r-cran-devtools cmake g++ git libboost-dev flex bison libfmt-dev&& \
     cd /source && \
     git clone --depth=1 https://framagit.org/simgrid/simgrid-template-s4u.git simgrid-template-s4u.git && \
     printf "master-workers ping-pong:\n\t@echo \"Please run the following command before make:\";echo \"    cmake .\"; exit 1" > Makefile &&\
index 59f39a4..989fd59 100644 (file)
@@ -1,7 +1,9 @@
 # Base image 
 FROM simgrid/stable
 
-RUN apt update && apt -y upgrade 
+# https://stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands
+ADD "http://deb.debian.org/debian/dists/testing/Release" skipcache
+RUN apt update && apt -y upgrade
 
 RUN apt install -y sudo && \
     groupadd -g 999 user && \
@@ -12,7 +14,7 @@ RUN apt install -y sudo && \
     chown -R user:user /home/user
 
 # - Clone simgrid-template-smpi, as it is needed by the tutorial
-RUN apt install -y python3 pajeng libssl-dev r-base r-cran-ggplot2 r-cran-dplyr r-cran-devtools build-essential g++ gfortran git libboost-dev cmake flex bison libfmt-dev && \
+RUN apt install -y python3 pajeng libssl-dev r-base r-cran-devtools r-cran-tidyverse build-essential g++ gfortran git libboost-dev cmake flex bison libfmt-dev && \
     cd /source && \
     git clone --depth=1 https://framagit.org/simgrid/simgrid-template-smpi.git simgrid-template-smpi.git && \
     chown -R user:user /source && \
index dc2faf5..4da4f51 100644 (file)
@@ -11,15 +11,14 @@ default:
        @echo "All our images are based on debian:testing"
        @echo "Also possible: DOCKER_EXTRA=--no-cache make unstable"
 
-all: build-deps unstable tuto-s4u tuto-smpi
+all: build-deps unstable tuto-s4u tuto-smpi tuto-mc
 
 stable:
-       # docker build -f Dockerfile.stable --build-arg DLURL=/simgrid/simgrid/uploads/0365f13697fb26eae8c20fc234c5af0e/SimGrid-3.25.tar.gz -t simgrid/stable:latest -t simgrid/stable:v3.25 . |tee stable.log
+       # docker build -f Dockerfile.stable --build-arg DLURL=/simgrid/simgrid/-/archive/v3.28/simgrid-v3.28.tar.gz -t simgrid/stable:latest -t simgrid/stable:v3.25 . |tee stable.log
        export last_tag=$$(wget https://framagit.org/simgrid/simgrid/tags 2>/dev/null -O - | grep /simgrid/simgrid/-/tags/v | head -n1  | sed 's/[^>]*>//' | sed 's/<.*//'); \
-       export DLURL=$$(wget https://framagit.org/simgrid/simgrid/tags/$${last_tag} 2>/dev/null -O - | grep simgrid- | perl -pe 's/.*?<a href="(\/simgrid[^ ]*tar.gz)".*/$1/'); \
-  echo "DLURL=$$DLURL";\
+       echo "DLURL=/simgrid/simgrid/-/archive/$${last_tag}/simgrid-$${last_tag}.tar.gz";\
        docker build -f Dockerfile.stable \
-                --build-arg DLURL=$${DLURL} \
+                --build-arg DLURL=/simgrid/simgrid/-/archive/$${last_tag}/simgrid-$${last_tag}.tar.gz \
                 -t simgrid/stable:latest \
                  -t simgrid/stable:$${last_tag} \
                 $(DOCKER_EXTRA) \
index 74872a2..8cf4bb6 100644 (file)
 + \.circleci/.*
 + \.clang-format
 + \.classpath
-+ \.codacy\.yml
 + \.editorconfig
 + \.gitlab-ci\.yml
++ \.lgtm\.yml
 + \.project
 + \.readthedocs.yml
-+ \.travis\.yml
 + sonar-project\.properties
 
 + contrib/.*
diff --git a/tools/internal/travis-sonarqube.sh b/tools/internal/travis-sonarqube.sh
deleted file mode 100755 (executable)
index eeb0b44..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env sh
-
-# Install and run SonarQube on travis.
-#
-# Use it as a wrapper to your build command, eg: ./travis-sonarqube.sh make VERBOSE=1
-
-# On macOS or with pull requests, you don't want to run SonarQube but to exec the build command directly.
-
-# Be verbose and fail fast
-set -ex
-
-# Install required software
-installSonarQubeScanner() {
-  SONAR_SCANNER_VERSION=3.2.0.1227
-  export SONAR_SCANNER_HOME=$HOME/.sonar/sonar-scanner-$SONAR_SCANNER_VERSION
-  rm -rf $SONAR_SCANNER_HOME
-  mkdir -p $SONAR_SCANNER_HOME
-  curl -sSLo $HOME/.sonar/sonar-scanner.zip http://repo1.maven.org/maven2/org/sonarsource/scanner/cli/sonar-scanner-cli/$SONAR_SCANNER_VERSION/sonar-scanner-cli-$SONAR_SCANNER_VERSION.zip
-  unzip $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/
-  rm $HOME/.sonar/sonar-scanner.zip
-  export PATH=$SONAR_SCANNER_HOME/bin:$PATH
-  export SONAR_SCANNER_OPTS="-server"
-}
-installBuildWrapper() {
-  curl -LsS https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip > build-wrapper-linux-x86.zip
-  unzip build-wrapper-linux-x86.zip
-}
-installSonarQubeScanner
-installBuildWrapper
-
-# triggers the compilation through the build wrapper to gather compilation database
-./build-wrapper-linux-x86/build-wrapper-linux-x86-64 --out-dir bw-outputs "$@"
-
-# Run ctest before sonar to gather coverage some information
-# EDIT: Don't run the tests on travis because they take too much time.
-#set +e
-#ctest -j2 --output-on-failure
-#outcome=$?
-#set -e
-outcome=0
-
-# Only run sonar on master (not on pull requests)
-if [ "$TRAVIS_PULL_REQUEST" != "false" ] ; then
-  exit $outcome
-fi
-
-# generate the gcov files
-#ctest -D ExperimentalCoverage
-
-# and finally execute the actual SonarQube analysis
-# (the SONAR_TOKEN is set from the travis web interface, to not expose it with an ongoing "set -x")
-# See https://docs.travis-ci.com/user/sonarqube/ for more info on tokens
-# don't show the token in the logs
-set +x
-sonar-scanner -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=$SONAR_TOKEN 2>&1 \
-  | grep -v 'INFO: Parsing /home/travis/build/simgrid/simgrid/Testing/CoverageInfo'  \
-  | grep -v 'WARN: File not analysed by Sonar, so ignoring coverage: /usr/include/'
-
-exit $outcome
index 2cd8155..bf9a0d5 100755 (executable)
@@ -120,8 +120,9 @@ if [ -f Testing/TAG ] ; then
   pvs-studio-analyzer analyze -f "$BUILDFOLDER"/compile_commands.json -o "$WORKSPACE"/pvs.log $EXCLUDEDPATH -j$NUMPROC
   # Disable:
   # V521 Such expressions using the ',' operator are dangerous. (-> commas in catch.hpp),
+  # V576 Incorrect format. (-> gives false alarms, and already checked elsewhere)
   # V1042 This file is marked with copyleft license, which requires you to open the derived source code.
   # V1056 The predefined identifier '__func__' always contains the string 'operator()' inside function body of the overloaded 'operator()'.
-  plog-converter -t xml -o "$WORKSPACE"/pvs.plog -d V521,V1042,V1056 "$WORKSPACE"/pvs.log
+  plog-converter -t xml -o "$WORKSPACE"/pvs.plog -d V521,V576,V1042,V1056 "$WORKSPACE"/pvs.log
 
 fi || exit 42
diff --git a/tools/jenkins/ci-batsim.sh b/tools/jenkins/ci-batsim.sh
new file mode 100755 (executable)
index 0000000..b2af1a0
--- /dev/null
@@ -0,0 +1,51 @@
+#! /bin/sh
+
+# Test this script locally as follows (rerun `docker pull simgrid/unstable` to get a fresh version).
+# cd (simgrid)/tools/jenkins
+# docker run -it --rm --volume `pwd`:/source simgrid/unstable /source/ci-batsim.sh
+
+set -ex
+
+echo "XXXXXXXXXXXXXXXX Install APT dependencies"
+
+export SUDO=""
+$SUDO apt-get update
+$SUDO apt-get -y install gcc g++ git
+
+# Dependencies of BatSim
+# OK  simgrid-3.28
+# SRC intervalset-1.2.0
+# PKG rapidjson-1.1.0
+# ??  redox
+# PKG hiredis-1.0.0
+# PKG zeromq-4.3.4
+# PKG docopt.cpp-0.6.3
+# PKG pugixml-1.11.1
+# PKG gtest-1.10.0-dev
+$SUDO apt-get -y install meson pkg-config libpugixml-dev libgtest-dev rapidjson-dev python3-hiredis libzmq3-dev libdocopt-dev libboost-all-dev
+
+echo "XXXXXXXXXXXXXXXX Install intervalset"
+git clone https://framagit.org/batsim/intervalset.git
+cd intervalset 
+meson build --prefix=/usr
+cd build && ninja install
+cd ../..
+
+echo "XXXXXXXXXXXXXXXX Install redox"
+$SUDO apt-get -y install libhiredis-dev libev-dev cmake #for redox
+git clone --depth=1 --branch=install-pkg-config-file https://github.com/mpoquet/redox.git
+cd redox 
+cmake -DCMAKE_INSTALL_PREFIX=/usr -Dstatic_lib=OFF . && make -j$(nproc) install
+cp redox.pc /usr/lib/pkgconfig/
+cd ..
+
+echo "XXXXXXXXXXXXXXXX Install and test batsim"
+# install BatSim from their upstream git into the batsim.git directory
+git clone --depth 1 https://gitlab.inria.fr/batsim/batsim
+cd batsim
+meson build -Ddo_unit_tests=true
+ninja -C build
+meson test -C build
+
+echo "XXXXXXXXXXXXXXXX cat /batsim/build/meson-logs/testlog.txt"
+cat build/meson-logs/testlog.txt
diff --git a/tools/jenkins/ci-bigdft.sh b/tools/jenkins/ci-bigdft.sh
new file mode 100755 (executable)
index 0000000..457c8ad
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# Test this script locally as follows (rerun `docker pull simgrid/unstable` to get a fresh version).
+# cd (simgrid)/tools/jenkins
+# docker run -it --rm --volume `pwd`:/source simgrid/unstable /source/ci-bigdft.sh
+
+set -ex
+export OMP_NUM_THREADS=1
+
+echo "XXXXXXXXXXXXXXXX Install APT dependencies"
+SUDO="" # to ease the local testing
+$SUDO apt-get -y update
+$SUDO apt-get -y install git build-essential gfortran python-is-python3 python3-six python3-distutils automake cmake libboost-dev libblas-dev liblapack-dev wget
+
+echo "XXXXXXXXXXXXXXXX build and test BigDFT (git version)"
+git clone --depth=1 https://gitlab.com/l_sim/bigdft-suite.git
+cd bigdft-suite
+
+WORKSPACE=`pwd`
+mkdir build && cd build
+export PATH=$PWD/simgrid-dev/smpi_script/bin/:$PATH
+export LD_LIBRARY_PATH=$PWD/simgrid-dev/lib/:$LD_LIBRARY_PATH
+export JHBUILD_RUN_AS_ROOT=1
+
+../Installer.py autogen -y
+
+../Installer.py -f ../../tools/jenkins/gfortran-simgrid.rc -y build
+
+#cubic version
+cd ../bigdft/tests/DFT/cubic/C
+smpirun -hostfile $WORKSPACE/simgrid-dev/examples/smpi/hostfile -platform $WORKSPACE/simgrid-dev/examples/platforms/small_platform.xml -np 8 $WORKSPACE/build/install/bin/bigdft -l no
+
+#Psolver checking with smpi_shared_malloc
+cd $WORKSPACE/build/psolver/tests
+make FC=smpif90 PS_Check
+smpirun -hostfile $WORKSPACE/simgrid-dev/examples/smpi/hostfile -platform $WORKSPACE/simgrid-dev/examples/platforms/small_platform.xml -np 4 ./PS_Check -n [57,48,63] -g F
+
+#linear scaling version (heavy, might swap)
+cd $WORKSPACE/bigdft/tests/DFT/linear/surface
+smpirun -hostfile $WORKSPACE/simgrid-dev/examples/smpi/hostfile -platform $WORKSPACE/simgrid-dev/examples/platforms/small_platform.xml -np 4 $WORKSPACE/build/install/bin/bigdft -n graphene -l no
+
+cd $WORKSPACE/build
+../Installer.py -f ../../tools/jenkins/gfortran-simgrid.rc -y clean
diff --git a/tools/jenkins/ci-starpu.sh b/tools/jenkins/ci-starpu.sh
new file mode 100755 (executable)
index 0000000..22fc426
--- /dev/null
@@ -0,0 +1,54 @@
+#!/usr/bin/env sh
+
+# Test this script locally as follows (rerun `docker pull simgrid/unstable` to get a fresh version).
+# cd (simgrid)/tools/jenkins
+# docker run -it --rm --volume `pwd`:/source simgrid/unstable /source/ci-starpu.sh
+
+set -ex
+
+export SUDO=""
+
+echo "XXXXXXXXXXXXXXXX Install APT dependencies"
+$SUDO apt-get update
+$SUDO apt-get -y install build-essential libboost-all-dev wget git
+
+for i in master 1.3 ; do
+  echo "XXXXXXXXXXXXXXXX Build and test StarPU $i"
+  rm -rf starpu*
+  wget https://files.inria.fr/starpu/simgrid/starpu-simgrid-$i.tar.gz
+  md5sum starpu-simgrid-$i.tar.gz
+  tar xf starpu-simgrid-$i.tar.gz
+  cd starpu-1*
+
+  # NOTE: Do *not* introduce parameters to "make it work" here.
+  # Things should "just work" with default parameters!
+  # Users should not have to tinker to get starpu working on top of simgrid, that is precisely why we have this CI
+
+  if [ $i = master ]; then
+    # On master, fail if we use deprecated functions, so that StarPU people know they have to stop using them, fix it, and thus make CI happy again
+    CFLAGS="-Werror=deprecated-declarations"
+    CXXFLAGS="-Werror=deprecated-declarations"
+  else
+    CFLAGS=""
+    CXXFLAGS=""
+  fi
+  if ! ./configure CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" \
+                   --enable-simgrid --disable-shared --enable-mpi-check --disable-cuda \
+                   --disable-build-doc --enable-quick-check
+  then
+    cat ./config.log
+    false
+  fi
+  make -j$(nproc) V=1
+
+  for STARPU_SCHED in eager dmdas ; do
+    export STARPU_SCHED
+    if ! make check -k
+    then
+      make showsuite
+      make showfailed
+      false
+    fi
+  done
+  cd ..
+done
diff --git a/tools/jenkins/ci-wrench.sh b/tools/jenkins/ci-wrench.sh
new file mode 100755 (executable)
index 0000000..7d605b4
--- /dev/null
@@ -0,0 +1,26 @@
+#! /bin/sh
+
+# Test this script locally as follows (rerun `docker pull simgrid/unstable` to get a fresh version).
+# cd (simgrid)/tools/jenkins
+# docker run -it --rm --volume `pwd`:/source simgrid/unstable /source/ci-wrench.sh
+
+set -ex
+
+export CXX="g++"
+export CC="gcc"
+export SUDO=""
+
+echo "XXXXXXXXXXXXXXXX Install APT dependencies"
+
+$SUDO apt-get update
+$SUDO apt-get -y install cmake gcc g++ git
+$SUDO apt-get -y install unzip doxygen wget
+$SUDO apt-get -y install libboost-all-dev libpugixml-dev nlohmann-json3-dev libgtest-dev
+
+echo "XXXXXXXXXXXXXXXX build and test wrench (git version)"
+# install WRENCH from their upstream git into the wrench.git directory
+rm -rf wrench.git && git clone --depth 1 --branch simgrid-external-project-ci https://github.com/wrench-project/wrench.git wrench.git
+(mkdir wrench.git/build && cd wrench.git/build && cmake -DSIMGRID_INSTALL_PATH=/usr/ .. && make -j$(nproc) unit_tests && ./unit_tests && cd ../.. && rm -rf wrench.git) || exit 1
+
+
+
diff --git a/tools/jenkins/gfortran-simgrid.rc b/tools/jenkins/gfortran-simgrid.rc
new file mode 100644 (file)
index 0000000..70c55d8
--- /dev/null
@@ -0,0 +1,28 @@
+#This is the configuration file for the BigDFT installer
+#This is a python script which is executed by the build suite
+def getcwd():
+  import os
+  return os.getcwd()
+prefix=getcwd()+"/install"
+#Add the condition testing to run tests and includes PyYaml
+conditions.add("testing")
+conditions.add("simulation") #to include simgrid compilation
+#List the module the this rcfile will build
+modules = ['spred',]
+#example of the potentialities of the python syntax in this file
+def env_configuration():
+    return """--host=x86_64-linux-gnu 'FCFLAGS=-O2 -std=legacy -fopenmp -g -fbounds-check -fbacktrace -ffpe-trap=invalid,zero,overflow,denormal -Wall -fPIC' 'CFLAGS=-O2 -fopenmp -fPIC' 'LDFLAGS=-fopenmp -fPIC' --with-mpi3=false"""
+
+#the following command sets the environment variable to give these settings
+#to all the modules
+import os
+os.environ['BIGDFT_CONFIGURE_FLAGS']=env_configuration()
+#here follow the configuration instructions for the modules built
+#we specify the configurations for the modules to customize the options if needed
+autogenargs=env_configuration()
+module_autogenargs.update({
+'futile': env_configuration()+
+    " --enable-simgrid-shared --with-mpi-libs='-lsimgrid' --with-mpi-include=-I"+getcwd()+"/install/include/smpi FC="+getcwd()+"/install/bin/smpif90 CC=gcc SIMGRID_FC="+getcwd()+"/install/bin/smpif90",
+'bigdft': env_configuration()+
+    " --enable-simgrid-shared --with-mpi-libs='-lsimgrid' --with-mpi-include=-I"+getcwd()+"/install/include/smpi FC="+getcwd()+"/install/bin/smpif90 CC=gcc SIMGRID_FC="+getcwd()+"/install/bin/smpif90",
+})
index 529ed19..cd019ca 100755 (executable)
@@ -173,41 +173,6 @@ do
 done
 
 
-#Travis - get ID of the last jobs with the API
-BUILD_NUM=$(curl -s 'https://api.travis-ci.org/repos/simgrid/simgrid/builds?limit=1' | grep -o '^\[{"id":[0-9]*,' | grep -o '[0-9]' | tr -d '\n')
-BUILDS=($(curl -s https://api.travis-ci.org/repos/simgrid/simgrid/builds/"${BUILD_NUM}" | grep -o '{"id":[0-9]*,' | grep -o '[0-9]*'| tail -n 3))
-OS=($(curl -s https://api.travis-ci.org/repos/simgrid/simgrid/builds/"${BUILD_NUM}" | grep -o '"os":"[a-z]*",' | sed  's/"os":"\([a-z]*\)",/\1/g'| tail -n 3))
-
-for id in "${!BUILDS[@]}"
-do
-    wget --quiet https://api.travis-ci.org/v3/job/"${BUILDS[$id]}"/log.txt -O ./consoleText >/dev/null 2>&1
-    sed -i -e "s/\r//g" ./consoleText
-
-    if [ "${OS[$id]}" == "linux" ]; then
-      node="travis-linux (<a href=\"https://travis-ci.org/simgrid/simgrid/jobs/${BUILDS[$id]}\">log</a>)"
-      os="Ubuntu  <a href=\"https://docs.travis-ci.com/user/reference/bionic/\">18.04 bionic</a>"
-    elif [ "${OS[$id]}" == "osx" ]; then
-      node="travis-mac (<a href=\"https://travis-ci.org/simgrid/simgrid/jobs/${BUILDS[$id]}\">log</a>)"
-      os="Mac OS X <a href=\"https://docs.travis-ci.com/user/reference/osx/\">Catalina (10.15)</a> "
-    elif [ "${OS[$id]}" == "windows" ]; then
-      node="travis-windows (<a href=\"https://travis-ci.org/simgrid/simgrid/jobs/${BUILDS[$id]}\">log</a>)"
-      os="Windows <a href=\"https://docs.travis-ci.com/user/reference/windows/\">Server 1809</a>"
-    fi
-    boost=$(get_boost)
-    compiler=$(get_compiler)
-    java=$(get_java)
-    cmake=$(get_cmake)
-    ns3=$(get_ns3)
-    py=$(get_python)
-    success=$(grep -m 1 "Your build exited with 0" ./consoleText)
-    ball="red.png"
-    if [ -n "$success" ]; then
-      ball="blue.png"
-    fi
-    echo "<tr> <td class=\"matrix-leftcolumn\">$node</td><td class=\"matrix-cell\" style=\"text-align:left\">$os</td><td class=\"matrix-cell\" style=\"text-align:left\">$compiler</td><td class=\"matrix-cell\" style=\"text-align:left\">$boost</td><td class=\"matrix-cell\" style=\"text-align:left\">$java</td><td class=\"matrix-cell\" style=\"text-align:left\">$cmake</td><td class=\"matrix-cell\" style=\"text-align:center\">$ns3</td><td class=\"matrix-cell\" style=\"text-align:center\">$py</td><td class=\"matrix-cell\" style=\"text-align:center\"><img src=https://ci.inria.fr/simgrid/images/24x24/${ball}></td><td class=\"matrix-cell\" style=\"text-align:center\"><img src=https://ci.inria.fr/simgrid/images/24x24/grey.png></td></tr>"
-    rm consoleText
-done
-
 #Appveyor - get ID of the last job with the API
 BUILD_ID=$(curl -s "https://ci.appveyor.com/api/projects/mquinson/simgrid" | grep -o '\[{"jobId":"[a-zA-Z0-9]*",' | sed "s/\[{\"jobId\":\"//" | sed "s/\",//")
 wget --quiet https://ci.appveyor.com/api/buildjobs/"$BUILD_ID"/log -O ./consoleText >/dev/null 2>&1
index d3425f8..7d683f2 100755 (executable)
@@ -1,5 +1,10 @@
 #!/usr/bin/env python3
 
+# Copyright (c) 2018-2021. The SimGrid Team. All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
 '''
 This script is intended to convert SMPI time independent traces (TIT) from the
 old format (simgrid version <= 3.19) to the new format.
index fefb7d0..b867236 100755 (executable)
@@ -1,4 +1,10 @@
 #!/usr/bin/env perl
+#
+# Copyright (c) 2016-2021. The SimGrid Team. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+#
 # Copyright 2016 Vincent Danjean <vincent.danjean@inria.fr>
 #                Christian Heinrich <franz-christian.heinrich@inria.fr>
 #
@@ -25,9 +31,15 @@ if (defined $options{f}) {
   $commentChar="!"
 }
 
+print "$commentChar Copyright (c) 2016-2021. The SimGrid Team. All rights reserved.\n";
+print "\n";
+print "$commentChar This program is free software; you can redistribute it and/or modify it\n";
+print "$commentChar under the terms of the license (GNU LGPL) which comes with this package.\n";
+print "\n";
 print "$commentChar This file has been automatically generated by the script\n";
 print "$commentChar in tools/smpi/generate_smpi_defines.pl\n";
 print "$commentChar DO NOT EDIT MANUALLY. ALL CHANGES WILL BE OVERWRITTEN!\n";
+print "\n";
 
 # Formatting of the output
 sub output_macro {
index a51dac8..2552c71 100755 (executable)
@@ -674,5 +674,4 @@ if __name__ == '__main__':
             print("Test suite from stdin OK")
         else:
             print("Test suite `" + f.filename + "' OK")
-    else:
-        tesh_exit(return_code)
+    tesh_exit(return_code)