Skip to contentSkip to conversation

gem_wsim: Rip out userspace balancing

PATCH In review Tvrtko Ursulin 3 participants 20 messages Jun 18, 2020

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/11 gem_wsim: Rip out userspace balancing

From: Tvrtko Ursulin <[email protected]>

Evaluation of userspace load balancing options was how this tool started but since we have settled on doing it in the kernel.

Tomorrow we will want to update the tool for new engine interfaces and all this legacy code will just be a distraction.

Rip out everything not related to explicit load balancing implemented via context engine maps and adjust the workloads to use it.

---
 benchmarks/Makefile.am                        |    2 +-
 benchmarks/Makefile.sources                   |    6 -
 benchmarks/ewma.h                             |   71 -
 benchmarks/gem_wsim.c                         | 1394 +----------------
 benchmarks/ilog2.h                            |  104 --
 benchmarks/meson.build                        |    6 +-
 benchmarks/wsim/media-1080p-player.wsim       |    2 +
 benchmarks/wsim/media_1n2_480p.wsim           |   12 +-
 benchmarks/wsim/media_1n2_asy.wsim            |    8 +-
 benchmarks/wsim/media_1n3_480p.wsim           |   16 +-
 benchmarks/wsim/media_1n3_asy.wsim            |    8 +
 benchmarks/wsim/media_1n4_480p.wsim           |   20 +-
 benchmarks/wsim/media_1n4_asy.wsim            |   10 +
 benchmarks/wsim/media_1n5_480p.wsim           |   24 +-
 benchmarks/wsim/media_1n5_asy.wsim            |   12 +
 benchmarks/wsim/media_load_balance_17i7.wsim  |   10 +-
 benchmarks/wsim/media_load_balance_19.wsim    |    4 +-
 .../wsim/media_load_balance_4k12u7.wsim       |    2 +
 .../wsim/media_load_balance_fhd26u7.wsim      |   16 +-
 benchmarks/wsim/media_load_balance_hd01.wsim  |   34 +-
 .../wsim/media_load_balance_hd06mp2.wsim      |    6 +-
 benchmarks/wsim/media_load_balance_hd12.wsim  |    6 +-
 .../wsim/media_load_balance_hd17i4.wsim       |    8 +-
 benchmarks/wsim/media_mfe2_480p.wsim          |   12 +-
 benchmarks/wsim/media_mfe3_480p.wsim          |   18 +-
 benchmarks/wsim/media_mfe4_480p.wsim          |   24 +-
 benchmarks/wsim/media_nn_1080p.wsim           |    4 +
 benchmarks/wsim/media_nn_1080p_s1.wsim        |    4 +-
 benchmarks/wsim/media_nn_1080p_s2.wsim        |    2 +
 benchmarks/wsim/media_nn_1080p_s3.wsim        |    2 +
 benchmarks/wsim/media_nn_480p.wsim            |    4 +
 benchmarks/wsim/vcs_balanced.wsim             |   52 +-
 scripts/Makefile.am                           |    2 +-
 scripts/media-bench.pl                        |  736 ---------
 34 files changed, 314 insertions(+), 2327 deletions(-)
 delete mode 100644 benchmarks/ewma.h
 delete mode 100644 benchmarks/ilog2.h
 delete mode 100755 scripts/media-bench.pl
benchmarks/Makefile.am +1 -1
index 1f05adf31527..45b923ebbae3 100644
@@ -25,4 +25,4 @@ gem_latency_CFLAGS = $(AM_CFLAGS) $(THREAD_CFLAGS)
 gem_latency_LDADD = $(LDADD) -lpthread
 gem_syslatency_CFLAGS = $(AM_CFLAGS) $(THREAD_CFLAGS)
 gem_syslatency_LDADD = $(LDADD) -lpthread
-gem_wsim_LDADD = $(LDADD) $(top_builddir)/lib/libigt_perf.la -lpthread
+gem_wsim_LDADD = $(LDADD) -lpthread
benchmarks/Makefile.sources +0 -6
index ee045fb309ad..dae3cdda4cf7 100644
@@ -19,12 +19,6 @@ benchmarks_prog_list =			\
 	vgem_mmap			\
 	$(NULL)
 
-gem_wsim_SOURCES =                      \
-	gem_wsim.c                      \
-	ewma.h                          \
-	ilog2.h                         \
-	$(NULL)
-
 LIBDRM_INTEL_BENCHMARKS =		\
 	intel_upload_blit_large		\
 	intel_upload_blit_large_gtt	\
benchmarks/ewma.h deleted +0 -71

71 lines not on this page · raw message

benchmarks/gem_wsim.c +78 -1316

1,826 lines not on this page · raw message

benchmarks/ilog2.h deleted +0 -104

104 lines not on this page · raw message

benchmarks/meson.build +1 -5
index ef93193b70dd..c70e1aac79c6 100644
@@ -11,6 +11,7 @@ benchmark_progs = [
 	'gem_prw',
 	'gem_set_domain',
 	'gem_syslatency',
+	'gem_wsim',
 	'kms_vblank',
 	'prime_lookup',
 	'vgem_mmap',
@@ -34,8 +35,3 @@ foreach prog : benchmark_progs
 		   install_dir : benchmarksdir,
 		   dependencies : igt_deps)
 endforeach
-
-executable('gem_wsim', 'gem_wsim.c',
-	   install : true,
-	   install_dir : benchmarksdir,
-	   dependencies : igt_deps + [ lib_igt_perf ])
benchmarks/wsim/media-1080p-player.wsim +2 -0
index bcbb0cfd2ad3..c87e1aee4f5d 100644
@@ -1,3 +1,5 @@
+M.1.VCS
+B.1
 1.VCS.5000-10000.0.0
 2.RCS.1000-2000.-1.0
 P.3.1
benchmarks/wsim/media_1n2_480p.wsim +9 -3
index 11a4da6bfae8..3ce15ebc3d71 100644
@@ -1,9 +1,15 @@
-1.VCS.12000-15000.0.0
+M.10.VCS
+B.10
+M.11.VCS
+B.11
+M.12.VCS
+B.12
+10.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.1000-1400.-1.0
 3.RCS.10000-12000.0.0
-3.VCS.2500-3500.-1.0
+11.VCS.2500-3500.-1.0
 4.RCS.1000-2200.-5.0
 5.RCS.1000-1400.-1.0
 5.RCS.10000-12000.0.0
-5.VCS.2500-3500.-1.1
+12.VCS.2500-3500.-1.1
benchmarks/wsim/media_1n2_asy.wsim +5 -3
index 58c99ca1122c..f9943eb62e8a 100644
@@ -1,9 +1,11 @@
-1.VCS.12000-15000.0.0
+M.10.VCS
+B.10
+10.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.1000-1400.-1.0
 3.RCS.10000-12000.0.0
-3.VCS.2500-3500.-1.0
+11.VCS.2500-3500.-1.0
 4.RCS.400-800.-5.0
 5.RCS.500-700.-1.0
 5.RCS.5000-6000.0.0
-5.VCS.1200-1500.-1.1
+12.VCS.1200-1500.-1.1
benchmarks/wsim/media_1n3_480p.wsim +12 -4
index c724ab28a1f4..4f585fa8a8e0 100644
@@ -1,13 +1,21 @@
-1.VCS.12000-15000.0.0
+M.10.VCS
+B.10
+M.11.VCS
+B.11
+M.12.VCS
+B.12
+M.13.VCS
+B.13
+10.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.1000-1400.-1.0
 3.RCS.10000-12000.0.0
-3.VCS.2500-3500.-1.0
+11.VCS.2500-3500.-1.0
 4.RCS.1000-2200.-5.0
 5.RCS.1000-1400.-1.0
 5.RCS.10000-12000.0.0
-5.VCS.2500-3500.-1.0
+12.VCS.2500-3500.-1.0
 6.RCS.1000-2200.-9.0
 7.RCS.1000-1400.-1.0
 7.RCS.10000-12000.0.0
-7.VCS.2500-3500.-1.1
+13.VCS.2500-3500.-1.1
benchmarks/wsim/media_1n3_asy.wsim +8 -0
index c7588328e3f1..dce7789ec1d8 100644
@@ -1,3 +1,11 @@
+M.10.VCS
+B.10
+M.11.VCS
+B.11
+M.12.VCS
+B.12
+M.13.VCS
+B.13
 1.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.1000-1400.-1.0
benchmarks/wsim/media_1n4_480p.wsim +15 -5
index e67fefc3bf17..06fa9adef5eb 100644
@@ -1,17 +1,27 @@
-1.VCS.12000-15000.0.0
+M.10.VCS
+B.10
+M.11.VCS
+B.11
+M.12.VCS
+B.12
+M.13.VCS
+B.13
+M.14.VCS
+B.14
+10.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.1000-1400.-1.0
 3.RCS.10000-12000.0.0
-3.VCS.2500-3500.-1.0
+11.VCS.2500-3500.-1.0
 4.RCS.1000-2200.-5.0
 5.RCS.1000-1400.-1.0
 5.RCS.10000-12000.0.0
-5.VCS.2500-3500.-1.0
+12.VCS.2500-3500.-1.0
 6.RCS.1000-2200.-9.0
 7.RCS.1000-1400.-1.0
 7.RCS.10000-12000.0.0
-7.VCS.2500-3500.-1.0
+13.VCS.2500-3500.-1.0
 8.RCS.1000-2200.-13.0
 9.RCS.1000-1400.-1.0
 9.RCS.10000-12000.0.0
-9.VCS.2500-3500.-1.1
+14.VCS.2500-3500.-1.1
benchmarks/wsim/media_1n4_asy.wsim +10 -0
index ede4fd7a2205..6dc6b652e903 100644
@@ -1,3 +1,13 @@
+M.10.VCS
+B.10
+M.11.VCS
+B.11
+M.12.VCS
+B.12
+M.13.VCS
+B.13
+M.14.VCS
+B.14
 1.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.1000-1400.-1.0
benchmarks/wsim/media_1n5_480p.wsim +18 -6
index 9e43b9845430..3467a386887a 100644
@@ -1,21 +1,33 @@
-1.VCS.12000-15000.0.0
+M.10.VCS
+B.10
+M.11.VCS
+B.11
+M.12.VCS
+B.12
+M.13.VCS
+B.13
+M.14.VCS
+B.14
+M.15.VCS
+B.15
+10.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.1000-1400.-1.0
 3.RCS.10000-12000.0.0
-3.VCS.2500-3500.-1.0
+11.VCS.2500-3500.-1.0
 4.RCS.1000-2200.-5.0
 5.RCS.1000-1400.-1.0
 5.RCS.10000-12000.0.0
-5.VCS.2500-3500.-1.0
+12.VCS.2500-3500.-1.0
 6.RCS.1000-2200.-9.0
 7.RCS.1000-1400.-1.0
 7.RCS.10000-12000.0.0
-7.VCS.2500-3500.-1.0
+13.VCS.2500-3500.-1.0
 8.RCS.1000-2200.-13.0
 9.RCS.1000-1400.-1.0
 9.RCS.10000-12000.0.0
-9.VCS.2500-3500.-1.0
+14.VCS.2500-3500.-1.0
 10.RCS.1000-2200.-17.0
 11.RCS.1000-1400.-1.0
 11.RCS.10000-12000.0.0
-11.VCS.2500-3500.-1.1
+15.VCS.2500-3500.-1.1
benchmarks/wsim/media_1n5_asy.wsim +12 -0
index 78bb4a86dbca..4b205457a8d4 100644
@@ -1,3 +1,15 @@
+M.10.VCS
+B.10
+M.11.VCS
+B.11
+M.12.VCS
+B.12
+M.13.VCS
+B.13
+M.14.VCS
+B.14
+M.15.VCS
+B.15
 1.VCS.12000-15000.0.0
 2.RCS.2000-3000.-1.0
 3.RCS.500-900.-1.0
benchmarks/wsim/media_load_balance_17i7.wsim +6 -4
index 0830a3231ea9..bcb1ab2f04fa 100644
@@ -1,7 +1,9 @@
+M.1.VCS
+B.1
 1.VCS.2800-3200.0.1
-1.RCS.900-1100.-1.0
-1.RCS.3600-3800.0.0
-1.RCS.900-1100.-2.0
+2.RCS.900-1100.-1.0
+2.RCS.3600-3800.0.0
+2.RCS.900-1100.-2.0
 1.VCS.2200-2400.-2.0
-1.RCS.4500-4900.-1.0
+2.RCS.4500-4900.-1.0
 1.VCS.500-700.-1.1
benchmarks/wsim/media_load_balance_19.wsim +3 -1
index 03890776fda3..88cd34fb6898 100644
@@ -1,3 +1,5 @@
+M.1.VCS
+B.1
 0.VECS.1400-1500.0.0
 0.RCS.1000-1500.-1.0
 s.-2
@@ -5,6 +7,6 @@ s.-2
 1.VCS.1300-1400.0.1
 0.VECS.1400-1500.0.0
 0.RCS.100-300.-1.1
-1.RCS.1300-1500.0.0
+2.RCS.1300-1500.-3.0
 1.VCS.100-300.-1.1
 1.VCS.900-1400.0.1
benchmarks/wsim/media_load_balance_4k12u7.wsim +2 -0
index ff10425b6bec..a417bb18e121 100644
@@ -1,3 +1,5 @@
+M.1.VCS
+B.1
 1.VCS.4000-6000.0.0
 2.RCS.400-800.-1.0
 3.RCS.1900-2200.-1.0
benchmarks/wsim/media_load_balance_fhd26u7.wsim +9 -7
index 56114ddc48c2..4c8225e1fe13 100644
@@ -1,25 +1,27 @@
+M.3.VCS
+B.3
 1.VCS1.1200-1800.0.0
 1.VCS1.1900-2100.0.0
 2.RCS.1500-2000.-1.0
-2.VCS.1400-1800.-1.1
+3.VCS.1400-1800.-1.1
 1.VCS1.1900-2100.-1.0
 2.RCS.1500-2000.-1.0
-2.VCS.1400-1800.-1.1
+3.VCS.1400-1800.-1.1
 1.VCS1.1900-2100.-1.0
 2.RCS.200-400.-1.0
 2.RCS.1500-2000.0.0
-2.VCS.1400-1800.-1.1
+3.VCS.1400-1800.-1.1
 1.VCS1.1900-2100.-1.0
 2.RCS.1500-2000.-1.0
-2.VCS.1400-1800.-1.1
+3.VCS.1400-1800.-1.1
 1.VCS1.1900-2100.-1.0
 2.RCS.200-400.-1.0
 2.RCS.1500-2000.0.0
-2.VCS.1400-1800.-1.1
+3.VCS.1400-1800.-1.1
 1.VCS1.1900-2100.-1.0
 2.RCS.1500-2000.-1.0
-2.VCS.1400-1800.-1.1
+3.VCS.1400-1800.-1.1
 1.VCS1.1900-2100.-1.0
 2.RCS.1500-2000.-1.0
 2.RCS.1500-2000.0.0
-2.VCS.1400-1800.-1.1
+3.VCS.1400-1800.-1.1
benchmarks/wsim/media_load_balance_hd01.wsim +19 -15
index 862931521c90..8e7e9d90e435 100644
@@ -1,23 +1,27 @@
+M.1.VCS
+B.1
+M.3.VCS
+B.3
 1.VCS.1400-1900.0.0
-1.RCS.1200-1600.-1.0
-1.RCS.1000-1400.-1.0
-2.VCS.800-1000.-1.0
+2.RCS.1200-1600.-1.0
+2.RCS.1000-1400.-1.0
+3.VCS.800-1000.-1.0
 1.VCS.1400-1900.-4.0
-1.RCS.1200-1600.-1.0
-1.RCS.1000-1400.-1.0
-2.VCS.800-1000.-1.0
+2.RCS.1200-1600.-1.0
+2.RCS.1000-1400.-1.0
+3.VCS.800-1000.-1.0
 1.VCS.1400-1900.-4.0
-1.RCS.1200-1600.-1.0
-1.RCS.1000-1400.-1.0
-2.VCS.800-1000.-1.0
+2.RCS.1200-1600.-1.0
+2.RCS.1000-1400.-1.0
+3.VCS.800-1000.-1.0
 1.VCS.1400-1900.-4.0
-1.RCS.1200-1600.-1.0
-1.RCS.1000-1400.-1.0
-2.VCS.800-1000.-1.0
+2.RCS.1200-1600.-1.0
+2.RCS.1000-1400.-1.0
+3.VCS.800-1000.-1.0
 1.VCS.1400-1900.-4.0
-1.RCS.1200-1600.-1.0
-1.RCS.1000-1400.-1.0
-2.VCS.800-1000.-1.0
+2.RCS.1200-1600.-1.0
+2.RCS.1000-1400.-1.0
+3.VCS.800-1000.-1.0
 s.-17
 s.-14
 s.-11
benchmarks/wsim/media_load_balance_hd06mp2.wsim +5 -1
index 1e1fc003c755..cfe985019a7b 100644
@@ -1,4 +1,8 @@
+M.1.VCS
+B.1
+M.4.VCS
+B.4
 1.VCS.900-1700.0.0
 2.RCS.100-400.-1.0
 3.RCS.800-900.-1.0
-3.VCS.100-200.-1.1
+4.VCS.100-200.-1.1
benchmarks/wsim/media_load_balance_hd12.wsim +5 -1
index 8f3b41ca5ab6..684e6b511762 100644
@@ -1,4 +1,8 @@
+M.1.VCS
+B.1
+M.4.VCS
+B.4
 1.VCS.850-1300.0.0
 2.RCS.50-250.-1.0
 3.RCS.400-800.-1.0
-3.VCS.100-200.-1.1
+4.VCS.100-200.-1.1
benchmarks/wsim/media_load_balance_hd17i4.wsim +6 -2
index b6195b605bf7..1430f18df033 100644
@@ -1,7 +1,11 @@
+M.1.VCS
+B.1
+M.3.VCS
+B.3
 1.VCS.900-1400.0.0
 2.RCS.200-300.-1.0
 2.RCS.1000-2000.0.0
 2.RCS.1000-2000.0.0
-2.VCS.800-1000.-1.0
-1.RCS.2800-3100.-1.0
+3.VCS.800-1000.-1.0
+4.RCS.2800-3100.-1.0
 1.VCS.800-1000.-1.1
benchmarks/wsim/media_mfe2_480p.wsim +10 -2
index 18bc756f1b55..00ef5c3a7574 100644
@@ -1,3 +1,11 @@
+M.1.VCS
+B.1
+M.4.VCS
+B.4
+M.7.VCS
+B.7
+M.8.VCS
+B.8
 1.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.800-1600.-1.0
@@ -5,5 +13,5 @@
 5.RCS.1000-2200.-1.0
 6.RCS.800-1600.-1.0
 6.RCS.10000-12000.-4.0
-6.VCS.2500-3500.-1.0
-3.VCS.2500-3500.-2.1
+7.VCS.2500-3500.-1.0
+8.VCS.2500-3500.-2.1
benchmarks/wsim/media_mfe3_480p.wsim +15 -3
index e12a2e6ac29d..3ac4db0eb8ec 100644
@@ -1,3 +1,15 @@
+M.1.VCS
+B.1
+M.4.VCS
+B.4
+M.7.VCS
+B.7
+M.10.VCS
+B.10
+M.11.VCS
+B.11
+M.12.VCS
+B.12
 1.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.800-1600.-1.0
@@ -8,6 +20,6 @@
 8.RCS.1000-2200.-1.0
 9.RCS.800-1600.-1.0
 9.RCS.10000-12000.-7/-4.0
-9.VCS.2500-3500.-1.0
-3.VCS.2500-3500.-2.0
-6.VCS.2500-3500.-3.1
+10.VCS.2500-3500.-1.0
+11.VCS.2500-3500.-2.0
+12.VCS.2500-3500.-3.1
benchmarks/wsim/media_mfe4_480p.wsim +20 -4
index 75d4f67ea4fb..7f6831569908 100644
@@ -1,3 +1,19 @@
+M.1.VCS
+B.1
+M.4.VCS
+B.4
+M.7.VCS
+B.7
+M.10.VCS
+B.10
+M.13.VCS
+B.13
+M.14.VCS
+B.14
+M.15.VCS
+B.15
+M.16.VCS
+B.16
 1.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.800-1600.-1.0
@@ -11,7 +27,7 @@
 11.RCS.1000-2200.-1.0
 12.RCS.800-1600.-1.0
 12.RCS.10000-12000.-4/-7/-10.0
-12.VCS.2500-3500.-1.0
-3.VCS.2500-3500.-2.0
-6.VCS.2500-3500.-3.0
-9.VCS.2500-3500.-4.1
+13.VCS.2500-3500.-1.0
+14.VCS.2500-3500.-2.0
+15.VCS.2500-3500.-3.0
+16.VCS.2500-3500.-4.1
benchmarks/wsim/media_nn_1080p.wsim +4 -0
index f9a3ca1b9963..88c5c772202c 100644
@@ -1,3 +1,7 @@
+M.1.VCS
+B.1
+M.3.VCS
+B.3
 1.VCS.13000-17000.0.0
 2.RCS.2000-4000.-1.0
 3.RCS.3000-5000.-1.0
benchmarks/wsim/media_nn_1080p_s1.wsim +3 -1
index 4fa6ca653000..5b47d2a3c7ec 100644
@@ -1,3 +1,5 @@
+M.4.VCS
+B.4
 f
 1.VCS1.6500-8000.f-1.0
 1.VCS2.6500-8000.f-2.0
@@ -5,4 +7,4 @@ a.-3
 2.RCS.2000-4000.-2/-3.0
 3.RCS.3000-5000.-1.0
 3.RCS.23000-27000.0.0
-3.VCS.16000-20000.-1.1
+4.VCS.16000-20000.-1.1
benchmarks/wsim/media_nn_1080p_s2.wsim +2 -0
index 68f0acdfb842..e3678b396b42 100644
@@ -1,3 +1,5 @@
+M.1.VCS
+B.1
 1.VCS.13000-17000.0.0
 2.RCS.2000-4000.-1.0
 3.RCS.3000-5000.-1.0
benchmarks/wsim/media_nn_1080p_s3.wsim +2 -0
index 12368da83dca..ee3b675de9e5 100644
@@ -1,3 +1,5 @@
+M.1.VCS
+B.1
 1.VCS.13000-17000.0.0
 2.RCS.2000-4000.-1.0
 3.RCS.3000-5000.-1.0
benchmarks/wsim/media_nn_480p.wsim +4 -0
index ab64a4569d71..73fc643dc9e5 100644
@@ -1,3 +1,7 @@
+M.1.VCS
+B.1
+M.3.VCS
+B.3
 1.VCS.12000-15000.0.0
 2.RCS.1000-2200.-1.0
 3.RCS.1000-1400.-1.0
benchmarks/wsim/vcs_balanced.wsim +27 -25

53 lines not on this page · raw message

scripts/Makefile.am +1 -1
index e26a39e2f072..641715294936 100644
@@ -1,2 +1,2 @@
-dist_noinst_SCRIPTS = intel-gfx-trybot who.sh run-tests.sh trace.pl media-bench.pl
+dist_noinst_SCRIPTS = intel-gfx-trybot who.sh run-tests.sh trace.pl
 noinst_PYTHON = throttle.py
scripts/media-bench.pl deleted +0 -736

496 lines not on this page · raw message

The rest of this diff is not shown. View the raw message.

Signature · 6 lines
2.20.1

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

Part of the diff is not shown here. View the raw message.

#1 lore raw

PATCH 2/11 gem_wsim: Buffer objects working sets and complex dependencies

From: Tvrtko Ursulin <[email protected]>

Add support for defining buffer object working sets and targetting them as data dependencies. For more information please see the README file.

v2:
* More robustness in parsing here and there. (Chris)

---
 benchmarks/gem_wsim.c                   | 475 +++++++++++++++++++++---
 benchmarks/wsim/README                  |  59 +++
 benchmarks/wsim/cloud-gaming-60fps.wsim |  11 +
 benchmarks/wsim/composited-ui.wsim      |   7 +
 4 files changed, 498 insertions(+), 54 deletions(-)
 create mode 100644 benchmarks/wsim/cloud-gaming-60fps.wsim
 create mode 100644 benchmarks/wsim/composited-ui.wsim
benchmarks/gem_wsim.c +421 -54
index 5cc71c56fe6e..dc47470c621d 100644
@@ -88,14 +88,21 @@ enum w_type
 	LOAD_BALANCE,
 	BOND,
 	TERMINATE,
-	SSEU
+	SSEU,
+	WORKINGSET,
+};
+
+struct dep_entry {
+	int target;
+	bool write;
+	int working_set; /* -1 = step dependecy, >= 0 working set id */
 };
 
 struct deps
 {
 	int nr;
 	bool submit_fence;
-	int *list;
+	struct dep_entry *list;
 };
 
 struct w_arg {
@@ -110,6 +117,14 @@ struct bond {
 	enum intel_engine_id master;
 };
 
+struct working_set {
+	int id;
+	bool shared;
+	unsigned int nr;
+	uint32_t *handles;
+	unsigned long *sizes;
+};
+
 struct workload;
 
 struct w_step
@@ -143,6 +158,7 @@ struct w_step
 			enum intel_engine_id bond_master;
 		};
 		int sseu;
+		struct working_set working_set;
 	};
 
 	/* Implementation details */
@@ -193,6 +209,9 @@ struct workload
 	unsigned int nr_ctxs;
 	struct ctx *ctx_list;
 
+	struct working_set **working_sets; /* array indexed by set id */
+	int max_working_set_id;
+
 	int sync_timeline;
 	uint32_t sync_seqno;
 
@@ -281,11 +300,129 @@ print_engine_calibrations(void)
 	printf("\n");
 }
 
+static void add_dep(struct deps *deps, struct dep_entry entry)
+{
+	deps->list = realloc(deps->list, sizeof(*deps->list) * (deps->nr + 1));
+	igt_assert(deps->list);
+
+	deps->list[deps->nr++] = entry;
+}
+
+static int
+parse_working_set_deps(struct workload *wrk,
+		       struct deps *deps,
+		       struct dep_entry _entry,
+		       char *str)
+{
+	/*
+	 * 1 - target handle index in the specified working set.
+	 * 2-4 - range
+	 */
+	struct dep_entry entry = _entry;
+	char *s;
+
+	s = index(str, '-');
+	if (s) {
+		int from, to;
+
+		from = atoi(str);
+		if (from < 0)
+			return -1;
+
+		to = atoi(++s);
+		if (to <= 0)
+			return -1;
+
+		if (to <= from)
+			return -1;
+
+		for (entry.target = from; entry.target <= to; entry.target++)
+			add_dep(deps, entry);
+	} else {
+		entry.target = atoi(str);
+		if (entry.target < 0)
+			return -1;
+
+		add_dep(deps, entry);
+	}
+
+	return 0;
+}
+
+static int
+parse_dependency(unsigned int nr_steps, struct w_step *w, char *str)
+{
+	struct dep_entry entry = { .working_set = -1 };
+	bool submit_fence = false;
+	char *s;
+
+	switch (str[0]) {
+	case '-':
+		if (str[1] < '0' || str[1] > '9')
+			return -1;
+
+		entry.target = atoi(str);
+		if (entry.target > 0 || ((int)nr_steps + entry.target) < 0)
+			return -1;
+
+		add_dep(&w->data_deps, entry);
+
+		break;
+	case 's':
+		submit_fence = true;
+		/* Fall-through. */
+	case 'f':
+		/* Multiple fences not yet supported. */
+		igt_assert_eq(w->fence_deps.nr, 0);
+
+		entry.target = atoi(++str);
+		if (entry.target > 0 || ((int)nr_steps + entry.target) < 0)
+			return -1;
+
+		add_dep(&w->fence_deps, entry);
+
+		w->fence_deps.submit_fence = submit_fence;
+		break;
+	case 'w':
+		entry.write = true;
+		/* Fall-through. */
+	case 'r':
+		/*
+		 * [rw]N-<str>
+		 * r1-<str> or w2-<str>, where N is working set id.
+		 */
+		s = index(++str, '-');
+		if (!s)
+			return -1;
+
+		entry.working_set = atoi(str);
+		if (entry.working_set < 0)
+			return -1;
+
+		if (parse_working_set_deps(w->wrk, &w->data_deps, entry, ++s))
+			return -1;
+
+		break;
+	default:
+		return -1;
+	};
+
+	return 0;
+}
+
 static int
 parse_dependencies(unsigned int nr_steps, struct w_step *w, char *_desc)
 {
 	char *desc = strdup(_desc);
 	char *token, *tctx = NULL, *tstart = desc;
+	int ret = 0;
+
+	/*
+	 * Skip when no dependencies to avoid having to detect
+	 * non-sensical "0/0/..." below.
+	 */
+	if (!strcmp(_desc, "0"))
+		goto out;
 
 	igt_assert(desc);
 	igt_assert(!w->data_deps.nr && w->data_deps.nr == w->fence_deps.nr);
@@ -293,47 +430,17 @@ parse_dependencies(unsigned int nr_steps, struct w_step *w, char *_desc)
 		   w->data_deps.list == w->fence_deps.list);
 
 	while ((token = strtok_r(tstart, "/", &tctx)) != NULL) {
-		bool submit_fence = false;
-		char *str = token;
-		struct deps *deps;
-		int dep;
-
 		tstart = NULL;
 
-		if (str[0] == '-' || (str[0] >= '0' && str[0] <= '9')) {
-			deps = &w->data_deps;
-		} else {
-			if (str[0] == 's')
-				submit_fence = true;
-			else if (str[0] != 'f')
-				return -1;
-
-			deps = &w->fence_deps;
-			str++;
-		}
-
-		dep = atoi(str);
-		if (dep > 0 || ((int)nr_steps + dep) < 0) {
-			if (deps->list)
-				free(deps->list);
-			return -1;
-		}
-
-		if (dep < 0) {
-			deps->nr++;
-			/* Multiple fences not yet supported. */
-			igt_assert(deps->nr == 1 || deps != &w->fence_deps);
-			deps->list = realloc(deps->list,
-					     sizeof(*deps->list) * deps->nr);
-			igt_assert(deps->list);
-			deps->list[deps->nr - 1] = dep;
-			deps->submit_fence = submit_fence;
-		}
+		ret = parse_dependency(nr_steps, w, token);
+		if (ret)
+			break;
 	}
 
+out:
 	free(desc);
 
-	return 0;
+	return ret;
 }
 
 static void __attribute__((format(printf, 1, 2)))
@@ -624,6 +731,101 @@ static int parse_engine_map(struct w_step *step, const char *_str)
 	return 0;
 }
 
+static unsigned long parse_size(char *str)
+{
+	const unsigned int len = strlen(str);
+	unsigned int mult = 1;
+	long val;
+
+	/* "1234567890[gGmMkK]" */
+
+	if (len == 0)
+		return 0;
+
+	switch (str[len - 1]) {
+	case 'g':
+	case 'G':
+		mult *= 1024;
+		/* Fall-throuogh. */
+	case 'm':
+	case 'M':
+		mult *= 1024;
+		/* Fall-throuogh. */
+	case 'k':
+	case 'K':
+		mult *= 1024;
+
+		str[len - 1] = 0;
+		/* Fall-throuogh. */
+
+	case '0' ... '9':
+		break;
+	default:
+		return 0; /* Unrecognized non-digit. */
+	}
+
+	val = atol(str);
+	if (val <= 0)
+		return 0;
+
+	return val * mult;
+}
+
+static int add_buffers(struct working_set *set, char *str)
+{
+	/*
+	 * 4096
+	 * 4k
+	 * 4m
+	 * 4g
+	 * 10n4k - 10 4k batches
+	 */
+	unsigned long *sizes, size;
+	int add, i;
+	char *n;
+
+	n = index(str, 'n');
+	if (n) {
+		*n = 0;
+		add = atoi(str);
+		if (add <= 0)
+			return -1;
+		str = ++n;
+	} else {
+		add = 1;
+	}
+
+	size = parse_size(str);
+	if (!size)
+		return -1;
+
+	sizes = realloc(set->sizes, (set->nr + add) * sizeof(*sizes));
+	if (!sizes)
+		return -1;
+
+	for (i = 0; i < add; i++)
+		sizes[set->nr + i] = size;
+
+	set->nr += add;
+	set->sizes = sizes;
+
+	return 0;
+}
+
+static int parse_working_set(struct working_set *set, char *str)
+{
+	char *token, *tctx = NULL, *tstart = str;
+
+	while ((token = strtok_r(tstart, "/", &tctx))) {
+		tstart = NULL;
+
+		if (add_buffers(set, token))
+			return -1;
+	}
+
+	return 0;
+}
+
 static uint64_t engine_list_mask(const char *_str)
 {
 	uint64_t mask = 0;
@@ -644,6 +846,8 @@ static uint64_t engine_list_mask(const char *_str)
 	return mask;
 }
 
+static void allocate_working_set(struct working_set *set);
+
 #define int_field(_STEP_, _FIELD_, _COND_, _ERR_) \
 	if ((field = strtok_r(fstart, ".", &fctx))) { \
 		tmp = atoi(field); \
@@ -661,7 +865,7 @@ parse_workload(struct w_arg *arg, unsigned int flags, struct workload *app_w)
 	char *desc = strdup(arg->desc);
 	char *_token, *token, *tctx = NULL, *tstart = desc;
 	char *field, *fctx = NULL, *fstart;
-	struct w_step step, *steps = NULL;
+	struct w_step step, *w, *steps = NULL;
 	unsigned int valid;
 	int i, j, tmp;
 
@@ -851,6 +1055,28 @@ parse_workload(struct w_arg *arg, unsigned int flags, struct workload *app_w)
 
 				step.type = BOND;
 				goto add_step;
+			} else if (!strcmp(field, "w") || !strcmp(field, "W")) {
+				unsigned int nr = 0;
+
+				step.working_set.shared = field[0] == 'W';
+
+				while ((field = strtok_r(fstart, ".", &fctx))) {
+					tmp = atoi(field);
+					if (nr == 0) {
+						step.working_set.id = tmp;
+					} else {
+						tmp = parse_working_set(&step.working_set,
+									field);
+						check_arg(tmp < 0,
+							  "Invalid working set at step %u!\n",
+							  nr_steps);
+					}
+
+					nr++;
+				}
+
+				step.type = WORKINGSET;
+				goto add_step;
 			}
 
 			if (!field) {
@@ -975,6 +1201,8 @@ add_step:
 	wrk->steps = steps;
 	wrk->prio = arg->prio;
 	wrk->sseu = arg->sseu;
+	wrk->max_working_set_id = -1;
+	wrk->working_sets = NULL;
 
 	free(desc);
 
@@ -984,7 +1212,7 @@ add_step:
 	 */
 	for (i = 0; i < nr_steps; i++) {
 		for (j = 0; j < steps[i].fence_deps.nr; j++) {
-			tmp = steps[i].idx + steps[i].fence_deps.list[j];
+			tmp = steps[i].idx + steps[i].fence_deps.list[j].target;
 			check_arg(tmp < 0 || tmp >= i ||
 				  (steps[tmp].type != BATCH &&
 				   steps[tmp].type != SW_FENCE),
@@ -1003,6 +1231,51 @@ add_step:
 		}
 	}
 
+	/*
+	 * Check no duplicate working set ids.
+	 */
+	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
+		struct w_step *w2;
+
+		if (w->type != WORKINGSET)
+			continue;
+
+		for (j = 0, w2 = wrk->steps; j < wrk->nr_steps; w2++, j++) {
+			if (j == i)
+				continue;
+			if (w2->type != WORKINGSET)
+				continue;
+
+			check_arg(w->working_set.id == w2->working_set.id,
+				  "Duplicate working set id at %u!\n", j);
+		}
+	}
+
+	/*
+	 * Allocate shared working sets.
+	 */
+	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
+		if (w->type == WORKINGSET && w->working_set.shared)
+			allocate_working_set(&w->working_set);
+	}
+
+	wrk->max_working_set_id = -1;
+	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
+		if (w->type == WORKINGSET &&
+		    w->working_set.shared &&
+		    w->working_set.id > wrk->max_working_set_id)
+			wrk->max_working_set_id = w->working_set.id;
+	}
+
+	wrk->working_sets = calloc(wrk->max_working_set_id + 1,
+				   sizeof(*wrk->working_sets));
+	igt_assert(wrk->working_sets);
+
+	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
+		if (w->type == WORKINGSET && w->working_set.shared)
+			wrk->working_sets[w->working_set.id] = &w->working_set;
+	}
+
 	return wrk;
 }
 
@@ -1024,6 +1297,18 @@ clone_workload(struct workload *_wrk)
 
 	memcpy(wrk->steps, _wrk->steps, sizeof(struct w_step) * wrk->nr_steps);
 
+	wrk->max_working_set_id = _wrk->max_working_set_id;
+	if (wrk->max_working_set_id >= 0) {
+		wrk->working_sets = calloc(wrk->max_working_set_id + 1,
+					sizeof(*wrk->working_sets));
+		igt_assert(wrk->working_sets);
+
+		memcpy(wrk->working_sets,
+		       _wrk->working_sets,
+		       (wrk->max_working_set_id + 1) *
+		       sizeof(*wrk->working_sets));
+	}
+
 	/* Check if we need a sw sync timeline. */
 	for (i = 0; i < wrk->nr_steps; i++) {
 		if (wrk->steps[i].type == SW_FENCE) {
@@ -1222,17 +1507,36 @@ alloc_step_batch(struct workload *wrk, struct w_step *w)
 	igt_assert(j < nr_obj);
 
 	for (i = 0; i < w->data_deps.nr; i++) {
-		igt_assert(w->data_deps.list[i] <= 0);
-		if (w->data_deps.list[i]) {
-			int dep_idx = w->idx + w->data_deps.list[i];
+		struct dep_entry *entry = &w->data_deps.list[i];
+		uint32_t dep_handle;
 
+		if (entry->working_set == -1) {
+			int dep_idx = w->idx + entry->target;
+
+			igt_assert(entry->target <= 0);
 			igt_assert(dep_idx >= 0 && dep_idx < w->idx);
 			igt_assert(wrk->steps[dep_idx].type == BATCH);
 
-			w->obj[j].handle = wrk->steps[dep_idx].obj[0].handle;
-			j++;
-			igt_assert(j < nr_obj);
+			dep_handle = wrk->steps[dep_idx].obj[0].handle;
+		} else {
+			struct working_set *set;
+
+			igt_assert(entry->working_set <=
+				   wrk->max_working_set_id);
+
+			set = wrk->working_sets[entry->working_set];
+
+			igt_assert(set->nr);
+			igt_assert(entry->target < set->nr);
+			igt_assert(set->sizes[entry->target]);
+
+			dep_handle = set->handles[entry->target];
 		}
+
+		w->obj[j].flags = entry->write ? EXEC_OBJECT_WRITE : 0;
+		w->obj[j].handle = dep_handle;
+		j++;
+		igt_assert(j < nr_obj);
 	}
 
 	if (w->unbound_duration)
@@ -1391,10 +1695,22 @@ static size_t sizeof_engines_bond(int count)
 			engines[count]);
 }
 
+static void allocate_working_set(struct working_set *set)
+{
+	unsigned int i;
+
+	set->handles = calloc(set->nr, sizeof(*set->handles));
+	igt_assert(set->handles);
+
+	for (i = 0; i < set->nr; i++)
+		set->handles[i] = gem_create(fd, set->sizes[i]);
+}
+
 #define alloca0(sz) ({ size_t sz__ = (sz); memset(alloca(sz__), 0, sz__); })
 
 static int prepare_workload(unsigned int id, struct workload *wrk)
 {
+	struct working_set **sets;
 	uint32_t share_vm = 0;
 	int max_ctx = -1;
 	struct w_step *w;
@@ -1629,6 +1945,51 @@ static int prepare_workload(unsigned int id, struct workload *wrk)
 		}
 	}
 
+	/*
+	 * Allocate working sets.
+	 */
+	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
+		if (w->type == WORKINGSET && !w->working_set.shared)
+			allocate_working_set(&w->working_set);
+	}
+
+	/*
+	 * Map of working set ids.
+	 */
+	wrk->max_working_set_id = -1;
+	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
+		if (w->type == WORKINGSET &&
+		    w->working_set.id > wrk->max_working_set_id)
+			wrk->max_working_set_id = w->working_set.id;
+	}
+
+	sets = wrk->working_sets;
+	wrk->working_sets = calloc(wrk->max_working_set_id + 1,
+				   sizeof(*wrk->working_sets));
+	igt_assert(wrk->working_sets);
+
+	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
+		struct working_set *set;
+
+		if (w->type != WORKINGSET)
+			continue;
+
+		if (!w->working_set.shared) {
+			set = &w->working_set;
+		} else {
+			igt_assert(sets);
+
+			set = sets[w->working_set.id];
+			igt_assert(set->shared);
+			igt_assert(set->sizes);
+		}
+
+		wrk->working_sets[w->working_set.id] = set;
+	}
+
+	if (sets)
+		free(sets);
+
 	/*
 	 * Allocate batch buffers.
 	 */
@@ -1698,7 +2059,7 @@ do_eb(struct workload *wrk, struct w_step *w, enum intel_engine_id engine)
 		      2 * sizeof(uint32_t));
 
 	for (i = 0; i < w->fence_deps.nr; i++) {
-		int tgt = w->idx + w->fence_deps.list[i];
+		int tgt = w->idx + w->fence_deps.list[i].target;
 
 		/* TODO: fence merging needed to support multiple inputs */
 		igt_assert(i == 0);
@@ -1729,14 +2090,18 @@ static void sync_deps(struct workload *wrk, struct w_step *w)
 	unsigned int i;
 
 	for (i = 0; i < w->data_deps.nr; i++) {
+		struct dep_entry *entry = &w->data_deps.list[i];
 		int dep_idx;
 
-		igt_assert(w->data_deps.list[i] <= 0);
+		if (entry->working_set == -1)
+			continue;
+
+		igt_assert(entry->target <= 0);
 
-		if (!w->data_deps.list[i])
+		if (!entry->target)
 			continue;
 
-		dep_idx = w->idx + w->data_deps.list[i];
+		dep_idx = w->idx + entry->target;
 
 		igt_assert(dep_idx >= 0 && dep_idx < w->idx);
 		igt_assert(wrk->steps[dep_idx].type == BATCH);
@@ -1836,11 +2201,6 @@ static void *run_workload(void *data)
 					MI_BATCH_BUFFER_END;
 				__sync_synchronize();
 				continue;
-			} else if (w->type == PREEMPTION ||
-				   w->type == ENGINE_MAP ||
-				   w->type == LOAD_BALANCE ||
-				   w->type == BOND) {
-				continue;
 			} else if (w->type == SSEU) {
 				if (w->sseu != wrk->ctx_list[w->context * 2].sseu) {
 					wrk->ctx_list[w->context * 2].sseu =
@@ -1848,6 +2208,13 @@ static void *run_workload(void *data)
 							     w->sseu);
 				}
 				continue;
+			} else if (w->type == PREEMPTION ||
+				   w->type == ENGINE_MAP ||
+				   w->type == LOAD_BALANCE ||
+				   w->type == BOND ||
+				   w->type == WORKINGSET) {
+				   /* No action for these at execution time. */
+				continue;
 			}
 
 			if (do_sleep || w->type == PERIOD) {
benchmarks/wsim/README +59 -0

74 lines not on this page · raw message

benchmarks/wsim/cloud-gaming-60fps.wsim new file +11 -0
new file mode 100644
index 000000000000..9e48bbc2f617
@@ -0,0 +1,11 @@
+w.1.10n8m
+w.2.3n16m
+1.RCS.500-1500.r1-0-4/w2-0.0
+1.RCS.500-1500.r1-5-9/w2-1.0
+1.RCS.500-1500.r2-0-1/w2-2.0
+M.2.VCS
+B.2
+3.RCS.500-1500.r2-2.0
+2.DEFAULT.2000-4000.-1.0
+4.VCS1.250-750.-1.1
+p.16667
benchmarks/wsim/composited-ui.wsim new file +7 -0
new file mode 100644
index 000000000000..4164f8bf7393
@@ -0,0 +1,7 @@
+w.1.10n8m/3n16m
+W.2.16m
+1.RCS.200-600.r1-0-4/w1-10.0
+1.RCS.200-600.r1-5-9/w1-11.0
+1.RCS.400-800.r1-10-11/w1-12.0
+3.BCS.200-800.r1-12/w2-0.1
+p.16667
Signature · 6 lines
2.20.1

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v1 2/11
#2 lore raw

Re: [igt-dev] [PATCH i-g-t 02/11] gem_wsim: Buffer objects working sets and complex dependencies

Quoting Tvrtko Ursulin (2020-06-18 11:47:38)

Quoted 9 lines

From: Tvrtko Ursulin <[email protected]>

Add support for defining buffer object working sets and targetting them as data dependencies. For more information please see the README file.

v2:
* More robustness in parsing here and there. (Chris)

Is there a tag for "please don't make me read more of the parser"?

-Chris
_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#3 lore raw

PATCH 3/11 gem_wsim: Show workload timing stats

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

Show average/min/max workload iteration and dropped period stats when 'p' command is used.

---
 benchmarks/gem_wsim.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)
benchmarks/gem_wsim.c +15 -4
index dc47470c621d..dd0b2e260a5a 100644
@@ -2117,7 +2117,8 @@ static void *run_workload(void *data)
 	struct w_step *w;
 	int throttle = -1;
 	int qd_throttle = -1;
-	int count;
+	int count, missed = 0;
+	unsigned long time_tot = 0, time_min = ULONG_MAX, time_max = 0;
 	int i;
 
 	clock_gettime(CLOCK_MONOTONIC, &t_start);
@@ -2137,12 +2138,19 @@ static void *run_workload(void *data)
 				do_sleep = w->delay;
 			} else if (w->type == PERIOD) {
 				struct timespec now;
+				int elapsed;
 
 				clock_gettime(CLOCK_MONOTONIC, &now);
-				do_sleep = w->period -
-					   elapsed_us(&wrk->repeat_start, &now);
+				elapsed = elapsed_us(&wrk->repeat_start, &now);
+				do_sleep = w->period - elapsed;
+				time_tot += elapsed;
+				if (elapsed < time_min)
+					time_min = elapsed;
+				if (elapsed > time_max)
+					time_max = elapsed;
 				if (do_sleep < 0) {
-					if (verbose > 1)
+					missed++;
+					if (verbose > 2)
 						printf("%u: Dropped period @ %u/%u (%dus late)!\n",
 						       wrk->id, count, i, do_sleep);
 					continue;
@@ -2296,6 +2304,9 @@ static void *run_workload(void *data)
 		printf("%c%u: %.3fs elapsed (%d cycles, %.3f workloads/s).",
 		       wrk->background ? ' ' : '*', wrk->id,
 		       t, count, count / t);
+		if (time_tot)
+			printf(" Time avg/min/max=%lu/%lu/%luus; %u missed.",
+			       time_tot / count, time_min, time_max, missed);
 		putchar('\n');
 	}
 
Signature · 6 lines
2.20.1

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v1 3/11
#4 lore raw

Re: [igt-dev] [PATCH i-g-t 03/11] gem_wsim: Show workload timing stats

Quoting Tvrtko Ursulin (2020-06-18 11:47:39)

Quoted 6 lines

From: Tvrtko Ursulin <[email protected]>

Show average/min/max workload iteration and dropped period stats when 'p' command is used.

-Chris
_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#5 lore raw

PATCH 4/11 gem_wsim: Move BO allocation to a helper

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

---
 benchmarks/gem_wsim.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)
benchmarks/gem_wsim.c +10 -4
index dd0b2e260a5a..23b81d181df3 100644
@@ -1490,6 +1490,11 @@ get_ctxid(struct workload *wrk, struct w_step *w)
 	return wrk->ctx_list[w->context].id;
 }
 
+static uint32_t alloc_bo(int i915, unsigned long size)
+{
+	return gem_create(i915, size);
+}
+
 static void
 alloc_step_batch(struct workload *wrk, struct w_step *w)
 {
@@ -1501,7 +1506,7 @@ alloc_step_batch(struct workload *wrk, struct w_step *w)
 	w->obj = calloc(nr_obj, sizeof(*w->obj));
 	igt_assert(w->obj);
 
-	w->obj[j].handle = gem_create(fd, 4096);
+	w->obj[j].handle = alloc_bo(fd, 4096);
 	w->obj[j].flags = EXEC_OBJECT_WRITE;
 	j++;
 	igt_assert(j < nr_obj);
@@ -1546,7 +1551,8 @@ alloc_step_batch(struct workload *wrk, struct w_step *w)
 	else
 		w->bb_sz = get_bb_sz(w, w->duration.max);
 
-	w->bb_handle = w->obj[j].handle = gem_create(fd, w->bb_sz + (w->unbound_duration ? 4096 : 0));
+	w->bb_handle = w->obj[j].handle =
+		alloc_bo(fd, w->bb_sz + (w->unbound_duration ? 4096 : 0));
 	init_bb(w);
 	w->obj[j].relocation_count = terminate_bb(w);
 
@@ -1703,7 +1709,7 @@ static void allocate_working_set(struct working_set *set)
 	igt_assert(set->handles);
 
 	for (i = 0; i < set->nr; i++)
-		set->handles[i] = gem_create(fd, set->sizes[i]);
+		set->handles[i] = alloc_bo(fd, set->sizes[i]);
 }
 
 #define alloca0(sz) ({ size_t sz__ = (sz); memset(alloca(sz__), 0, sz__); })
@@ -2339,7 +2345,7 @@ static unsigned long calibrate_nop(unsigned int tolerance_pct, struct intel_exec
 	do {
 		struct timespec t_start;
 
-		obj.handle = gem_create(fd, size);
+		obj.handle = alloc_bo(fd, size);
 		gem_write(fd, obj.handle, size - sizeof(bbe), &bbe,
 			  sizeof(bbe));
 		gem_execbuf(fd, &eb);
Signature · 6 lines
2.20.1

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
#7 lore raw

PATCH 5/11 gem_wsim: Support random buffer sizes

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

See README for more details.

v2:
* No need to mess with flags. (Chris)

---
 benchmarks/gem_wsim.c  | 69 +++++++++++++++++++++++++++++++++---------
 benchmarks/wsim/README |  4 +++
 2 files changed, 59 insertions(+), 14 deletions(-)
benchmarks/gem_wsim.c +55 -14
index 23b81d181df3..a387e180c242 100644
@@ -117,12 +117,18 @@ struct bond {
 	enum intel_engine_id master;
 };
 
+struct work_buffer_size {
+	unsigned long size;
+	unsigned long min;
+	unsigned long max;
+};
+
 struct working_set {
 	int id;
 	bool shared;
 	unsigned int nr;
 	uint32_t *handles;
-	unsigned long *sizes;
+	struct work_buffer_size *sizes;
 };
 
 struct workload;
@@ -203,6 +209,7 @@ struct workload
 	bool print_stats;
 
 	uint32_t bb_prng;
+	uint32_t bo_prng;
 
 	struct timespec repeat_start;
 
@@ -779,10 +786,12 @@ static int add_buffers(struct working_set *set, char *str)
 	 * 4m
 	 * 4g
 	 * 10n4k - 10 4k batches
+	 * 4096-16k - random size in range
 	 */
-	unsigned long *sizes, size;
+	struct work_buffer_size *sizes;
+	unsigned long min_sz, max_sz;
+	char *n, *max = NULL;
 	int add, i;
-	char *n;
 
 	n = index(str, 'n');
 	if (n) {
@@ -795,16 +804,34 @@ static int add_buffers(struct working_set *set, char *str)
 		add = 1;
 	}
 
-	size = parse_size(str);
-	if (!size)
+	n = index(str, '-');
+	if (n) {
+		*n = 0;
+		max = ++n;
+	}
+
+	min_sz = parse_size(str);
+	if (!min_sz)
 		return -1;
 
+	if (max) {
+		max_sz = parse_size(max);
+		if (!max_sz)
+			return -1;
+	} else {
+		max_sz = min_sz;
+	}
+
 	sizes = realloc(set->sizes, (set->nr + add) * sizeof(*sizes));
 	if (!sizes)
 		return -1;
 
-	for (i = 0; i < add; i++)
-		sizes[set->nr + i] = size;
+	for (i = 0; i < add; i++) {
+		struct work_buffer_size *sz = &sizes[set->nr + i];
+		sz->min = min_sz;
+		sz->max = max_sz;
+		sz->size = 0;
+	}
 
 	set->nr += add;
 	set->sizes = sizes;
@@ -846,7 +873,7 @@ static uint64_t engine_list_mask(const char *_str)
 	return mask;
 }
 
-static void allocate_working_set(struct working_set *set);
+static void allocate_working_set(struct workload *wrk, struct working_set *set);
 
 #define int_field(_STEP_, _FIELD_, _COND_, _ERR_) \
 	if ((field = strtok_r(fstart, ".", &fctx))) { \
@@ -1203,6 +1230,7 @@ add_step:
 	wrk->sseu = arg->sseu;
 	wrk->max_working_set_id = -1;
 	wrk->working_sets = NULL;
+	wrk->bo_prng = (flags & SYNCEDCLIENTS) ? master_prng : rand();
 
 	free(desc);
 
@@ -1256,7 +1284,7 @@ add_step:
 	 */
 	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
 		if (w->type == WORKINGSET && w->working_set.shared)
-			allocate_working_set(&w->working_set);
+			allocate_working_set(wrk, &w->working_set);
 	}
 
 	wrk->max_working_set_id = -1;
@@ -1533,7 +1561,7 @@ alloc_step_batch(struct workload *wrk, struct w_step *w)
 
 			igt_assert(set->nr);
 			igt_assert(entry->target < set->nr);
-			igt_assert(set->sizes[entry->target]);
+			igt_assert(set->sizes[entry->target].size);
 
 			dep_handle = set->handles[entry->target];
 		}
@@ -1701,15 +1729,27 @@ static size_t sizeof_engines_bond(int count)
 			engines[count]);
 }
 
-static void allocate_working_set(struct working_set *set)
+static unsigned long
+get_buffer_size(struct workload *wrk, const struct work_buffer_size *sz)
+{
+	if (sz->min == sz->max)
+		return sz->min;
+	else
+		return sz->min + hars_petruska_f54_1_random(&wrk->bo_prng) %
+		       (sz->max + 1 - sz->min);
+}
+
+static void allocate_working_set(struct workload *wrk, struct working_set *set)
 {
 	unsigned int i;
 
 	set->handles = calloc(set->nr, sizeof(*set->handles));
 	igt_assert(set->handles);
 
-	for (i = 0; i < set->nr; i++)
-		set->handles[i] = alloc_bo(fd, set->sizes[i]);
+	for (i = 0; i < set->nr; i++) {
+		set->sizes[i].size = get_buffer_size(wrk, &set->sizes[i]);
+		set->handles[i] = alloc_bo(fd, set->sizes[i].size);
+	}
 }
 
 #define alloca0(sz) ({ size_t sz__ = (sz); memset(alloca(sz__), 0, sz__); })
@@ -1724,6 +1764,7 @@ static int prepare_workload(unsigned int id, struct workload *wrk)
 
 	wrk->id = id;
 	wrk->bb_prng = (wrk->flags & SYNCEDCLIENTS) ? master_prng : rand();
+	wrk->bo_prng = (wrk->flags & SYNCEDCLIENTS) ? master_prng : rand();
 	wrk->run = true;
 
 	/*
@@ -1956,7 +1997,7 @@ static int prepare_workload(unsigned int id, struct workload *wrk)
 	 */
 	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
 		if (w->type == WORKINGSET && !w->working_set.shared)
-			allocate_working_set(&w->working_set);
+			allocate_working_set(wrk, &w->working_set);
 	}
 
 	/*
benchmarks/wsim/README +4 -0
index 3d9143226740..8c71f2fe6579 100644
@@ -307,11 +307,15 @@ For size a byte size can be given, or suffix 'k', 'm' or 'g' can be used (case
 insensitive). Prefix in the format of "<int>n<size>" can also be given to create
 multiple objects of the same size.
 
+Ranges can also be specified using the <min>-<max> syntax.
+
 Examples:
 
   w.1.4k - Working set 1 with a single 4KiB object in it.
   W.2.2M/32768 - Working set 2 with one 2MiB and one 32768 byte object.
   w.3.10n4k/2n20000 - Working set 3 with ten 4KiB and two 20000 byte objects.
+  w.4.4n4k-1m - Working set 4 with four objects of random size between 4KiB and
+		1MiB.
 
 Working set objects can be referenced as data dependency targets using the new
 'r'/'w' syntax. Simple example:
Signature · 6 lines
2.20.1

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
Reviewed-by on v1 5/11
#8 lore raw

Re: [Intel-gfx] [igt-dev] [PATCH i-g-t 05/11] gem_wsim: Support random buffer sizes

Quoting Tvrtko Ursulin (2020-06-18 11:47:41)

Quoted 8 lines

From: Tvrtko Ursulin <[email protected]>

See README for more details.

v2:
* No need to mess with flags. (Chris)

-Chris
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#9 lore raw

PATCH 6/11 gem_wsim: Support scaling workload batch durations

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

-f <float> on the command line can be used to scale batch buffer durations in all parsed workloads.

---
 benchmarks/gem_wsim.c | 37 ++++++++++++++++++++++++++++++-------
 1 file changed, 30 insertions(+), 7 deletions(-)
benchmarks/gem_wsim.c +30 -7
index a387e180c242..2d6d0a6a7b4b 100644
@@ -41,6 +41,7 @@
 #include <assert.h>
 #include <limits.h>
 #include <pthread.h>
+#include <math.h>
 
 #include "intel_chipset.h"
 #include "intel_reg.h"
@@ -875,6 +876,11 @@ static uint64_t engine_list_mask(const char *_str)
 
 static void allocate_working_set(struct workload *wrk, struct working_set *set);
 
+static long __duration(long dur, double scale)
+{
+	return round(scale * dur);
+}
+
 #define int_field(_STEP_, _FIELD_, _COND_, _ERR_) \
 	if ((field = strtok_r(fstart, ".", &fctx))) { \
 		tmp = atoi(field); \
@@ -885,7 +891,8 @@ static void allocate_working_set(struct workload *wrk, struct working_set *set);
 	} \
 
 static struct workload *
-parse_workload(struct w_arg *arg, unsigned int flags, struct workload *app_w)
+parse_workload(struct w_arg *arg, unsigned int flags, double scale_dur,
+	       double scale_time, struct workload *app_w)
 {
 	struct workload *wrk;
 	unsigned int nr_steps = 0;
@@ -1151,7 +1158,7 @@ parse_workload(struct w_arg *arg, unsigned int flags, struct workload *app_w)
 					  tmpl == LONG_MAX,
 					  "Invalid duration at step %u!\n",
 					  nr_steps);
-				step.duration.min = tmpl;
+				step.duration.min = __duration(tmpl, scale_dur);
 
 				if (sep && *sep == '-') {
 					tmpl = strtol(sep + 1, NULL, 10);
@@ -1161,7 +1168,8 @@ parse_workload(struct w_arg *arg, unsigned int flags, struct workload *app_w)
 						tmpl == LONG_MAX,
 						"Invalid duration range at step %u!\n",
 						nr_steps);
-					step.duration.max = tmpl;
+					step.duration.max = __duration(tmpl,
+								       scale_dur);
 				} else {
 					step.duration.max = step.duration.min;
 				}
@@ -1197,6 +1205,9 @@ parse_workload(struct w_arg *arg, unsigned int flags, struct workload *app_w)
 		step.type = BATCH;
 
 add_step:
+		if (step.type == DELAY)
+			step.delay = __duration(step.delay, scale_time);
+
 		step.idx = nr_steps++;
 		step.request = -1;
 		steps = realloc(steps, sizeof(step) * nr_steps);
@@ -2508,7 +2519,9 @@ static void print_help(void)
 "                    command line. Subsequent -s switches it off.\n"
 "  -S                Synchronize the sequence of random batch durations between\n"
 "                    clients.\n"
-"  -d                Sync between data dependencies in userspace."
+"  -d                Sync between data dependencies in userspace.\n"
+"  -f <scale>        Scale factor for batch durations.\n"
+"  -F <scale>        Scale factor for delays."
 	);
 }
 
@@ -2570,6 +2583,8 @@ int main(int argc, char **argv)
 	struct w_arg *w_args = NULL;
 	unsigned int tolerance_pct = 1;
 	int exitcode = EXIT_FAILURE;
+	double scale_time = 1.0f;
+	double scale_dur = 1.0f;
 	int prio = 0;
 	double t;
 	int i, c;
@@ -2590,7 +2605,7 @@ int main(int argc, char **argv)
 	master_prng = time(NULL);
 
 	while ((c = getopt(argc, argv,
-			   "ThqvsSdc:n:r:w:W:a:t:p:I:")) != -1) {
+			   "ThqvsSdc:n:r:w:W:a:t:p:I:f:F:")) != -1) {
 		switch (c) {
 		case 'W':
 			if (master_workload >= 0) {
@@ -2701,6 +2716,12 @@ int main(int argc, char **argv)
 		case 'I':
 			master_prng = strtol(optarg, NULL, 0);
 			break;
+		case 'f':
+			scale_dur = atof(optarg);
+			break;
+		case 'F':
+			scale_time = atof(optarg);
+			break;
 		case 'h':
 			print_help();
 			goto out;
@@ -2758,7 +2779,8 @@ int main(int argc, char **argv)
 
 	if (append_workload_arg) {
 		struct w_arg arg = { NULL, append_workload_arg, 0 };
-		app_w = parse_workload(&arg, flags, NULL);
+		app_w = parse_workload(&arg, flags, scale_dur, scale_time,
+				       NULL);
 		if (!app_w) {
 			wsim_err("Failed to parse append workload!\n");
 			goto err;
@@ -2776,7 +2798,8 @@ int main(int argc, char **argv)
 			goto err;
 		}
 
-		wrk[i] = parse_workload(&w_args[i], flags, app_w);
+		wrk[i] = parse_workload(&w_args[i], flags, scale_dur,
+					scale_time, app_w);
 		if (!wrk[i]) {
 			wsim_err("Failed to parse workload %u!\n", i);
 			goto err;
Signature · 6 lines
2.20.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Reviewed-by on v1 6/11
#10 lore raw

Re: [igt-dev] [PATCH i-g-t 06/11] gem_wsim: Support scaling workload batch durations

Quoting Tvrtko Ursulin (2020-06-18 11:47:42)

Quoted 6 lines

From: Tvrtko Ursulin <[email protected]>

-f <float> on the command line can be used to scale batch buffer durations in all parsed workloads.

-Chris
_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#11 lore raw

PATCH 7/11 gem_wsim: Log max and active working set sizes in verbose mode

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

It is useful to know how much memory workload is allocating.

---
 benchmarks/gem_wsim.c | 100 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 95 insertions(+), 5 deletions(-)
benchmarks/gem_wsim.c +95 -5
index 2d6d0a6a7b4b..8788f752121b 100644
@@ -874,7 +874,8 @@ static uint64_t engine_list_mask(const char *_str)
 	return mask;
 }
 
-static void allocate_working_set(struct workload *wrk, struct working_set *set);
+static unsigned long
+allocate_working_set(struct workload *wrk, struct working_set *set);
 
 static long __duration(long dur, double scale)
 {
@@ -1294,8 +1295,14 @@ add_step:
 	 * Allocate shared working sets.
 	 */
 	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
-		if (w->type == WORKINGSET && w->working_set.shared)
-			allocate_working_set(wrk, &w->working_set);
+		if (w->type == WORKINGSET && w->working_set.shared) {
+			unsigned long total =
+				allocate_working_set(wrk, &w->working_set);
+
+			if (verbose > 1)
+				printf("%u: %lu bytes in shared working set %u\n",
+				       wrk->id, total, w->working_set.id);
+		}
 	}
 
 	wrk->max_working_set_id = -1;
@@ -1750,8 +1757,10 @@ get_buffer_size(struct workload *wrk, const struct work_buffer_size *sz)
 		       (sz->max + 1 - sz->min);
 }
 
-static void allocate_working_set(struct workload *wrk, struct working_set *set)
+static unsigned long
+allocate_working_set(struct workload *wrk, struct working_set *set)
 {
+	unsigned long total = 0;
 	unsigned int i;
 
 	set->handles = calloc(set->nr, sizeof(*set->handles));
@@ -1760,7 +1769,82 @@ static void allocate_working_set(struct workload *wrk, struct working_set *set)
 	for (i = 0; i < set->nr; i++) {
 		set->sizes[i].size = get_buffer_size(wrk, &set->sizes[i]);
 		set->handles[i] = alloc_bo(fd, set->sizes[i].size);
+		total += set->sizes[i].size;
+	}
+
+	return total;
+}
+
+static bool
+find_dep(struct dep_entry *deps, unsigned int nr, struct dep_entry dep)
+{
+	unsigned int i;
+
+	for (i = 0; i < nr; i++) {
+		if (deps[i].working_set == dep.working_set &&
+		    deps[i].target == dep.target)
+			return true;
 	}
+
+	return false;
+}
+
+static void measure_active_set(struct workload *wrk)
+{
+	unsigned long total = 0, batch_sizes = 0;
+	struct dep_entry *deps = NULL;
+	unsigned int nr = 0, i, j;
+	struct w_step *w;
+
+	if (verbose < 3)
+		return;
+
+	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
+		if (w->type != BATCH)
+			continue;
+
+		batch_sizes += w->bb_sz;
+
+		for (j = 0; j < w->data_deps.nr; j++) {
+			struct dep_entry *dep = &w->data_deps.list[j];
+			struct dep_entry _dep = *dep;
+
+			if (dep->working_set == -1 && dep->target < 0) {
+				int idx = w->idx + dep->target;
+
+				igt_assert(idx >= 0 && idx < w->idx);
+				igt_assert(wrk->steps[idx].type == BATCH);
+
+				_dep.target = wrk->steps[idx].obj[0].handle;
+			}
+
+			if (!find_dep(deps, nr, _dep)) {
+				if (dep->working_set == -1) {
+					total += 4096;
+				} else {
+					struct working_set *set;
+
+					igt_assert(dep->working_set <=
+						   wrk->max_working_set_id);
+
+					set = wrk->working_sets[dep->working_set];
+					igt_assert(set->nr);
+					igt_assert(dep->target < set->nr);
+					igt_assert(set->sizes[dep->target].size);
+
+					total += set->sizes[dep->target].size;
+				}
+
+				deps = realloc(deps, (nr + 1) * sizeof(*deps));
+				deps[nr++] = *dep;
+			}
+		}
+	}
+
+	free(deps);
+
+	printf("%u: %lu bytes active working set in %u buffers. %lu in batch buffers.\n",
+	       wrk->id, total, nr, batch_sizes);
 }
 
 #define alloca0(sz) ({ size_t sz__ = (sz); memset(alloca(sz__), 0, sz__); })
@@ -1768,6 +1852,7 @@ static void allocate_working_set(struct workload *wrk, struct working_set *set)
 static int prepare_workload(unsigned int id, struct workload *wrk)
 {
 	struct working_set **sets;
+	unsigned long total = 0;
 	uint32_t share_vm = 0;
 	int max_ctx = -1;
 	struct w_step *w;
@@ -2008,9 +2093,12 @@ static int prepare_workload(unsigned int id, struct workload *wrk)
 	 */
 	for (i = 0, w = wrk->steps; i < wrk->nr_steps; i++, w++) {
 		if (w->type == WORKINGSET && !w->working_set.shared)
-			allocate_working_set(wrk, &w->working_set);
+			total += allocate_working_set(wrk, &w->working_set);
 	}
 
+	if (verbose > 2)
+		printf("%u: %lu bytes in working sets.\n", wrk->id, total);
+
 	/*
 	 * Map of working set ids.
 	 */
@@ -2058,6 +2146,8 @@ static int prepare_workload(unsigned int id, struct workload *wrk)
 		alloc_step_batch(wrk, w);
 	}
 
+	measure_active_set(wrk);
+
 	return 0;
 }
 
Signature · 6 lines
2.20.1

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
#12 lore raw

PATCH 8/11 gem_wsim: Snippet of a workload extracted from carchase

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

Some frames from the middle of a demo with corresponding buffers.

---
 benchmarks/wsim/carchasepart.wsim | 184 ++++++++++++++++++++++++++++++
 1 file changed, 184 insertions(+)
 create mode 100644 benchmarks/wsim/carchasepart.wsim
benchmarks/wsim/carchasepart.wsim new file +45 -0
new file mode 100644
index 000000000000..4407d0ef47dc
@@ -0,0 +1,184 @@
+w.0.118n8192
+w.1.69n12288
+w.10.145n131072
+w.11.1n163840
+w.12.3n196608
+w.13.2n229376
+w.14.2n262144
+w.15.7n327680
+w.16.2n393216
+w.17.9n458752
+w.18.30n524288
+w.19.1n655360
+w.2.74n16384
+w.20.2n917504
+w.21.1n1048576
+w.22.33n1310720
+w.23.1n1572864
+w.24.24n1835008
+w.25.117n2097152
+w.26.1n2621440
+w.27.2n3670016
+w.28.4n4194304
+w.29.3n6291456
+w.3.123n20480
+w.30.1n7340032
+w.31.1n8388608
+w.32.20n10485760
+w.33.4n12582912
+w.34.3n14680064
+w.35.1n25165824
+w.4.19n24576
+w.5.2n32768
+w.6.2n40960
+w.7.4n49152
+w.8.2n65536
+w.9.9n81920
+1.RCS.5736.r0-58/r3-80/r22-31/r3-41/r3-42/r9-4/w27-1/r3-18/r22-1/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/w28-1/r3-93/w32-14/r32-0/r33-2/w32-16.0
+2.RCS.1000.r9-4/r3-41/r3-42/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5950.r9-4/r33-2/r3-6/r22-31/r3-42/w0-103/w0-106/r3-41/r2-54.0
+1.RCS.14562.r0-58/r3-80/r22-31/r3-41/r3-42/r9-4/w32-18/r3-18/r22-1/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-106/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6494.r3-80/r22-31/r3-41/r3-42/r9-4/w9-5/r0-71/r0-58/w32-19/r3-18/r22-1/r3-78/r3-88/r22-5/r22-14/r22-6/r22-29/r22-7/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-60/r22-20/r25-99/r22-16/r21-0/r22-21/r0-97/r22-27/r0-98/r22-4/r0-84/r3-47/w28-2/r0-107/w8-0/r0-48.0
+d.36394
+2.RCS.2207.r9-4/r28-2/r3-42/r22-31/w8-0/r2-47/r20-0/w22-23/r3-47/r3-95/r0-58/w22-10/r3-80.0
+d.17275
+1.RCS.1000.r3-47/w27-0/r0-58/r3-80/r22-31/r3-42/r9-4/w34-0/r3-18/r3-41/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-67/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r0-45/r3-110/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-85/r25-48/r3-12/r25-104/r24-23/r3-87/r3-108/r3-26/r3-96/r22-5/r22-14/r3-49/r3-103/r22-6/r3-68/r3-112/r22-29/r22-28/r25-14/r25-44/r25-19/r3-67/r25-111/r18-4/r3-66/r18-17/r4-5/r25-68/r25-86/r25-26/r25-67/r3-37/r25-0/r22-7/r25-59/r25-71/r25-101/r25-75/r25-20/r25-91/r3-2/r3-117/r3-33/r22-2/r25-55/r25-66/r25-24/r25-105/r25-61/r25-11/r25-51/r25-64/r25-70/r18-19/r18-26/r18-21/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r22-21/r25-22/r3-29/r25-93/r18-2/r18-14/r18-3/r22-10/r18-23/r18-7/r18-11/r3-73/r8-0/r25-92/r25-41/w33-3/r0-107/w19-0.

0
+d.2101
+1.RCS.32763.r9-4/r3-18/r3-47/r22-3/r22-31/w19-0/r3-98/r33-3/r3-6/r32-3/r3-78/r3-80/r3-73/r0-107/r0-58/r3-110/w31-0/w33-2/r32-19/r3-114/w32-4/w29-1/w32-8/r9-5/r32-17/r32-1/r30-0/r3-104/r35-0/r34-1/r34-0/r3-92/r34-2/r22-12/r22-1/w32-0/r3-75/r3-118/r3-70/r3-1/r3-113/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/r3-8/r4-5/r3-85/r3-115/r3-55/r3-13/r3-59/r22-2.0
+d.1788
+2.RCS.33594.r9-4/r0-26/r3-110/w7-2/r3-47/r0-109/r0-75/w6-1/r0-29/w7-0/r0-68/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.5573.r0-58/r3-80/r22-31/r3-47/r3-110/r9-4/w27-1/r3-18/r22-1/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/w28-1/r3-93/r3-60/w32-14/r32-0/r33-2/w32-16.0
+2.RCS.1000.r9-4/r3-60/r3-110/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5826.r9-4/r33-2/r3-6/r22-31/r3-110/w0-103/w0-22/r3-60/r2-54.0
+1.RCS.14378.r0-58/r3-80/r22-31/r3-60/r3-110/r9-4/w32-18/r3-18/r3-47/r22-1/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-22/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6218.r3-80/r22-31/r3-60/r3-110/r9-4/w9-5/r0-53/r0-58/w32-19/r3-18/r3-47/r22-1/r3-78/r3-88/r22-5/r22-14/r22-6/r22-29/r22-7/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-115/r22-20/r25-99/r22-16/r21-0/r22-21/r0-35/r22-27/r0-19/r22-4/r0-92/w28-2/r0-107/r3-0/w8-0/r0-76.0
+d.36049
+2.RCS.2085.r9-4/r28-2/r3-0/r22-31/w8-0/r2-9/r20-0/w22-23/r3-60/r3-95/r0-58/w22-10/r3-80.0
+d.12310 +1.RCS.1000.r3-60/w27-0/r0-58/r3-80/r22-31/r3-0/r9-4/w34-0/r3-18/r3-47/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-88/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r0-71/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-85/r25-48/r3-12/r25-104/r24-23/r3-87/r3-108/r3-26/r3-96/r22-5/r22-14/r3-49/r3-103/r22-6/r3-68/r3-112/r22-29/r22-28/r25-14/r25-44/r25-19/r3-67/r25-111/r18-4/r3-66/r18-17/r4-5/r25-68/r25-86/r25-26/r25-67/r3-37/r25-0/r22-7/r25-59/r25-71/r25-101/r25-75/r25-20/r25-91/r3-2/r3-117/r3-33/r22-2/r25-55/r25-66/r25-24/r25-105/r25-61/r25-11/r25-51/r25-64/r25-70/r18-19/r18-26/r18-21/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r22-21/r25-22/r3-29/r25-93/r18-2/r18-14/r18-3/r22-10/r18-23/r18-7/r18-11/r3-73/r8-0/r25-92/r25-41/w33-3/r0-107/w19-0.0 +d.3238
+1.RCS.32454.r9-4/r3-18/r3-60/r22-3/r22-31/w19-0/r3-98/r33-3/r3-6/r32-3/r3-78/r3-80/r3-73/r0-107/r0-58/r3-0/w31-0/w33-2/r32-19/r3-114/w32-4/w29-1/r3-74/w32-8/r9-5/r32-17/r32-1/r30-0/r3-104/r35-0/r34-1/r34-0/r3-92/r34-2/r22-12/r22-1/w32-0/r3-75/r3-118/r3-70/r3-1/r3-113/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/r3-8/r4-5/r3-85/r3-115/r3-55/r3-13/r3-59/r22-2.0
+d.3160
+2.RCS.33268.r9-4/r0-60/r3-0/w7-2/r3-60/r0-109/r3-74/r0-97/w6-1/r0-98/w7-0/r0-84/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.5675.r0-58/r3-80/r22-31/r3-74/r3-0/r9-4/w27-1/r3-18/r3-60/r22-1/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/w28-1/r3-93/w32-14/r32-0/r33-2/w32-16.0
+d.1148
+2.RCS.1000.r9-4/r3-74/r3-0/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5911.r9-4/r33-2/r3-6/r22-31/r3-0/w0-103/w0-48/r3-74/r2-54.0
+1.RCS.13981.r0-58/r3-80/r22-31/r3-74/r3-0/r9-4/w32-18/r3-18/r3-60/r22-1/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-48/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6208.r3-80/r22-31/r3-74/r3-0/r9-4/w9-5/r0-67/r0-58/w32-19/r3-18/r3-60/r22-1/r3-78/r3-88/r22-5/r22-14/r22-6/r22-29/r22-7/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-45/r22-20/r25-99/r22-16/r21-0/r0-64/r3-42/r22-21/r22-27/r0-42/r22-4/r0-52/w28-2/r0-107/w8-0/r0-87.0
+d.41148
+2.RCS.2070.r9-4/r28-2/r3-42/r22-31/w8-0/r2-47/r20-0/w22-23/r3-74/r3-95/r0-58/w22-10/r3-80.0
+d.18190 +1.RCS.1000.r3-74/w27-0/r0-58/r3-80/r22-31/r3-42/r9-4/w34-0/r3-18/r3-60/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-106/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r0-53/r3-31/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-85/r25-48/r3-12/r25-104/r24-23/r3-49/r3-103/r3-96/r22-6/r22-14/r3-87/r3-108/r3-26/r22-5/r22-29/r3-68/r3-112/r22-28/r25-14/r25-44/r25-19/r3-67/r25-111/r18-4/r3-66/r18-17/r4-5/r25-68/r25-86/r25-26/r25-67/r3-37/r25-0/r25-59/r25-71/r25-101/r25-75/r25-20/r25-91/r22-7/r3-2/r3-117/r3-33/r22-2/r25-55/r25-66/r25-24/r25-105/r25-61/r25-11/r25-51/r25-64/r25-70/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r18-19/r18-26/r18-21/r22-21/r25-22/r3-29/r25-93/r22-10/r18-23/r18-7/r18-11/r3-73/r8-0/r25-92/r25-41/w33-3/r0-107/w19-0.0 +d.1071
+1.RCS.31421.r0-58/r3-80/r22-31/r3-31/r3-42/r9-4/w31-0/r3-18/r22-3/r3-98/r19-0/r3-6/w33-2/r32-19/r3-114/r0-107/w32-4/r3-78/w29-1/w32-8/r9-5/r32-17/r32-3/r32-1/r30-0/r3-104/r35-0/r34-1/r34-0/r3-92/r34-2/r22-12/r22-1/w32-0/r3-75/r3-118/r3-70/r3-1/r3-113/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/r3-8/r4-5/r3-85/r3-115/r3-55/r3-13/r3-59/r22-2.0
+d.1795
+2.RCS.32222.r9-4/r0-115/r3-42/w7-2/r3-74/r0-109/r3-31/r0-35/w6-1/r0-19/w7-0/r0-92/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.5663.r0-58/r3-80/r22-31/r3-31/r3-42/r9-4/w27-1/r3-18/r22-1/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/w28-1/r3-93/r3-110/w32-14/r32-0/r33-2/w32-16.0
+2.RCS.1000.r9-4/r3-31/r3-110/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5878.r9-4/r33-2/r3-6/r22-31/r3-110/w0-103/w0-76/r3-31/r2-54.0
+1.RCS.14059.r0-58/r3-80/r22-31/r3-31/r3-110/r9-4/w32-18/r3-18/r22-1/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-76/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6168.r3-80/r22-31/r3-31/r3-110/r9-4/w9-5/r0-88/r0-58/w32-19/r3-18/r22-1/r3-78/r3-88/r22-5/r22-14/r22-6/r22-29/r22-7/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-71/r22-20/r25-99/r22-16/r21-0/r0-26/r22-21/r0-75/r3-20/r22-4/r22-27/r0-29/w28-2/r0-107/w8-0/r0-68.0
+d.32708
+2.RCS.2145.r9-4/r28-2/r3-110/r22-31/w8-0/r2-9/r20-0/w22-23/r3-20/r3-95/r0-58/w22-10/r3-80.0
+d.11843 +1.RCS.1000.r3-20/w27-0/r0-58/r3-80/r22-31/r3-110/r9-4/w34-0/r3-18/r3-31/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-22/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r0-67/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-85/r25-48/r3-12/r25-104/r3-87/r3-108/r3-26/r3-96/r22-5/r22-14/r22-29/r3-68/r3-112/r3-103/r3-49/r22-6/r22-28/r25-14/r25-44/r25-19/r3-67/r25-111/r18-4/r3-66/r18-17/r4-5/r25-68/r25-86/r25-26/r25-59/r25-71/r25-101/r25-67/r3-37/r25-0/r22-7/r25-75/r25-20/r25-91/r3-2/r3-117/r3-33/r22-2/r25-55/r25-66/r25-24/r25-105/r25-61/r25-11/r25-51/r25-64/r25-70/r18-19/r18-26/r18-21/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r9-2/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r22-21/r25-82/r25-77/r25-33/r25-22/r3-29/r25-93/r22-10/r18-23/r18-7/r18-11/r3-73/r8-0/r25-92/r25-41/w33-3/r0-107/w19-0.0 +d.3354
+1.RCS.31662.r0-58/r3-80/r22-31/r3-20/r3-110/r9-2/w31-0/r3-18/r22-3/r3-98/r19-0/r3-6/w33-2/r32-19/r3-114/r0-107/w32-4/r3-78/w29-1/w32-8/r9-5/r32-17/r32-3/r32-1/r30-0/r3-104/r35-0/r34-1/r34-0/r3-92/r34-2/r22-12/r22-1/w32-0/r3-75/r3-118/r3-70/r3-1/r3-113/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/r3-8/r4-5/r3-85/r3-115/r3-55/r3-13/r3-59/r22-2.0
+d.2763
+2.RCS.32465.r0-58/r9-2/r0-45/r3-110/w7-2/r3-20/r0-109/r0-64/w6-1/r0-42/w7-0/r0-52/w7-1/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.5493.r0-58/r3-80/r22-31/r3-20/r3-110/r9-2/w27-1/r3-18/r22-1/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/r3-0/w28-1/r3-93/r3-41/w32-14/r32-0/r33-2/w32-16.0
+2.RCS.1000.r9-2/r3-41/r3-0/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5680.r9-2/r33-2/r3-6/r22-31/r3-0/w0-103/w0-87/r3-41/r2-54.0
+1.RCS.13742.r0-58/r3-80/r22-31/r3-41/r3-0/r9-2/w32-18/r3-18/r3-20/r22-1/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-87/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.5993.r3-80/r22-31/r3-41/r3-0/r9-2/w9-5/r0-106/r0-58/w32-19/r3-18/r3-20/r22-1/r3-78/r3-88/r22-5/r22-14/r22-6/r22-29/r22-7/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-53/r22-20/r25-99/r22-16/r21-0/r0-60/r22-21/r0-97/r22-27/r0-98/r22-4/w28-2/r0-107/w8-0/r0-84.0
+d.37477
+2.RCS.1875.r9-2/r28-2/r3-0/r22-31/w8-0/r2-47/r20-0/w22-23/r3-41/r3-95/r0-58/w22-10/r3-80.0
+d.12907 +1.RCS.1000.r3-41/w27-0/r0-58/r3-80/r22-31/r3-0/r9-2/w34-0/r3-18/r3-20/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-48/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r0-88/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-87/r3-108/r3-26/r3-96/r22-5/r22-14/r22-29/r3-68/r3-112/r3-103/r3-49/r3-12/r22-6/r3-85/r25-104/r22-28/r25-14/r25-44/r25-19/r3-67/r25-111/r18-4/r3-66/r18-17/r4-5/r25-68/r25-86/r25-26/r25-59/r25-71/r25-101/r25-67/r3-37/r25-0/r25-75/r25-20/r25-91/r22-7/r3-2/r3-117/r3-33/r22-2/r25-55/r25-66/r25-24/r25-105/r25-61/r25-11/r25-51/r25-64/r25-70/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r18-19/r18-26/r18-21/r22-21/r25-82/r25-77/r25-33/r25-22/r3-29/r25-93/r22-10/r25-110/r25-62/r25-72/r22-9/r8-0/r18-23/r18-7/r18-11/r3-73/r25-92/r25-41/w33-3/r0-10
7/w19-0/w31-0.0
+d.3000
+1.RCS.33546.r9-2/r3-18/r3-41/r22-3/r22-31/w31-0/r3-98/r19-0/r3-6/w33-2/r32-19/r3-0/r3-80/r3-114/r0-107/r0-58/w32-4/r3-47/r3-78/r3-42/w29-1/w32-8/r9-5/r32-17/r32-3/r32-1/r30-0/r3-104/r35-0/r34-1/r34-0/r3-92/r34-2/r22-12/r22-1/w32-0/r3-75/r3-118/r3-70/r3-1/r3-113/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/r3-8/r4-5/r3-85/r3-115/r3-55/r3-13/r3-59/r22-2.0
+d.3250
+2.RCS.34417.r9-2/r0-71/r3-42/w7-2/r3-41/r0-109/r3-47/r0-26/w6-1/r0-75/w7-0/r0-29/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.5575.r0-58/r3-80/r22-31/r3-47/r3-42/r9-2/w27-1/r3-18/r3-41/r22-1/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/w28-1/r3-93/w32-14/r32-0/r33-2/w32-16.0
+2.RCS.1000.r9-2/r3-47/r3-42/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5743.r9-2/r33-2/r3-6/r22-31/r3-42/w0-103/w0-68/r3-47/r2-54.0
+1.RCS.13966.r0-58/r3-80/r22-31/r3-47/r3-42/r9-2/w32-18/r3-18/r3-41/r22-1/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-68/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6056.r3-80/r22-31/r3-47/r3-42/r9-2/w9-5/r0-22/r0-58/w32-19/r3-18/r3-41/r22-1/r3-78/r3-88/r22-5/r22-14/r22-6/r22-29/r22-7/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-67/r22-20/r25-99/r22-16/r21-0/r0-115/r22-21/r0-35/r22-27/r0-19/w28-2/r0-107/w8-0/r0-92.0
+d.36302
+2.RCS.1862.r9-2/r28-2/r3-42/r22-31/w8-0/r2-9/r20-0/w22-23/r3-47/r3-95/r0-58/w22-10/r3-80.0
+d.15703 +1.RCS.1000.r3-47/w27-0/r0-58/r3-80/r22-31/r3-42/r9-2/w34-0/r3-18/r3-41/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-76/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r0-106/r3-60/w32-17/r3-27/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-87/r3-108/r3-26/r3-96/r22-5/r22-14/r22-29/r3-68/r3-112/r3-103/r3-49/r3-12/r22-6/r3-85/r25-104/r22-28/r25-14/r25-44/r25-19/r3-67/r25-111/r18-4/r3-66/r18-17/r4-5/r25-68/r25-86/r25-26/r25-59/r25-71/r25-101/r25-67/r3-37/r25-0/r25-75/r25-20/r25-91/r22-7/r3-2/r3-117/r3-33/r22-2/r25-55/r25-66/r25-24/r25-105/r25-61/r25-11/r25-51/r25-64/r25-70/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r18-19/r18-26/r18-21/r22-21/r25-82/r25-77/r25-33/r25-22/r3-29/r25-93/r22-10/r25-110/r25-62/r25-72/r22-9/r8-0/r18-23/r18-7/r18-11/r3-73/r25-92/r25-
41/w33-3/r0-107/w19-0/w31-0.0
+d.2669
+1.RCS.33805.r9-2/r3-18/r3-60/r22-3/r22-31/w31-0/r3-98/r19-0/r3-6/w33-2/r32-19/r3-27/r3-80/r3-114/r0-107/r0-58/w32-4/r3-78/w29-1/w32-8/r9-5/r32-17/r32-3/r32-1/r30-0/r3-104/r35-0/r34-1/r34-0/r3-92/r34-2/r22-12/r22-1/w32-0/r3-75/r3-118/r3-70/r3-1/r3-113/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/r3-8/r4-5/r3-85/r3-115/r3-55/r3-13/r3-59/r22-2.0
+d.2564
+2.RCS.34680.r9-2/r0-53/r3-27/w7-2/r3-47/r0-109/r3-60/r0-60/w6-1/r0-97/w7-0/r0-98/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.5597.r0-58/r3-80/r22-31/r3-60/r3-27/r9-2/w27-1/r3-18/r22-1/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/w28-1/r3-93/w32-14/r32-0/r33-2/w32-16.0
+2.RCS.1000.r9-2/r3-60/r3-27/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5780.r9-2/r33-2/r3-6/r22-31/r3-27/w0-103/w0-84/r3-60/r2-54.0
+1.RCS.14008.r0-58/r3-80/r22-31/r3-60/r3-27/r9-2/w32-18/r3-18/r22-1/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-84/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6132.r3-80/r22-31/r3-60/r3-27/r9-2/w9-5/r0-48/r0-58/w32-19/r3-18/r22-1/r3-78/r3-88/r22-5/r22-14/r22-6/r22-29/r22-7/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-88/r22-20/r25-99/r22-16/r21-0/r0-45/r22-21/r0-64/r3-74/r22-27/r0-42/w28-2/r0-107/w8-0/r0-52.0
+d.37446
+2.RCS.1900.r9-2/r28-2/r3-27/r22-31/w8-0/r2-47/r20-0/w22-23/r3-74/r3-95/r0-58/w22-10/r3-80.0
+d.18811 +1.RCS.1000.r3-74/w27-0/r0-58/r3-80/r22-31/r3-27/r9-2/w34-0/r3-18/r3-60/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-87/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r3-110/r0-22/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-87/r3-108/r3-26/r3-96/r22-5/r22-14/r22-29/r3-68/r3-112/r3-103/r3-49/r3-12/r22-6/r3-85/r25-104/r22-28/r25-14/r25-44/r25-19/r3-67/r25-111/r18-4/r3-66/r18-17/r4-5/r25-68/r25-86/r25-26/r25-59/r25-71/r25-101/r25-67/r3-37/r25-0/r25-75/r25-20/r25-91/r22-7/r3-2/r3-117/r3-33/r22-2/r25-55/r25-66/r25-24/r25-105/r25-61/r25-11/r25-51/r25-64/r25-70/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r18-19/r18-26/r18-21/r22-21/r25-82/r25-77/r25-33/r25-22/r3-29/r25-93/r22-10/r25-110/r25-62/r25-72/r22-9/r8-0/r18-23/r18-7/r18-11/r3-73/r25-92/r25-41/w33
-3/r0-107/w19-0/w31-0.0
+d.1865
+1.RCS.34308.r9-2/r3-18/r3-74/r22-3/r22-31/w31-0/r3-98/r19-0/r3-6/w33-2/r32-19/r3-110/r3-80/r3-114/r0-107/r0-58/w32-4/r3-78/w29-1/w32-8/r9-5/r32-17/r32-3/r32-1/r30-0/r3-104/r35-0/r34-1/r34-0/r3-92/r34-2/r22-12/r22-1/w32-0/r3-75/r3-118/r3-70/r3-1/r3-113/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/r3-8/r4-5/r3-85/r3-115/r3-55/r3-13/r3-59/r22-2.0
+d.1284
+2.RCS.35212.r9-2/r0-67/r3-110/w7-2/r3-74/r0-109/r0-115/w6-1/r0-35/w7-0/r0-19/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.5686.r0-58/r3-80/r22-31/r3-74/r3-110/r9-2/w27-1/r3-18/r22-1/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/w28-1/r3-31/r3-93/w32-14/r32-0/r33-2/w32-16.0
+2.RCS.1000.r9-2/r3-31/r3-110/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5791.r9-2/r33-2/r3-6/r22-31/r3-110/w0-103/w0-92/r3-31/r2-54.0
+1.RCS.14049.r0-58/r3-80/r22-31/r3-31/r3-110/r9-2/w32-18/r3-18/r3-74/r22-1/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-92/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6085.r3-80/r22-31/r3-31/r3-110/r9-2/w9-5/r0-76/r0-58/w32-19/r3-18/r3-74/r22-1/r3-78/r3-88/r22-5/r22-14/r22-6/r22-29/r22-7/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-106/r22-20/r25-99/r22-16/r21-0/r0-71/r0-26/r22-27/r0-75/w28-2/r0-107/r3-0/w8-0/r0-29.0
+d.34977
+2.RCS.1794.r9-2/r28-2/r3-0/r22-31/w8-0/r2-9/r20-0/w22-23/r3-31/r3-95/r0-58/w22-10/r3-80.0
+d.11049 +1.RCS.32894.r3-31/w27-0/r0-58/r3-80/r22-31/r3-0/r9-2/w34-0/r3-18/r3-74/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-68/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r0-48/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-87/r3-108/r3-26/r3-96/r22-5/r22-14/r22-29/r3-68/r3-112/r3-103/r3-49/r3-12/r22-6/r3-85/r25-104/r22-28/r25-14/r25-44/r25-19/r3-67/r18-17/r4-5/r18-4/r3-2/r3-117/r3-33/r22-2/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r22-7/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r18-19/r18-26/r18-21/r25-105/r25-61/r25-11/r25-75/r25-20/r25-91/r25-51/r25-64/r25-70/r25-55/r25-66/r25-24/r25-111/r3-66/r25-68/r25-86/r25-26/r22-21/r25-82/r25-77/r25-33/r22-10/r25-110/r25-62/r25-72/r22-9/r8-0/r18-23/r18-7/r18-11/r3-73/r25-92/r25-41/w33-3/r0-107/w19-0/w31-0/r32-19/r3-20/r3-114/w32-4/w29-1/w32-8/r35-0/r3
4-1/r3-92/w32-0.0
+d.5753
+2.RCS.33634.r9-2/r0-88/r3-0/w7-2/r3-31/r0-109/r3-20/r0-45/w6-1/r0-64/w7-0/r0-42/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+d.1325
+1.RCS.6527.r9-2/r3-18/r3-31/r3-20/r22-1/r22-31/r9-5/r3-78/w32-0/r3-98/r3-75/r3-104/r3-118/r3-6/r3-70/r30-0/r35-0/r34-1/r34-0/r32-19/r3-0/r3-1/r3-113/w33-2/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/r0-58/r3-80/w27-1/r0-32/r32-8/r0-107/w28-0/r3-91/w28-1/r3-93/w32-14/w32-16.0
+d.2261
+2.RCS.1000.r9-2/r3-20/r3-0/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.6788.r9-2/r33-2/r3-6/r22-31/r3-0/w0-103/w0-52/r3-20/r2-54.0
+1.RCS.13974.r0-58/r3-80/r22-31/r3-20/r3-0/r9-2/w32-18/r3-18/r3-31/r22-14/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-52/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6098.r3-80/r22-31/r3-20/r3-0/r9-2/w9-5/r0-87/r0-58/w32-19/r3-18/r3-31/r22-14/r3-78/r3-42/r3-88/r22-5/r22-6/r22-29/r22-7/r22-1/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-22/r22-20/r25-99/r22-16/r21-0/r0-53/r0-60/r0-97/w28-2/r0-107/w8-0/r0-98.0
+d.39039
+2.RCS.1753.r9-2/r28-2/r3-42/r22-31/w8-0/r2-47/r20-0/w22-23/r3-20/r3-95/r0-58/w22-10/r3-80.0
+d.14507 +1.RCS.31161.r3-20/w27-0/r0-58/r3-80/r22-31/r3-42/r9-2/w34-0/r3-18/r3-31/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-84/r25-40/r3-90/r22-20/r0-76/r3-41/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-87/r3-108/r3-26/r3-96/r22-29/r22-14/r3-68/r3-112/r3-103/r22-5/r3-49/r3-12/r22-6/r3-85/r25-14/r3-6/r25-104/r22-28/r25-44/r25-19/r3-67/r18-17/r4-5/r18-4/r25-111/r3-66/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r22-7/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r18-19/r18-26/r18-21/r3-2/r3-117/r3-33/r22-2/r25-51/r25-64/r25-70/r25-105/r25-61/r25-11/r25-75/r25-20/r25-91/r25-55/r25-66/r25-24/r25-68/r25-86/r25-26/r22-21/r25-82/r25-77/r25-33/r22-10/r25-110/r25-62/r25-72/r22-9/r8-0/r18-23/r18-7/r18-11/r3-73/r25-99/r25-73/r25-92/r25-41/w33-3/r0-107/w19-0/w31-0/r32-19/r3-114/w32-4/w29-1/w32-8/r35-0/r
34-1/r3-92.0
+d.3932
+2.RCS.31979.r9-2/r0-106/r3-42/w7-2/r3-20/r0-109/r3-41/r0-71/w6-1/r0-26/w7-0/r0-75/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+d.1568
+1.RCS.6364.r0-58/r3-80/r22-31/r3-41/r3-42/r9-2/w32-0/r3-18/r22-1/r9-5/r3-78/r3-98/r3-75/r3-104/r3-118/r3-6/r3-70/r30-0/r35-0/r34-1/r34-0/r32-19/r3-1/r3-113/w33-2/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/w27-1/r0-32/r32-8/r0-107/w28-0/r3-91/w28-1/r3-93/r3-27/w32-14/w32-16.0
+2.RCS.1000.r9-2/r3-41/r3-27/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.6617.r9-2/r33-2/r3-6/r22-31/r3-27/w0-103/w0-29/r3-41/r2-54.0
+1.RCS.13317.r0-58/r3-80/r22-31/r3-41/r3-27/r9-2/w32-18/r3-18/r22-14/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-29/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6237.r3-80/r22-31/r3-41/r3-27/r9-2/w9-5/r0-68/r0-58/w32-19/r3-18/r22-14/r3-78/r3-88/r22-5/r22-6/r22-29/r22-7/r22-1/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-48/r22-20/r25-99/r22-16/r21-0/r0-67/r3-47/r0-115/r0-35/w28-2/r0-107/w8-0/r0-19.0
+d.38304
+2.RCS.1901.r9-2/r28-2/r3-27/r22-31/w8-0/r2-9/r20-0/w22-23/r3-47/r3-95/r0-58/w22-10/r3-80.0
+d.20018 +1.RCS.31362.r3-47/w27-0/r0-58/r3-80/r22-31/r3-27/r9-2/w34-0/r3-18/r3-41/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-92/r25-40/r3-90/r22-20/r0-87/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-87/r3-108/r3-26/r3-96/r22-29/r22-14/r3-68/r3-112/r3-103/r22-5/r3-49/r3-12/r22-6/r3-85/r25-14/r3-6/r25-104/r22-28/r24-23/r25-44/r25-19/r3-67/r18-17/r4-5/r18-4/r25-111/r3-66/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r22-7/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r18-19/r18-26/r18-21/r3-2/r3-117/r3-33/r22-2/r25-51/r25-64/r25-70/r25-105/r25-61/r25-11/r25-75/r25-20/r25-91/r25-55/r25-66/r25-24/r25-68/r25-86/r25-26/r22-21/r25-82/r25-77/r25-33/r22-10/r25-110/r25-62/r25-72/r22-9/r8-0/r18-23/r18-7/r18-11/r3-73/r25-99/r25-73/r25-92/r25-41/w33-3/r0-107/w19-0/w31-0/r32-19/r3-114/w32-4/w29-1/w32-8/r35-0/
r34-1/r3-92.0
+d.1960
+2.RCS.32169.r9-2/r0-22/r3-27/w7-2/r3-47/r0-109/r0-53/w6-1/r0-60/w7-0/r0-97/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.6329.r0-58/r3-80/r22-31/r3-47/r3-27/r9-2/w32-0/r3-18/r22-1/r9-5/r3-78/r3-98/r3-75/r3-104/r3-118/r3-6/r3-70/r30-0/r35-0/r34-1/r34-0/r32-19/r3-1/r3-113/w33-2/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7/w27-1/r0-32/r32-8/r0-107/w28-0/r3-91/r3-110/w28-1/r3-60/r3-93/w32-14/w32-16.0
+2.RCS.1000.r9-2/r3-60/r3-110/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.6597.r9-2/r33-2/r3-6/r22-31/r3-110/w0-103/w0-98/r3-60/r2-54.0
+1.RCS.13180.r0-58/r3-80/r22-31/r3-60/r3-110/r9-2/w32-18/r3-18/r3-47/r22-14/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-98/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6083.r3-80/r22-31/r3-60/r3-110/r9-2/w9-5/r0-84/r0-58/w32-19/r3-18/r3-47/r22-14/r3-78/r3-88/r22-5/r22-6/r22-29/r22-7/r22-1/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-76/r22-20/r9-4/r25-99/r22-16/r21-0/r0-88/r0-45/r0-64/w28-2/r0-107/w8-0/r0-42.0
+d.31011
+2.RCS.1752.r0-58/r9-4/r28-2/r3-110/r22-31/w8-0/r2-47/r20-0/w22-23/r3-60/r3-95/w22-10/r3-80.0
+d.8789 +1.RCS.1000.r3-60/w27-0/r0-58/r3-80/r22-31/r3-110/r9-4/w34-0/r3-18/r3-47/r21-0/r9-5/r3-78/r25-4/r3-104/r3-23/r30-0/r3-88/r22-27/r22-1/r25-45/r3-50/r22-12/r22-22/r22-3/r22-0/r25-56/r3-4/r22-15/r25-113/r3-7/r22-18/r25-60/r3-81/r25-21/r3-89/r18-5/r3-93/r17-8/r25-28/r25-87/r25-9/r25-13/r25-42/r25-90/r22-16/r34-2/r3-15/w3-64/r0-52/r25-99/r25-73/r3-6/r25-40/r3-90/r22-20/r0-68/w32-17/w32-16/w32-3/w32-1/w33-2/r28-2/r3-98/r3-85/r25-14/r3-12/r3-87/r3-108/r3-26/r3-96/r22-29/r22-14/r3-68/r3-112/r3-103/r22-5/r3-49/r22-6/r25-104/r22-28/r24-23/r25-44/r25-19/r3-67/r18-17/r4-5/r18-4/r25-111/r3-66/r25-81/r25-78/r25-37/r25-50/r25-102/r25-35/r22-7/r18-18/r18-13/r18-12/r3-69/r3-19/r3-100/r18-19/r18-26/r18-21/r3-2/r3-117/r3-33/r22-2/r25-51/r25-64/r25-70/r25-105/r25-61/r25-11/r25-75/r25-20/r25-91/r25-55/r25-66/r25-24/r25-68/r25-86/r25-26/r22-21/r25-82/r25-77/r25-33/r22-10/r25-110/r25-62/r25-72/r22-9/r8-0/r18-23/r18-7/r18-11/r3-73/r25-92/r25-41/w33-3/r0-107/w19-0/w31-0/r3-74/r32-19/r3-0/r3-114/w32-4/w29-1/w
32-8.0
+d.3470
+1.RCS.32141.r9-4/r3-60/r3-18/r3-74/r22-3/r22-31/r9-5/w32-8/r3-98/r32-17/r3-6/r32-3/r32-1/w33-2/r29-1/r30-0/r3-104/r35-0/r34-1/r34-0/r3-78/r3-80/r3-92/r0-107/r34-2/r22-12/r22-1/r0-58/r3-0/w32-0/r3-75/r3-118/r3-70/r32-19/r3-1/r3-113/r22-29/r22-14/r3-109/r3-28/r3-79/r22-7.0
+d.2303
+2.RCS.33018.r9-4/r0-48/r3-0/w7-2/r3-60/r0-109/r3-74/r0-67/w6-1/r0-115/w7-0/r0-35/w7-1/r0-58/r32-8/r3-6/r22-31/w0-2/r3-113/r9-5/w0-32.0
+1.RCS.5660.r0-58/r3-80/r22-31/r3-74/r3-0/r9-4/w27-1/r3-18/r3-60/r22-14/r9-5/r0-32/r3-6/r32-8/r3-78/r3-113/r0-107/w28-0/r3-98/r3-91/w28-1/r3-93/w32-14/r32-0/r33-2/w32-16.0
+d.1494
+2.RCS.1000.r9-4/r3-74/r3-0/r32-16/r3-93/w4-16/r0-3/w3-122/r3-91/r0-58.0
+2.RCS.5873.r9-4/r33-2/r3-6/r22-31/r3-0/w0-103/w0-19/r3-74/r2-54.0
+d.1151
+1.RCS.12578.r0-58/r3-80/r22-31/r3-74/r3-0/r9-4/w32-18/r3-18/r3-60/r22-14/r9-5/r3-98/r32-14/r3-93/r33-2/r3-6/r32-16/r3-122/r3-106/r3-78/r2-54/r0-107/w32-7/w32-11/w32-2/r33-0/r25-116/r0-19/r16-0/r28-3/r0-3/r0-111/r22-32/r10-58/r4-13/r4-3/r4-1.0
+1.RCS.6159.r3-80/r22-31/r3-74/r3-0/r9-4/w9-5/r0-92/r0-58/w32-19/r3-18/r3-60/r22-14/r3-78/r3-88/r22-5/r22-6/r22-29/r22-7/r22-1/r22-12/r22-18/r22-28/r22-3/r22-0/r3-75/r3-104/w3-64/r0-87/r22-20/r25-99/r22-16/r21-0/r0-106/r0-71/r0-26/w28-2/r0-107/w8-0/r0-75.0

Signature · 6 lines
2.20.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Acked-by on v1 8/11
#13 lore raw

Re: [igt-dev] [Intel-gfx] [PATCH i-g-t 08/11] gem_wsim: Snippet of a workload extracted from carchase

Quoting Tvrtko Ursulin (2020-06-18 11:47:44)

Quoted 5 lines

From: Tvrtko Ursulin <[email protected]>

Some frames from the middle of a demo with corresponding buffers.

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#14 lore raw

PATCH 9/11 gem_wsim: Implement device selection

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

New command line options -L and -D <device> can respectively be used to list and select a GPU when more than one is present.

---
 benchmarks/gem_wsim.c | 62 +++++++++++++++++++++++++++++++------------
 1 file changed, 45 insertions(+), 17 deletions(-)
benchmarks/gem_wsim.c +45 -17
index 8788f752121b..59ddc798a3ea 100644
@@ -43,6 +43,7 @@
 #include <pthread.h>
 #include <math.h>
 
+#include "igt_device_scan.h"
 #include "intel_chipset.h"
 #include "intel_reg.h"
 #include "drm.h"
@@ -2611,7 +2612,9 @@ static void print_help(void)
 "                    clients.\n"
 "  -d                Sync between data dependencies in userspace.\n"
 "  -f <scale>        Scale factor for batch durations.\n"
-"  -F <scale>        Scale factor for delays."
+"  -F <scale>        Scale factor for delays.\n"
+"  -L                List GPUs.\n"
+"  -D <gpu>          One of the GPUs from -L."
 	);
 }
 
@@ -2672,31 +2675,32 @@ int main(int argc, char **argv)
 	char *append_workload_arg = NULL;
 	struct w_arg *w_args = NULL;
 	unsigned int tolerance_pct = 1;
+	enum igt_devices_print_type printtype = IGT_PRINT_SIMPLE;
+	bool list_devices_arg = false;
 	int exitcode = EXIT_FAILURE;
+	struct igt_device_card card;
 	double scale_time = 1.0f;
 	double scale_dur = 1.0f;
+	char *device_arg = NULL;
 	int prio = 0;
 	double t;
-	int i, c;
+	int i, c, ret;
 	char *subopts, *value;
 	int raw_number = 0;
 	long calib_val;
 	int eng;
 
-	/*
-	 * Open the device via the low-level API so we can do the GPU quiesce
-	 * manually as close as possible in time to the start of the workload.
-	 * This minimizes the gap in engine utilization tracking when observed
-	 * via external tools like trace.pl.
-	 */
-	fd = __drm_open_driver_render(DRIVER_INTEL);
-	igt_require(fd);
-
 	master_prng = time(NULL);
 
 	while ((c = getopt(argc, argv,
-			   "ThqvsSdc:n:r:w:W:a:t:p:I:f:F:")) != -1) {
+			   "LThqvsSdc:n:r:w:W:a:t:p:I:f:F:D:")) != -1) {
 		switch (c) {
+		case 'L':
+			list_devices_arg = true;
+			break;
+		case 'D':
+			device_arg = strdup(optarg);
+			break;
 		case 'W':
 			if (master_workload >= 0) {
 				wsim_err("Only one master workload can be given!\n");
@@ -2820,6 +2824,33 @@ int main(int argc, char **argv)
 		}
 	}
 
+
+	igt_devices_scan(false);
+
+	if (list_devices_arg) {
+		igt_devices_print(printtype);
+		return EXIT_SUCCESS;
+	}
+
+	if (device_arg) {
+		ret = igt_device_card_match(device_arg, &card);
+		if (!ret) {
+			wsim_err("Requested device %s not found!\n", device_arg);
+			free(device_arg);
+
+			return EXIT_FAILURE;
+		}
+		free(device_arg);
+	} else {
+		igt_device_find_first_i915_discrete_card(&card);
+	}
+
+	if (card.render[0])
+		fd = igt_open_render(&card);
+	else
+		fd = __drm_open_driver_render(DRIVER_INTEL);
+	igt_require(fd);
+
 	if (!has_nop_calibration) {
 		if (verbose > 1) {
 			printf("Calibrating nop delays with %u%% tolerance...\n",
@@ -2932,15 +2963,12 @@ int main(int argc, char **argv)
 	clock_gettime(CLOCK_MONOTONIC, &t_start);
 
 	for (i = 0; i < clients; i++) {
-		int ret;
-
 		ret = pthread_create(&w[i]->thread, NULL, run_workload, w[i]);
 		igt_assert_eq(ret, 0);
 	}
 
 	if (master_workload >= 0) {
-		int ret = pthread_join(w[master_workload]->thread, NULL);
-
+		ret = pthread_join(w[master_workload]->thread, NULL);
 		igt_assert(ret == 0);
 
 		for (i = 0; i < clients; i++)
@@ -2949,7 +2977,7 @@ int main(int argc, char **argv)
 
 	for (i = 0; i < clients; i++) {
 		if (master_workload != i) {
-			int ret = pthread_join(w[i]->thread, NULL);
+			ret = pthread_join(w[i]->thread, NULL);
 			igt_assert(ret == 0);
 		}
 	}
Signature · 6 lines
2.20.1

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
#15 lore raw

PATCH 10/11 gem_wsim: Fix calibration handling

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

Intended use case was that run without arguments prints out the calibrations which can be simply copied and pasted to the -n argument and things should just work.

Two problems we need to solve: If the print out loops shows zero calibrations (engine not present) they are later rejected and also if some calibration is not given it is only an error if it needs to be used (engine present).

---
 benchmarks/gem_wsim.c | 20 ++------------------
 1 file changed, 2 insertions(+), 18 deletions(-)
benchmarks/gem_wsim.c +2 -18
index 59ddc798a3ea..811a4b1b7161 100644
@@ -296,8 +296,8 @@ print_engine_calibrations(void)
 
 	printf("Nop calibration for %uus delay is: ", nop_calibration_us);
 	for (int i = 0; i < NUM_ENGINES; i++) {
-		/* skip DEFAULT and VCS engines */
-		if (i != DEFAULT && i != VCS) {
+		/* skip engines not present and DEFAULT and VCS */
+		if (i != DEFAULT && i != VCS && engine_calib_map[i]) {
 			if (first_entry) {
 				printf("%s=%lu", ring_str_map[i], engine_calib_map[i]);
 				first_entry = false;
@@ -2862,22 +2862,6 @@ int main(int argc, char **argv)
 		if (verbose)
 			print_engine_calibrations();
 		goto out;
-	} else {
-		bool missing = false;
-
-		for (i = 0; i < NUM_ENGINES; i++) {
-			if (i == VCS)
-				continue;
-
-			if (!engine_calib_map[i]) {
-				wsim_err("Missing calibration for '%s'!\n",
-					 ring_str_map[i]);
-				missing = true;
-			}
-		}
-
-		if (missing)
-			goto err;
 	}
 
 	if (!nr_w_args) {
Signature · 6 lines
2.20.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Reviewed-by on v1 10/11
#16 lore raw

Re: [igt-dev] [PATCH i-g-t 10/11] gem_wsim: Fix calibration handling

Quoting Tvrtko Ursulin (2020-06-18 11:47:46)

Quoted 6 lines

From: Tvrtko Ursulin <[email protected]>

Intended use case was that run without arguments prints out the calibrations which can be simply copied and pasted to the -n argument and things should just work.

Quoted 6 lines

Two problems we need to solve: If the print out loops shows zero calibrations (engine not present) they are later rejected and also if some calibration is not given it is only an error if it needs to be used (engine present).

Good enough,

-Chris
_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

#17 lore raw

PATCH 11/11 gem_wsim: Do not keep batch mapped unless needed

In reply to Tvrtko Ursulin

From: Tvrtko Ursulin <[email protected]>

At this point we only need to keep the mapping for infinite batch buffers.

---
 benchmarks/gem_wsim.c | 5 +++++
 1 file changed, 5 insertions(+)
benchmarks/gem_wsim.c +5 -0
index 811a4b1b7161..496e5042d89c 100644
@@ -1449,6 +1449,7 @@ static unsigned int terminate_bb(struct w_step *w)
 	const uint32_t bbe = 0xa << 23;
 	unsigned long mmap_start, mmap_len;
 	unsigned long batch_start = w->bb_sz;
+	bool keep_mmap = false;
 	unsigned int r = 0;
 	uint32_t *ptr, *cs;
 
@@ -1472,6 +1473,7 @@ static unsigned int terminate_bb(struct w_step *w)
 
 		*cs++ = w->preempt_us ? 0x5 << 23 /* MI_ARB_CHK; */ : MI_NOOP;
 		w->recursive_bb_start = cs;
+		keep_mmap = true;
 		*cs++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
 		*cs++ = 0;
 		*cs++ = 0;
@@ -1479,6 +1481,9 @@ static unsigned int terminate_bb(struct w_step *w)
 
 	*cs = bbe;
 
+	if (!keep_mmap)
+		munmap(ptr, mmap_len);
+
 	return r;
 }
 
Signature · 6 lines
2.20.1

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev
#18 lore raw

[igt-dev] ✗ Fi.CI.BUILD: failure for series starting with [i-g-t,01/11] gem_wsim: Rip out userspace balancing

In reply to Tvrtko Ursulin
== Series Details ==

== Series Details ==

Series: series starting with [i-g-t,01/11] gem_wsim: Rip out userspace balancing
URL : https://patchwork.freedesktop.org/series/78525/
State : failure

== Summary ==

Applying: gem_wsim: Rip out userspace balancing
Applying: gem_wsim: Buffer objects working sets and complex dependencies
Applying: gem_wsim: Show workload timing stats
Applying: gem_wsim: Move BO allocation to a helper
Applying: gem_wsim: Support random buffer sizes
Applying: gem_wsim: Support scaling workload batch durations
Applying: gem_wsim: Log max and active working set sizes in verbose mode
Applying: gem_wsim: Snippet of a workload extracted from carchase Patch failed at 0008 gem_wsim: Snippet of a workload extracted from carchase When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort".

_______________________________________________
igt-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/igt-dev

Acked-by on v1 1/11
#19 lore raw
In reply to Tvrtko Ursulin

Quoting Tvrtko Ursulin (2020-06-18 11:47:37)

Quoted 5 lines

From: Tvrtko Ursulin <[email protected]>

Evaluation of userspace load balancing options was how this tool started but since we have settled on doing it in the kernel.

Quoted 7 lines

Tomorrow we will want to update the tool for new engine interfaces and all this legacy code will just be a distraction.

Rip out everything not related to explicit load balancing implemented via context engine maps and adjust the workloads to use it.

-Chris
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx