]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commit
threadpool : skip polling for unused threads (#9461)
authorMax Krasnyansky <redacted>
Tue, 17 Sep 2024 08:19:46 +0000 (01:19 -0700)
committerGitHub <redacted>
Tue, 17 Sep 2024 08:19:46 +0000 (11:19 +0300)
commit0226613853133c081b55bb892a41bb5eacc0bc94
tree4f8aa1fb4fb66918aee51e55a40376403463cb75
parent503147a9f9d195d6a14e7c998df23b6eb61f2bae
threadpool : skip polling for unused threads (#9461)

* threadpool: skip polling for unused threads

Currently all threads do N polling rounds even if only 1 thread is active (n_threads_cur == 1).
This commit adds a check to skip the polling for unused threads (ith >= n_threads_cur).

n_threads_cur is now an atomic_int to explicitly tell thread sanitizer that it is written
from one thread and read from other threads (not a race conditions).

* threadpool: further simplify and improve ggml_barrier

Avoid using strict memory order while polling, yet make sure that all threads go through
full memory barrier (memory fence) on ggml_barrier entrace and exit.

* threads: add simple barrier test

This test does lots of small, parallel matmul ops where the barriers in between dominate the overhead.

* threadpool: improve thread sync for new-graphs

Using the same tricks as ggml_barrier. All the polling is done with relaxed memory order
to keep it efficient, once the new graph is detected we do full fence using read-modify-write
with strict memory order.

* threadpool: improve abort handling

Do not use threadpool->ec (exit code) to decide whether to exit the compute loop.
threadpool->ec is not atomic which makes thread-sanitizer rightfully unhappy about it.

Instead introduce atomic threadpool->abort flag used for this. This is consistent with
how we handle threadpool->stop or pause.

While at it add an explicit atomic_load for n_threads_cur for consistency.

* test-barrier: release threadpool before releasing the context

fixes use-after-free detected by gcc thread-sanitizer on x86-64
for some reason llvm sanitizer is not detecting this issue.
ggml/src/ggml.c
tests/CMakeLists.txt
tests/test-barrier.cpp [new file with mode: 0644]