Browse Source

Lazyly reinit threads after a fork in OMP mode

This initializes the per-thread memory buffers which get
cleared/released on a fork via pthread_at_fork. Not doing so leads to
each thread calling blas_memory_alloc on almost every execution which
slows down the code significantly as the threads race for the memory
allocation using locks to serialize that.
tags/v0.3.11^2
Alexander Grund 5 years ago
parent
commit
3094fc6c83
No known key found for this signature in database GPG Key ID: E92C451FC21EF13F
1 changed files with 18 additions and 0 deletions
  1. +18
    -0
      driver/others/blas_server_omp.c

+ 18
- 0
driver/others/blas_server_omp.c View File

@@ -48,6 +48,21 @@


#else #else


#ifndef likely
#ifdef __GNUC__
#define likely(x) __builtin_expect(!!(x), 1)
#else
#define likely(x) (x)
#endif
#endif
#ifndef unlikely
#ifdef __GNUC__
#define unlikely(x) __builtin_expect(!!(x), 0)
#else
#define unlikely(x) (x)
#endif
#endif

#ifndef OMP_SCHED #ifndef OMP_SCHED
#define OMP_SCHED static #define OMP_SCHED static
#endif #endif
@@ -350,6 +365,9 @@ static void exec_threads(blas_queue_t *queue, int buf_index){


int exec_blas(BLASLONG num, blas_queue_t *queue){ int exec_blas(BLASLONG num, blas_queue_t *queue){


// Handle lazy re-init of the thread-pool after a POSIX fork
if (unlikely(blas_server_avail == 0)) blas_thread_init();

BLASLONG i, buf_index; BLASLONG i, buf_index;


if ((num <= 0) || (queue == NULL)) return 0; if ((num <= 0) || (queue == NULL)) return 0;


Loading…
Cancel
Save