Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 1 | # pthreadpool |
Marat Dukhan | 712fcb3 | 2017-03-06 14:35:05 -0500 | [diff] [blame] | 2 | |
| 3 | [](https://github.com/Maratyszcza/pthreadpool/blob/master/LICENSE) |
| 4 | [](https://travis-ci.org/Maratyszcza/pthreadpool) |
| 5 | |
Marat Dukhan | 88042a0 | 2019-10-19 05:41:08 -0400 | [diff] [blame] | 6 | **pthreadpool** is a portable and efficient thread pool implementation. |
| 7 | It provides similar functionality to `#pragma omp parallel for`, but with additional features. |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 8 | |
| 9 | ## Features: |
| 10 | |
| 11 | * C interface (C++-compatible). |
Marat Dukhan | 88042a0 | 2019-10-19 05:41:08 -0400 | [diff] [blame] | 12 | * 1D-6D loops with step parameters. |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 13 | * Run on user-specified or auto-detected number of threads. |
| 14 | * Work-stealing scheduling for efficient work balancing. |
Marat Dukhan | 88042a0 | 2019-10-19 05:41:08 -0400 | [diff] [blame] | 15 | * Wait-free synchronization of work items. |
Marat Dukhan | be1bd8e | 2020-04-07 19:14:45 -0700 | [diff] [blame] | 16 | * Compatible with Linux (including Android), macOS, iOS, Windows, Emscripten environments. |
Marat Dukhan | 88042a0 | 2019-10-19 05:41:08 -0400 | [diff] [blame] | 17 | * 100% unit tests coverage. |
| 18 | * Throughput and latency microbenchmarks. |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 19 | |
| 20 | ## Example |
| 21 | |
| 22 | The following example demonstates using the thread pool for parallel addition of two arrays: |
| 23 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 24 | ```c |
| 25 | static void add_arrays(struct array_addition_context* context, size_t i) { |
| 26 | context->sum[i] = context->augend[i] + context->addend[i]; |
| 27 | } |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 28 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 29 | #define ARRAY_SIZE 4 |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 30 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 31 | int main() { |
| 32 | double augend[ARRAY_SIZE] = { 1.0, 2.0, 4.0, -5.0 }; |
| 33 | double addend[ARRAY_SIZE] = { 0.25, -1.75, 0.0, 0.5 }; |
| 34 | double sum[ARRAY_SIZE]; |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 35 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 36 | pthreadpool_t threadpool = pthreadpool_create(0); |
| 37 | assert(threadpool != NULL); |
Marat Dukhan | 2e59d6f | 2020-03-23 05:44:19 -0700 | [diff] [blame] | 38 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 39 | const size_t threads_count = pthreadpool_get_threads_count(threadpool); |
| 40 | printf("Created thread pool with %zu threads\n", threads_count); |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 41 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 42 | struct array_addition_context context = { augend, addend, sum }; |
Marat Dukhan | 88042a0 | 2019-10-19 05:41:08 -0400 | [diff] [blame] | 43 | pthreadpool_parallelize_1d(threadpool, |
| 44 | (pthreadpool_task_1d_t) add_arrays, |
Marat Dukhan | 2e59d6f | 2020-03-23 05:44:19 -0700 | [diff] [blame] | 45 | (void*) &context, |
Marat Dukhan | 88042a0 | 2019-10-19 05:41:08 -0400 | [diff] [blame] | 46 | ARRAY_SIZE, |
| 47 | PTHREADPOOL_FLAG_DISABLE_DENORMALS /* flags */); |
Marat Dukhan | 2e59d6f | 2020-03-23 05:44:19 -0700 | [diff] [blame] | 48 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 49 | pthreadpool_destroy(threadpool); |
| 50 | threadpool = NULL; |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 51 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 52 | printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Augend", |
| 53 | augend[0], augend[1], augend[2], augend[3]); |
| 54 | printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Addend", |
| 55 | addend[0], addend[1], addend[2], addend[3]); |
| 56 | printf("%8s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", "Sum", |
| 57 | sum[0], sum[1], sum[2], sum[3]); |
Marat Dukhan | 90a03e7 | 2015-08-25 13:35:31 -0400 | [diff] [blame] | 58 | |
Marat Dukhan | ab8e102 | 2016-03-05 19:02:13 -0500 | [diff] [blame] | 59 | return 0; |
| 60 | } |
| 61 | ``` |