diff --git a/tests/vault/gear/scheduler-stress-test.cpp b/tests/vault/gear/scheduler-stress-test.cpp index 08487792e..e259514c3 100644 --- a/tests/vault/gear/scheduler-stress-test.cpp +++ b/tests/vault/gear/scheduler-stress-test.cpp @@ -122,6 +122,7 @@ namespace test { testLoad.setupSchedule(scheduler) .withLoadTimeBase(LOAD_BASE) .withJobDeadline(100ms) + .withPlanningStep(200us) .withChunkSize(20) .launch_and_wait(); diff --git a/tests/vault/gear/test-chain-load.hpp b/tests/vault/gear/test-chain-load.hpp index f53ece9b9..9fc74d6a2 100644 --- a/tests/vault/gear/test-chain-load.hpp +++ b/tests/vault/gear/test-chain-load.hpp @@ -166,7 +166,8 @@ namespace test { const double LOAD_SPEED_BASELINE = 100; ///< initial assumption for calculation speed (without calibration) const microseconds LOAD_DEFAULT_TIME = 100us; ///< default time delay produced by ComputationalLoad at `Node.weight==1` const size_t LOAD_DEFAULT_MEM_SIZE = 1000; ///< default allocation base size used if ComputationalLoad.useAllocation - const microseconds PLANNING_TIME_PER_NODE = 400us; ///< time budget to reserve for each node to be planned and scheduled + const Duration SCHEDULE_LEVEL_STEP{_uTicks(1ms)}; ///< time budget to plan for the calculation of each »time level« of jobs + const Duration SCHEDULE_PLAN_STEP{_uTicks(100us)}; ///< time budget to reserve for each node to be planned and scheduled } @@ -1573,12 +1574,13 @@ namespace test { lib::UninitialisedDynBlock schedule_; - FrameRate levelSpeed_{1, Duration{_uTicks(1ms)}}; + FrameRate levelSpeed_{1, SCHEDULE_LEVEL_STEP}; + FrameRate planSpeed_{1, SCHEDULE_PLAN_STEP}; uint blockLoadFactor_{2}; size_t chunkSize_{DEFAULT_CHUNKSIZE}; TimeVar startTime_{Time::ANYTIME}; microseconds deadline_{STANDARD_DEADLINE}; - microseconds preRoll_{guessPlanningPreroll (chunkSize_)}; + microseconds preRoll_{guessPlanningPreroll()}; ManifestationID manID_{}; std::promise signalDone_{}; @@ -1617,7 +1619,7 @@ namespace test { if (work_left) { size_t nextChunkEndNode = calcNextChunkEnd (lastNodeIDX); - scheduler_.continueMetaJob (calcPlanScheduleTime (nextChunkEndNode) + scheduler_.continueMetaJob (calcPlanScheduleTime (lastNodeIDX+1) ,planningJob (nextChunkEndNode) ,manID_); } @@ -1683,6 +1685,14 @@ namespace test { return move(*this); } + ScheduleCtx&& + withPlanningStep (microseconds planningTime_per_node) + { + planSpeed_ = FrameRate{1, Duration{_uTicks(planningTime_per_node)}}; + preRoll_ = guessPlanningPreroll(); + return move(*this); + } + ScheduleCtx&& withLoadFactor (uint factor_on_levelSpeed) { @@ -1694,7 +1704,7 @@ namespace test { withChunkSize (size_t nodes_per_chunk) { chunkSize_ = nodes_per_chunk; - preRoll_ = guessPlanningPreroll (chunkSize_); + preRoll_ = guessPlanningPreroll(); return move(*this); } @@ -1803,10 +1813,10 @@ namespace test { return RealClock::now() + _uTicks(preRoll_); } - static microseconds - guessPlanningPreroll(size_t chunkSize) + microseconds + guessPlanningPreroll() { - return chunkSize * PLANNING_TIME_PER_NODE; + return microseconds(_raw(Time{chunkSize_ / planSpeed_})); } FrameRate diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 09c77c951..b346273ea 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -107144,7 +107144,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -107774,7 +107774,402 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + + + + + + + + + + + +

+ < now ⟹ re-entrant +

+ + +
+ + + + + + + + + + + +

+ == now ⟹ re-entrant +

+ + +
+ + + + + + + + + + + +

+ < now ⟹ re-entrant +

+ +
+ + + + + + + + + + + +

+ < now ⟹ re-entrant +

+ +
+ + + + + + + + + + + +

+ < now ⟹ re-entrant +

+ +
+ + + + + + + + + + + +

+ ... +

+

+ ... +

+

+ ... +

+ + +
+ + + + + + + +

+ < now ⟹ re-entrant +

+ +
+ + + + + + + + + + +

+ @36141 Continuation(lastNode=304, levelDone=43) --> to ...324  ○ start=45000 +

+ + +
+ + +
+ + + +
+ + +
+
+
+
+
+
+ + + + + + + + + + + + + + + +

+ Level 19(lang) * 5 wird von 5 Threads bearbeitet +

+ + +
+ + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+         scheduleCalcJob_(currIdx_, n->level); +

+

+         for (Node* pred: n->pred) +

+

+           markDependency_(pred,n); +

+ + +
+ + +
+ + + + + + + + + + + + + +

+ +

+

+ ... dispose(i=412,lev:72) -> @72000 +

+

+ ‖•△•‖     wof:8 HT:154587 +

+

+ ‖SCH‖ 0F: @154927 ○ start=72000 dead:100000 +

+

+ !◆!   0F: @154940  ⚙  calc(i=412, lev:72) +

+

+ +

+

+ ‖PST‖ FD: @154987 ◒ start=68000▹▹69000 dead:100000 +

+

+ ..!   BF: @154998 ⤴       (i=381) +

+

+ ‖PST‖ FD: @155018 ◒ start=68000▹▹69000 dead:100000 +

+

+ ‖PST‖ BF: @155029 ◒ start=68000▹▹69000 dead:100000 +

+

+    ·‖ 74: @155076 HT:69000  -> ▶ 69000 +

+

+ +

+

+ !◆!   74: @155162  ⚙  calc(i=383, lev:69) +

+

+ !◆!   BF: @155194  ⚙  calc(i=384, lev:69) +

+

+    ·‖ FD: @155354 HT:69000  -> ▶ 69000 +

+

+ +

+

+ !◆!   FD: @155371  ⚙  calc(i=387, lev:69) +

+

+ ..!   0F: @155533        (i=412) +

+

+ PRECONDITION: extent-family.hpp:321: thread_4: access: (isValidPos (idx)) +

+ + +
+ +
+ + + + + + + + + +

+ ...und der Stack-Trace zeigt ja, daß der Call-Pfad über SchedulerCtx::setDependency()  lief +

+ + +
+
+
+
+
+ + + + + + +

+ sichtbar wurde das durch eine zu späte Startzeit +

+ + +
+ + + + + + + + + + + + + + + + + + + + +

+ der reale Planer muß dafür sogar elaborierte Kontroll-Logik  haben +

+ + +
+
+
+ + + + + + + + + + + + +
+
+
+ + + + + + + + + + +