From 5ceb7167266a9909b1999ee42e76992b9fab69c9 Mon Sep 17 00:00:00 2001 From: Alexander Knorre Date: Sun, 24 Apr 2022 01:00:42 +0300 Subject: [PATCH 1/4] res_index modulation Better thread utilization for tables with entity count lower than worker count through resource index modulation --- src/iter.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/iter.c b/src/iter.c index 96bc527b33..38eb7cd22a 100644 --- a/src/iter.c +++ b/src/iter.c @@ -1045,7 +1045,12 @@ bool ecs_worker_next_instanced( ecs_iter_t *chain_it = it->chain_it; ecs_worker_iter_t *iter = &it->priv.iter.worker; - int32_t res_count = iter->count, res_index = iter->index; + int32_t res_count = iter->count; + int32_t res_index = iter->index; + if (iter->count < res_count) { + uint64_t table_id = it->table ? it->table->id : 0; + res_index = (int32_t)((UINT64_C(11400714819323198485) * table_id + iter->index) % res_count); + } int32_t per_worker, instances_per_worker, first; do { From 3cf5e5a56009416028e8ca13d0363b19d7bb0a27 Mon Sep 17 00:00:00 2001 From: Alexander Knorre Date: Sun, 24 Apr 2022 01:03:58 +0300 Subject: [PATCH 2/4] Fix sign warning --- src/iter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iter.c b/src/iter.c index 38eb7cd22a..0c21e01f47 100644 --- a/src/iter.c +++ b/src/iter.c @@ -1049,7 +1049,7 @@ bool ecs_worker_next_instanced( int32_t res_index = iter->index; if (iter->count < res_count) { uint64_t table_id = it->table ? it->table->id : 0; - res_index = (int32_t)((UINT64_C(11400714819323198485) * table_id + iter->index) % res_count); + res_index = ((int32_t)(UINT64_C(11400714819323198485) * table_id + (uint64_t)iter->index)) % res_count; } int32_t per_worker, instances_per_worker, first; From ee70335240d3d1e9ad7c246f5f59ecba84205c31 Mon Sep 17 00:00:00 2001 From: Alexander Knorre Date: Sun, 24 Apr 2022 16:55:24 +0300 Subject: [PATCH 3/4] Switch from it to chain_it table Fix incorrect table usage --- src/iter.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/iter.c b/src/iter.c index 0c21e01f47..1998b5ec8b 100644 --- a/src/iter.c +++ b/src/iter.c @@ -1046,11 +1046,6 @@ bool ecs_worker_next_instanced( ecs_iter_t *chain_it = it->chain_it; ecs_worker_iter_t *iter = &it->priv.iter.worker; int32_t res_count = iter->count; - int32_t res_index = iter->index; - if (iter->count < res_count) { - uint64_t table_id = it->table ? it->table->id : 0; - res_index = ((int32_t)(UINT64_C(11400714819323198485) * table_id + (uint64_t)iter->index)) % res_count; - } int32_t per_worker, instances_per_worker, first; do { @@ -1063,6 +1058,9 @@ bool ecs_worker_next_instanced( /* Keep instancing setting from original iterator */ ECS_BIT_COND(it->flags, EcsIterIsInstanced, instanced); + + uint64_t table_id = it->table ? it->table->id : 0; + int32_t res_index = ((int32_t)(table_id + iter->index)) % res_count; int32_t count = it->count; int32_t instance_count = it->instance_count; From 4e7488efa9fb248a568baf8b75ad953e0355b95e Mon Sep 17 00:00:00 2001 From: Alexander Knorre Date: Sun, 24 Apr 2022 16:59:35 +0300 Subject: [PATCH 4/4] Fix warning and improve salt for res_index --- src/iter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iter.c b/src/iter.c index 1998b5ec8b..26d0450344 100644 --- a/src/iter.c +++ b/src/iter.c @@ -1060,7 +1060,7 @@ bool ecs_worker_next_instanced( ECS_BIT_COND(it->flags, EcsIterIsInstanced, instanced); uint64_t table_id = it->table ? it->table->id : 0; - int32_t res_index = ((int32_t)(table_id + iter->index)) % res_count; + int32_t res_index = (int32_t)((UINT64_C(11400714819323198485) * table_id + (uint64_t)iter->index) % (uint64_t)res_count); int32_t count = it->count; int32_t instance_count = it->instance_count;