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.