anv: Use vma_heap for descriptor pool host allocation
authorChad Versace <chadversary@chromium.org>
Thu, 8 Dec 2022 19:28:22 +0000 (11:28 -0800)
committerMarge Bot <emma+marge@anholt.net>
Fri, 16 Dec 2022 07:18:38 +0000 (07:18 +0000)
commita5f9e59ce357c2974a97004d943aae92ad6f5004
tree77a4ef5a6b0c0cdcb02b44f9b58faaa6c2b0713f
parent94a6384f1b7785d255f66b5d5c237c98f6611760
anv: Use vma_heap for descriptor pool host allocation

Pre-patch, anv_descriptor_pool used a free list for host allocations
that never merged adjacent free blocks.  If the pool only allocated
fixed-sized blocks, then this would not be a problem. But the pool
allocations are variable-sized, and this caused over half of the pool's
memory to be consumed by unusable free blocks in some workloads, causing
unnecessary memory footprint.

Replacing the free list with util_vma_heap, which does merge adjacent
free blocks, fixes the memory explosion in the target workload.

Disdavantges of util_vma_heap compared to the free list:
  - The heap calls malloc() when a new hole is created.
  - The heap calls free() when a hole disappears or is merged with an
    adjacent hole.
  - The Vulkan spec expects descriptor set creation/destruction to be
    thread-local lockless in the common case. For workloads that
    create/destroy with high frequency, malloc/free may cause overhead.
    Profiling is needed.

Tested with a ChromeOS internal TensorFlow benchmark, provided by
package 'tensorflow', running with its OpenCL backend on clvk.

  cmdline: benchmark_model --graph=mn2.tflite --use_gpu=true --min_secs=60
  gpu: adl
  memory footprint from start of benchmark:
    before: init=132.691MB max=227.684MB
    after:  init=134.988MB max=134.988MB

Reported-by: Romaric Jodin <rjodin@google.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20289>
src/intel/vulkan/anv_descriptor_set.c
src/intel/vulkan/anv_private.h