From 45979b05f40ccdfbce8c0f8fef84950265c87d25 Mon Sep 17 00:00:00 2001 From: slaren Date: Tue, 28 May 2024 22:11:32 +0200 Subject: [PATCH] ggml : use atomic_flag for critical section --- ggml.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/ggml.c b/ggml.c index 023077ca6..b65f70439 100644 --- a/ggml.c +++ b/ggml.c @@ -2883,24 +2883,20 @@ struct ggml_state { // global state static struct ggml_state g_state; -static atomic_int g_state_barrier = 0; +static atomic_flag g_state_critical = ATOMIC_FLAG_INIT; // barrier via spin lock inline static void ggml_critical_section_start(void) { - int processing = atomic_fetch_add(&g_state_barrier, 1); - - while (processing > 0) { - // wait for other threads to finish - atomic_fetch_sub(&g_state_barrier, 1); - sched_yield(); // TODO: reconsider this - processing = atomic_fetch_add(&g_state_barrier, 1); + while (atomic_flag_test_and_set(&g_state_critical)) { + // spin + sched_yield(); } } // TODO: make this somehow automatically executed // some sort of "sentry" mechanism inline static void ggml_critical_section_end(void) { - atomic_fetch_sub(&g_state_barrier, 1); + atomic_flag_clear(&g_state_critical); } #if defined(__gnu_linux__)