summaryrefslogtreecommitdiff
path: root/benchmarks
diff options
context:
space:
mode:
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>2019-05-22 16:57:19 +0100
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>2019-05-23 15:12:13 +0100
commitccc473acb1eaf47f3cef9af9fec06bc53d047835 (patch)
treee65acd5bc33d46c16f5c4a2541b2b92c7944527b /benchmarks
parente8fd4938a42945e9e28cd7004adf2e31ded3d394 (diff)
gem_wsim: Fix prng usage
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>
Diffstat (limited to 'benchmarks')
-rw-r--r--benchmarks/gem_wsim.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
index 0ccb2715..c43bbbc8 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) {