]> git.djapps.eu Git - pkg/ggml/sources/whisper.cpp/commitdiff
ggml: Fix data race in ggml threadpool (llama/11736)
authorKarol Kontny <redacted>
Sat, 8 Feb 2025 14:30:53 +0000 (15:30 +0100)
committerGeorgi Gerganov <redacted>
Thu, 27 Feb 2025 06:55:36 +0000 (08:55 +0200)
After the barrier in last iteration is executed, still the loop termination
condition will be executed. However main thread can destroy the cgraph object
and its nodes already, then another thread will access it, but the thing is already gone.
Also trouble can happen when n_nodes == 0 or abort is called, but I'm not sure if the
prior situation is possible.

Last syncronization should be done after the loop to ensure the cgraph/cplan won't be
accessed after the main thread exits from the function.

ggml/src/ggml-cpu/ggml-cpu.c

index 59efaeb71292e52e177609cc2da3db7fd4a45c76..fdb430a43cc216607a62245ea04d9f4a588f7ace 100644 (file)
@@ -13856,9 +13856,13 @@ static thread_ret_t ggml_graph_compute_thread(void * data) {
             tp->ec    = GGML_STATUS_ABORTED;
         }
 
-        ggml_barrier(state->threadpool);
+        if (node_n + 1 < cgraph->n_nodes) {
+            ggml_barrier(state->threadpool);
+        }
     }
 
+    ggml_barrier(state->threadpool);
+
     return 0;
 }