From 2c291aed4bb80f07e8557284d3399cf1e2a4ccb9 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sun, 1 Mar 2026 18:09:44 +0100 Subject: Improve Windows build support. - Use multithreading (works with a sufficiently recent version of the Microsoft developer tools / C SDK). - Detect CPU architecture and use AVX2 or NEON when appropriate. - Automatically detect python installation path. --- src/utils/prefetch.h | 16 +++------- src/utils/wrapthread.h | 86 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 67 insertions(+), 35 deletions(-) (limited to 'src/utils') diff --git a/src/utils/prefetch.h b/src/utils/prefetch.h index 89b14e8..a2c41ef 100644 --- a/src/utils/prefetch.h +++ b/src/utils/prefetch.h @@ -1,15 +1,7 @@ -#if defined(AVX2) - -#define prefetch(a, i) _mm_prefetch(a+i, _MM_HINT_T0) - -#else #if defined(__GNUC__) || defined(__clang__) - -#define prefetch(a, i) __builtin_prefetch(a+i, 0, 0) - + #define prefetch(a, i) __builtin_prefetch(a+i, 0, 0) +#elif defined(AVX2) + #define prefetch(a, i) _mm_prefetch((char *)(a+i), _MM_HINT_T0) #else - -#define prefetch(a, i) (void)i - -#endif + #define prefetch(a, i) (void)i #endif diff --git a/src/utils/wrapthread.h b/src/utils/wrapthread.h index 28654fe..4ac72a6 100644 --- a/src/utils/wrapthread.h +++ b/src/utils/wrapthread.h @@ -1,37 +1,77 @@ #if THREADS == 1 + #define WRAPTHREAD_NOTHREADS 1 +#elif defined(__unix__) + #define WRAPTHREAD_PTHREADS 1 +#elif defined(__has_include) + #if __has_include() + #define WRAPTHREAD_PTHREADS 1 + #elif __has_include() + #define WRAPTHREAD_C11THREADS 1 + #endif +#else + #define WRAPTHREAD_NOTHREADS 1 +#endif + +#if WRAPTHREAD_PTHREADS + #include + + #define wrapthread_atomic _Atomic + + #define wrapthread_return_t void * + #define wrapthread_return_val NULL + + #define wrapthread_define_var_thread_t(x) pthread_t x + #define wrapthread_define_var_mutex_t(x) pthread_mutex_t x + #define wrapthread_define_struct_thread_t(x) pthread_t x + #define wrapthread_define_struct_mutex_t(x) pthread_mutex_t x + + #define wrapthread_define_if_threads(T, x) T x + + #define wrapthread_create(a, f, arg) pthread_create(a, NULL, f, arg) + #define wrapthread_join(a) pthread_join(a, NULL) + #define wrapthread_mutex_init(a) pthread_mutex_init(a, NULL) + #define wrapthread_mutex_lock(a) pthread_mutex_lock(a) + #define wrapthread_mutex_unlock(a) pthread_mutex_unlock(a) + +#elif WRAPTHREAD_C11THREADS + #include + + #define wrapthread_atomic _Atomic -#define wrapthread_atomic + #define wrapthread_return_t int + #define wrapthread_return_val 0 -#define wrapthread_define_var_thread_t(x) unused char x -#define wrapthread_define_var_mutex_t(x) unused char x -#define wrapthread_define_struct_thread_t(x) char x -#define wrapthread_define_struct_mutex_t(x) char x + #define wrapthread_define_var_thread_t(x) thrd_t x + #define wrapthread_define_var_mutex_t(x) mtx_t x + #define wrapthread_define_struct_thread_t(x) thrd_t x + #define wrapthread_define_struct_mutex_t(x) mtx_t x -#define wrapthread_define_if_threads(T, x) T x; (void)(x) + #define wrapthread_define_if_threads(T, x) T x -#define wrapthread_create(a, b, c, d) c(d) -#define wrapthread_join(a, b) -#define wrapthread_mutex_init(a, b) -#define wrapthread_mutex_lock(a) -#define wrapthread_mutex_unlock(a) + #define wrapthread_create(a, f, arg) thrd_create(a, f, arg) + #define wrapthread_join(a) thrd_join(a, NULL) + #define wrapthread_mutex_init(a) mtx_init(a, mtx_plain) + #define wrapthread_mutex_lock(a) mtx_lock(a) + #define wrapthread_mutex_unlock(a) mtx_unlock(a) #else -#include + #define wrapthread_atomic -#define wrapthread_atomic _Atomic + #define wrapthread_return_t int + #define wrapthread_return_val 0 -#define wrapthread_define_var_thread_t(x) pthread_t x -#define wrapthread_define_var_mutex_t(x) pthread_mutex_t x -#define wrapthread_define_struct_thread_t(x) pthread_t x -#define wrapthread_define_struct_mutex_t(x) pthread_mutex_t x + #define wrapthread_define_var_thread_t(x) unused char x + #define wrapthread_define_var_mutex_t(x) unused char x + #define wrapthread_define_struct_thread_t(x) char x + #define wrapthread_define_struct_mutex_t(x) char x -#define wrapthread_define_if_threads(T, x) T x + #define wrapthread_define_if_threads(T, x) T x; (void)(x) -#define wrapthread_create(a, b, c, d) pthread_create(a, b, c, d) -#define wrapthread_join(a, b) pthread_join(a, b) -#define wrapthread_mutex_init(a, b) pthread_mutex_init(a, b) -#define wrapthread_mutex_lock(a) pthread_mutex_lock(a) -#define wrapthread_mutex_unlock(a) pthread_mutex_unlock(a) + #define wrapthread_create(t, f, arg) f(arg) + #define wrapthread_join(a) + #define wrapthread_mutex_init(a) + #define wrapthread_mutex_lock(a) + #define wrapthread_mutex_unlock(a) #endif -- cgit v1.3