Scheduler: component wiring

The »Scheduler Service« will be assembled
from the components developed during the last months
- Layer-1
- Layer-2
- Activity-Language
- Block-Flow
- Work-Force
This commit is contained in:
Fischlurch 2023-10-20 01:45:20 +02:00
parent 9db341bd8b
commit 74c97614b3
7 changed files with 365 additions and 66 deletions

View file

@ -117,7 +117,7 @@ namespace gear {
/* === characteristic parameters === */
const static size_t EPOCH_SIZ = 100; ///< Number of storage slots to fit into one »Epoch«
const Duration DUTY_CYCLE{FSecs(1)}; ///< typical relaxation time or average pre-roll to deadline
const size_t INITIAL_STREAMS = 2; ///< Number of streams with TYPICAL_FPS to expect for normal use
const size_t INITIAL_STREAMS = 2; ///< Number of streams with #REFERENCE_FPS to expect for normal use
/* === algorithm tuning settings === */
const double TARGET_FILL = 0.90; ///< aim at using this fraction of Epoch space on average (slightly below 100%)

View file

@ -0,0 +1,79 @@
/*
ENGINE-OBSERVER.hpp - collection and maintenance of engine performance indicators
Copyright (C) Lumiera.org
2023, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file engine-observer.hpp
** Render Engine performance data collection service. Data indicative of the
** current operational state is emitted at various levels of processing as
** synchronous notification calls. The information transmitted must be offloaded
** quickly for asynchronous processing to generate the actual observable values.
**
** @see scheduler.hpp
** @see job-planning.hpp
** @see Activity::Verb::WORKSTART
**
** @todo WIP-WIP-WIP 10/2023 »Playback Vertical Slice« created as a stub
**
*/
#ifndef SRC_VAULT_GEAR_ENGINE_OBSERVER_H_
#define SRC_VAULT_GEAR_ENGINE_OBSERVER_H_
#include "lib/error.hpp"
#include "vault/gear/block-flow.hpp"
#include "vault/gear/scheduler-commutator.hpp"
#include "vault/gear/scheduler-invocation.hpp"
//#include "lib/symbol.hpp"
#include "lib/nocopy.hpp"
//#include "lib/util.hpp"
//#include <string>
namespace vault{
namespace gear {
// using util::isnil;
// using std::string;
/**
* Collector and aggregator for performance data.
* @todo WIP-WIP 10/2023 - stub as placeholder for later development
* @see Scheduler
*/
class EngineObserver
: util::NonCopyable
{
public:
explicit
EngineObserver()
{ }
};
}}// namespace vault::gear
#endif /*SRC_VAULT_GEAR_ENGINE_OBSERVER_H_*/

View file

@ -0,0 +1,83 @@
/*
LOAD-CONTROLLER.hpp - coordinator for scheduler resource usage
Copyright (C) Lumiera.org
2023, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file load-controller.hpp
** Scheduler resource usage coordination.
** Operating the render activities in the engine involves several low-level
** support systems, which must be actively guided to remain within sustainable
** limits. While all parts of the engine are tuned towards typical expected
** scenarios, a wide array of load patterns may be encountered, complicating
** any generic performance optimisation. Rather, the participating components
** are designed to withstand a short-term imbalance, expecting that general
** engine parametrisation will be adjusted based on moving averages.
**
** @see scheduler.hpp
** @see SchedulerStress_test
**
** @todo WIP-WIP-WIP 10/2023 »Playback Vertical Slice«
**
*/
#ifndef SRC_VAULT_GEAR_LOAD_CONTROLLER_H_
#define SRC_VAULT_GEAR_LOAD_CONTROLLER_H_
#include "lib/error.hpp"
//#include "vault/gear/block-flow.hpp"
//#include "lib/symbol.hpp"
#include "lib/nocopy.hpp"
//#include "lib/util.hpp"
//#include <string>
namespace vault{
namespace gear {
// using util::isnil;
// using std::string;
/**
* Controller to coordinate resource usage related to the Scheduler.
* @todo WIP-WIP 10/2023 just a placeholder for now
* @see BlockFlow
* @see Scheduler
*/
class LoadController
: util::NonCopyable
{
BlockFlowAlloc& allocator_;
public:
explicit
LoadController (BlockFlowAlloc& blockFlow)
: allocator_{blockFlow}
{ }
};
}}// namespace vault::gear
#endif /*SRC_VAULT_GEAR_LOAD_CONTROLLER_H_*/

View file

@ -44,8 +44,12 @@
#include "lib/error.hpp"
#include "vault/gear/block-flow.hpp"
#include "vault/gear/work-force.hpp"
#include "vault/gear/activity-lang.hpp"
#include "vault/gear/scheduler-commutator.hpp"
#include "vault/gear/scheduler-invocation.hpp"
#include "vault/gear/load-controller.hpp"
#include "vault/gear/engine-observer.hpp"
//#include "lib/symbol.hpp"
#include "lib/nocopy.hpp"
//#include "lib/util.hpp"
@ -67,18 +71,86 @@ namespace gear {
* @see SchedulerUsage_test
*/
class Scheduler
: util::NonCopyable
{
using Setup = work::Config; ////////////////////////////////////////////////////OOO actually need subclass to attach the work-function
SchedulerInvocation layer1_;
SchedulerCommutator layer2_;
// WorkForce<Setup> workForce_;
ActivityLang activityLang_;
LoadController loadControl_;
EngineObserver& engineObserver_;
public:
explicit
Scheduler()
Scheduler (BlockFlowAlloc& activityAllocator
,EngineObserver& engineObserver)
: layer1_{}
, layer2_{}
// , workForce_{connectWorkers()}
, activityLang_{activityAllocator}
, loadControl_{activityAllocator}
, engineObserver_{engineObserver}
{ }
// using default copy/assignment
/**
*
*/
void
terminateProcessing()
{
UNIMPLEMENTED("suicide");
}
/**
*
*/
double
getLoadIndicator()
{
UNIMPLEMENTED("load indicator");
}
/**
*
*/
void
seedCalcStream()
{
UNIMPLEMENTED("get it going");
}
/**
*
*/
void
buildJob()
{
UNIMPLEMENTED("wrap the ActivityTerm");
}
/**
*
*/
void
getWork()
{
UNIMPLEMENTED("the Worker-Funkction");
}
private:
Setup
connectWorkers()
{
UNIMPLEMENTED("build Worker pool operational setup");
}
};

View file

@ -32,7 +32,19 @@ END
PLANNED "Scheduler Integration" SchedulerUsage_test <<END
PLANNED "Scheduler Integration" SchedulerService_test <<END
return: 0
END
PLANNED "Scheduler Performance" SchedulerStress_test <<END
return: 0
END
PLANNED "Scheduler Usage" SchedulerUsage_test <<END
return: 0
END

View file

@ -69,24 +69,31 @@ namespace test {
/** @test TODO demonstrate a simple usage scenario
* @todo WIP 10/23 define 🔁 implement
*/
void
simpleUsage()
{
BlockFlowAlloc bFlow;
EngineObserver watch;
Scheduler{bFlow, watch};
}
/** @test TODO
* @todo WIP 10/23 🔁 define implement
*/
void
walkingDeadline()
{
UNIMPLEMENTED ("walking Deadline");
}
/** @test TODO
* @todo WIP 10/23 🔁 define implement
*/
void
setupLalup()

View file

@ -78565,8 +78565,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node CREATED="1697754985639" ID="ID_799408544" MODIFIED="1697755265544" TEXT="Verschaltung: Prerequisite &#x21b7; Dependent-Job">
<linktarget COLOR="#3e9bb9" DESTINATION="ID_799408544" ENDARROW="Default" ENDINCLINATION="1223;78;" ID="Arrow_ID_184937137" SOURCE="ID_107749731" STARTARROW="None" STARTINCLINATION="370;22;"/>
<linktarget COLOR="#7a96a6" DESTINATION="ID_799408544" ENDARROW="Default" ENDINCLINATION="651;46;" ID="Arrow_ID_1767879061" SOURCE="ID_1696760158" STARTARROW="None" STARTINCLINATION="267;-849;"/>
<linktarget COLOR="#3e9bb9" DESTINATION="ID_799408544" ENDARROW="Default" ENDINCLINATION="1223;78;" ID="Arrow_ID_184937137" SOURCE="ID_107749731" STARTARROW="None" STARTINCLINATION="370;22;"/>
<icon BUILTIN="info"/>
<node CREATED="1697755215608" HGAP="42" ID="ID_70962304" MODIFIED="1697755242505" TEXT="wird in der Activity-Language im Scheduler genau so ben&#xf6;tigt" VSHIFT="-4">
<icon BUILTIN="idea"/>
@ -81651,27 +81651,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
<node COLOR="#7350b1" CREATED="1697755288338" HGAP="29" ID="ID_612802023" MODIFIED="1697755490162" VSHIFT="11">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
weil sie sinnigerweise <i>auf dem Kopf steht</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
....das hat sich allerdings schon aus der Analyse des Pull-Processing im Node-Network so ergeben, denn dort geht man von der ExitNode r&#252;ckw&#228;rts; damals konnte ich nicht vorhersehen, wie die Situation im Scheduler sich darstellen wird &#8212; m&#246;glicherweise verbirg sich eine tiefere, strukturelle Konvergenz dahinter, da&#223; das jetzt so <i>sch&#246;n aufgeht</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
@ -81679,6 +81673,36 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697745850749" ID="ID_48640613" MODIFIED="1697745867438" TEXT="Worker-Function"/>
</node>
</node>
<node CREATED="1697756690787" ID="ID_87589773" MODIFIED="1697756717299" TEXT="Design: delegierende &#xe4;u&#xdf;ere H&#xfc;lle"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756746748" ID="ID_1029141907" MODIFIED="1697757702430" TEXT="Interface bauen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697756762145" ID="ID_685418556" MODIFIED="1697756903799" TEXT="auf abstraktes Interface kann (vorerst) verzichtet werden">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...bedingt durch den stark gegliederten Aufbau wird es auf Service-Ebene nichts zu verbergen geben &#8212; zudem bewegen sich voraussichtlich auch alle Clients im gleichen Code-Universums (so da&#223; es keine Probleme mit Dependencies gibt.
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756908166" ID="ID_1142273023" MODIFIED="1697756948024" TEXT="Wrapper-Builder um den Activity-Term legen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756956736" ID="ID_830267980" MODIFIED="1697756972566" TEXT="Top-level-Implementierung der Worker-Funktion">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697757025906" ID="ID_180161439" MODIFIED="1697757063868" TEXT="seedCalcStream()">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697757058002" ID="ID_603254465" MODIFIED="1697757063869" TEXT="terminateProcessing()">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697757694037" ID="ID_1433751218" MODIFIED="1697757700693" TEXT="ein vorl&#xe4;ufiger Load-Indicator">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
@ -81744,9 +81768,33 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693841227130" ID="ID_1537960830" MODIFIED="1697675265270" TEXT="WorkForce einbinden">
<arrowlink COLOR="#397cb2" DESTINATION="ID_987966047" ENDARROW="Default" ENDINCLINATION="-962;-41;" ID="Arrow_ID_818972822" STARTARROW="None" STARTINCLINATION="-609;73;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697768180196" ID="ID_1541537637" MODIFIED="1697768202330" TEXT="work::Config konstruieren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697768205409" ID="ID_489957180" MODIFIED="1697768215224" TEXT="mit dem Load-Controller verbinden">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697675135117" ID="ID_880133050" MODIFIED="1697675148836" TEXT="ActivityLang + BlockFlow">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697758561025" ID="ID_107853136" MODIFIED="1697758575911">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
ActivityLang geh&#246;rt sinnvollerweise <i>in den Scheduler</i>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1697758577471" ID="ID_805214343" MODIFIED="1697758585886" TEXT="dagegen BlockFlow ist eine externe Komponente"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697763699242" ID="ID_272943268" MODIFIED="1697763810547" TEXT="EngineObserver-Schnittstelle">
<arrowlink COLOR="#4f3156" DESTINATION="ID_1642973256" ENDARROW="Default" ENDINCLINATION="-628;-472;" ID="Arrow_ID_1213898118" STARTARROW="None" STARTINCLINATION="-1771;162;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697763821714" ID="ID_1158248288" MODIFIED="1697763853485" TEXT="vorerst nur eine Senke f&#xfc;r die WORKSTART|STOP-Activities">
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697663918107" ID="ID_210862409" MODIFIED="1697675123151" TEXT="Load-Controller vorsehen">
<linktarget COLOR="#75769b" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-667;72;" ID="Arrow_ID_1800712901" SOURCE="ID_464175339" STARTARROW="None" STARTINCLINATION="-540;37;"/>
@ -86664,6 +86712,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1697758391611" ID="ID_124711923" MODIFIED="1697758397083" TEXT="F&#xe4;lle">
<node CREATED="1697758425500" ID="ID_1450418166" MODIFIED="1697758430911" TEXT="simpleUsage">
<node CREATED="1697758440737" ID="ID_1211803424" MODIFIED="1697758454084" TEXT="zeigt hier vor allem was man braucht"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697755558855" ID="ID_278365674" MODIFIED="1697741858009" TEXT="SchedulerStress_test">
<icon BUILTIN="flag-yellow"/>
@ -86676,9 +86729,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697733279313" ID="ID_1511632308" MODIFIED="1697734150888" TEXT="Ziel: Feststellen des Implementierungs-Overhead">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Einen komplett leeren Job-Funktor wiederholt back-to-back (ohne Wartezeit) aufrufen; dabei das System nicht in die S&#228;ttigung treiben
@ -86693,9 +86744,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697734330989" ID="ID_1732860802" MODIFIED="1697734334809" TEXT="L&#xf6;sungsans&#xe4;tze">
<node CREATED="1697734356370" ID="ID_1254835839" MODIFIED="1697734436578" TEXT="WorkForce nicht ganz auf Volllast">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
z.B. 7 Cores auf meinem 8-Core-System &#8212; damit die <i>sonstigen Sytem-aktivit&#228;ten</i>&#160;nicht zu Stau-Zust&#228;nden f&#252;hren
@ -86705,9 +86754,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697734513005" ID="ID_803781887" MODIFIED="1697734840822" TEXT="immer nur eine Epoche rechnen mit Deadline=ASAP">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
immer nur so viele Jobs einstellen, da&#223; eine Epoche nicht ganz voll wird; aber die Startzeiten extrem dicht zusammen legen, so da&#223; im alles effektiv sofort berechenbar wird; dann kann man sinnvoll messen, wenn alles abgearbeitet ist: dazu einen Zeitmesser-Job verwenden; man kann die Zeitmessung <i>vor</i>&#160;oder <i>nach</i>&#160;dem Einstellen der Jobs starten
@ -86717,9 +86764,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697734845040" ID="ID_348047225" MODIFIED="1697735849618" TEXT="Last mit ged&#xe4;mpfter R&#xfc;ckkopplung geregelt hochfahren bis zur S&#xe4;ttigung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Bei diesem Ansatz wird eine Dauerlast erzeugt, indem immer ein Planungs-Chunk eine Zahl an Jobs erzeugt, die im Verh&#228;ltnis zur Epochen-Gr&#246;&#223;e steht (dabei kann auch durchaus auf eine &#220;berlastung des BlockFlow-Allokators abgezielt werden, indem man immer das N-Fache der Block-Kapazit&#228;t einstellt). Diese Jobs werden getaktet gem&#228;&#223; der aktuellen Dichte, aber diese Dichte wird langsam gesteigert, bis ein Feedback-Signal auftritt: n&#228;mlich wenn der reale Zeitpunkt des n&#228;chsten Planungs-Chunks versp&#228;tet ist, dann elastisch zur&#252;ckregeln. Bei richtiger Abstimmung sollte sich dann ein &#187;Lockstate&#171; einstellen, von dem man einen Me&#223;wert f&#252;r die erreichbare Dichte ablesen kann
@ -86734,9 +86779,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697733314115" ID="ID_537940927" MODIFIED="1697736103683" TEXT="Ziel: Overhead exzessiv vernetzter Activities">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Sollte ausgef&#252;hrt werden wie der normale Leerlauf-Stresstest, aber nun mit zus&#228;tzlichen und zunehmend exzessiven Dependencies/Notifications in der kette; beobachtet wird die Degeneration der Leerlauf-Kapazit&#228;t
@ -86753,9 +86796,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697736121279" ID="ID_1940006605" MODIFIED="1697736240729" TEXT="Ziel: Fehler in der Ausf&#xfc;hrungslogik ausschlie&#xdf;en">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Anders als in den Leerlauf-Tests wird hier eine &#252;berpr&#252;fbare Berechnung ausgef&#252;hrt, die aber auch Dependencies mit einschlie&#223;t. Auch unter Vollast mu&#223; die Pr&#252;fsumme korrekt sein. F&#252;r diesen Test k&#246;nnte man das System sogar kurzzeitig extrem in die S&#228;ttigung treiben (und trotzdem mu&#223; das Ergebnis stimmen)
@ -86786,9 +86827,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697736275498" ID="ID_1296200966" MODIFIED="1697736334906" TEXT="Einsatz wie im Play-Process">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Es wird aber kein Play-Prozess gebaut, sondern die entsprechende Funktionalit&#228;t direkt aus dem Test aufgebaut
@ -88887,6 +88926,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684984312239" ID="ID_1397136569" MODIFIED="1684984327473" TEXT="Dependencies repr&#xe4;sentieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697759022092" ID="ID_1686263066" MODIFIED="1697759031147" TEXT="Render-Nodes">
<icon BUILTIN="hourglass"/>
</node>
<node CREATED="1697759087931" ID="ID_1166391944" MODIFIED="1697759133905" TEXT="Job-Ticket: abstrahiert als Prerequisite &#x21b7; anderes Ticket"/>
<node CREATED="1697759154154" ID="ID_39776878" MODIFIED="1697759165180" TEXT="Render-Activity-Network">
<node CREATED="1697759166171" ID="ID_1324159119" MODIFIED="1697759177547" TEXT="Aufschalten einer Notification"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681347258814" ID="ID_1046752034" MODIFIED="1681347345729" TEXT="TimingObservable">
<linktarget COLOR="#a54e77" DESTINATION="ID_1046752034" ENDARROW="Default" ENDINCLINATION="-1519;212;" ID="Arrow_ID_1830118942" SOURCE="ID_1139462793" STARTARROW="None" STARTINCLINATION="836;79;"/>
@ -88895,6 +88941,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#8f29b2" DESTINATION="ID_1462535336" ENDARROW="Default" ENDINCLINATION="885;-44;" ID="Arrow_ID_1037995856" SOURCE="ID_321040814" STARTARROW="None" STARTINCLINATION="503;38;"/>
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687909270889" ID="ID_453814959" MODIFIED="1687909331969" TEXT="Me&#xdf;punkte">
<linktarget COLOR="#9291ae" DESTINATION="ID_453814959" ENDARROW="Default" ENDINCLINATION="-76;125;" ID="Arrow_ID_271419388" SOURCE="ID_1817482022" STARTARROW="None" STARTINCLINATION="92;-5;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687909320050" ID="ID_1843968618" MODIFIED="1687909327679" TEXT="Speicher-Ort">
<icon BUILTIN="flag-yellow"/>
@ -88974,6 +89021,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697763685621" ID="ID_1642973256" MODIFIED="1697763887954" TEXT="EngineObserver">
<linktarget COLOR="#4f3156" DESTINATION="ID_1642973256" ENDARROW="Default" ENDINCLINATION="-628;-472;" ID="Arrow_ID_1213898118" SOURCE="ID_272943268" STARTARROW="None" STARTINCLINATION="-1771;162;"/>
<icon BUILTIN="hourglass"/>
<node CREATED="1697763889873" ID="ID_1880953372" MODIFIED="1697763896717" TEXT="Aufgaben">
<icon BUILTIN="info"/>
<node CREATED="1697763898072" ID="ID_51060127" MODIFIED="1697763919401" TEXT="empf&#xe4;ngt einzelne Zeitmessungen"/>
<node CREATED="1697763920773" ID="ID_1817482022" MODIFIED="1697763990347" TEXT="ordnet diese den Me&#xdf;punkten zu">
<arrowlink COLOR="#9291ae" DESTINATION="ID_453814959" ENDARROW="Default" ENDINCLINATION="-76;125;" ID="Arrow_ID_271419388" STARTARROW="None" STARTINCLINATION="92;-5;"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697764000874" ID="ID_525721456" MODIFIED="1697764038363" TEXT="k&#xf6;nnte noch weitere Performance-Daten empfangen">
<icon BUILTIN="hourglass"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697764018200" ID="ID_222314932" MODIFIED="1697764038362" TEXT="k&#xf6;nnte Notifications und Triggerschwellen verwalten">
<icon BUILTIN="hourglass"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1689468998095" ID="ID_32989316" MODIFIED="1689469005279" TEXT="Selbstregulierung">
<icon BUILTIN="hourglass"/>
<node CREATED="1689468860552" ID="ID_1323627214" MODIFIED="1689468865077" TEXT="offene Themen">
@ -89043,9 +89109,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="yes"/>
<node CREATED="1697737465179" ID="ID_1204584376" MODIFIED="1697737798383" TEXT="selber Programmieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
An Libraries ist nur erlaubt, was ohnehin <i>in Reichweite liegt</i>&#160;(also elementare Video-Libraries und Cairo zum Zeichnen). Der Code wird Teil des Projekts, sollte daher in C++ stehen und allen Qualit&#228;tsstandards entsprechen. Sinnvollerweise wird der Code in ein ad-hoc-Plugin gepackt, um den Umgang mit Dependencies zu erleichtern
@ -89055,9 +89119,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697737473137" ID="ID_1145748705" MODIFIED="1697737860816" TEXT="nicht viel Zeit darauf verwenden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
&#8222;viel&#8220; ist relativ. Es darf schon Spa&#223; machen, aber es sollte nicht in ein monatelanges Kunst-Projekt ausufern
@ -89067,9 +89129,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697737543296" ID="ID_635918288" MODIFIED="1697738301537" TEXT="sollte gewisse Lastformen erzeugen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Der Datengenerator bewegt sich in einem gewissen Rahmen: bei hinreichend kleiner Aufl&#246;sung mu&#223; er zuverl&#228;ssig und ohne Aussetzer in Echtzeit laufen, und zwar mit 30fps. Idealerweise gibt es Parameter, um die Last stark zu erh&#246;hen, so da&#223; man ihn auch zum Test von Qualit&#228;ts-Renders heranziehen kann. Weiterhin sollte es sich im Wesentlichen um eine computational load handeln; ein gewisser Speicherbedarf ist dabei akzeptabel, externe IO nicht.
@ -89079,9 +89139,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697737491239" ID="ID_815953078" MODIFIED="1697738077728" TEXT="Ergebnis soll Stil haben">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Da das Projekt auf eine gewisse &#246;ffentliche Sichtbarkeit zusteuert, werden alle sichtbaren und leicht fa&#223;baren Elemente auf subtile Weise zu einer Visitenkarte. Dieser Playback ist so ziemlich das Erste und Einzige seit vielen Jahren, das man sehen und erfassen kann. Es sollte daher klar sein, da&#223; es in jeder Form einen Eindruck hinterl&#228;&#223;t.
@ -89104,9 +89162,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697738465629" ID="ID_95162985" MODIFIED="1697738467361" TEXT="Quellen">
<node CREATED="1697738525765" ID="ID_1218093676" LINK="https://flam3.com/flame_draves.pdf" MODIFIED="1697738678279" TEXT="Scott Draves: Flame-Algo">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Beschreibt das Prinzip rekursiver fraktaler Funktionen, und stellt dann Erweiterungen vor, die in seinem &#187;Flam3&#171; implementiert sind. Auf dieser Basis hat er &#187;Electric Sheep&#171; aufgebaut, welches auch die Grafik-Definitionen selber durch einen generativen Proze&#223; weiterentwickelt.
@ -89145,9 +89201,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697739314316" ID="ID_1389662036" MODIFIED="1697739320743" TEXT="Randomised Side-Chains">
<node CREATED="1697739585271" ID="ID_214582424" MODIFIED="1697739867461" TEXT="Zahlenfolge in eine Hash-Summe einbuchen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -89165,9 +89219,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697739654662" ID="ID_200209889" MODIFIED="1697740265583" TEXT="&#x201e;zuf&#xe4;lliger&#x201c; limitierter R&#xfc;ckgriff auf &#xe4;ltere Ergebnisse">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Ein lokal berechneter Hashwert kann als pseudo-Zufallszahl verwendet werden, um eine gewisse Zahl an Neben-Zweigen zu erzeugen; diese greifen in einem limitierten Rahmen auf vorausgehende Ergebnisse zur&#252;ck. Diese werden dadurch zu Voraussetzungen.
@ -89177,9 +89229,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697739748719" ID="ID_1722048889" MODIFIED="1697740071380" TEXT="lokale Iteration um Last zu erzeugen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
die Hash-Funktion wird N-fach auf das Zwischenergebnis angewendet, f&#252;r gro&#223;es N. Damit kann CPU-Last erzeugt werden
@ -89190,9 +89240,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697740269884" ID="ID_1006441438" MODIFIED="1697740623243" TEXT="ist deterministisch und parallelisierbar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Wenn man nicht immer auf den unmittelbaren Vorg&#228;nger zur&#252;ckgreift, sondern auf zuf&#228;llige Vorg&#228;nger, entsteht ein chaotischer DAG, der aber aufgrund der Limitierung stets Forschritt macht. Durch die teilweise lokale Entkoppelung der Zweige wird die Berechnung parallelisierbar; da sich jede Entscheidung aber aus den Eingangsdaten ergibt, mu&#223; das Ergebnis 100% deterministisch sein.
@ -89202,9 +89250,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697740624211" ID="ID_1773119907" MODIFIED="1697740764084" TEXT="f&#xfc;r den Test wird die Verzweigungsstruktur vorgeneriert">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Das Ergebnis mu&#223; ohnehin einmal auf konventionellem Weg berechnet werden; an dieser Stelle kann man die sich ergebende Verkn&#252;pfungs-Struktur ausgeben, um daraus verkn&#252;pfte Render-Jobs zu machen