From 5bcd57722f2dbfc2f1e09447e11e3dee9c4b7c1c Mon Sep 17 00:00:00 2001 From: Reese Levine Date: Fri, 14 Nov 2025 09:53:44 -0800 Subject: [PATCH] Move wasm single-thread logic out of test-backend-ops for cpu backend --- ggml/include/ggml.h | 6 ++++++ ggml/src/ggml-cpu/ggml-cpu.cpp | 7 +++++++ tests/test-backend-ops.cpp | 4 ---- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ggml/include/ggml.h b/ggml/include/ggml.h index 605fcfcb9c..47bfa64536 100644 --- a/ggml/include/ggml.h +++ b/ggml/include/ggml.h @@ -225,7 +225,13 @@ # define GGML_MAX_NAME 64 #endif +// For single-thread WASM builds, only use 1 thread +#if !defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__) #define GGML_DEFAULT_N_THREADS 4 +#else +#define GGML_DEFAULT_N_THREADS 1 +#endif + #define GGML_DEFAULT_GRAPH_SIZE 2048 #if UINTPTR_MAX == 0xFFFFFFFF diff --git a/ggml/src/ggml-cpu/ggml-cpu.cpp b/ggml/src/ggml-cpu/ggml-cpu.cpp index 3191faaa4c..3c5cc14102 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.cpp +++ b/ggml/src/ggml-cpu/ggml-cpu.cpp @@ -246,8 +246,11 @@ bool ggml_backend_is_cpu(ggml_backend_t backend) { void ggml_backend_cpu_set_n_threads(ggml_backend_t backend_cpu, int n_threads) { GGML_ASSERT(ggml_backend_is_cpu(backend_cpu)); +// For single-thread WASM builds, do not allow changing the number of threads +#if !defined(_EMSCRIPTEN_) || defined(__EMSCRIPTEN_PTHREADS__) struct ggml_backend_cpu_context * ctx = (struct ggml_backend_cpu_context *)backend_cpu->context; ctx->n_threads = n_threads; +#endif } void ggml_backend_cpu_set_threadpool(ggml_backend_t backend_cpu, ggml_threadpool_t threadpool) { @@ -622,10 +625,14 @@ static ggml_backend_feature * ggml_backend_cpu_get_features(ggml_backend_reg_t r } static void * ggml_backend_cpu_get_proc_address(ggml_backend_reg_t reg, const char * name) { + +// For single-thread WASM builds, do not expose a set_n_threads function +#if !defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__) if (strcmp(name, "ggml_backend_set_n_threads") == 0) { ggml_backend_set_n_threads_t fct = ggml_backend_cpu_set_n_threads; return (void *)fct; } +#endif if (strcmp(name, "ggml_backend_dev_get_extra_bufts") == 0) { ggml_backend_dev_get_extra_bufts_t fct = ggml_backend_cpu_device_get_extra_buffers_type; return (void *)fct; diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index a1df5d6627..5e95e411e9 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -19,7 +19,6 @@ #include #include #include -#include #include #include @@ -7905,9 +7904,6 @@ static bool test_backend(ggml_backend_t backend, test_mode mode, const char * op return false; } - // TODO: find a better way to set the number of threads for the CPU backend - ggml_backend_cpu_set_n_threads(backend_cpu, N_THREADS); - size_t n_ok = 0; size_t tests_run = 0; std::vector failed_tests;