Scheduler-test: build adapted schedule

...based on the adapted time-factor sequence
implemented yesterday in TestChainLoad itself

- in this case, the TimeBase from the computation load is used as level speed
- this »base beat« is then modulated by the timing factor sequence
- working in an additional stress factor to press the schedule uniformly
- actual start time will be added as offset once the actual test commences
This commit is contained in:
Fischlurch 2024-01-01 22:42:51 +01:00
parent f4dd309476
commit 813f8721f7
4 changed files with 126 additions and 19 deletions

View file

@ -89,6 +89,14 @@ namespace util {
, upperBound);
}
template <typename NUM, typename NB>
inline bool constexpr
isLimited (NB lowerBound, NUM val, NB upperBound)
{
return lowerBound <= val
and val <= upperBound;
}
/** positive integral number from textual representation
* @return always a number, 0 in case of unparseable text,
* limited to 0 <= num <= LUMIERA_MAX_ORDINAL_NUMBER */

View file

@ -189,6 +189,39 @@ SHOW_EXPR(micros);
CHECK (schedule[26] == _uTicks(26ms));
CHECK (schedule[27] == _uTicks(27ms));
double stressFac = 1.0;
testSetup.withAdaptedSchedule (stressFac, concurrency);
schedule = testSetup.getScheduleSeq().effuse();
CHECK (schedule.size() == testLoad.topLevel() + 2);
SHOW_EXPR(schedule[0])
SHOW_EXPR(schedule[1])
SHOW_EXPR(schedule[2])
SHOW_EXPR(schedule[3])
SHOW_EXPR(schedule[4])
SHOW_EXPR(schedule[5])
SHOW_EXPR(schedule[6])
SHOW_EXPR(schedule[7])
SHOW_EXPR(schedule[8])
SHOW_EXPR(schedule[9])
SHOW_EXPR(schedule[10])
SHOW_EXPR(schedule[11])
SHOW_EXPR(schedule[12])
SHOW_EXPR(schedule[13])
SHOW_EXPR(schedule[14])
SHOW_EXPR(schedule[15])
SHOW_EXPR(schedule[16])
SHOW_EXPR(schedule[17])
SHOW_EXPR(schedule[18])
SHOW_EXPR(schedule[19])
SHOW_EXPR(schedule[20])
SHOW_EXPR(schedule[21])
SHOW_EXPR(schedule[22])
SHOW_EXPR(schedule[23])
SHOW_EXPR(schedule[24])
SHOW_EXPR(schedule[25])
SHOW_EXPR(schedule[26])
SHOW_EXPR(schedule[27])
micros = testSetup.launch_and_wait();
SHOW_EXPR(micros);
}

View file

@ -131,6 +131,7 @@ namespace test {
using util::limited;
using util::unConst;
using util::toString;
using util::isLimited;
using util::showHashLSB;
using lib::time::Time;
using lib::time::TimeValue;
@ -161,6 +162,7 @@ namespace test {
const auto SAFETY_TIMEOUT = 5s; ///< maximum time limit for test run, abort if exceeded
const auto STANDARD_DEADLINE = 10ms; ///< deadline to use for each individual computation job
const size_t DEFAULT_CHUNKSIZE = 64; ///< number of computation jobs to prepare in each planning round
const size_t UPFRONT_PLANNING_BOOST = 2; ///< factor to increase the computed pre-roll to ensure up-front planning
const size_t GRAPH_BENCHMARK_RUNS = 5; ///< repetition count for reference calculation of a complete node graph
const size_t LOAD_BENCHMARK_RUNS = 500; ///< repetition count for calibration benchmark for ComputationalLoad
const double LOAD_SPEED_BASELINE = 100; ///< initial assumption for calculation speed (without calibration)
@ -168,6 +170,8 @@ namespace test {
const size_t LOAD_DEFAULT_MEM_SIZE = 1000; ///< default allocation base size used if ComputationalLoad.useAllocation
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
inline uint defaultConcurr() { return work::Config::getDefaultComputationCapacity(); }
}
struct LevelWeight
@ -1697,7 +1701,7 @@ namespace test {
{
auto finished = attachNewCompletionSignal();
size_t numNodes = chainLoad_.size();
size_t firstChunkEndNode = calcNextChunkEnd(0)-1;
size_t firstChunkEndNode = calcNextChunkEnd(0);
schedule_.allocate (numNodes);
compuLoad_->maybeCalibrate();
calcFunctor_.reset (new RandomChainCalcFunctor<maxFan>{chainLoad_.nodes_[0], compuLoad_.get()});
@ -1743,7 +1747,7 @@ namespace test {
fillDefaultSchedule();
return lib::explore(startTimes_)
.transform([&](Time jobTime) -> Time
.transform([&](Time jobTime) -> TimeVar
{
return jobTime - startTimes_[0];
});
@ -1790,14 +1794,21 @@ namespace test {
}
ScheduleCtx&&
withAdaptedSchedule(double stressFac =1.0)
withAdaptedSchedule (double stressFac =1.0, uint concurrency=0)
{
if (not concurrency) // use hardware concurrency (#cores) by default
concurrency = defaultConcurr();
ENSURE (isLimited (1u, concurrency, 3*defaultConcurr()));
withLevelDuration (compuLoad_->timeBase);
fillAdaptedSchedule (stressFac, concurrency);
return move(*this);
}
ScheduleCtx&&
withUpfrontPlanning()
{
withChunkSize (chainLoad_.size());
preRoll_ *= UPFRONT_PLANNING_BOOST;
return move(*this);
}
@ -1941,7 +1952,10 @@ namespace test {
size_t numPoints = chainLoad_.topLevel()+2;
startTimes_.clear();
startTimes_.reserve (numPoints);
chainLoad_.levelScheduleSequence(concurrency).effuse();
startTimes_.push_back (Time::ZERO);
chainLoad_.levelScheduleSequence (concurrency)
.transform([&](double scheduleFact){ return (scheduleFact/stressFac) / levelSpeed_;})
.effuse(startTimes_);
}
Time

View file

@ -107403,7 +107403,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#980e34" DESTINATION="ID_451970697" ENDARROW="Default" ENDINCLINATION="163;698;" ID="Arrow_ID_1930824070" SOURCE="ID_1994748011" STARTARROW="None" STARTINCLINATION="-607;42;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702944889122" FOLDED="true" ID="ID_816186443" MODIFIED="1704056444572" TEXT="Berechnung der systematisch-erwartbaren Ausf&#xfc;hrungszeit">
<node COLOR="#338800" CREATED="1702944889122" FOLDED="true" ID="ID_816186443" MODIFIED="1704139827788" TEXT="Berechnung der systematisch-erwartbaren Ausf&#xfc;hrungszeit">
<linktarget COLOR="#618eb4" DESTINATION="ID_816186443" ENDARROW="Default" ENDINCLINATION="-871;-40;" ID="Arrow_ID_888227312" SOURCE="ID_1434946452" STARTARROW="None" STARTINCLINATION="-203;20;"/>
<linktarget COLOR="#5d567f" DESTINATION="ID_816186443" ENDARROW="Default" ENDINCLINATION="-25;77;" ID="Arrow_ID_280715198" SOURCE="ID_1983964457" STARTARROW="None" STARTINCLINATION="-621;-17;"/>
<icon BUILTIN="button_ok"/>
@ -107650,33 +107650,76 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1702945662283" ID="ID_557005311" MODIFIED="1704134638849" TEXT="M&#xf6;glichkeit f&#xfc;r hierauf abstellendes genaues Scheduling">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1702945698917" ID="ID_617955437" MODIFIED="1704134635631" TEXT="ScheduleCtx stellt dieses Feature bereit">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1702945698917" ID="ID_617955437" MODIFIED="1704144780465" TEXT="ScheduleCtx stellt dieses Feature bereit">
<icon BUILTIN="button_ok"/>
<node CREATED="1703797401009" ID="ID_1091284884" MODIFIED="1703797408236" TEXT="implementiert durch eine LUT"/>
<node CREATED="1703797437806" ID="ID_139711050" MODIFIED="1703797452286" TEXT="welche auch gleich die Integration (Gesamtzeit) mit beinhaltet"/>
<node CREATED="1704131775134" ID="ID_1368289574" MODIFIED="1704131778714" TEXT="Umbauten">
<node COLOR="#435e98" CREATED="1704131775134" ID="ID_1368289574" MODIFIED="1704144781683" TEXT="Umbauten">
<node COLOR="#435e98" CREATED="1704131779566" ID="ID_665664314" MODIFIED="1704131849268" TEXT="startTime_ bleibt erhalten (zur Dokumentation)">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1704131789964" ID="ID_1025558471" MODIFIED="1704134610988" TEXT="aber das Schedule wird komplett fertig vorberechnet">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1704131789964" ID="ID_1025558471" MODIFIED="1704139765021" TEXT="aber das Schedule wird komplett fertig vorberechnet">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1704131859763" ID="ID_474855100" MODIFIED="1704134619233" STYLE="fork" TEXT="anchorStartTime() &#x27f6; anchorSchedule()"/>
<node COLOR="#338800" CREATED="1704131877441" ID="ID_1279812512" MODIFIED="1704134622336" TEXT="f&#xfc;llt normalerweise das default-Schedule ein">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1704131901605" ID="ID_1726719129" MODIFIED="1704134625483" TEXT="ansonsten: schon bef&#xfc;llte Time-Table mit Startzeit beaufschlagen">
<icon BUILTIN="flag-pink"/>
<node COLOR="#338800" CREATED="1704131901605" ID="ID_1726719129" MODIFIED="1704139760567" TEXT="ansonsten: schon bef&#xfc;llte Time-Table mit Startzeit beaufschlagen">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1704131825817" ID="ID_552446029" MODIFIED="1704131842686" TEXT="einen Vector mit den explzitien Startzeitpunkten vorsehen">
<node COLOR="#338800" CREATED="1704131825817" ID="ID_552446029" MODIFIED="1704139775357" TEXT="einen Vector mit den explizitien Startzeitpunkten vorsehen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702945713771" ID="ID_66050639" MODIFIED="1702945728105" TEXT="verwendet hierzu die Auswertung aus Chain-Load">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1703797265083" ID="ID_117426514" MODIFIED="1703797283385" TEXT="diese kann eine Iterations-Berechnung (one-pass) sein"/>
<node CREATED="1703797286217" ID="ID_1277790232" MODIFIED="1703797356569" TEXT="die Zahl der Level ist bekannt &#x2014; also kann man die in eine fixe Tabelle ziehen"/>
<node COLOR="#338800" CREATED="1702945713771" ID="ID_66050639" MODIFIED="1704144784537" TEXT="verwendet hierzu die Auswertung aus Chain-Load">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1703797265083" ID="ID_117426514" MODIFIED="1704139844019" TEXT="diese ist eine Iterations-Berechnung (one-pass)">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1704139798805" ID="ID_498812151" LINK="#ID_660577400" MODIFIED="1704139836566" TEXT="bereits entwickelt und getestet...">
<icon BUILTIN="idea"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1703797286217" ID="ID_1277790232" MODIFIED="1704143153260" TEXT="die Zahl der Level ist bekannt &#x2014; also kann man die in eine fixe Tabelle ziehen">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1704139847919" ID="ID_400967739" MODIFIED="1704139899216" TEXT="Fencepost-Problem">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1704139860317" ID="ID_655692811" MODIFIED="1704139878702" TEXT="den punkt vor Level-0 schon vorher einf&#xfc;llen"/>
<node CREATED="1704139879314" ID="ID_1950048406" MODIFIED="1704139896128" TEXT="damit gelten alle Punkte aus der Tabelle nach dem Level"/>
</node>
<node COLOR="#338800" CREATED="1704139903251" ID="ID_1859688800" MODIFIED="1704144774344" TEXT="mit dem Level-Spacing gem&#xe4;&#xdf; Load - Base-Time multiplizieren">
<icon BUILTIN="button_ok"/>
<node CREATED="1704139942618" ID="ID_1753308073" MODIFIED="1704139949075" TEXT="Setter-Logik beachten">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1704143830785" ID="ID_1390235964" MODIFIED="1704143853479" TEXT="levelSpeed_ ist eine FrameRate"/>
<node CREATED="1704143853969" ID="ID_921864562" MODIFIED="1704143861808" TEXT="wird bereits per Zeitangabe gesetzt"/>
</node>
<node COLOR="#338800" CREATED="1704139950245" ID="ID_678737201" MODIFIED="1704144767694" TEXT="loadBaseTime &#xfc;bersteuert nun Level-Spacing">
<icon BUILTIN="idea"/>
<node COLOR="#435e98" CREATED="1704143876275" ID="ID_206816787" MODIFIED="1704144754334" TEXT="aber nur wenn withAdaptedSchedule()">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1704143902767" ID="ID_1052292540" MODIFIED="1704144761258" TEXT="ein reiner Seiteneffekt von der LoadTimeBase w&#xe4;re zu verwirrend">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1704143931324" ID="ID_577773022" MODIFIED="1704143962808">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
und withAdaptedSchedule <i>mu&#223; man explizit </i>aufrufen (wegen Stress-Faktor)
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1704130248910" ID="ID_279203774" MODIFIED="1704130263076" TEXT="Verifikation und Testbarkeit">
<icon BUILTIN="flag-yellow"/>
@ -107695,8 +107738,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702945731584" ID="ID_572123244" MODIFIED="1702945745735" TEXT="stress-Faktor relativ zu diesem Schema">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1704130423451" ID="ID_828141465" MODIFIED="1704130534983" TEXT="komplett-Planung vorneweg">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1704130423451" ID="ID_828141465" MODIFIED="1704143001031" TEXT="komplett-Planung vorneweg">
<icon BUILTIN="button_ok"/>
<node CREATED="1704142955950" ID="ID_1769532330" MODIFIED="1704142991446" TEXT="KISS-L&#xf6;sung gen&#xfc;gt!">
<icon BUILTIN="yes"/>
</node>
<node COLOR="#338800" CREATED="1704142966181" ID="ID_1582448622" MODIFIED="1704142997956" TEXT="chunk-Size maximal setzen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1704142982267" ID="ID_855188480" MODIFIED="1704142999211" TEXT="errechneten pre-Roll verdoppeln">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1704130413244" ID="ID_899448993" MODIFIED="1704130422596" TEXT="zus&#xe4;tziches Einzel-Stepping">
<icon BUILTIN="flag-yellow"/>