[Mesa-dev] [PATCH] radv/winsys: replace bo list searchs with a hash table.

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu Jan 11 09:37:36 UTC 2018


mmh, last time I tried to use a hash table for the amdgpu winsys of 
RadeonSI it was *worse*, so not sure if that really helps.

Though, I don't have any numbers to show you because it was a while ago.

On 01/11/2018 04:53 AM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> This should make the merging of cmd buffers less CPU intensive,
> note I said *should* :)
> ---
>   src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 47 ++++++++++++---------------
>   1 file changed, 20 insertions(+), 27 deletions(-)
> 
> diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> index 0ee56f91447..9a39d237ae8 100644
> --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> @@ -33,6 +33,7 @@
>   #include "radv_amdgpu_bo.h"
>   #include "sid.h"
>   
> +#include "util/hash_table.h"
>   
>   enum {
>   	VIRTUAL_BUFFER_HASH_TABLE_SIZE = 1024
> @@ -584,6 +585,9 @@ static int radv_amdgpu_create_bo_list(struct radv_amdgpu_winsys *ws,
>   			priorities[0] = 8;
>   		}
>   
> +		struct hash_table *ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
> +								_mesa_key_pointer_equal);
> +
>   		for (unsigned i = 0; i < count + !!extra_cs; ++i) {
>   			struct radv_amdgpu_cs *cs;
>   
> @@ -595,50 +599,39 @@ static int radv_amdgpu_create_bo_list(struct radv_amdgpu_winsys *ws,
>   			if (!cs->num_buffers)
>   				continue;
>   
> -			if (unique_bo_count == 0) {
> -				memcpy(handles, cs->handles, cs->num_buffers * sizeof(amdgpu_bo_handle));
> -				memcpy(priorities, cs->priorities, cs->num_buffers * sizeof(uint8_t));
> -				unique_bo_count = cs->num_buffers;
> -				continue;
> -			}
> -			int unique_bo_so_far = unique_bo_count;
>   			for (unsigned j = 0; j < cs->num_buffers; ++j) {
> -				bool found = false;
> -				for (unsigned k = 0; k < unique_bo_so_far; ++k) {
> -					if (handles[k] == cs->handles[j]) {
> -						found = true;
> -						priorities[k] = MAX2(priorities[k],
> -								     cs->priorities[j]);
> -						break;
> -					}
> -				}
> -				if (!found) {
> +				struct hash_entry *entry = _mesa_hash_table_search(ht, (void *)cs->handles[j]);
> +				if (!entry) {
> +					_mesa_hash_table_insert(ht, (void *)cs->handles[j], (void *)(uintptr_t)unique_bo_count);
>   					handles[unique_bo_count] = cs->handles[j];
>   					priorities[unique_bo_count] = cs->priorities[j];
>   					++unique_bo_count;
> +				} else {
> +					int bo_idx = (uint32_t)(unsigned long)entry->data;
> +					priorities[bo_idx] = MAX2(priorities[bo_idx],
> +								  cs->priorities[j]);
>   				}
>   			}
>   			for (unsigned j = 0; j < cs->num_virtual_buffers; ++j) {
>   				struct radv_amdgpu_winsys_bo *virtual_bo = radv_amdgpu_winsys_bo(cs->virtual_buffers[j]);
>   				for(unsigned k = 0; k < virtual_bo->bo_count; ++k) {
>   					struct radv_amdgpu_winsys_bo *bo = virtual_bo->bos[k];
> -					bool found = false;
> -					for (unsigned m = 0; m < unique_bo_count; ++m) {
> -						if (handles[m] == bo->bo) {
> -							found = true;
> -							priorities[m] = MAX2(priorities[m],
> -									cs->virtual_buffer_priorities[j]);
> -							break;
> -						}
> -					}
> -					if (!found) {
> +
> +					struct hash_entry *entry = _mesa_hash_table_search(ht, (void *)bo->bo);
> +					if (!entry) {
> +						_mesa_hash_table_insert(ht, (void *)bo->bo, (void *)(uintptr_t)unique_bo_count);
>   						handles[unique_bo_count] = bo->bo;
>   						priorities[unique_bo_count] = cs->virtual_buffer_priorities[j];
>   						++unique_bo_count;
> +					} else {
> +						int bo_idx = (uint32_t)(unsigned long)entry->data;
> +						priorities[bo_idx] = MAX2(priorities[bo_idx],
> +									  cs->virtual_buffer_priorities[j]);
>   					}
>   				}
>   			}
>   		}
> +		_mesa_hash_table_destroy(ht, NULL);
>   
>   		if (unique_bo_count > 0) {
>   			r = amdgpu_bo_list_create(ws->dev, unique_bo_count, handles,
> 


More information about the mesa-dev mailing list