diff mbox series

[i-g-t,14/15] gem_wsim: Fix prng usage

Message ID 20190522155720.28723-15-tvrtko.ursulin@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series Remaining bits of Virtual Engine tooling | expand

Commit Message

Tvrtko Ursulin May 22, 2019, 3:57 p.m. UTC
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Back when gem_wsim used forking it was safe to use the common storage
prng, but after converting to threads it no longer is.

Fix by storing and using a new per workload seed for batch buffer
duration randomness.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 benchmarks/gem_wsim.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

Comments

Chris Wilson May 22, 2019, 4:51 p.m. UTC | #1
Quoting Tvrtko Ursulin (2019-05-22 16:57:19)
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> 
> Back when gem_wsim used forking it was safe to use the common storage
> prng, but after converting to threads it no longer is.
> 
> Fix by storing and using a new per workload seed for batch buffer
> duration randomness.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

But I suggest squashing this with the following patch as this introduces
a variable random seed; and the next patch allows it to be
pre-determined again.
-Chris
diff mbox series

Patch

diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
index 0ccb271575f7..c43bbbc8c94d 100644
--- a/benchmarks/gem_wsim.c
+++ b/benchmarks/gem_wsim.c
@@ -193,6 +193,7 @@  struct workload
 	unsigned int flags;
 	bool print_stats;
 
+	uint32_t bb_prng;
 	uint32_t prng;
 
 	struct timespec repeat_start;
@@ -240,6 +241,8 @@  struct workload
 static const unsigned int nop_calibration_us = 1000;
 static unsigned long nop_calibration;
 
+static unsigned int master_prng;
+
 static unsigned int context_vcs_rr;
 
 static int verbose = 1;
@@ -1067,14 +1070,14 @@  clone_workload(struct workload *_wrk)
 #define PAGE_SIZE (4096)
 #endif
 
-static unsigned int get_duration(struct w_step *w)
+static unsigned int get_duration(struct workload *wrk, struct w_step *w)
 {
 	struct duration *dur = &w->duration;
 
 	if (dur->min == dur->max)
 		return dur->min;
 	else
-		return dur->min + hars_petruska_f54_1_random_unsafe() %
+		return dur->min + hars_petruska_f54_1_random(&wrk->bb_prng) %
 		       (dur->max + 1 - dur->min);
 }
 
@@ -1448,6 +1451,7 @@  prepare_workload(unsigned int id, struct workload *wrk, unsigned int flags)
 
 	wrk->id = id;
 	wrk->prng = rand();
+	wrk->bb_prng = (wrk->flags & SYNCEDCLIENTS) ? master_prng : rand();
 	wrk->run = true;
 
 	ctx_vcs =  0;
@@ -2607,7 +2611,7 @@  do_eb(struct workload *wrk, struct w_step *w, enum intel_engine_id engine,
 	w->eb.batch_start_offset =
 		w->unbound_duration ?
 		0 :
-		ALIGN(w->bb_sz - get_bb_sz(get_duration(w)),
+		ALIGN(w->bb_sz - get_bb_sz(get_duration(wrk, w)),
 		      2 * sizeof(uint32_t));
 
 	for (i = 0; i < w->fence_deps.nr; i++) {
@@ -2676,9 +2680,6 @@  static void *run_workload(void *data)
 
 	clock_gettime(CLOCK_MONOTONIC, &t_start);
 
-	hars_petruska_f54_1_random_seed((wrk->flags & SYNCEDCLIENTS) ?
-					0 : wrk->id);
-
 	init_status_page(wrk, INIT_ALL);
 	for (count = 0; wrk->run && (wrk->background || count < wrk->repeat);
 	     count++) {
@@ -3117,6 +3118,10 @@  int main(int argc, char **argv)
 
 	init_clocks();
 
+	master_prng = time(NULL);
+	srand(master_prng);
+	master_prng = rand();
+
 	while ((c = getopt(argc, argv,
 			   "hqv2RsSHxGdc:n:r:w:W:a:t:b:p:")) != -1) {
 		switch (c) {