LIBJXL

Functions
thread_parallel_runner.h File Reference

implementation using std::thread of a JxlParallelRunner. More...

`#include <stddef.h>`
`#include <stdint.h>`
`#include <stdio.h>`
`#include <stdlib.h>`
`#include "jxl/jxl_threads_export.h"`
`#include "jxl/memory_manager.h"`
`#include "jxl/parallel_runner.h"`
Include dependency graph for thread_parallel_runner.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

## Functions
JXL_THREADS_EXPORT JxlParallelRetCode | JxlThreadParallelRunner (void *runner_opaque, void *jpegxl_opaque, JxlParallelRunInit init, JxlParallelRunFunction func, uint32_t start_range, uint32_t end_range)
JXL_THREADS_EXPORT void * | JxlThreadParallelRunnerCreate (const JxlMemoryManager *memory_manager, size_t num_worker_threads)
JXL_THREADS_EXPORT void | JxlThreadParallelRunnerDestroy (void *runner_opaque)
JXL_THREADS_EXPORT size_t | JxlThreadParallelRunnerDefaultNumWorkerThreads ()

## Detailed Description

implementation using std::thread of a JxlParallelRunner.

## Function Documentation

## ◆ JxlThreadParallelRunner()

JXL_THREADS_EXPORT JxlParallelRetCode JxlThreadParallelRunner | ( | void * | runner_opaque,
|  | void * | jpegxl_opaque,
|  | JxlParallelRunInit | init,
|  | JxlParallelRunFunction | func,
|  | uint32_t | start_range,
|  | uint32_t | end_range
| ) |  |

Implementation of JxlParallelRunner than can be used to enable multithreading when using the JPEG XL library. This uses std::thread internally and related synchronization functions. The number of threads created is fixed at construction time and the threads are re-used for every ThreadParallelRunner::Runner call. Only one concurrent JxlThreadParallelRunner call per instance is allowed at a time.

This is a scalable, lower-overhead thread pool runner, especially suitable for data-parallel computations in the fork-join model, where clients need to know when all tasks have completed.

This thread pool can efficiently load-balance millions of tasks using an atomic counter, thus avoiding per-task virtual or system calls. With 48 hyperthreads and 1M tasks that add to an atomic counter, overall runtime is 10-20x higher when using std::async, and ~200x for a queue-based thread Parallel runner internally using std::thread. Use as JxlParallelRunner.

## ◆ JxlThreadParallelRunnerCreate()

JXL_THREADS_EXPORT void * JxlThreadParallelRunnerCreate | ( | const JxlMemoryManager * | memory_manager,
|  | size_t | num_worker_threads
| ) |  |

Creates the runner for JxlThreadParallelRunner. Use as the opaque runner.

## ◆ JxlThreadParallelRunnerDefaultNumWorkerThreads()

JXL_THREADS_EXPORT size_t JxlThreadParallelRunnerDefaultNumWorkerThreads | ( |  | ) |

Returns a default num_worker_threads value for JxlThreadParallelRunnerCreate.

## ◆ JxlThreadParallelRunnerDestroy()

JXL_THREADS_EXPORT void JxlThreadParallelRunnerDestroy | ( | void * | runner_opaque | ) |

Destroys the runner created by JxlThreadParallelRunnerCreate.