[Intel-gfx] [PATCH i-g-t 05/10] gem_wsim: Support random buffer sizes

Chris Wilson chris at chris-wilson.co.uk
Wed Jun 17 16:31:17 UTC 2020


Quoting Tvrtko Ursulin (2020-06-17 17:01:15)
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> 
> See README for more details.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>  benchmarks/gem_wsim.c  | 71 +++++++++++++++++++++++++++++++++---------
>  benchmarks/wsim/README |  4 +++
>  2 files changed, 61 insertions(+), 14 deletions(-)
> 
> diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
> index 5893de38a98e..c1405596c46a 100644
> --- a/benchmarks/gem_wsim.c
> +++ b/benchmarks/gem_wsim.c
> @@ -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;
>  
> @@ -757,10 +764,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;
>         unsigned int add, i;
> -       char *n;
>  
>         n = index(str, 'n');
>         if (n) {
> @@ -773,16 +782,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;
> @@ -824,7 +851,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))) { \
> @@ -1177,10 +1204,12 @@ add_step:
>  
>         wrk->nr_steps = nr_steps;
>         wrk->steps = steps;
> +       wrk->flags = flags;
>         wrk->prio = arg->prio;
>         wrk->sseu = arg->sseu;
>         wrk->max_working_set_id = -1;
>         wrk->working_sets = NULL;
> +       wrk->bo_prng = (wrk->flags & SYNCEDCLIENTS) ? master_prng : rand();
>  
>         free(desc);
>  
> @@ -1234,7 +1263,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;
> @@ -1267,6 +1296,7 @@ clone_workload(struct workload *_wrk)
>         igt_assert(wrk);
>         memset(wrk, 0, sizeof(*wrk));
>  
> +       wrk->flags = _wrk->flags;
>         wrk->prio = _wrk->prio;
>         wrk->sseu = _wrk->sseu;
>         wrk->nr_steps = _wrk->nr_steps;

wrk->flags wasn't introduced in this patch, why are we needing to copy
them now.

I see wrk->bo_prn = flags & SYNC above, but I haven't seem them used
again later. They used to carry the balancer info and were setup in
main. Am I not mistaken in thinking they still are being set in main()
as well?
-Chris


More information about the Intel-gfx mailing list