mirror of https://gitlab.freedesktop.org/mesa/mesa
tu: Retain allocated CSes in tu_autotune_on_submit
It was determined that a significant part of queue submission overhead was from allocation/freeing of CSes constantly inside `tu_autotune_on_submit`. This has been reduced by retaining instances of `tu_submission_data` with their corresponding CSes, this results in entirely eliminating that overhead as resetting a CS is a very cheap operation compared to allocation or even freeing it wholly. Signed-off-by: Mark Collins <mark@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18461>
This commit is contained in:
parent
762d377292
commit
21aec585c1
|
@ -100,8 +100,14 @@ static struct tu_submission_data *
|
||||||
create_submission_data(struct tu_device *dev, struct tu_autotune *at,
|
create_submission_data(struct tu_device *dev, struct tu_autotune *at,
|
||||||
uint32_t fence)
|
uint32_t fence)
|
||||||
{
|
{
|
||||||
struct tu_submission_data *submission_data =
|
struct tu_submission_data *submission_data = NULL;
|
||||||
calloc(1, sizeof(struct tu_submission_data));
|
if (!list_is_empty(&at->submission_data_pool)) {
|
||||||
|
submission_data = list_first_entry(&at->submission_data_pool,
|
||||||
|
struct tu_submission_data, node);
|
||||||
|
list_del(&submission_data->node);
|
||||||
|
} else {
|
||||||
|
submission_data = calloc(1, sizeof(struct tu_submission_data));
|
||||||
|
}
|
||||||
submission_data->fence = fence;
|
submission_data->fence = fence;
|
||||||
|
|
||||||
struct tu_cs* fence_cs = &submission_data->fence_cs;
|
struct tu_cs* fence_cs = &submission_data->fence_cs;
|
||||||
|
@ -120,6 +126,15 @@ create_submission_data(struct tu_device *dev, struct tu_autotune *at,
|
||||||
return submission_data;
|
return submission_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
finish_submission_data(struct tu_autotune *at,
|
||||||
|
struct tu_submission_data *data)
|
||||||
|
{
|
||||||
|
list_del(&data->node);
|
||||||
|
list_addtail(&data->node, &at->submission_data_pool);
|
||||||
|
tu_cs_reset(&data->fence_cs);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_submission_data(struct tu_submission_data *data)
|
free_submission_data(struct tu_submission_data *data)
|
||||||
{
|
{
|
||||||
|
@ -265,7 +280,7 @@ process_results(struct tu_autotune *at, uint32_t current_fence)
|
||||||
if (fence_before(current_fence, submission_data->fence))
|
if (fence_before(current_fence, submission_data->fence))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
free_submission_data(submission_data);
|
finish_submission_data(at, submission_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,6 +411,7 @@ tu_autotune_init(struct tu_autotune *at, struct tu_device *dev)
|
||||||
|
|
||||||
list_inithead(&at->pending_results);
|
list_inithead(&at->pending_results);
|
||||||
list_inithead(&at->pending_submission_data);
|
list_inithead(&at->pending_submission_data);
|
||||||
|
list_inithead(&at->submission_data_pool);
|
||||||
|
|
||||||
/* start from 1 because tu6_global::autotune_fence is initialized to 0 */
|
/* start from 1 because tu6_global::autotune_fence is initialized to 0 */
|
||||||
at->fence_counter = 1;
|
at->fence_counter = 1;
|
||||||
|
@ -434,6 +450,11 @@ tu_autotune_fini(struct tu_autotune *at, struct tu_device *dev)
|
||||||
free_submission_data(submission_data);
|
free_submission_data(submission_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_for_each_entry_safe(struct tu_submission_data, submission_data,
|
||||||
|
&at->submission_data_pool, node) {
|
||||||
|
free_submission_data(submission_data);
|
||||||
|
}
|
||||||
|
|
||||||
_mesa_hash_table_destroy(at->ht, NULL);
|
_mesa_hash_table_destroy(at->ht, NULL);
|
||||||
u_rwlock_destroy(&at->ht_lock);
|
u_rwlock_destroy(&at->ht_lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,11 @@ struct tu_autotune {
|
||||||
*/
|
*/
|
||||||
struct list_head pending_submission_data;
|
struct list_head pending_submission_data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of per-submission data that has been finished and can be reused.
|
||||||
|
*/
|
||||||
|
struct list_head submission_data_pool;
|
||||||
|
|
||||||
uint32_t fence_counter;
|
uint32_t fence_counter;
|
||||||
uint32_t idx_counter;
|
uint32_t idx_counter;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue