Need help with pthreadpool?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

Maratyszcza
148 Stars 66 Forks BSD 2-Clause "Simplified" License 135 Commits 0 Opened issues

Description

Portable (POSIX/Windows/Emscripten) thread pool for C/C++

Services available

!
?

Need anything else?

Contributors list

# 8,729
ml
matrix-...
fast-fo...
assembl...
113 commits
# 11,032
pandas
dask
pydata
yml
1 commit
# 115,627
opencl
GitHub
Ruby
pytorch
1 commit
# 3,487
viml
golang
ag
q
1 commit
# 53,876
C++
Perl
pytorch
scikit-...
1 commit
# 2,418
C++
tensor
ml
scikit-...
1 commit

pthreadpool

BSD (2 clause) License Build Status

pthreadpool is a portable and efficient thread pool implementation. It provides similar functionality to

#pragma omp parallel for
, but with additional features.

Features:

  • C interface (C++-compatible).
  • 1D-6D loops with step parameters.
  • Run on user-specified or auto-detected number of threads.
  • Work-stealing scheduling for efficient work balancing.
  • Wait-free synchronization of work items.
  • Compatible with Linux (including Android), macOS, iOS, Windows, Emscripten environments.
  • 100% unit tests coverage.
  • Throughput and latency microbenchmarks.

Example

The following example demonstates using the thread pool for parallel addition of two arrays:

static void add_arrays(struct array_addition_context* context, size_t i) {
  context->sum[i] = context->augend[i] + context->addend[i];
}

#define ARRAY_SIZE 4

int main() { double augend[ARRAY_SIZE] = { 1.0, 2.0, 4.0, -5.0 }; double addend[ARRAY_SIZE] = { 0.25, -1.75, 0.0, 0.5 }; double sum[ARRAY_SIZE];

pthreadpool_t threadpool = pthreadpool_create(0); assert(threadpool != NULL);

const size_t threads_count = pthreadpool_get_threads_count(threadpool); printf("Created thread pool with %zu threads\n", threads_count);

struct array_addition_context context = { augend, addend, sum }; pthreadpool_parallelize_1d(threadpool, (pthreadpool_task_1d_t) add_arrays, (void*) &context, ARRAY_SIZE, PTHREADPOOL_FLAG_DISABLE_DENORMALS /* flags */);

pthreadpool_destroy(threadpool); threadpool = NULL;

printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Augend", augend[0], augend[1], augend[2], augend[3]); printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Addend", addend[0], addend[1], addend[2], addend[3]); printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Sum", sum[0], sum[1], sum[2], sum[3]);

return 0; }

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.