From 118188a1c1f065615c580fba7b00f21b088b9ddd Mon Sep 17 00:00:00 2001 From: talubik Date: Tue, 17 Feb 2026 19:08:07 +0300 Subject: [PATCH 1/2] fix : vx_spawn --- kernel/src/vx_spawn.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/kernel/src/vx_spawn.c b/kernel/src/vx_spawn.c index 688836bf04..cfbac3942b 100644 --- a/kernel/src/vx_spawn.c +++ b/kernel/src/vx_spawn.c @@ -237,7 +237,13 @@ int vx_spawn_threads(uint32_t dimension, } // calculate offsets for group distribution - uint32_t group_offset = core_id * total_groups_per_core + MIN(core_id, remaining_groups_per_core); + uint32_t group_offset; + uint32_t base_groups = num_groups / active_cores; + if (core_id < remaining_groups_per_core) { + group_offset = core_id * (base_groups + 1); + } else { + group_offset = remaining_groups_per_core * (base_groups + 1) + (core_id - remaining_groups_per_core) * base_groups; + } // set scheduler arguments wspawn_groups_args_t wspawn_args = { @@ -296,7 +302,12 @@ int vx_spawn_threads(uint32_t dimension, } // calculate offsets for task distribution - uint32_t all_tasks_offset = core_id * tasks_per_core + MIN(core_id, remaining_tasks_per_core); + uint32_t all_tasks_offset; + if (core_id < remaining_tasks_per_core) { + all_tasks_offset = core_id * tasks_per_core; + } else { + all_tasks_offset = remaining_tasks_per_core * (tasks_per_core + 1) + (core_id - remaining_tasks_per_core) * tasks_per_core; + } uint32_t remain_tasks_offset = all_tasks_offset + (tasks_per_core - remaining_tasks); // prepare scheduler arguments From ac69a43ec1117a4f140a3e61dd3666feaa17bdc8 Mon Sep 17 00:00:00 2001 From: talubik Date: Wed, 18 Feb 2026 18:56:23 +0300 Subject: [PATCH 2/2] refactor : simplify the logic of the code --- kernel/src/vx_spawn.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/kernel/src/vx_spawn.c b/kernel/src/vx_spawn.c index cfbac3942b..4fb4c65013 100644 --- a/kernel/src/vx_spawn.c +++ b/kernel/src/vx_spawn.c @@ -238,11 +238,10 @@ int vx_spawn_threads(uint32_t dimension, // calculate offsets for group distribution uint32_t group_offset; - uint32_t base_groups = num_groups / active_cores; if (core_id < remaining_groups_per_core) { - group_offset = core_id * (base_groups + 1); + group_offset = core_id * total_groups_per_core; } else { - group_offset = remaining_groups_per_core * (base_groups + 1) + (core_id - remaining_groups_per_core) * base_groups; + group_offset = remaining_groups_per_core + core_id * total_groups_per_core; } // set scheduler arguments @@ -306,7 +305,7 @@ int vx_spawn_threads(uint32_t dimension, if (core_id < remaining_tasks_per_core) { all_tasks_offset = core_id * tasks_per_core; } else { - all_tasks_offset = remaining_tasks_per_core * (tasks_per_core + 1) + (core_id - remaining_tasks_per_core) * tasks_per_core; + all_tasks_offset = remaining_tasks_per_core + core_id * tasks_per_core; } uint32_t remain_tasks_offset = all_tasks_offset + (tasks_per_core - remaining_tasks);