From da57e3dfcda41344f74290ccd6e20a7edbd34545 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Mon, 11 Dec 2023 22:55:11 +0100 Subject: [PATCH] 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 --- .../2023-12-09.Scheduler-Integration/Dump-04 | 510 ++++++++++++++++++ .../SchedulerTestGraph.pdf | Bin 0 -> 19920 bytes .../index.txt | 8 + tests/vault/gear/test-chain-load-test.cpp | 78 ++- tests/vault/gear/test-chain-load.hpp | 97 +++- wiki/thinkPad.ichthyo.mm | 172 +++++- 6 files changed, 815 insertions(+), 50 deletions(-) create mode 100644 doc/devel/dump/2023-12-09.Scheduler-Integration/Dump-04 create mode 100644 doc/devel/dump/2023-12-09.Scheduler-Integration/SchedulerTestGraph.pdf diff --git a/doc/devel/dump/2023-12-09.Scheduler-Integration/Dump-04 b/doc/devel/dump/2023-12-09.Scheduler-Integration/Dump-04 new file mode 100644 index 000000000..14a8a1b0f --- /dev/null +++ b/doc/devel/dump/2023-12-09.Scheduler-Integration/Dump-04 @@ -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 + diff --git a/doc/devel/dump/2023-12-09.Scheduler-Integration/SchedulerTestGraph.pdf b/doc/devel/dump/2023-12-09.Scheduler-Integration/SchedulerTestGraph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04c93c9a3ef3776a99f4345459520a33ba53d22b GIT binary patch literal 19920 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 r#Q0jX*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() diff --git a/tests/vault/gear/test-chain-load.hpp b/tests/vault/gear/test-chain-load.hpp index 2df7508f8..04bd998e4 100644 --- a/tests/vault/gear/test-chain-load.hpp +++ b/tests/vault/gear/test-chain-load.hpp @@ -58,7 +58,7 @@ ** - reductionRule: controls joining of the graph into a combining successor node ** - seedingRule: controls injection of new start nodes in the middle of the graph ** - pruningRule: controls insertion of exit nodes to cut-off some chain immediately - ** - weightRule: controls assignment of a Node::weight to command the ComputationalLoad + ** - weightRule: controls assignment of a Node::weight to command the ComputationalLoad ** ** ## Usage ** A TestChainLoad instance is created with predetermined maximum fan factor and a fixed @@ -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 + TestChainLoad&& + TestChainLoad::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_)))< typename TestChainLoad::ScheduleCtx - TestChainLoad::setupSchedule(Scheduler& scheduler) + TestChainLoad::setupSchedule (Scheduler& scheduler) { clearNodeHashes(); return ScheduleCtx{*this, scheduler}; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 80464cab0..a02383649 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -85308,9 +85308,33 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + + + + + +

+ ...denn wir wissen grundsätzlich nie, wieviel Kapazität wir „in der Rückhand“ haben; nur falls sich das grundsätzlich ändert, könnte man über derartige Priorisierungen nachdenken. Das wäre durchaus möglich, würde aber mit dem Design-Prinzip dieses Schedulers brechen: daß nämlich die Worker aktiv sind und nebenbei die Administration mit erledigen, und daß Kapazität über mehrere Stufen „fließt“ +

+ +
+ +
+
+ + + + +

+ weil bei etwa 100µs die Granularität des OS-Schedulers liegt; man kann zwar deutlich kleinere Schlaf-Zeiten angeben und bekommt dann auch was Kürzeres und zwar im Schnitt. Aber im Einzelfall bekommt man dann eben doch x-mal wieder etwas über 100µs. Gemäß Zielabwägung habe ich daher die Grenze für spinning yield-wait auf 50µs gesetzt, denn wenn's mehr als 50µs sind, dann ist es auch schon egal wenn wir über 100µs bekommen +

+ +
+ +
@@ -93428,8 +93452,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + @@ -96083,7 +96107,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -96155,13 +96179,16 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + - + + + + @@ -96379,7 +96406,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -96393,9 +96420,6 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - @@ -96813,16 +96837,16 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + - + - + - + @@ -96843,8 +96867,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + @@ -99493,9 +99517,25 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + + + + + + + + + + + + + + + + @@ -99677,6 +99717,11 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + @@ -99777,7 +99822,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- +
@@ -100952,9 +100997,49 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + +

+ Dies müßte in eine Prüf-Klammer eingebunden werden, die den Original-Graphen zu fassen bekommt, bevor der Scheduler gestartet wird +

+
    +
  • + man müßte einen Vector aller Node-Hashes aufzeichnen — ist ein Einzeiler mit explore(allNodes)...effuse() +
  • +
  • + danach macht man das Gleiche und einen Vergleich in einem Pass ⟿ abweichende Nodes in geeigneter Datenstruktur markieren +
  • +
  • + zusätzlich bedarf es einer Erweiterung des generateTopologyDOT: ein zusätzliches Argument bringt mark-up per Node ein; der fließt dann in die Node-Generierung ein; konkret wäre das eine Farbmarkierung der fehlerhaften Nodes +
  • +
+ +
- - + + + + +
    +
  • + will man überhaupt im Einzelnen wissen, wo der Hash abgewichen ist? +
  • +
  • + was kann man mit dieser Information anfangen, ohne einen kompletten Berechnungs-Trail genau dieses Laufes zu haben? +
  • +
+ +
+ +
+
+
+ + @@ -101059,20 +101144,48 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -102663,6 +102776,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + +