[Intel-gfx] [PATCH 1/1] intel: align reuse buffer's size on page size instead

Chris Wilson chris at chris-wilson.co.uk
Sat Mar 3 09:45:37 UTC 2018


Quoting James Xiong (2018-03-02 17:53:04)
> From: "Xiong, James" <james.xiong at intel.com>
> 
> With gem_reuse enabled, when a buffer size is different than
> the sizes of buckets, it is aligned to the next bucket's size,
> which means about 25% more memory than the requested is allocated
> in the worst senario. For example:
> 
> Orignal size    Actual
> 32KB+1Byte      40KB
> .
> .
> .
> 8MB+1Byte       10MB
> .
> .
> .
> 96MB+1Byte      112MB
> 
> This is very memory expensive and make the reuse feature less
> favorable than it deserves to be.
> 
> This commit aligns the reuse buffer size on page size instead,
> the buffer whose size falls between bucket[n] and bucket[n+1] is
> put in bucket[n] when it's done; And when searching for a cached
> buffer for reuse, it goes through the cached buffers list in the
> bucket until a cached buffer, whose size is larger than or equal
> to the requested size, is found.
> 
> Performed gfxbench tests, the performances and reuse ratioes
> (reuse count/allocation count) were same as before, saved memory
> usage by 1% ~ 7%(gl_manhattan: peak allocated memory size was
> reduced from 448401408 to 419078144).

Apart from GL doesn't use this... And what is the impact on !llc, where
buffer reuse is more important? (Every new buffer requires clflushing.)

> Signed-off-by: Xiong, James <james.xiong at intel.com>
> ---
>  intel/intel_bufmgr_gem.c | 180 +++++++++++++++++++++++++----------------------
>  libdrm_lists.h           |   6 ++
>  2 files changed, 101 insertions(+), 85 deletions(-)
> 
> diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
> index 386da30..5b2d0d0 100644
> --- a/intel/intel_bufmgr_gem.c
> +++ b/intel/intel_bufmgr_gem.c
> @@ -402,11 +402,10 @@ drm_intel_gem_bo_bucket_for_size(drm_intel_bufmgr_gem *bufmgr_gem,
>  {
>         int i;
>  
> -       for (i = 0; i < bufmgr_gem->num_buckets; i++) {
> -               struct drm_intel_gem_bo_bucket *bucket =
> -                   &bufmgr_gem->cache_bucket[i];
> -               if (bucket->size >= size) {
> -                       return bucket;
> +       for (i = 0; i < bufmgr_gem->num_buckets - 1; i++) {
> +               if (size >= bufmgr_gem->cache_bucket[i].size &&
> +                   size < bufmgr_gem->cache_bucket[i+1].size) {
> +                       return &bufmgr_gem->cache_bucket[i];

Are your buckets not ordered correctly?

Please reduce this patch to a series of small functional changes required to
bring into effect having mixed, page-aligned bo->size within a bucket.
-Chris


More information about the dri-devel mailing list