Scheduler-test: ''can demonstrate running a synthetic load'' (closes #1346)

* added benchmark over synchronous execution as point of reference
 * verified running times and execution pattern
 * Scheduler **behaves as expected** for this example
This commit is contained in:
Fischlurch 2023-12-11 22:55:11 +01:00
parent 347b9b24be
commit da57e3dfcd
6 changed files with 815 additions and 50 deletions

View file

@ -0,0 +1,510 @@
invokeTestCase: ++------------------- invoking TEST: vault::gear::test::TestChainLoad_test
+++ 8F: seed(num:64)
ANCHOR=0 preRoll=5120
‖▷▷▷‖ 8F: @ -4805 EMPTY
‖IGN‖ wof:8
‖SCH‖ 8F: @-3381 ○ start=-4951 dead:100000
!◆! plan...to:63|curr=0 (max:64)
|n.(0,lev:0)
... dispose(i=0,lev:0) -> @0
‖•△•‖ wof:8 HT:195
‖SCH‖ 8F: @-3186 ○ start=0 dead:10000
|n.(1,lev:1)
... dispose(i=1,lev:1) -> @1000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-3103 ○ start=1000 dead:10000
|n.(2,lev:2)
... dispose(i=2,lev:2) -> @2000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-3021 ○ start=2000 dead:10000
|n.(3,lev:2)
... dispose(i=3,lev:2) -> @2000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2959 ○ start=2000 dead:10000
|n.(4,lev:3)
... dispose(i=4,lev:3) -> @3000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2895 ○ start=3000 dead:10000
|n.(5,lev:3)
... dispose(i=5,lev:3) -> @3000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2814 ○ start=3000 dead:10000
|n.(6,lev:3)
... dispose(i=6,lev:3) -> @3000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2749 ○ start=3000 dead:10000
|n.(7,lev:4)
... dispose(i=7,lev:4) -> @4000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2686 ○ start=4000 dead:10000
|n.(8,lev:4)
... dispose(i=8,lev:4) -> @4000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2625 ○ start=4000 dead:10000
|n.(9,lev:4)
... dispose(i=9,lev:4) -> @4000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2561 ○ start=4000 dead:10000
|n.(10,lev:4)
... dispose(i=10,lev:4) -> @4000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2496 ○ start=4000 dead:10000
|n.(11,lev:5)
... dispose(i=11,lev:5) -> @5000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2433 ○ start=5000 dead:10000
|n.(12,lev:5)
... dispose(i=12,lev:5) -> @5000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2370 ○ start=5000 dead:10000
|n.(13,lev:5)
... dispose(i=13,lev:5) -> @5000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2307 ○ start=5000 dead:10000
|n.(14,lev:5)
... dispose(i=14,lev:5) -> @5000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2246 ○ start=5000 dead:10000
|n.(15,lev:6)
... dispose(i=15,lev:6) -> @6000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2184 ○ start=6000 dead:10000
|n.(16,lev:6)
... dispose(i=16,lev:6) -> @6000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2123 ○ start=6000 dead:10000
|n.(17,lev:6)
... dispose(i=17,lev:6) -> @6000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2061 ○ start=6000 dead:10000
|n.(18,lev:6)
... dispose(i=18,lev:6) -> @6000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-2001 ○ start=6000 dead:10000
|n.(19,lev:6)
... dispose(i=19,lev:6) -> @6000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1889 ○ start=6000 dead:10000
|n.(20,lev:7)
... dispose(i=20,lev:7) -> @7000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1826 ○ start=7000 dead:10000
|n.(21,lev:7)
... dispose(i=21,lev:7) -> @7000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1747 ○ start=7000 dead:10000
|n.(22,lev:7)
... dispose(i=22,lev:7) -> @7000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1670 ○ start=7000 dead:10000
|n.(23,lev:7)
... dispose(i=23,lev:7) -> @7000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1607 ○ start=7000 dead:10000
|n.(24,lev:7)
... dispose(i=24,lev:7) -> @7000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1544 ○ start=7000 dead:10000
|n.(25,lev:8)
... dispose(i=25,lev:8) -> @8000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1483 ○ start=8000 dead:10000
|n.(26,lev:8)
... dispose(i=26,lev:8) -> @8000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1411 ○ start=8000 dead:10000
|n.(27,lev:8)
... dispose(i=27,lev:8) -> @8000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1345 ○ start=8000 dead:10000
|n.(28,lev:8)
... dispose(i=28,lev:8) -> @8000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1268 ○ start=8000 dead:10000
|n.(29,lev:8)
... dispose(i=29,lev:8) -> @8000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1184 ○ start=8000 dead:10000
|n.(30,lev:9)
... dispose(i=30,lev:9) -> @9000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1115 ○ start=9000 dead:10000
|n.(31,lev:9)
... dispose(i=31,lev:9) -> @9000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-1047 ○ start=9000 dead:10000
|n.(32,lev:9)
... dispose(i=32,lev:9) -> @9000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-980 ○ start=9000 dead:10000
|n.(33,lev:9)
... dispose(i=33,lev:9) -> @9000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-914 ○ start=9000 dead:10000
|n.(34,lev:9)
... dispose(i=34,lev:9) -> @9000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-846 ○ start=9000 dead:10000
|n.(35,lev:10)
... dispose(i=35,lev:10) -> @10000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-773 ○ start=10000 dead:10000
|n.(36,lev:10)
... dispose(i=36,lev:10) -> @10000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-709 ○ start=10000 dead:10000
|n.(37,lev:10)
... dispose(i=37,lev:10) -> @10000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-645 ○ start=10000 dead:10000
|n.(38,lev:10)
... dispose(i=38,lev:10) -> @10000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-585 ○ start=10000 dead:10000
|n.(39,lev:10)
... dispose(i=39,lev:10) -> @10000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-523 ○ start=10000 dead:10000
|n.(40,lev:11)
... dispose(i=40,lev:11) -> @11000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-460 ○ start=11000 dead:10000
|n.(41,lev:11)
... dispose(i=41,lev:11) -> @11000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-398 ○ start=11000 dead:10000
|n.(42,lev:11)
... dispose(i=42,lev:11) -> @11000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-334 ○ start=11000 dead:10000
|n.(43,lev:11)
... dispose(i=43,lev:11) -> @11000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-270 ○ start=11000 dead:10000
|n.(44,lev:11)
... dispose(i=44,lev:11) -> @11000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-207 ○ start=11000 dead:10000
|n.(45,lev:12)
... dispose(i=45,lev:12) -> @12000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-147 ○ start=12000 dead:10000
|n.(46,lev:12)
... dispose(i=46,lev:12) -> @12000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-86 ○ start=12000 dead:10000
|n.(47,lev:12)
... dispose(i=47,lev:12) -> @12000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @-24 ○ start=12000 dead:10000
|n.(48,lev:12)
... dispose(i=48,lev:12) -> @12000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @36 ○ start=12000 dead:10000
|n.(49,lev:12)
... dispose(i=49,lev:12) -> @12000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @98 ○ start=12000 dead:10000
|n.(50,lev:13)
... dispose(i=50,lev:13) -> @13000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @160 ○ start=13000 dead:10000
|n.(51,lev:13)
... dispose(i=51,lev:13) -> @13000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @222 ○ start=13000 dead:10000
|n.(52,lev:13)
... dispose(i=52,lev:13) -> @13000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @283 ○ start=13000 dead:10000
|n.(53,lev:13)
... dispose(i=53,lev:13) -> @13000
‖•△•‖ wof:8 HT:0
‖SCH‖ 8F: @359 ○ start=13000 dead:10000
·‖ 6A: @ 350 HT:195 -> ▶ 0
|n.(54,lev:13)
!◆! 6A: calc(i=0, lev:0)
... dispose(i=54,lev:13) -> @13000
‖•△•‖ wof:8 HT:195
‖SCH‖ 8F: @451 ○ start=13000 dead:10000
|n.(55,lev:14)
... dispose(i=55,lev:14) -> @14000
‖•△•‖ wof:8 HT:195
‖SCH‖ 8F: @520 ○ start=14000 dead:10000
!◆! 6A: calc(i=1, lev:1)
|n.(56,lev:14)
... dispose(i=56,lev:14) -> @14000
‖•△•‖ wof:8 HT:195
‖SCH‖ 8F: @612 ○ start=14000 dead:10000
|n.(57,lev:14)
... dispose(i=57,lev:14) -> @14000
‖•△•‖ wof:8 HT:195
‖SCH‖ 8F: @683 ○ start=14000 dead:10000
!◆! 6A: calc(i=3, lev:2)
·‖ 70: @ 695 HT:1000 -> ▶ 195
‖▷▷▷‖ 70: @ 764 HT:1000
|n.(58,lev:14)
... dispose(i=58,lev:14) -> @14000
‖•△•‖ wof:8 HT:1000
‖SCH‖ 8F: @793 ○ start=14000 dead:10000
!◆! 6A: calc(i=6, lev:3)
|n.(59,lev:14)
... dispose(i=59,lev:14) -> @14000
‖•△•‖ wof:8 HT:1000
‖SCH‖ 8F: @882 ○ start=14000 dead:10000
|n.(60,lev:15)
... dispose(i=60,lev:15) -> @15000
‖•△•‖ wof:8 HT:1000
‖SCH‖ 8F: @954 ○ start=15000 dead:10000
!◆! 6A: calc(i=10, lev:4)
|n.(61,lev:15)
... dispose(i=61,lev:15) -> @15000
‖•△•‖ wof:8 HT:1000
‖SCH‖ 8F: @1043 ○ start=15000 dead:10000
·‖ 70: @ 1063 HT:2000 -> ▶ 1000
|n.(62,lev:15)
... dispose(i=62,lev:15) -> @15000
‖•△•‖ wof:8 HT:2000
‖SCH‖ 8F: @1127 ○ start=15000 dead:10000
!◆! 6A: calc(i=14, lev:5)
|n.(63,lev:16)
... dispose(i=63,lev:16) -> @16000
‖•△•‖ wof:8 HT:2000
‖SCH‖ 8F: @1217 ○ start=16000 dead:10000
+++ 8F: Continuation(lastNode=63, levelDone=16, work_left:false)
‖•△•‖ wof:8 HT:2000
‖SCH‖ 8F: @1320 ○ start=17000 dead:100000
!◆! 6A: calc(i=19, lev:6)
·‖ 70: @ 2084 HT:2000 -> ▶ 2000
·‖ 70: @ 2119 HT:3000 -> ▶ 2000
!◆! 70: calc(i=2, lev:2)
!◆! 70: calc(i=4, lev:3)
·‖ 70: @ 3061 HT:3000 -> ▶ 3000
!◆! 70: calc(i=5, lev:3)
!◆! 70: calc(i=8, lev:4)
·‖ 70: @ 3441 HT:3000 -> ▶ 3000
·‖ 70: @ 3464 HT:4000 -> ▶ 3000
·‖ 70: @ 4130 HT:4000 -> ▶ 4000
·‖ 70: @ 4192 HT:4000 -> ▶ 4000
!◆! 70: calc(i=9, lev:4)
!◆! 70: calc(i=12, lev:5)
·‖ 70: @ 4596 HT:4000 -> ▶ 4000
·‖ 70: @ 4619 HT:5000 -> ▶ 4000
!◆! 70: calc(i=7, lev:4)
!◆! 70: calc(i=11, lev:5)
!◆! 70: calc(i=16, lev:6)
·‖ 98: @ 5008 HT:5000 -> ▶ 5000
!◆! 98: calc(i=13, lev:5)
·‖ 74: @ 5106 HT:5000 -> ▶ 5000
·‖ 70: @ 5212 HT:5000 -> ∘
·‖ 98: @ 5248 HT:5000 -> ∘
·‖ 70: @ 5258 HT:5000 -> ∘
·‖ 98: @ 5265 HT:5000 -> ∘
·‖ 70: @ 5284 HT:5000 -> ∘
·‖ 74: @ 5271 HT:5000 -> ▶ 5000
·‖ 98: @ 5291 HT:5000 -> ∘
·‖ 70: @ 5319 HT:5000 -> ∘
·‖ 98: @ 5352 HT:5000 -> ∘
·‖ 74: @ 5353 HT:5239 -> ▶ 5000
·‖ 70: @ 5362 HT:5239 -> ∘
·‖ 98: @ 5366 HT:5239 -> ∘
·‖ 70: @ 5385 HT:5239 -> ∘
·‖ 70: @ 5430 HT:5239 -> ∘
·‖ 98: @ 5432 HT:5239 -> ∘
·‖ 74: @ 5433 HT:6000 -> ▶ 5239
!◆! 74: calc(i=18, lev:6)
!◆! 74: calc(i=23, lev:7)
·‖ C2: @ 6021 HT:6000 -> ▶ 6000
·‖ 98: @ 6023 HT:6000 -> ∘
·‖ C2: @ 6048 HT:6000 -> ▶ 6000
·‖ C2: @ 6064 HT:6000 -> ▶ 6000
·‖ 98: @ 6064 HT:6000 -> ∘
·‖ 74: @ 6073 HT:6000 -> ∘
·‖ 70: @ 6066 HT:6000 -> ∘
·‖ 74: @ 6110 HT:6000 -> ▶ 6000
·‖ 70: @ 6134 HT:6000 -> ∘
!◆! C2: calc(i=17, lev:6)
·‖ 98: @ 6121 HT:6000 -> ∘
·‖ 70: @ 6157 HT:6000 -> ∘
·‖ 74: @ 6185 HT:7000 -> ▶ 6000
!◆! 74: calc(i=15, lev:6)
!◆! C2: calc(i=21, lev:7)
!◆! 74: calc(i=20, lev:7)
!◆! 74: calc(i=26, lev:8)
·‖ 74: @ 7003 HT:7000 -> ▶ 7000
!◆! 74: calc(i=24, lev:7)
·‖ 98: @ 7064 HT:7000 -> ∘
·‖ 70: @ 7064 HT:7000 -> ▶ 7000
·‖ 70: @ 7094 HT:7000 -> ▶ 7000
·‖ 98: @ 7129 HT:7000 -> ▶ 7000
!◆! 70: calc(i=22, lev:7)
·‖ 98: @ 7157 HT:8000 -> ▶ 7000
!◆! 74: calc(i=29, lev:8)
!◆! 70: calc(i=28, lev:8)
!◆! 74: calc(i=33, lev:9)
·‖ 98: @ 8060 HT:8000 -> ▶ 8000
·‖ 98: @ 8086 HT:8000 -> ▶ 8000
·‖ 98: @ 8107 HT:8000 -> ▶ 8000
!◆! 98: calc(i=27, lev:8)
!◆! 98: calc(i=31, lev:9)
·‖ 98: @ 8485 HT:8000 -> ▶ 8000
·‖ 98: @ 8506 HT:9000 -> ▶ 8000
!◆! 98: calc(i=25, lev:8)
!◆! 98: calc(i=30, lev:9)
!◆! 98: calc(i=36, lev:10)
·‖ 98: @ 9065 HT:9000 -> ∘
·‖ 98: @ 9082 HT:9000 -> ∘
·‖ D4: @ 9064 HT:9000 -> ▶ 9000
!◆! D4: calc(i=34, lev:9)
·‖ 98: @ 9101 HT:9000 -> ∘
·‖ 98: @ 9127 HT:9000 -> ▶ 9000
·‖ 98: @ 9158 HT:9000 -> ▶ 9000
!◆! 98: calc(i=32, lev:9)
!◆! D4: calc(i=39, lev:10)
!◆! 98: calc(i=38, lev:10)
·‖ D4: @ 9508 HT:9000 -> ▶ 9000
·‖ D4: @ 9530 HT:10000 -> ▶ 9000
!◆! 98: calc(i=43, lev:11)
·‖ D4: @ 10063 HT:10000 -> ▶ 10000
·‖ D4: @ 10084 HT:10000 -> ▶ 10000
·‖ D4: @ 10101 HT:10000 -> ▶ 10000
!◆! D4: calc(i=37, lev:10)
!◆! D4: calc(i=41, lev:11)
·‖ D4: @ 10416 HT:10000 -> ▶ 10000
·‖ D4: @ 10435 HT:11000 -> ▶ 10000
!◆! D4: calc(i=35, lev:10)
!◆! D4: calc(i=40, lev:11)
!◆! D4: calc(i=46, lev:12)
·‖ 70: @ 11064 HT:11000 -> ▶ 11000
·‖ 70: @ 11096 HT:11000 -> ▶ 11000
!◆! 70: calc(i=44, lev:11)
!◆! 70: calc(i=49, lev:12)
·‖ C2: @ 11487 HT:11000 -> ∘
·‖ 70: @ 11489 HT:11000 -> ▶ 11000
·‖ 70: @ 11520 HT:11000 -> ▶ 11000
·‖ C2: @ 11547 HT:11000 -> ∘
·‖ 70: @ 11559 HT:12000 -> ▶ 11000
!◆! 70: calc(i=42, lev:11)
!◆! 70: calc(i=48, lev:12)
!◆! 70: calc(i=53, lev:13)
·‖ C2: @ 12060 HT:12000 -> ▶ 12000
·‖ C2: @ 12081 HT:12000 -> ▶ 12000
·‖ C2: @ 12098 HT:12000 -> ▶ 12000
·‖ 70: @ 12120 HT:12000 -> ▶ 12000
!◆! 70: calc(i=45, lev:12)
!◆! C2: calc(i=47, lev:12)
!◆! C2: calc(i=51, lev:13)
!◆! 70: calc(i=50, lev:13)
!◆! 70: calc(i=56, lev:14)
·‖ C2: @ 12387 HT:13000 -> ▶ 12000
·‖ C2: @ 13060 HT:13000 -> ▶ 13000
·‖ C2: @ 13080 HT:13000 -> ▶ 13000
!◆! C2: calc(i=54, lev:13)
!◆! C2: calc(i=59, lev:14)
·‖ C2: @ 13366 HT:13000 -> ▶ 13000
·‖ C2: @ 13383 HT:13000 -> ▶ 13000
·‖ C2: @ 13400 HT:14000 -> ▶ 13000
!◆! C2: calc(i=52, lev:13)
!◆! C2: calc(i=58, lev:14)
!◆! C2: calc(i=62, lev:15)
·‖ C2: @ 14059 HT:14000 -> ▶ 14000
·‖ C2: @ 14078 HT:14000 -> ▶ 14000
·‖ C2: @ 14095 HT:14000 -> ▶ 14000
!◆! C2: calc(i=57, lev:14)
·‖ 74: @ 14144 HT:14000 -> ▶ 14000
!◆! 74: calc(i=55, lev:14)
!◆! C2: calc(i=61, lev:15)
!◆! 74: calc(i=60, lev:15)
·‖ C2: @ 14367 HT:15000 -> ▶ 14000
!◆! 74: calc(i=63, lev:16)
·‖ C2: @ 15060 HT:15000 -> ▶ 15000
·‖ C2: @ 15080 HT:15000 -> ▶ 15000
·‖ C2: @ 15097 HT:16000 -> ▶ 15000
·‖ C2: @ 16060 HT:17000 -> ▶ 16000
·‖ C2: @ 17060 HT:50764 -> ▶ 17000
+++ 8F: wake-up / shutdown
‖▽▼▽‖ 5D: @ 17446
‖▽▼▽‖ 6A: @ 17999
‖▽▼▽‖ 98: @ 18212
‖▽▼▽‖ CE: @ 18263
‖▽▼▽‖ 74: @ 18327
‖▽▼▽‖ D4: @ 18682
‖▽▼▽‖ 70: @ 21125
‖▽▼▽‖ C2: @ 50886

View file

@ -33,6 +33,8 @@ tangible CPU load and thus the job processing is absolutely dominated by
the scheduler management overhead. Several workers, pulling concurrently,
may create a slowdown due to contention on the »Grooming-Token«
SchedulerTestGraph.pdf::
Visualisation of the computation structure used for these tests
Dump-01::
example of a nice and clean run
@ -72,3 +74,9 @@ Dump-03::
appear in the log. This _may hint at additional contention generated by the
dump output itself...._
Dump-04::
Example of a successful run with a computational load of 100µs per step.
This example was obtained form running `TestChainLoad_test::usageExample()`
with additional print-statements inserted into the code.

View file

@ -27,6 +27,7 @@
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
#include "lib/test/diagnostic-output.hpp"
#include "test-chain-load.hpp"
#include "vault/gear/job.h"
#include "lib/util.hpp"
@ -59,6 +60,10 @@ namespace test {
/*****************************************************************//**
* @test verify a tool to generate synthetic load for Scheduler tests.
* @remark statistics output and the generation of Graphviz-DOT diagrams
* is commented out; these diagnostics are crucial to understand
* the generated load pattern or to develop new graph shapes.
* Visualise graph with `dot -Tpng example.dot | display`
* @see SchedulerService_test
* @see SchedulerStress_test
*/
@ -84,7 +89,8 @@ namespace test {
/** @test demonstrate simple usage of the test-load
* @todo WIP 11/23 define implement
* - build a graph with 64 nodes, grouped into small segments
* - use a scheduler instance to »perform« this graph
*/
void
usageExample()
@ -94,22 +100,24 @@ namespace test {
.configureShape_short_segments3_interleaved()
.buildToplolgy();
// while building the graph, node hashes are computed
CHECK (testLoad.getHash() == 0xD2F292D864CF8086);
BlockFlowAlloc bFlow;
EngineObserver watch;
Scheduler scheduler{bFlow, watch};
CHECK (testLoad.getHash() == 0xD2F292D864CF8086);
testLoad.setupSchedule(scheduler)
.launch_and_wait();
// invocation through Scheduler has reproduced all node hashes
CHECK (testLoad.getHash() == 0xD2F292D864CF8086);
}
/** @test data structure to represent a computation Node
* @todo WIP 11/23 define implement
*/
void
verify_Node()
@ -195,7 +203,6 @@ namespace test {
* - in the default case, nodes are linearly chained
* - hash is also computed by chaining with predecessor hash
* - hash computations can be reproduced
* @todo WIP 11/23 define implement
*/
void
verify_Topology()
@ -256,7 +263,6 @@ namespace test {
* - with additional shuffling, the decisions are more random
* - statistics can be computed to characterise the graph
* - the graph can be visualised as _Graphviz diagram_
* @todo WIP 11/23 define implement
*/
void
showcase_Expansion()
@ -326,7 +332,6 @@ namespace test {
* all chains to be joined eventually
* - expansion and reduction can counterbalance each other,
* leading to localised »packages« of branchings and reductions
* @todo WIP 11/23 define implement
*/
void
showcase_Reduction()
@ -396,7 +401,6 @@ namespace test {
* - the seed rule allows to start new chains in the middle of the graph
* - combined with with reduction, the emerging structure resembles
* the processing pattern encountered with real media calculations
* @todo WIP 11/23 define implement
*/
void
showcase_SeedChains()
@ -454,7 +458,6 @@ namespace test {
* - this can lead to fragmentation into several sub-graphs
* - these can be completely segregated, or appear interwoven
* - equilibrium of seeding and pruning can be established
* @todo WIP 11/23 define implement
*/
void
showcase_PruneChains()
@ -595,7 +598,6 @@ namespace test {
* parameter variations leading into repeated re-establishment
* of some node constellation. When this is achieved, additional
* shuffling can be introduced to uncover further potential.
* @todo WIP 11/23 define implement
*/
void
showcase_StablePattern()
@ -853,7 +855,6 @@ namespace test {
/** @test verify calibration of a configurable computational load.
* @todo WIP 12/23 define implement
*/
void
verify_computation_load()
@ -921,7 +922,6 @@ namespace test {
* that the last node is an exit node. The following code traverses
* all nodes grouped into 4-node clusters to verify this regular
* pattern and the calculated hashes.
* @todo WIP 11/23 define implement
*/
void
verify_reseed_recalculate()
@ -1024,13 +1024,62 @@ namespace test {
/** @test TODO compute synchronous execution time for reference
* @todo WIP 12/23 🔁 define 🔁 implement
/** @test compute synchronous execution time for reference
*/
void
verify_runtime_reference()
{
double t1 =
TestChainLoad{64}
.configureShape_short_segments3_interleaved()
.buildToplolgy()
.calcRuntimeReference();
double t2 =
TestChainLoad{64}
.configureShape_short_segments3_interleaved()
.buildToplolgy()
.calcRuntimeReference(1ms);
double t3 =
TestChainLoad{256}
.configureShape_short_segments3_interleaved()
.buildToplolgy()
.calcRuntimeReference();
auto isWithin10Percent = [](double t, double r)
{
auto delta = abs (1.0 - t/r);
return delta < 0.1;
};
// the test-graph has 64 Nodes,
// each using the default load of 100µs
CHECK (isWithin10Percent(t1, 6400)); // thus overall we should be close to 6.4ms
CHECK (isWithin10Percent(t2, 10*t1)); // and the 10-fold load should yield 10-times
CHECK (isWithin10Percent(t3, 4*t1)); // using 4 times as much nodes (64->256)
// the time measurement uses a performance
// which clears, re-seeds and calculates the complete graph
auto graph =
TestChainLoad{64}
.configureShape_short_segments3_interleaved()
.buildToplolgy();
CHECK (graph.getHash() == 0xD2F292D864CF8086);
graph.clearNodeHashes();
CHECK (graph.getHash() == 0);
// this is used by the timing benchmark
graph.performGraphSynchronously();
CHECK (graph.getHash() == 0xD2F292D864CF8086);
graph.clearNodeHashes();
CHECK (graph.getHash() == 0);
graph.calcRuntimeReference();
CHECK (graph.getHash() == 0xD2F292D864CF8086);
}
@ -1045,7 +1094,6 @@ namespace test {
* if all nodes are processed and all dependency connections
* properly reported through the callback-λ, then calculating
* this clone network should reproduce the original hash.
* @todo WIP 12/23 define implement
*/
void
verify_scheduling_setup()

View file

@ -66,7 +66,7 @@
** control functions can then be configured. The [topology generation](\ref TestChainLoad::buildTopology)
** then traverses the nodes, starting with the seed value from the root node, and establishes
** the complete node connectivity. After this priming, the expected result hash should be
** [retrieved](\ref TestChainLoad::getHash). The node structure can than be traversed or
** [retrieved](\ref TestChainLoad::getHash). The node structure can then be traversed or
** [scheduled as Render Jobs](\ref TestChainLoad::scheduleJobs).
**
** ## Observation tools
@ -75,6 +75,10 @@
** and showing predecessor -> successor connectivity. Seed nodes are distinguished by
** circular shape.
**
** The complete graph can be [performed synchronously](\ref TestChainLoad::performGraphSynchronously),
** allowing to watch a [baseline run-time](\ref TestChainLoad::calcRuntimeReference) when execution
** all nodes consecutively, using the configured load but without any time gaps. The run time
** in µs can be compared to the timings observed when performing the graph through the Scheduler.
** Moreover, Statistics can be computed over the generated graph, allowing to draw some
** conclusions regarding node distribution and connectivity.
**
@ -157,6 +161,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 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)
const microseconds LOAD_DEFAULT_TIME = 100us; ///< default time delay produced by ComputationalLoad at `Node.weight==1`
@ -522,6 +527,11 @@ namespace test {
{
return rule(n);
};
auto calcNode = [&](Node* n)
{
n->calculate();
n->weight = apply(weightRule_,n);
};
// visit all further nodes and establish links
while (moreNodes())
@ -533,8 +543,7 @@ namespace test {
REQUIRE (spaceLeft());
for (Node* o : *curr)
{ // follow-up on all Nodes in current level...
o->calculate();
o->weight = apply (weightRule_,o);
calcNode(o);
if (apply (pruningRule_,o))
continue; // discontinue
size_t toSeed = apply (seedingRule_, o);
@ -578,10 +587,10 @@ namespace test {
node->level = level;
for (Node* o : *next)
{
o->calculate();
calcNode(o);
node->addPred(o);
}
node->calculate();
calcNode(node);
//
return move(*this);
}
@ -689,6 +698,43 @@ namespace test {
}
/**
* Conduct a number of benchmark runs over processing the Graph synchronously.
* @return runtime time in microseconds
* @remark can be used as reference point to judge Scheduler performance;
* - additional parallelisation could be exploited: w / floor(w/concurrency)
* - but the Scheduler also adds overhead and dispatch leeway
*/
double
calcRuntimeReference(microseconds timeBase =LOAD_DEFAULT_TIME
,size_t sizeBase =0
,size_t repeatCnt=GRAPH_BENCHMARK_RUNS
)
{
return microBenchmark ([&]{ performGraphSynchronously(timeBase,sizeBase); }
,repeatCnt)
.first; // ∅ runtime in µs
}
/** Emulate complete graph processing in a single threaded loop. */
TestChainLoad&& performGraphSynchronously(microseconds timeBase =LOAD_DEFAULT_TIME
,size_t sizeBase =0);
TestChainLoad&&
printRuntimeReference(microseconds timeBase =LOAD_DEFAULT_TIME
,size_t sizeBase =0
,size_t repeatCnt=GRAPH_BENCHMARK_RUNS
)
{
cout << _Fmt{"runtime ∅(%d) = %6.2fms (single-threaded)\n"}
% repeatCnt
% (1e-3 * calcRuntimeReference(timeBase,sizeBase,repeatCnt))
<< "───═══───═══───═══───═══───═══───═══───═══───═══───═══───═══───"
<< endl;
return move(*this);
}
Statistic computeGraphStatistics();
TestChainLoad&& printTopologyStatistics();
@ -1119,6 +1165,7 @@ namespace test {
* variable and can thus be reused.
*/
class ComputationalLoad
: util::MoveAssign
{
using Sink = volatile size_t;
@ -1245,6 +1292,42 @@ namespace test {
};
/**
* @param timeBase time delay produced by ComputationalLoad at `Node.weight==1`;
* can be set to zero to disable the synthetic processing load on nodes
* @param sizeBase allocation base size used; also causes switch to memory-access based load
* @see TestChainLoad::calcRuntimeReference() for a benchmark based on this processing
*/
template<size_t maxFan>
TestChainLoad<maxFan>&&
TestChainLoad<maxFan>::performGraphSynchronously (microseconds timeBase, size_t sizeBase)
{
ComputationalLoad compuLoad;
compuLoad.timeBase = timeBase;
if (not sizeBase)
{
compuLoad.sizeBase = LOAD_DEFAULT_MEM_SIZE;
compuLoad.useAllocation =false;
}
else
{
compuLoad.sizeBase = sizeBase;
compuLoad.useAllocation =true;
}
compuLoad.maybeCalibrate();
size_t seed = this->getSeed();
for (Node& n : allNodes())
{
n.hash = isStart(n)? seed : 0;
if (n.weight)
compuLoad.invoke (n.weight);
n.calculate();
}
return move(*this);
}
@ -1725,7 +1808,7 @@ cout<<"ANCHOR="+relT(ank)+" preRoll="+util::toString(_raw(_uTicks(preRoll_)))<<e
*/
template<size_t maxFan>
typename TestChainLoad<maxFan>::ScheduleCtx
TestChainLoad<maxFan>::setupSchedule(Scheduler& scheduler)
TestChainLoad<maxFan>::setupSchedule (Scheduler& scheduler)
{
clearNodeHashes();
return ScheduleCtx{*this, scheduler};

View file

@ -85308,9 +85308,33 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="bell"/>
<node CREATED="1698078395346" ID="ID_1995310118" MODIFIED="1698078418081" TEXT="ist die probabilistische Kapazit&#xe4;tsverteilung ausreichend, um Aussetzer zu verhindern?"/>
<node CREATED="1698078423734" ID="ID_588175161" MODIFIED="1698078714099" TEXT="bringt das Spinning im Nah-Bereich &#xfc;berhaupt etwas (oder schadet es gar?)"/>
<node CREATED="1698078720726" ID="ID_690302845" MODIFIED="1698078865023" TEXT="mu&#xdf; incomingCapacity &#xfc;berhaupt am tend-Next teilnehmen?"/>
<node COLOR="#5b280f" CREATED="1698078720726" ID="ID_690302845" MODIFIED="1702322971360" TEXT="mu&#xdf; incomingCapacity &#xfc;berhaupt am tend-Next teilnehmen?">
<icon BUILTIN="button_cancel"/>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1702322895562" HGAP="34" ID="ID_506016335" MODIFIED="1702323195697" TEXT="ja &#x2014; schon aus rein-logischen Gr&#xfc;nden" VSHIFT="3">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...denn wir wissen grunds&#228;tzlich nie, wieviel Kapazit&#228;t wir &#8222;in der R&#252;ckhand&#8220; haben; nur <i>falls sich das grunds&#228;tzlich &#228;ndert, </i>k&#246;nnte man &#252;ber derartige Priorisierungen nachdenken. Das w&#228;re durchaus m&#246;glich, w&#252;rde aber mit dem Design-Prinzip dieses Schedulers brechen: da&#223; n&#228;mlich die Worker aktiv sind und nebenbei die Administration mit erledigen, und da&#223; Kapazit&#228;t &#252;ber mehrere Stufen &#8222;flie&#223;t&#8220;
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
</node>
<node CREATED="1698200170774" ID="ID_433843739" MODIFIED="1698200464028" TEXT="sind derart kleine Wartezeiten &#xfc;berhaupt sinnvoll?">
<arrowlink COLOR="#69496a" DESTINATION="ID_1298210753" ENDARROW="Default" ENDINCLINATION="2071;-139;" ID="Arrow_ID_67065674" STARTARROW="None" STARTINCLINATION="733;41;"/>
<node CREATED="1702323207113" HGAP="46" ID="ID_279554596" MODIFIED="1702323430889" TEXT="vorl&#xe4;ufiges Ergebnis: directed-sleep unter 100&#xb5;s funktioniert nicht; dar&#xfc;ber durchaus" VSHIFT="4">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
weil bei etwa 100&#181;s die Granularit&#228;t des OS-Schedulers liegt; man kann zwar deutlich kleinere Schlaf-Zeiten angeben und bekommt dann auch was K&#252;rzeres und zwar im Schnitt. Aber im Einzelfall bekommt man dann eben doch x-mal wieder etwas &#252;ber 100&#181;s. Gem&#228;&#223; Zielabw&#228;gung habe ich daher die Grenze f&#252;r spinning yield-wait auf 50&#181;s gesetzt, denn wenn's mehr als 50&#181;s sind, dann ist es auch schon egal wenn wir &#252;ber 100&#181;s bekommen
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
</node>
</node>
@ -93428,8 +93452,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#fde0ca" DESTINATION="ID_1032000470" ENDARROW="Default" ENDINCLINATION="-1678;88;" ID="Arrow_ID_552669850" SOURCE="ID_849227497" STARTARROW="None" STARTINCLINATION="-1536;97;"/>
<icon BUILTIN="flag-pink"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697741769556" ID="ID_1899821736" MODIFIED="1697741852506" TEXT="brauche eine reproduzierbare komplexe Last">
<arrowlink COLOR="#9b2277" DESTINATION="ID_509932054" ENDARROW="Default" ENDINCLINATION="-374;-90;" ID="Arrow_ID_1082315358" STARTARROW="None" STARTINCLINATION="-1039;60;"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697741769556" ID="ID_1899821736" MODIFIED="1702330788267" TEXT="brauche eine reproduzierbare komplexe Last">
<arrowlink COLOR="#22709b" DESTINATION="ID_509932054" ENDARROW="Default" ENDINCLINATION="-374;-90;" ID="Arrow_ID_1082315358" STARTARROW="None" STARTINCLINATION="-1039;60;"/>
<icon BUILTIN="flag-pink"/>
</node>
</node>
@ -96083,7 +96107,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
<node CREATED="1697739192956" ID="ID_1199894921" MODIFIED="1697739211725" TEXT="Korrektheit mu&#xdf; verifizierbar sein"/>
<node CREATED="1697739215921" ID="ID_880522211" MODIFIED="1697739222701" TEXT="Last-Parameter sollten steuerbar sein"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1697739223592" ID="ID_1177697704" MODIFIED="1701476435378" TEXT="Naheliegend: Pr&#xfc;fsummen-Kette">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1697739223592" FOLDED="true" ID="ID_1177697704" MODIFIED="1702330821954" TEXT="Naheliegend: Pr&#xfc;fsummen-Kette">
<arrowlink COLOR="#fcffac" DESTINATION="ID_509932054" ENDARROW="Default" ENDINCLINATION="44;-115;" ID="Arrow_ID_388403838" STARTARROW="None" STARTINCLINATION="-227;20;"/>
<icon BUILTIN="idea"/>
<node CREATED="1697739240230" ID="ID_1190486942" MODIFIED="1697739258607" TEXT="wie in Git oder Blockchain">
@ -96155,13 +96179,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697740783336" ID="ID_509932054" MODIFIED="1701477303910" TEXT="TestChainLoad">
<linktarget COLOR="#9b2277" DESTINATION="ID_509932054" ENDARROW="Default" ENDINCLINATION="-374;-90;" ID="Arrow_ID_1082315358" SOURCE="ID_1899821736" STARTARROW="None" STARTINCLINATION="-1039;60;"/>
<node COLOR="#338800" CREATED="1697740783336" ID="ID_509932054" MODIFIED="1702334910682" TEXT="TestChainLoad">
<linktarget COLOR="#22709b" DESTINATION="ID_509932054" ENDARROW="Default" ENDINCLINATION="-374;-90;" ID="Arrow_ID_1082315358" SOURCE="ID_1899821736" STARTARROW="None" STARTINCLINATION="-1039;60;"/>
<linktarget COLOR="#fcffac" DESTINATION="ID_509932054" ENDARROW="Default" ENDINCLINATION="44;-115;" ID="Arrow_ID_388403838" SOURCE="ID_1177697704" STARTARROW="None" STARTINCLINATION="-227;20;"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1697740826362" ID="ID_1948434460" MODIFIED="1697740845523" TEXT="eine verifizierbare verzweigte Berechnungs-Last">
<icon BUILTIN="info"/>
</node>
<node COLOR="#338800" CREATED="1697743909120" ID="ID_483537733" MODIFIED="1702334893691" TEXT="#1346 reproducible computational load">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1699657771858" FOLDED="true" ID="ID_492954771" MODIFIED="1701476473418" TEXT="Design">
<icon BUILTIN="yes"/>
<node COLOR="#435e98" CREATED="1699657791215" ID="ID_1285189810" MODIFIED="1701476453672" TEXT="Anforderungen">
@ -96379,7 +96406,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1699745687140" ID="ID_703752888" MODIFIED="1699745716356" TEXT="es gibt eine Sammlung von Standard-Bausteinen zur Parametrisierung der Steuergr&#xf6;&#xdf;en"/>
</node>
</node>
<node COLOR="#338800" CREATED="1697740857815" ID="ID_1544079509" MODIFIED="1702317805054" TEXT="in separatem Test entwerfen">
<node COLOR="#338800" CREATED="1697740857815" FOLDED="true" ID="ID_1544079509" MODIFIED="1702317805054" TEXT="in separatem Test entwerfen">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1697741633966" ID="ID_787175245" MODIFIED="1701476481436" TEXT="Nutzen vorher kl&#xe4;ren">
<icon BUILTIN="messagebox_warning"/>
@ -96393,9 +96420,6 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1699813845859" ID="ID_1345582113" MODIFIED="1699813864796" TEXT="der errechnete chained-Hash ist direkt abrufbar (von der End-Node)"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697743909120" ID="ID_483537733" MODIFIED="1697743924734" TEXT="#1346 reproducible computational load">
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#338800" CREATED="1697740877587" ID="ID_1275890321" MODIFIED="1702317799986" TEXT="TestChainLoad_test">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1699747322625" ID="ID_1190216980" MODIFIED="1699804627509" TEXT="verify_Node">
@ -96813,16 +96837,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1701838479658" ID="ID_120274201" MODIFIED="1702317754549" TEXT="usageExample">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#338800" CREATED="1701838479658" ID="ID_120274201" MODIFIED="1702330737006" TEXT="usageExample">
<linktarget COLOR="#7718bb" DESTINATION="ID_120274201" ENDARROW="Default" ENDINCLINATION="-730;116;" ID="Arrow_ID_573558112" SOURCE="ID_111682569" STARTARROW="None" STARTINCLINATION="-428;0;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1701838487567" ID="ID_535031858" MODIFIED="1701838516891" TEXT="das ist zugleich ein einfacher Integrations-Test">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1701838487567" ID="ID_535031858" MODIFIED="1702330670355" TEXT="das ist zugleich ein einfacher Integrations-Test">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1701838497798" ID="ID_1377336908" MODIFIED="1701838519142" TEXT="verwendet also einen voll funktionalen Scheduler (und Threadpool)">
<node COLOR="#338800" CREATED="1701838497798" ID="ID_1377336908" MODIFIED="1702330727605" TEXT="verwendet also einen voll funktionalen Scheduler (und Threadpool)">
<icon BUILTIN="info"/>
</node>
<node CREATED="1702317761795" ID="ID_662891478" MODIFIED="1702317771621" TEXT="verwendet einen einfachen vorkonfigurierten Graphen"/>
<node COLOR="#338800" CREATED="1702317761795" ID="ID_662891478" LINK="#ID_1823731538" MODIFIED="1702317761795" TEXT="verwendet einen einfachen vorkonfigurierten Graphen"/>
<node COLOR="#338800" CREATED="1702317772680" ID="ID_1058689959" MODIFIED="1702317791471" TEXT="alles auf Default-Einstellungen (-&gt; 100&#xb5;s compuLoad)">
<icon BUILTIN="button_ok"/>
</node>
@ -96843,8 +96867,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701017994288" ID="ID_1312682056" MODIFIED="1701018004852" TEXT="und da&#xdf; ich sp&#xe4;ter die Mittel habe, Fehler zu finden"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699746799143" ID="ID_1824939661" MODIFIED="1699746805576" TEXT="Implementierung">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1699746799143" FOLDED="true" ID="ID_1824939661" MODIFIED="1702330764646" TEXT="Implementierung">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1699746806718" ID="ID_1563586426" MODIFIED="1701476504781" TEXT="Grundstrukturen anlegen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1699746880572" ID="ID_1016750692" MODIFIED="1701225759355" TEXT="Rahmen">
@ -99493,9 +99517,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1699747521150" FOLDED="true" ID="ID_356376425" MODIFIED="1702317355301" TEXT="kann durch Repetitionen aufwendig gemacht werden">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1699813962931" ID="ID_944363802" MODIFIED="1702174785856" TEXT="repetition-Count in der Node speichern">
<node COLOR="#338800" CREATED="1699813962931" FOLDED="true" ID="ID_944363802" MODIFIED="1702330376701" TEXT="repetition-Count in der Node speichern">
<arrowlink COLOR="#16a827" DESTINATION="ID_1466090082" ENDARROW="Default" ENDINCLINATION="77;19;" ID="Arrow_ID_1920139323" STARTARROW="None" STARTINCLINATION="-128;-105;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1702330315885" ID="ID_1841174299" MODIFIED="1702330326164" TEXT="weightRule eingef&#xfc;hrt">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702330326923" ID="ID_1888704548" MODIFIED="1702330337187" TEXT="beim Generieren angewendet">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1702330080620" ID="ID_1426822810" MODIFIED="1702330163236" TEXT="Bug: auch die letzten Nodes brauchen ein Gewicht">
<linktarget COLOR="#484669" DESTINATION="ID_1426822810" ENDARROW="Default" ENDINCLINATION="-329;18;" ID="Arrow_ID_208912100" SOURCE="ID_847074680" STARTARROW="None" STARTINCLINATION="-143;-3;"/>
<icon BUILTIN="broken-line"/>
<node COLOR="#338800" CREATED="1702330109341" ID="ID_1264352502" MODIFIED="1702330139034" TEXT="die hatte ich beim Bauen des Codes direkt erzeugt">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702330126685" ID="ID_1095406876" MODIFIED="1702330139035" TEXT="also Hilfsfunktion verwenden: calcNode()">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node COLOR="#5b280f" CREATED="1702174806912" ID="ID_624958935" MODIFIED="1702174820094" TEXT="eine Art Proof-of-Work verwenden">
<icon BUILTIN="button_cancel"/>
@ -99677,6 +99717,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1702263260126" ID="ID_1499147739" MODIFIED="1702264010690" TEXT="funktioniert ordentlich">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702330000602" ID="ID_1907594406" MODIFIED="1702330239552" TEXT="tats&#xe4;chlich generierte Verz&#xf6;gerung im Integrationstest verifiziert">
<arrowlink COLOR="#56ce73" DESTINATION="ID_23134092" ENDARROW="Default" ENDINCLINATION="42;-121;" ID="Arrow_ID_1093008801" STARTARROW="None" STARTINCLINATION="270;12;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1702330355415" ID="ID_517852515" LINK="#ID_1095406876" MODIFIED="1702330382676" TEXT="(und dabei Bug gefunden)"/>
</node>
<node CREATED="1702263313431" ID="ID_895745548" MODIFIED="1702264006022" TEXT="CPU sogar mit scaleStep OK"/>
<node CREATED="1702265746035" ID="ID_1709742498" MODIFIED="1702265757916" TEXT="gr&#xf6;&#xdf;ere Timebase &#x27f6; schneller"/>
<node CREATED="1702263578440" ID="ID_1625923973" MODIFIED="1702264017267" TEXT="mem wird langsamer">
@ -99777,7 +99822,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702264248082" ID="ID_880925728" MODIFIED="1702265717124" TEXT="&#x27f9; Konsequenz: mu&#xdf; Graph-Berechnung statisch messen k&#xf6;nnen">
<arrowlink COLOR="#b04460" DESTINATION="ID_1821698627" ENDARROW="Default" ENDINCLINATION="-913;-87;" ID="Arrow_ID_423579693" STARTARROW="None" STARTINCLINATION="-1124;53;"/>
<arrowlink COLOR="#4472b0" DESTINATION="ID_1821698627" ENDARROW="Default" ENDINCLINATION="-913;-87;" ID="Arrow_ID_423579693" STARTARROW="None" STARTINCLINATION="-1124;53;"/>
<linktarget COLOR="#f41958" DESTINATION="ID_880925728" ENDARROW="Default" ENDINCLINATION="91;4;" ID="Arrow_ID_669621335" SOURCE="ID_1256970210" STARTARROW="None" STARTINCLINATION="-10;15;"/>
</node>
</node>
@ -100952,9 +100997,49 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1701477000686" ID="ID_221374695" MODIFIED="1701477018461" TEXT="daher sind meine Statistiken &#xbb;pro Segment&#xab; im Grunde Mist"/>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1702324436116" FOLDED="true" ID="ID_902946206" MODIFIED="1702324840731" TEXT="Hash-Abweichungen markieren">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702324449548" ID="ID_899475711" MODIFIED="1702324733316" TEXT="das w&#xe4;re theoretisch nicht besonders schwer umzusetzen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Dies m&#252;&#223;te in eine Pr&#252;f-Klammer eingebunden werden, die den Original-Graphen zu fassen bekommt, <i>bevor</i>&#160;der Scheduler gestartet wird
</p>
<ul>
<li>
man m&#252;&#223;te einen Vector aller Node-Hashes aufzeichnen &#8212; ist ein Einzeiler mit explore(allNodes)...effuse()
</li>
<li>
danach macht man das Gleiche und einen Vergleich in einem Pass &#10239; abweichende Nodes in geeigneter Datenstruktur markieren
</li>
<li>
zus&#228;tzlich bedarf es einer Erweiterung des generateTopologyDOT: ein zus&#228;tzliches Argument bringt <i>mark-up per Node</i>&#160;ein; der flie&#223;t dann in die Node-Generierung ein; konkret w&#228;re das eine Farbmarkierung der fehlerhaften Nodes
</li>
</ul>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1700105473288" ID="ID_363744899" MODIFIED="1700105544295" TEXT="Operatoren">
<icon BUILTIN="pencil"/>
<node CREATED="1702324749570" ID="ID_637566531" MODIFIED="1702324839428" TEXT="vorerst vertagt &#x2014; Relevanz unklar">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
<i>will man &#252;berhaupt</i>&#160;im Einzelnen wissen, wo der Hash abgewichen ist?
</li>
<li>
was kann man mit dieser Information anfangen, ohne einen kompletten Berechnungs-Trail <i>genau dieses Laufes</i>&#160;zu haben?
</li>
</ul>
</body>
</html></richcontent>
<icon BUILTIN="stop-sign"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1700105473288" ID="ID_363744899" MODIFIED="1702330490395" TEXT="Operatoren">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1700105477363" ID="ID_1347431300" MODIFIED="1700105485349" TEXT="Iteration &#xfc;ber alle Nodes">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1700105486643" ID="ID_305524836" MODIFIED="1700105501783" TEXT="exponiere direkt lib::IterExplorer()">
@ -101059,20 +101144,48 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702264364035" ID="ID_1821698627" MODIFIED="1702265701973" TEXT="Basis-Messung (non-concurrent)">
<linktarget COLOR="#b04460" DESTINATION="ID_1821698627" ENDARROW="Default" ENDINCLINATION="-913;-87;" ID="Arrow_ID_423579693" SOURCE="ID_880925728" STARTARROW="None" STARTINCLINATION="-1124;53;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1702264364035" FOLDED="true" ID="ID_1821698627" MODIFIED="1702330533552" TEXT="Basis-Messung (non-concurrent)">
<linktarget COLOR="#4472b0" DESTINATION="ID_1821698627" ENDARROW="Default" ENDINCLINATION="-913;-87;" ID="Arrow_ID_423579693" SOURCE="ID_880925728" STARTARROW="None" STARTINCLINATION="-1124;53;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1702264442593" ID="ID_1012991246" MODIFIED="1702264507186" TEXT="lineare Berechnungs-Zeit m&#xfc;hsam bis unm&#xf6;glich zu ermitteln">
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702264696031" ID="ID_1280925602" MODIFIED="1702319553572" TEXT="daher Benchmark eines Berechnungs-Durchganges als Operator anbieten">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702319679776" ID="ID_102349499" MODIFIED="1702319686670" TEXT="calcRuntimeReference">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1702264696031" FOLDED="true" ID="ID_1280925602" MODIFIED="1702330488039" TEXT="daher Benchmark eines Berechnungs-Durchganges als Operator anbieten">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1702319679776" ID="ID_102349499" MODIFIED="1702330433407" TEXT="calcRuntimeReference">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1702330434516" ID="ID_582096424" MODIFIED="1702330455298" TEXT="dazu Ausgabefunktionen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702330439468" ID="ID_87054904" MODIFIED="1702330454324" TEXT="mu&#xdf; alle Parameter f&#xfc;r ComputationalLoad durchschleifen">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1701033495195" ID="ID_393831927" MODIFIED="1702319695136" TEXT="einfacher Test">
<arrowlink COLOR="#51c3bc" DESTINATION="ID_521071616" ENDARROW="Default" ENDINCLINATION="-721;75;" ID="Arrow_ID_734579827" STARTARROW="None" STARTINCLINATION="-378;-41;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1702329724549" ID="ID_1382334379" MODIFIED="1702329731210" TEXT="tut">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1702329731963" FOLDED="true" ID="ID_23134092" MODIFIED="1702330396680" TEXT="berechnete Laufzeit im Beispiel zu kurz">
<linktarget COLOR="#56ce73" DESTINATION="ID_23134092" ENDARROW="Default" ENDINCLINATION="42;-121;" ID="Arrow_ID_1093008801" SOURCE="ID_1907594406" STARTARROW="None" STARTINCLINATION="270;12;"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1702329742121" ID="ID_1145588744" MODIFIED="1702329749357" TEXT="verwende das usageExample"/>
<node CREATED="1702329750137" ID="ID_1320375202" MODIFIED="1702329781489" TEXT="das hat 64 Nodes mit weight &#x2254; 1 und baseTime = 100&#xb5;s"/>
<node CREATED="1702329784796" ID="ID_423320585" MODIFIED="1702329792245" TEXT="bekomme aber nur knapp unter 6ms"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702329798089" ID="ID_847074680" MODIFIED="1702330183279" STYLE="fork" TEXT="Ha! &#xbb;BUG&#xab;">
<arrowlink COLOR="#484669" DESTINATION="ID_1426822810" ENDARROW="Default" ENDINCLINATION="-329;18;" ID="Arrow_ID_208912100" STARTARROW="None" STARTINCLINATION="-143;-3;"/>
</node>
</node>
<node COLOR="#338800" CREATED="1702330401317" ID="ID_1814104410" MODIFIED="1702330428275" TEXT="Zahlen jetzt plausibel">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1702330406296" ID="ID_1886357669" MODIFIED="1702330427449" TEXT="auch mit 10 * baseTime">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1702330414656" ID="ID_1965830210" MODIFIED="1702330426468" TEXT="auch f&#xfc;r Graph 64 -&gt; 256 Nodes">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1702264680182" ID="ID_1945693212" MODIFIED="1702319534283" TEXT="kann man einen theoretischen Concurrency-Faktor bestimmen?">
@ -102663,6 +102776,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#cfac97" COLOR="#990033" CREATED="1698200219686" ID="ID_1298210753" MODIFIED="1698200428684" TEXT="minimal sinnvolle Thread-Wartezeit?">
<linktarget COLOR="#69496a" DESTINATION="ID_1298210753" ENDARROW="Default" ENDINCLINATION="2071;-139;" ID="Arrow_ID_67065674" SOURCE="ID_433843739" STARTARROW="None" STARTINCLINATION="733;41;"/>
<icon BUILTIN="help"/>
<node CREATED="1702323763681" HGAP="34" ID="ID_1791296378" MODIFIED="1702323781734" TEXT="vorl&#xe4;ufig bestimmte Grenze: 50&#xb5;s" VSHIFT="8">
<icon BUILTIN="info"/>
</node>
</node>
</node>
</node>