Scheduler-test: formula to guess expense
The intention is to establish a theoretical limit for the expense, given some degree of concurrency. In reality, the expense should always be greater, since the time is not just split by the number of cores; rather we need to chain up existing jobs of various weight on the available cores (which is a special case of the box packing problem). With this formula, an ideal weight factor can be determined for each level, and then summing up the sequence of levels gives us a guess for a sensible timing for the overall scheduler
This commit is contained in:
parent
409a60238a
commit
e9e7d954b1
3 changed files with 89 additions and 36 deletions
|
|
@ -162,41 +162,52 @@ SHOW_EXPR(micros);
|
|||
CHECK (micros > 450);
|
||||
|
||||
std::vector<LevelWeight> levelWeights = testLoad.allLevelWeights().effuse();
|
||||
std::vector<double> scheduleSeq = testLoad.levelScheduleSequence(4).effuse();
|
||||
SHOW_EXPR(levelWeights.size())
|
||||
for (auto& w : levelWeights)
|
||||
for (uint i=0; i<levelWeights.size(); ++i)
|
||||
{
|
||||
auto& [level,nodes,weight] = w;
|
||||
cout<<"level:"<<level<<" nodes:"<<nodes<<" ∑="<<weight<<endl;
|
||||
cout<<"level:"<<i<<" nodes:"<<levelWeights[i].nodes<<" ∑="<<levelWeights[i].weight<<" ..step="<<scheduleSeq[i]<<endl;
|
||||
}
|
||||
|
||||
using Node = TestChainLoad<>::Node;
|
||||
auto nodeData = testLoad.allNodes()
|
||||
.transform([](Node& n){ return make_pair(n.level,n.weight); })
|
||||
.effuse();
|
||||
for (auto& n : nodeData)
|
||||
cout<<"level:"<<n.first<<" w="<<n.second<<endl;
|
||||
auto node = testLoad.allNodePtr().effuse();
|
||||
for (auto& n : node)
|
||||
cout<<"level:"<<n->level<<" w="<<n->weight;
|
||||
auto getWeight = [&](uint level) { return levelWeights[level].weight; };
|
||||
CHECK (nodeData[22].first == 16);
|
||||
CHECK (nodeData[23].first == 17); CHECK (nodeData[23].second == 3); CHECK (getWeight(17) == 3);
|
||||
CHECK (node[22]->level == 16);
|
||||
CHECK (node[23]->level == 17); CHECK (node[23]->weight == 3); CHECK (getWeight(17) == 3);
|
||||
|
||||
CHECK (nodeData[24].first == 18); CHECK (nodeData[24].second == 0);
|
||||
CHECK (nodeData[25].first == 18); CHECK (nodeData[25].second == 0);
|
||||
CHECK (nodeData[26].first == 18); CHECK (nodeData[26].second == 0);
|
||||
CHECK (nodeData[27].first == 18); CHECK (nodeData[27].second == 0);
|
||||
CHECK (nodeData[28].first == 18); CHECK (nodeData[28].second == 0); CHECK (getWeight(18) == 0);
|
||||
CHECK (node[24]->level == 18); CHECK (node[24]->weight == 0);
|
||||
CHECK (node[25]->level == 18); CHECK (node[25]->weight == 0);
|
||||
CHECK (node[26]->level == 18); CHECK (node[26]->weight == 0);
|
||||
CHECK (node[27]->level == 18); CHECK (node[27]->weight == 0);
|
||||
CHECK (node[28]->level == 18); CHECK (node[28]->weight == 0); CHECK (getWeight(18) == 0);
|
||||
|
||||
CHECK (nodeData[29].first == 19); CHECK (nodeData[29].second == 2);
|
||||
CHECK (nodeData[30].first == 19); CHECK (nodeData[30].second == 2);
|
||||
CHECK (nodeData[31].first == 19); CHECK (nodeData[31].second == 2);
|
||||
CHECK (nodeData[32].first == 19); CHECK (nodeData[32].second == 2);
|
||||
CHECK (nodeData[33].first == 19); CHECK (nodeData[33].second == 2); CHECK (getWeight(19) == 10);
|
||||
CHECK (node[29]->level == 19); CHECK (node[29]->weight == 2);
|
||||
CHECK (node[30]->level == 19); CHECK (node[30]->weight == 2);
|
||||
CHECK (node[31]->level == 19); CHECK (node[31]->weight == 2);
|
||||
CHECK (node[32]->level == 19); CHECK (node[32]->weight == 2);
|
||||
CHECK (node[33]->level == 19); CHECK (node[33]->weight == 2); CHECK (getWeight(19) == 10);
|
||||
|
||||
CHECK (nodeData[34].first == 20); CHECK (nodeData[34].second == 3);
|
||||
CHECK (nodeData[35].first == 20); CHECK (nodeData[35].second == 2); CHECK (getWeight(20) == 5);
|
||||
CHECK (node[34]->level == 20); CHECK (node[34]->weight == 3);
|
||||
CHECK (node[35]->level == 20); CHECK (node[35]->weight == 2); CHECK (getWeight(20) == 5);
|
||||
|
||||
CHECK (nodeData[36].first == 21); CHECK (nodeData[36].second == 1);
|
||||
CHECK (nodeData[37].first == 21); CHECK (nodeData[37].second == 1);
|
||||
CHECK (nodeData[38].first == 21); CHECK (nodeData[38].second == 3); CHECK (getWeight(21) == 5);
|
||||
CHECK (node[36]->level == 21); CHECK (node[36]->weight == 1);
|
||||
CHECK (node[37]->level == 21); CHECK (node[37]->weight == 1);
|
||||
CHECK (node[38]->level == 21); CHECK (node[38]->weight == 3); CHECK (getWeight(21) == 5);
|
||||
|
||||
CHECK (levelWeights[19].nodes = 5);
|
||||
CHECK (levelWeights[19].weight = 10);
|
||||
CHECK (computeWeightFactor(levelWeights[19], 1) == 10.0);
|
||||
CHECK (computeWeightFactor(levelWeights[19], 2) == 10.0 / (5.0/3));
|
||||
CHECK (computeWeightFactor(levelWeights[19], 3) == 10.0 / (5.0/2));
|
||||
CHECK (computeWeightFactor(levelWeights[19], 4) == 10.0 / (5.0/2));
|
||||
CHECK (computeWeightFactor(levelWeights[19], 5) == 10.0 / (5.0/1));
|
||||
|
||||
CHECK (levelWeights[16].weight == 1); CHECK (levelWeights[16].nodes == 1); CHECK(scheduleSeq[16] == 13.0);
|
||||
CHECK (levelWeights[17].weight == 3); CHECK (levelWeights[17].nodes == 1); CHECK(scheduleSeq[17] == 16.0);
|
||||
CHECK (levelWeights[18].weight == 0); CHECK (levelWeights[18].nodes == 5); CHECK(scheduleSeq[18] == 16.0);
|
||||
CHECK (levelWeights[19].weight ==10); CHECK (levelWeights[19].nodes == 5); CHECK(scheduleSeq[19] == 20.0);
|
||||
CHECK (levelWeights[20].weight == 5); CHECK (levelWeights[20].nodes == 2); CHECK(scheduleSeq[20] == 22.5);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -177,6 +177,25 @@ namespace test {
|
|||
size_t weight{0};
|
||||
};
|
||||
|
||||
/**
|
||||
* simplified model for expense of a node, computed concurrently.
|
||||
* @remark assumptions of this model
|
||||
* - weight factor describes expense to compute this node
|
||||
* - nodes on the same level can be parallelised without limitation
|
||||
* - no consideration of stacking / ordering of tasks; rather the speed-up
|
||||
* is applied as an average factor to the summed node weights for a level
|
||||
* @return guess for a compounded weight factor
|
||||
*/
|
||||
inline double
|
||||
computeWeightFactor (LevelWeight const& lw, uint concurrency)
|
||||
{
|
||||
REQUIRE (0 < concurrency);
|
||||
double speedUp = lw.nodes? lw.nodes / std::ceil (double(lw.nodes)/concurrency)
|
||||
: 1.0;
|
||||
ENSURE (1.0 <= speedUp);
|
||||
return lw.weight / speedUp;
|
||||
}
|
||||
|
||||
struct Statistic;
|
||||
|
||||
|
||||
|
|
@ -769,6 +788,19 @@ namespace test {
|
|||
);
|
||||
}
|
||||
|
||||
/** sequence of the summed compounded weight factors _after_ each level */
|
||||
auto
|
||||
levelScheduleSequence (uint concurrency =1)
|
||||
{
|
||||
return allLevelWeights()
|
||||
.transform([schedule=0.0, concurrency]
|
||||
(LevelWeight const& lw) mutable
|
||||
{
|
||||
schedule += computeWeightFactor (lw, concurrency);
|
||||
return schedule;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
Statistic computeGraphStatistics();
|
||||
|
|
|
|||
|
|
@ -107413,12 +107413,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1702945094806" ID="ID_1458598401" MODIFIED="1702945105825" TEXT="Σ weight"/>
|
||||
<node CREATED="1702945249738" ID="ID_259125752" MODIFIED="1702945253136" TEXT="Σ nodes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702944916656" ID="ID_1187169308" MODIFIED="1702944931701" TEXT="Fall1: singlethreaded">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1702944916656" ID="ID_1187169308" MODIFIED="1703988495745" TEXT="Fall1: singlethreaded">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1703792015525" ID="ID_851282799" MODIFIED="1703792030956" TEXT="ermittelt Gewichtsfaktor pro Level"/>
|
||||
<node CREATED="1703797597576" ID="ID_496053162" MODIFIED="1703797638501" TEXT="liefert für jeden Level: (levelNr, Σw, Σn)"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1703801391911" ID="ID_1010028454" MODIFIED="1703807940482" TEXT="Implementierung">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1703801391911" ID="ID_1010028454" MODIFIED="1703988492468" TEXT="Implementierung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#5b280f" CREATED="1703801398285" FOLDED="true" ID="ID_1449254847" MODIFIED="1703979248329" TEXT="Iter-Explorer mit gruppierendem Processing-Layer">
|
||||
<arrowlink COLOR="#5874c0" DESTINATION="ID_1740211471" ENDARROW="Default" ENDINCLINATION="-136;-9;" ID="Arrow_ID_443078033" STARTARROW="None" STARTINCLINATION="53;91;"/>
|
||||
<linktarget COLOR="#f53565" DESTINATION="ID_1449254847" ENDARROW="Default" ENDINCLINATION="-19;118;" ID="Arrow_ID_669204155" SOURCE="ID_1512834256" STARTARROW="None" STARTINCLINATION="-120;-17;"/>
|
||||
|
|
@ -107483,12 +107483,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1703804201974" ID="ID_1363214026" MODIFIED="1703807936511" TEXT="stattdessen: direkt einen Vektor aggregieren und zurückgeben">
|
||||
<node COLOR="#435e98" CREATED="1703804201974" ID="ID_1363214026" MODIFIED="1703979718079" TEXT="stattdessen: direkt einen Vektor aggregieren und zurückgeben">
|
||||
<icon BUILTIN="yes"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1703806119013" ID="ID_848627487" MODIFIED="1703806130911" TEXT="For-Schleife mit schleppendem Aggregat"/>
|
||||
<node CREATED="1703807871832" ID="ID_414635297" MODIFIED="1703807880606" TEXT="Gewichte pro Level aufsummieren"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1703882997602" ID="ID_1587426873" MODIFIED="1703883014897" TEXT="nachfolgend wäre aber eine Pipeline doch nicht schlecht">
|
||||
<node COLOR="#338800" CREATED="1703882997602" FOLDED="true" ID="ID_1587426873" MODIFIED="1703979707599" TEXT="nachfolgend wäre aber eine Pipeline doch nicht schlecht">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node COLOR="#435e98" CREATED="1703883016888" ID="ID_1740211471" MODIFIED="1703979248329" TEXT="also einen zweiten Anlauf versuchen">
|
||||
<linktarget COLOR="#5874c0" DESTINATION="ID_1740211471" ENDARROW="Default" ENDINCLINATION="-136;-9;" ID="Arrow_ID_443078033" SOURCE="ID_1449254847" STARTARROW="None" STARTINCLINATION="53;91;"/>
|
||||
|
|
@ -107583,8 +107584,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702944922179" ID="ID_424913055" MODIFIED="1702944931701" TEXT="Fall2: concurrent-X">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1702944922179" ID="ID_424913055" MODIFIED="1703988524669" TEXT="Fall2: concurrent-X">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1703794147800" ID="ID_875844018" MODIFIED="1703797733272" TEXT="schwierige Frage: wie die Last verteilen?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1703794161470" ID="ID_1249728332" MODIFIED="1703794182703" TEXT="»box stacking problem«">
|
||||
|
|
@ -107615,15 +107616,24 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</html></richcontent>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1702265418472" ID="ID_565310505" MODIFIED="1703794852295" TEXT="∅ Beschleunigungsfaktor: ∅w / floor(∅w/concurrency)">
|
||||
<node CREATED="1702265418472" ID="ID_565310505" MODIFIED="1703984981329" TEXT="∅ Beschleunigungsfaktor: ∅b / ceil(∅b/concurrency)">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1703984999601" HGAP="31" ID="ID_823924305" MODIFIED="1703985020840" TEXT="b: level breadth" VSHIFT="3">
|
||||
<font NAME="SansSerif" SIZE="10"/>
|
||||
</node>
|
||||
<node CREATED="1703794853512" ID="ID_726786929" MODIFIED="1703796876018" TEXT="lokaler Beschleunigungsfaktor: w / (1+floor((w-1)/concurrency) )">
|
||||
</node>
|
||||
<node CREATED="1703794853512" ID="ID_726786929" MODIFIED="1703984987608" TEXT="lokaler Beschleunigungsfaktor: b / (1+floor((b-1)/concurrency) )">
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_726786929" ENDARROW="Default" ENDINCLINATION="158;7;" ID="Arrow_ID_134124822" SOURCE="ID_1463293935" STARTARROW="None" STARTINCLINATION="141;19;"/>
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1703797738652" ID="ID_956546780" MODIFIED="1703797835531" TEXT="läßt sich also on-the-fly berechnen"/>
|
||||
<node COLOR="#338800" CREATED="1703988501052" ID="ID_849722259" MODIFIED="1703988508987" TEXT="Hilfsfunktion für diese Berechnung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1703988509659" ID="ID_1542823485" MODIFIED="1703988522538" TEXT="Reihe der Gewichtsfaktoren aufintegriert">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702945662283" ID="ID_557005311" MODIFIED="1702945685743" TEXT="Möglichkeit für hierauf abstellendes genaues Scheduling">
|
||||
|
|
|
|||
Loading…
Reference in a new issue