Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add capacity to set priorities on I/Os + example
authorSUTER Frederic <frederic.suter@cc.in2p3.fr>
Thu, 28 Oct 2021 07:20:34 +0000 (09:20 +0200)
committerSUTER Frederic <frederic.suter@cc.in2p3.fr>
Thu, 28 Oct 2021 07:20:34 +0000 (09:20 +0200)
MANIFEST.in
examples/cpp/CMakeLists.txt
examples/cpp/exec-basic/s4u-exec-basic.cpp
examples/cpp/io-basic/s4u-io-basic.cpp [new file with mode: 0644]
examples/cpp/io-basic/s4u-io-basic.tesh [new file with mode: 0644]
include/simgrid/s4u/Io.hpp
src/kernel/activity/IoImpl.cpp
src/kernel/activity/IoImpl.hpp
src/s4u/s4u_Io.cpp

index 256e15d..d88dde2 100644 (file)
@@ -260,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-basic/s4u-io-basic.cpp
+include examples/cpp/io-basic/s4u-io-basic.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
index 138ec4a..c111550 100644 (file)
@@ -74,7 +74,7 @@ foreach (example actor-create actor-daemon actor-exiting actor-join actor-kill
                  maestro-set
                  mc-bugged1 mc-bugged2 mc-electric-fence mc-failing-assert
                                 network-wifi
-                 io-async io-degradation io-file-system io-file-remote io-disk-raw io-dependent
+                 io-async io-basic 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
index aadaace..2e053e3 100644 (file)
@@ -19,26 +19,23 @@ static void executor()
 
 static void privileged()
 {
-  /* This version of this_actor::execute() specifies that this execution
-   * gets a larger share of the resource.
+  /* This version of this_actor::execute() 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.
    *
-   * So instead of a half/half sharing between the two executions,
-   * we get a 1/3 vs 2/3 sharing. */
+   * So instead of a half/half sharing between the two executions, we get a 1/3 vs 2/3 sharing. */
   simgrid::s4u::this_actor::execute(98095, 2);
   XBT_INFO("Done.");
 
-  /* Note that the timings printed when executing this example are a bit misleading,
-   * because the uneven sharing only last until the privileged actor ends.
-   * After this point, the unprivileged one gets 100% of the CPU and finishes
-   * quite quickly. */
+  /* Note that the timings printed when running this example are a bit misleading, because the uneven sharing only  last
+   * until the privileged actor ends. After this point, the unprivileged one gets 100% of the CPU and finishes quite
+   * quickly. */
 }
 
 int main(int argc, char* argv[])
 {
   simgrid::s4u::Engine e(&argc, argv);
-  xbt_assert(argc > 1, "Usage: %s platform_file\n\tExample: %s ../platforms/small_platform.xml\n", argv[0], argv[0]);
+  xbt_assert(argc > 1, "Usage: %s platform_file\n\tExample: %s platform.xml\n", argv[0], argv[0]);
 
   e.load_platform(argv[1]);
 
diff --git a/examples/cpp/io-basic/s4u-io-basic.cpp b/examples/cpp/io-basic/s4u-io-basic.cpp
new file mode 100644 (file)
index 0000000..0cb9dba
--- /dev/null
@@ -0,0 +1,50 @@
+/* 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/s4u.hpp"
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
+
+static void writer()
+{
+  /* - Retrieve all disks from current host */
+  std::vector<simgrid::s4u::Disk*> const& disk_list = simgrid::s4u::Host::current()->get_disks();
+  /* - Write 400,000 bytes on Disk1 */
+  disk_list.front()->write(4000000);
+  XBT_INFO("Done.");
+}
+
+static void privileged_writer()
+{
+  /* - Retrieve all disks from current host */
+  std::vector<simgrid::s4u::Disk*> const& disk_list = simgrid::s4u::Host::current()->get_disks();
+
+  /* - Write 400,000 bytes on Disk1 but specifies that this I/O operation gets a larger share of the resource.
+   *
+   * Since the priority is 2, it writes twice as fast as a regular one.
+   *
+   * So instead of a half/half sharing between the two, we get a 1/3 vs. 2/3 sharing. */
+  disk_list.front()->io_init(4000000, simgrid::s4u::Io::OpType::WRITE)->set_priority(2)->wait();
+  XBT_INFO("Done.");
+
+  /* Note that the timings printed when running this example are a bit misleading, because the uneven sharing only last
+   * until the privileged actor ends. After this point, the unprivileged one gets 100% of the CPU and finishes quite
+   * quickly. */
+}
+
+int main(int argc, char* argv[])
+{
+  simgrid::s4u::Engine e(&argc, argv);
+  xbt_assert(argc > 1, "Usage: %s platform_file\n\tExample: %s platform.xml\n", argv[0], argv[0]);
+
+  e.load_platform(argv[1]);
+
+  simgrid::s4u::Actor::create("writer", e.host_by_name("bob"), writer);
+  simgrid::s4u::Actor::create("privileged_writer", e.host_by_name("bob"), privileged_writer);
+
+  e.run();
+
+  return 0;
+}
diff --git a/examples/cpp/io-basic/s4u-io-basic.tesh b/examples/cpp/io-basic/s4u-io-basic.tesh
new file mode 100644 (file)
index 0000000..4fd0f1c
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/env tesh
+
+$ ${bindir:=.}/s4u-io-basic ${platfdir}/hosts_with_disks.xml
+> [bob:privileged_writer:(2) 0.150000] [s4u_test/INFO] Done.
+> [bob:writer:(1) 0.200000] [s4u_test/INFO] Done.
index 1e7825b..14abc92 100644 (file)
@@ -46,6 +46,7 @@ public:
   double get_remaining() const override;
   sg_size_t get_performed_ioops() const;
   IoPtr set_disk(const_sg_disk_t disk);
+  IoPtr set_priority(double priority);
   IoPtr set_size(sg_size_t size);
   IoPtr set_op_type(OpType type);
 
index cb274dc..a714e97 100644 (file)
@@ -28,6 +28,12 @@ IoImpl::IoImpl()
   piface_ = new s4u::Io(this);
 }
 
+IoImpl& IoImpl::set_sharing_penalty(double sharing_penalty)
+{
+  sharing_penalty_ = sharing_penalty;
+  return *this;
+}
+
 IoImpl& IoImpl::set_timeout(double timeout)
 {
   const s4u::Host* host = get_disk()->get_host();
@@ -59,6 +65,7 @@ IoImpl* IoImpl::start()
   state_ = State::RUNNING;
   surf_action_ =
       disk_->get_host()->get_netpoint()->get_englobing_zone()->get_disk_model()->io_start(disk_, size_, type_);
+  surf_action_->set_sharing_penalty(sharing_penalty_);
   surf_action_->set_activity(this);
 
   XBT_DEBUG("Create IO synchro %p %s", this, get_cname());
index 3bd9c7b..2c2ab5b 100644 (file)
@@ -14,10 +14,11 @@ namespace kernel {
 namespace activity {
 
 class XBT_PUBLIC IoImpl : public ActivityImpl_T<IoImpl> {
-  resource::DiskImpl* disk_       = nullptr;
-  sg_size_t size_                 = 0;
-  s4u::Io::OpType type_           = s4u::Io::OpType::READ;
-  sg_size_t performed_ioops_      = 0;
+  resource::DiskImpl* disk_           = nullptr;
+  double sharing_penalty_             = 1.0;
+  sg_size_t size_                     = 0;
+  s4u::Io::OpType type_               = s4u::Io::OpType::READ;
+  sg_size_t performed_ioops_          = 0;
   resource::Action* timeout_detector_ = nullptr;
   s4u::Io* piface_;
 
@@ -25,6 +26,7 @@ public:
   IoImpl();
   s4u::Io* get_iface() { return piface_; }
 
+  IoImpl& set_sharing_penalty(double sharing_penalty);
   IoImpl& set_timeout(double timeout) override;
   IoImpl& set_size(sg_size_t size);
   IoImpl& set_type(s4u::Io::OpType type);
index f0183d2..4906e79 100644 (file)
@@ -78,6 +78,16 @@ IoPtr Io::set_disk(const_sg_disk_t disk)
  return this;
 }
 
+IoPtr Io::set_priority(double priority)
+{
+  xbt_assert(state_ == State::INITED || state_ == State::STARTING,
+             "Cannot change the priority of an io after its start");
+  kernel::actor::simcall([this, priority] {
+    boost::static_pointer_cast<kernel::activity::IoImpl>(pimpl_)->set_sharing_penalty(1. / priority);
+  });
+  return this;
+}
+
 IoPtr Io::set_size(sg_size_t size)
 {
   xbt_assert(state_ == State::INITED || state_ == State::STARTING, "Cannot set size once the Io is started");