Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
opencl.c File Reference
#include "common/opencl.h"
#include "common/paths.h"
#include "common/startup_progress.h"
#include "common/utility.h"
#include "system/capabilities.h"
#include "system/sys_resources.h"
#include "pixel/bilateralcl.h"
#include "darktable.h"
#include "common/dlopencl.h"
#include "pixel/dwt.h"
#include "common/file_location.h"
#include "pixel/gaussian.h"
#include "pixel/guided_filter.h"
#include "pixel/heal.h"
#include "pixel/interpolation.h"
#include "pixel/locallaplaciancl.h"
#include "system/nvidia_gpus.h"
#include <fcntl.h>
#include "system/opencl_drivers_blacklist.h"
#include "common/conf.h"
#include "develop/blend.h"
#include "develop/pixelpipe.h"
#include "caches/pixelpipe_cache.h"
#include "common/times.h"
#include <assert.h>
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <ctype.h>
#include <errno.h>
#include <glib/gstdio.h>
#include <sys/stat.h>
#include <zlib.h>
+ Include dependency graph for opencl.c:

Go to the source code of this file.

Data Structures

struct  dt_opencl_t
 
struct  _gpu_runtime_t
 
struct  dt_opencl_mem_record_t
 

Typedefs

typedef struct dt_opencl_t dt_opencl_t
 
typedef struct _gpu_runtime_t _gpu_runtime_t
 
typedef struct dt_opencl_mem_record_t dt_opencl_mem_record_t
 

Functions

static void dt_opencl_cleanup_device (dt_opencl_t *cl, int i)
 
static void _opencl_splash_update_compile (const char *programname)
 
static const char * dt_opencl_get_vendor_by_id (unsigned int id)
 
static const char * _gpu_runtime_of_platform (const char *platform_name)
 
static int _gpu_runtime_crash_streak (const char *runtime)
 
static void _gpu_runtime_set_crash_streak (const char *runtime, int value)
 
static char * _ascii_str_canonical (const char *in, char *out, int maxlen)
 
static void dt_opencl_priority_parse (dt_opencl_t *cl, char *configstr, int *priority_list, int *mandatory)
 
static void dt_opencl_update_priorities ()
 
static void dt_opencl_apply_scheduling_profile ()
 
static void dt_opencl_set_synchronization_timeout (int value)
 
static int dt_opencl_get_device_info (dt_opencl_t *cl, cl_device_id device, cl_device_info param_name, void **param_value, size_t *param_value_size)
 
int dt_opencl_avoid_atomics (const int devid)
 
int dt_opencl_micro_nap (const int devid)
 
gboolean dt_opencl_use_pinned_memory (const int devid)
 
gboolean dt_opencl_is_pinned_memory (cl_mem mem)
 
void dt_opencl_write_device_config (const int devid)
 
static int _dt_opencl_get_conf_int (const gchar *key_device, const gchar *conf_name, gboolean *safety_ok)
 
gboolean dt_opencl_read_device_config (const int devid)
 
int dt_opencl_get_detected_device_count (void)
 
const dt_opencl_detected_device_t * dt_opencl_get_detected_device (const int detected)
 
gboolean dt_opencl_detected_device_enabled (const int detected)
 
int dt_opencl_set_detected_device_enabled (const int detected, const gboolean enabled)
 
gboolean dt_opencl_detected_device_pinned_memory (const int detected)
 
int dt_opencl_set_detected_device_pinned_memory (const int detected, const gboolean enabled)
 
size_t dt_opencl_detected_device_headroom (const int detected)
 
int dt_opencl_set_detected_device_headroom (const int detected, const size_t headroom)
 
static int dt_opencl_device_init (dt_opencl_t *cl, const int dev, cl_device_id *devices, const int k)
 
static void _opencl_driver_crash_marker_path (char *buf, size_t buf_len)
 
void dt_opencl_note_crash_backtrace (const char *backtrace, size_t backtrace_len)
 Tell the OpenCL module that the process crashed, and let it judge whether the crash was its driver's doing.
 
static void _opencl_fold_driver_crashes (void)
 
void dt_opencl_init (const gboolean exclude_opencl, const gboolean print_statistics)
 
void dt_opencl_clear_driver_crash_streak (void)
 
void dt_opencl_cleanup (void)
 
gboolean dt_opencl_finish (const int devid)
 
int dt_opencl_enqueue_barrier (const int devid)
 
static int _take_from_list (int *list, int value)
 
static int _device_by_cname (const char *name)
 
int dt_opencl_reserve_device_for_pipe (const int pipetype)
 Reserve a device for a pipe run: choose a free one by the pipe's priority list and take its lock. Blocks or gives up per the opencl_mandatory_timeout conf key.
 
void dt_opencl_release_device (const int devid)
 Release a device reserved by either reserve function.
 
void dt_opencl_reserve_device_by_id (const int devid)
 Reserve a device the caller has already identified, blocking until it is free.
 
int dt_opencl_try_reserve_device_by_id (const int devid)
 Reserve a device only if it is free right now.
 
int dt_opencl_get_num_devices (void)
 Number of usable OpenCL devices; 0 when OpenCL is unavailable.
 
const char * dt_opencl_get_device_name (const int devid)
 Human-readable device name, owned by the OpenCL module.
 
gboolean dt_opencl_get_device_max_image_size (const int devid, int *width, int *height)
 Largest 2D image the device will accept, which is what bounds tile size.
 
size_t dt_opencl_get_device_max_global_mem (const int devid)
 Total device memory in bytes, or 0 for an out-of-range id.
 
size_t dt_opencl_get_device_memory_in_use (const int devid)
 Bytes Ansel holds on the device by its own accounting (dt_opencl_memory_statistics()), or 0 for an out-of-range id. What other applications hold there is not in it.
 
size_t dt_opencl_get_device_headroom (const int devid)
 Bytes of the device left to other applications (its forced_headroom, from its own config key or memory_opencl_headroom), or 0 for an out-of-range id. Ansel plans against the device's total memory less this.
 
int dt_opencl_report_pipe_error (void)
 Record that a pipe run failed on OpenCL, and decide whether to give up on it.
 
static FILE * fopen_stat (const char *filename, struct stat *st)
 
void dt_opencl_md5sum (const char **files, char **md5sums)
 
int dt_opencl_load_program (const int dev, const int prog, const char *filename, const char *binname, const char *cachedir, char *md5sum, char **includemd5, int *loaded_cached)
 
int dt_opencl_build_program (const int dev, const int prog, const char *binname, const char *cachedir, char *md5sum, int loaded_cached)
 
int dt_opencl_create_kernel (const int prog, const char *name)
 
void dt_opencl_free_kernel (const int kernel)
 
int dt_opencl_get_max_work_item_sizes (const int dev, size_t *sizes)
 
int dt_opencl_get_work_group_limits (const int dev, size_t *sizes, size_t *workgroupsize, unsigned long *localmemsize)
 
int dt_opencl_get_kernel_work_group_size (const int dev, const int kernel, size_t *kernelworkgroupsize)
 
int dt_opencl_set_kernel_arg (const int dev, const int kernel, const int num, const size_t size, const void *arg)
 
int dt_opencl_enqueue_kernel_2d (const int dev, const int kernel, const size_t *sizes)
 
int dt_opencl_enqueue_kernel_2d_with_local (const int dev, const int kernel, const size_t *sizes, const size_t *local)
 
int dt_opencl_copy_device_to_host (const int devid, void *host, void *device, const int width, const int height, const int bpp)
 
int dt_opencl_read_host_from_device (const int devid, void *host, void *device, const int width, const int height, const int bpp)
 
int dt_opencl_read_host_from_device_rowpitch (const int devid, void *host, void *device, const int width, const int height, const int rowpitch)
 
int dt_opencl_read_host_from_device_non_blocking (const int devid, void *host, void *device, const int width, const int height, const int bpp)
 
int dt_opencl_read_host_from_device_rowpitch_non_blocking (const int devid, void *host, void *device, const int width, const int height, const int rowpitch)
 
int dt_opencl_read_host_from_device_raw (const int devid, void *host, void *device, const size_t *origin, const size_t *region, const int rowpitch, const int blocking)
 
int dt_opencl_write_host_to_device (const int devid, void *host, void *device, const int width, const int height, const int bpp)
 
int dt_opencl_write_host_to_device_rowpitch (const int devid, void *host, void *device, const int width, const int height, const int rowpitch)
 
int dt_opencl_write_host_to_device_non_blocking (const int devid, void *host, void *device, const int width, const int height, const int bpp)
 
int dt_opencl_write_host_to_device_rowpitch_non_blocking (const int devid, void *host, void *device, const int width, const int height, const int rowpitch)
 
int dt_opencl_write_host_to_device_raw (const int devid, const void *host, void *device, const size_t *origin, const size_t *region, const int rowpitch, const int blocking)
 
int dt_opencl_enqueue_copy_image (const int devid, cl_mem src, cl_mem dst, size_t *orig_src, size_t *orig_dst, size_t *region)
 
int dt_opencl_enqueue_copy_image_to_buffer (const int devid, cl_mem src_image, cl_mem dst_buffer, size_t *origin, size_t *region, size_t offset)
 
int dt_opencl_enqueue_copy_buffer_to_image (const int devid, cl_mem src_buffer, cl_mem dst_image, size_t offset, size_t *origin, size_t *region)
 
int dt_opencl_enqueue_copy_buffer_to_buffer (const int devid, cl_mem src_buffer, cl_mem dst_buffer, size_t srcoffset, size_t dstoffset, size_t size)
 
int dt_opencl_read_buffer_from_device (const int devid, void *host, void *device, const size_t offset, const size_t size, const int blocking)
 
int dt_opencl_write_buffer_to_device (const int devid, void *host, void *device, const size_t offset, const size_t size, const int blocking)
 
void * dt_opencl_copy_host_to_device_constant (const int devid, const size_t size, void *host)
 
void * dt_opencl_copy_host_to_device (const int devid, void *host, const int width, const int height, const int bpp)
 
void * dt_opencl_copy_host_to_device_rowpitch (const int devid, void *host, const int width, const int height, const int bpp, const int rowpitch)
 
void dt_opencl_release_mem_object (cl_mem mem)
 
void * dt_opencl_map_buffer (const int devid, cl_mem buffer, const int blocking, const int flags, size_t offset, size_t size)
 
void * dt_opencl_map_image (const int devid, cl_mem buffer, const int blocking, const int flags, size_t width, size_t height, int bpp)
 
int dt_opencl_unmap_mem_object (const int devid, cl_mem mem_object, void *mapped_ptr)
 
static void * _dt_opencl_alloc_image2d (const int devid, const int width, const int height, const size_t bytes, const cl_mem_flags flags, const cl_image_format fmt, void *host, const char *const context)
 
void * dt_opencl_alloc_device (const int devid, const int width, const int height, const int bpp)
 
void * dt_opencl_alloc_device_use_host_pointer (const int devid, const int width, const int height, const int bpp, void *host, const int flags)
 
void * dt_opencl_alloc_device_buffer_with_flags (const int devid, const size_t size, const int flags, void *host_ptr)
 
void * dt_opencl_alloc_device_buffer (const int devid, const size_t size)
 
size_t dt_opencl_get_mem_object_size (cl_mem mem)
 
int dt_opencl_get_mem_context_id (cl_mem mem)
 
cl_mem_flags dt_opencl_get_mem_flags (cl_mem mem)
 
int dt_opencl_get_image_width (cl_mem mem)
 
int dt_opencl_get_image_height (cl_mem mem)
 
int dt_opencl_get_image_element_size (cl_mem mem)
 
void dt_opencl_memory_statistics (int devid, cl_mem mem, size_t size, dt_opencl_memory_t action)
 
gboolean dt_opencl_get_mem_record (cl_mem mem, int *devid, size_t *size)
 
void dt_opencl_check_tuning (const int devid)
 
cl_ulong dt_opencl_get_device_available (const int devid)
 
static cl_ulong _opencl_get_device_memalloc (const int devid)
 
cl_ulong dt_opencl_get_device_memalloc (const int devid)
 
dt_opencl_fit_reason_t dt_opencl_image_fits_device_reason (const int devid, const size_t width, const size_t height, const unsigned bpp, const float factor, const size_t overhead, size_t *needed, size_t *limit)
 
gboolean dt_opencl_image_fits_device (const int devid, const size_t width, const size_t height, const unsigned bpp, const float factor, const size_t overhead)
 
int dt_opencl_dev_roundup_width (int size, const int devid)
 
int dt_opencl_dev_roundup_height (int size, const int devid)
 
int dt_opencl_is_inited (void)
 
int dt_opencl_is_enabled (void)
 
void dt_opencl_disable (void)
 
int dt_opencl_update_settings (void)
 
cl_event * dt_opencl_events_get_slot (const int devid, const char *tag)
 
void dt_opencl_events_reset (const int devid)
 
void dt_opencl_events_wait_for (const int devid)
 
cl_int dt_opencl_events_flush (const int devid, const int reset)
 
void dt_opencl_events_profiling (const int devid, const int aggregated)
 
static int nextpow2 (int n)
 
int dt_opencl_local_buffer_opt (const int devid, const int kernel, dt_opencl_local_buffer_t *factors)
 

Variables

static dt_opencl_t * _opencl = NULL
 
static const _gpu_runtime_t _gpu_runtimes []
 
static char _driver_crash_marker [DT_PATH_MAX] = { 0 }
 

Typedef Documentation

◆ _gpu_runtime_t

◆ dt_opencl_mem_record_t

◆ dt_opencl_t

typedef struct dt_opencl_t dt_opencl_t

Function Documentation

◆ _ascii_str_canonical()

static char * _ascii_str_canonical ( const char *  in,
char *  out,
int  maxlen 
)
static

Definition at line 1772 of file opencl.c.

References IS_NULL_PTR, n, and out.

Referenced by _device_by_cname(), and dt_opencl_device_init().

◆ _device_by_cname()

static int _device_by_cname ( const char *  name)
static

◆ _dt_opencl_alloc_image2d()

static void * _dt_opencl_alloc_image2d ( const int  devid,
const int  width,
const int  height,
const size_t  bytes,
const cl_mem_flags  flags,
const cl_image_format  fmt,
void *  host,
const char *const  context 
)
inlinestatic

◆ _dt_opencl_get_conf_int()

static int _dt_opencl_get_conf_int ( const gchar *  key_device,
const gchar *  conf_name,
gboolean *  safety_ok 
)
static

◆ _gpu_runtime_crash_streak()

static int _gpu_runtime_crash_streak ( const char *  runtime)
static

◆ _gpu_runtime_of_platform()

static const char * _gpu_runtime_of_platform ( const char *  platform_name)
static

per-runtime GPU-driver crash streak; defined with the runtime table further down, declared here because the per-device setup above it consults them

Definition at line 1197 of file opencl.c.

References _gpu_runtimes, _gpu_runtime_t::conf_suffix, i, and IS_NULL_PTR.

Referenced by dt_opencl_device_init().

◆ _gpu_runtime_set_crash_streak()

static void _gpu_runtime_set_crash_streak ( const char *  runtime,
int  value 
)
static

Definition at line 1221 of file opencl.c.

References dt_conf_set_int(), IS_NULL_PTR, key, and value.

Referenced by _opencl_fold_driver_crashes(), and dt_opencl_clear_driver_crash_streak().

◆ _opencl_driver_crash_marker_path()

static void _opencl_driver_crash_marker_path ( char *  buf,
size_t  buf_len 
)
static

Definition at line 1234 of file opencl.c.

References dt_loc_get_user_cache_dir(), and DT_PATH_MAX.

Referenced by dt_opencl_init().

◆ _opencl_fold_driver_crashes()

static void _opencl_fold_driver_crashes ( void  )
static

◆ _opencl_get_device_memalloc()

static cl_ulong _opencl_get_device_memalloc ( const int  devid)
static

◆ _opencl_splash_update_compile()

static void _opencl_splash_update_compile ( const char *  programname)
inlinestatic

Definition at line 136 of file opencl.c.

References dt_startup_progress_report(), and IS_NULL_PTR.

Referenced by dt_opencl_device_init().

◆ _take_from_list()

static int _take_from_list ( int *  list,
int  value 
)
static

Definition at line 1733 of file opencl.c.

References value.

Referenced by dt_opencl_priority_parse().

◆ dt_opencl_alloc_device()

◆ dt_opencl_alloc_device_buffer()

◆ dt_opencl_alloc_device_buffer_with_flags()

void * dt_opencl_alloc_device_buffer_with_flags ( const int  devid,
const size_t  size,
const int  flags,
void *  host_ptr 
)

◆ dt_opencl_alloc_device_use_host_pointer()

void * dt_opencl_alloc_device_use_host_pointer ( const int  devid,
const int  width,
const int  height,
const int  bpp,
void *  host,
const int  flags 
)

◆ dt_opencl_apply_scheduling_profile()

static void dt_opencl_apply_scheduling_profile ( )
static

adjust opencl subsystem according to scheduling profile

Definition at line 3379 of file opencl.c.

References _opencl, dt_conf_get_int(), dt_opencl_set_synchronization_timeout(), dt_opencl_update_priorities(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), and dt_opencl_t::lock.

Referenced by dt_opencl_init().

◆ dt_opencl_avoid_atomics()

int dt_opencl_avoid_atomics ( const int  devid)

Definition at line 219 of file opencl.c.

References _opencl, dt_opencl_device_t::avoid_atomics, dt_opencl_t::dev, and dt_opencl_t::inited.

Referenced by commit_params().

◆ dt_opencl_build_program()

int dt_opencl_build_program ( const int  dev,
const int  prog,
const char *  binname,
const char *  cachedir,
char *  md5sum,
int  loaded_cached 
)

◆ dt_opencl_check_tuning()

◆ dt_opencl_cleanup()

◆ dt_opencl_cleanup_device()

◆ dt_opencl_clear_driver_crash_streak()

void dt_opencl_clear_driver_crash_streak ( void  )

Clears the persisted driver-crash streak after a session in which OpenCL ran to a clean shutdown. Reads and writes conf: call it from the shutdown sequence BEFORE dt_conf_cleanup(), and before dt_opencl_cleanup().

Definition at line 1616 of file opencl.c.

References _gpu_runtime_crash_streak(), _gpu_runtime_set_crash_streak(), _opencl, dt_opencl_t::dev, dt_opencl_device_t::disabled, dt_opencl_t::enabled, i, dt_opencl_t::inited, IS_NULL_PTR, dt_opencl_t::num_devs, and dt_opencl_device_t::runtime_id.

Referenced by dt_cleanup().

◆ dt_opencl_copy_device_to_host()

int dt_opencl_copy_device_to_host ( const int  devid,
void *  host,
void *  device,
const int  width,
const int  height,
const int  bpp 
)

◆ dt_opencl_copy_host_to_device()

void * dt_opencl_copy_host_to_device ( const int  devid,
void *  host,
const int  width,
const int  height,
const int  bpp 
)

◆ dt_opencl_copy_host_to_device_constant()

◆ dt_opencl_copy_host_to_device_rowpitch()

void * dt_opencl_copy_host_to_device_rowpitch ( const int  devid,
void *  host,
const int  width,
const int  height,
const int  bpp,
const int  rowpitch 
)

◆ dt_opencl_create_kernel()

◆ dt_opencl_detected_device_enabled()

gboolean dt_opencl_detected_device_enabled ( const int  detected)

◆ dt_opencl_detected_device_headroom()

size_t dt_opencl_detected_device_headroom ( const int  detected)

◆ dt_opencl_detected_device_pinned_memory()

gboolean dt_opencl_detected_device_pinned_memory ( const int  detected)

◆ dt_opencl_dev_roundup_height()

int dt_opencl_dev_roundup_height ( int  size,
const int  devid 
)

Definition at line 3321 of file opencl.c.

References _opencl, dt_opencl_device_t::clroundup_ht, dt_opencl_t::dev, and size.

◆ dt_opencl_dev_roundup_width()

int dt_opencl_dev_roundup_width ( int  size,
const int  devid 
)

round size to a multiple of the value given in the device specifig config parameter clroundup_wd/ht

Definition at line 3316 of file opencl.c.

References _opencl, dt_opencl_device_t::clroundup_wd, dt_opencl_t::dev, and size.

◆ dt_opencl_device_init()

static int dt_opencl_device_init ( dt_opencl_t *  cl,
const int  dev,
cl_device_id *  devices,
const int  k 
)
static
Todo:
: compile as a job?

Definition at line 532 of file opencl.c.

References _ascii_str_canonical(), _gpu_runtime_crash_streak(), _gpu_runtime_of_platform(), _opencl_splash_update_compile(), dt_opencl_device_t::avoid_atomics, dt_opencl_device_t::clroundup_ht, dt_opencl_device_t::clroundup_wd, dt_opencl_device_t::cltype, dt_opencl_detected_device_t::cltype, dt_opencl_device_t::cmd_queue, dt_opencl_device_t::cname, dt_opencl_detected_device_t::cname, dt_opencl_detected_device_t::config_id, dt_opencl_device_t::context, dt_opencl_t::crc, dt_opencl_t::detected_devs, dt_opencl_t::dev, dt_opencl_device_t::devid, dt_opencl_device_t::disabled, dt_opencl_detected_device_t::disabled, dt_opencl_t::dlocl, dt_dlopencl_symbols_t::dt_clCreateCommandQueue, dt_dlopencl_symbols_t::dt_clCreateContext, DT_CLDEVICE_HEAD, dt_dlopencl_symbols_t::dt_clGetDeviceInfo, dt_dlopencl_symbols_t::dt_clGetPlatformInfo, dt_dlopencl_symbols_t::dt_clReleaseCommandQueue, dt_dlopencl_symbols_t::dt_clReleaseContext, dt_dlopencl_symbols_t::dt_clReleaseKernel, dt_dlopencl_symbols_t::dt_clReleaseProgram, dt_concat_path_file(), dt_conf_flush(), dt_conf_get_bool(), dt_conf_get_string_const(), dt_conf_key_exists(), dt_conf_set_string(), DT_DEBUG_ALWAYS, DT_DEBUG_OPENCL, DT_DEBUG_PERF, dt_free, dt_get_debug_flags(), dt_get_wtime(), dt_loc_get_kerneldir(), dt_loc_get_user_cache_dir(), dt_nvidia_gpu_supports_sm_20(), dt_opencl_build_program(), DT_OPENCL_CBUFFSIZE, dt_opencl_check_driver_blacklist(), DT_OPENCL_DEFAULT_COMPILE, DT_OPENCL_DEFAULT_COMPILE_AMD, DT_OPENCL_DEFAULT_COMPILE_INTEL, DT_OPENCL_DEFAULT_COMPILE_NVIDIA, dt_opencl_get_device_info(), dt_opencl_get_vendor_by_id(), dt_opencl_load_program(), DT_OPENCL_MAX_INCLUDES, DT_OPENCL_MAX_KERNELS, DT_OPENCL_MAX_PROGRAMS, dt_opencl_md5sum(), DT_OPENCL_PINNING_ON, dt_opencl_read_device_config(), DT_OPENCL_VENDOR_AMD, DT_OPENCL_VENDOR_INTEL, DT_OPENCL_VENDOR_NVIDIA, dt_opencl_write_device_config(), DT_PATH_MAX, dt_print(), dt_print_nts(), dt_pthread_mutex_destroy(), dt_pthread_mutex_init(), dt_util_str_replace(), dt_vprint(), dt_opencl_device_t::event_handles, dt_opencl_device_t::eventlist, dt_opencl_device_t::eventsconsolidated, dt_opencl_device_t::eventtags, f, FALSE, dt_opencl_device_t::forced_headroom, dt_opencl_detected_device_t::forced_headroom, dt_opencl_device_t::host_unified_memory, dt_opencl_detected_device_t::host_unified_memory, i, IS_NULL_PTR, k, dt_opencl_device_t::kernel, dt_opencl_device_t::kernel_used, dt_opencl_device_t::lock, dt_opencl_device_t::lostevents, dt_opencl_device_t::max_global_mem, dt_opencl_device_t::max_image_height, dt_opencl_device_t::max_image_width, dt_opencl_device_t::max_mem_alloc, dt_opencl_device_t::maxevents, dt_opencl_device_t::maxeventslot, dt_opencl_device_t::memory_in_use, dt_opencl_device_t::micro_nap, MIN, n, dt_opencl_device_t::name, dt_opencl_detected_device_t::name, dt_opencl_t::num_detected_devs, dt_opencl_device_t::numevents, dt_opencl_device_t::nvidia_sm_20, dt_opencl_device_t::options, dt_opencl_device_t::options_md5, dt_opencl_device_t::peak_memory, dt_opencl_device_t::pinned_memory, dt_opencl_detected_device_t::pinned_memory, dt_opencl_device_t::program, dt_opencl_device_t::program_used, res, dt_opencl_device_t::runtime_error, dt_opencl_device_t::runtime_id, dt_opencl_device_t::summary, dt_dlopencl_t::symbols, dt_opencl_device_t::totalevents, dt_opencl_device_t::totallost, dt_opencl_device_t::totalsuccess, TRUE, type, dt_opencl_device_t::use_events, dt_opencl_device_t::used_available, dt_opencl_device_t::used_global_mem, dt_opencl_device_t::vendor, and dt_opencl_device_t::vendor_id.

Referenced by dt_opencl_init().

◆ dt_opencl_disable()

void dt_opencl_disable ( void  )

disable opencl

Definition at line 3343 of file opencl.c.

References _opencl, dt_conf_set_bool(), dt_opencl_t::enabled, FALSE, and dt_opencl_t::inited.

◆ dt_opencl_enqueue_barrier()

int dt_opencl_enqueue_barrier ( const int  devid)

◆ dt_opencl_enqueue_copy_buffer_to_buffer()

int dt_opencl_enqueue_copy_buffer_to_buffer ( const int  devid,
cl_mem  src_buffer,
cl_mem  dst_buffer,
size_t  srcoffset,
size_t  dstoffset,
size_t  size 
)

◆ dt_opencl_enqueue_copy_buffer_to_image()

int dt_opencl_enqueue_copy_buffer_to_image ( const int  devid,
cl_mem  src_buffer,
cl_mem  dst_image,
size_t  offset,
size_t *  origin,
size_t *  region 
)

◆ dt_opencl_enqueue_copy_image()

◆ dt_opencl_enqueue_copy_image_to_buffer()

int dt_opencl_enqueue_copy_image_to_buffer ( const int  devid,
cl_mem  src_image,
cl_mem  dst_buffer,
size_t *  origin,
size_t *  region,
size_t  offset 
)

◆ dt_opencl_enqueue_kernel_2d()

int dt_opencl_enqueue_kernel_2d ( const int  dev,
const int  kernel,
const size_t *  sizes 
)

launch kernel!

Definition at line 2612 of file opencl.c.

References dt_opencl_enqueue_kernel_2d_with_local(), and kernel().

Referenced by _cf_harmonic_fill_cl_n(), _cf_joint_fit_cl(), _cf_joint_stage_cl(), _cf_joint_stage_cl_selftest(), _cf_pair_stage_cl(), _cf_stage_cl(), _downsample_guided_laplacian_postfilter_cl(), _drawlayer_run_premult_over_kernel(), _harmonic_reconstruct_cl(), _hf_stage_cl(), _hl_cl_clip(), _hl_cl_lch_bayer(), _hl_cl_visualize(), _hl_knee_apply_cfa_cl(), _hl_knee_estimate_cl(), _refine_with_detail_mask_cl(), _region_edge_blur_cl(), _retouch_blur_cl(), _retouch_fill_cl(), _simulate_channel_cl(), _sp_chol_factor_cl(), _upsample_cl(), apply_global_distortion_map_cl(), box_max_cl(), box_min_cl(), cl_box_mean(), cl_covariances(), cl_generate_result(), cl_solve(), cl_split_rgb(), cl_update_covariance(), cl_variances(), dehaze_cl(), dt_bilateral_blur_cl(), dt_bilateral_init_cl(), dt_bilateral_slice_cl(), dt_bilateral_slice_to_output_cl(), dt_colorspaces_apply_profile_cl(), dt_develop_blend_process_cl(), dt_gaussian_blur_cl(), dt_iop_colorreconstruct_bilateral_blur_cl(), dt_iop_colorreconstruct_bilateral_init_cl(), dt_iop_colorreconstruct_bilateral_slice_cl(), dt_ioppr_transform_image_colorspace_rgb_cl(), dt_local_laplacian_cl(), dual_demosaic_cl(), dwt_add_layer_cl(), dwt_subtract_layer_cl(), dwt_wavelet_decompose_cl(), green_equilibration_cl(), nlmeans_cl_accu(), nlmeans_cl_init(), nlmeans_cl_run(), process_cl(), process_cl(), process_cl(), process_default_cl(), process_harmonic_cl(), process_laplacian_bayer_cl(), process_laplacian_passthrough_cl(), process_laplacian_xtrans_cl(), process_markesteijn_cl(), process_nlmeans_cl(), process_rcd_cl(), process_vng_cl(), process_wavelets_cl(), reconstruct_highlights_cl(), rt_copy_image_masked_cl(), rt_copy_in_to_out_cl(), rt_copy_mask_to_alpha_cl(), transition_map_cl(), wavelets_process_cl(), and wavelets_process_cl().

◆ dt_opencl_enqueue_kernel_2d_with_local()

◆ dt_opencl_events_flush()

cl_int dt_opencl_events_flush ( const int  devid,
const int  reset 
)

Wait for events in eventlist to terminate, check for return status and profiling info of events. If "reset" is TRUE report summary info (would be CL_COMPLETE or last error code) and print profiling info if needed. If "reset" is FALSE just store info (success value, profiling) from terminated events and release events for re-use by OpenCL driver.

Definition at line 3584 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_t::dlocl, dt_dlopencl_symbols_t::dt_clGetEventInfo, dt_dlopencl_symbols_t::dt_clGetEventProfilingInfo, dt_dlopencl_symbols_t::dt_clReleaseEvent, DT_DEBUG_OPENCL, DT_DEBUG_PERF, dt_get_debug_flags(), dt_opencl_events_profiling(), dt_opencl_events_reset(), dt_opencl_events_wait_for(), dt_print(), dt_opencl_device_t::eventlist, dt_opencl_device_t::eventsconsolidated, dt_opencl_device_t::eventtags, FALSE, dt_opencl_t::inited, IS_NULL_PTR, k, dt_opencl_device_t::lostevents, dt_opencl_device_t::numevents, reset(), dt_opencl_device_t::summary, dt_dlopencl_t::symbols, dt_opencl_device_t::totalsuccess, and dt_opencl_device_t::use_events.

Referenced by dt_dev_pixelpipe_process(), dt_opencl_events_get_slot(), and dt_opencl_finish().

◆ dt_opencl_events_get_slot()

◆ dt_opencl_events_profiling()

void dt_opencl_events_profiling ( const int  devid,
const int  aggregated 
)

◆ dt_opencl_events_reset()

◆ dt_opencl_events_wait_for()

void dt_opencl_events_wait_for ( const int  devid)

◆ dt_opencl_finish()

◆ dt_opencl_free_kernel()

◆ dt_opencl_get_detected_device()

◆ dt_opencl_get_detected_device_count()

int dt_opencl_get_detected_device_count ( void  )

Number of GPU devices detected during OpenCL probing, including devices disabled by user preference.

Definition at line 399 of file opencl.c.

References _opencl, IS_NULL_PTR, and dt_opencl_t::num_detected_devs.

Referenced by dt_gui_preferences_show().

◆ dt_opencl_get_device_available()

◆ dt_opencl_get_device_headroom()

size_t dt_opencl_get_device_headroom ( const int  devid)

Bytes of the device left to other applications (its forced_headroom, from its own config key or memory_opencl_headroom), or 0 for an out-of-range id. Ansel plans against the device's total memory less this.

Definition at line 2084 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_device_t::forced_headroom, dt_opencl_t::inited, IS_NULL_PTR, and dt_opencl_t::num_devs.

Referenced by _add_device_section().

◆ dt_opencl_get_device_info()

static int dt_opencl_get_device_info ( dt_opencl_t *  cl,
cl_device_id  device,
cl_device_info  param_name,
void **  param_value,
size_t *  param_value_size 
)
static

◆ dt_opencl_get_device_max_global_mem()

size_t dt_opencl_get_device_max_global_mem ( const int  devid)

Total device memory in bytes, or 0 for an out-of-range id.

Definition at line 2068 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_t::inited, IS_NULL_PTR, dt_opencl_device_t::max_global_mem, and dt_opencl_t::num_devs.

Referenced by _add_device_section().

◆ dt_opencl_get_device_max_image_size()

gboolean dt_opencl_get_device_max_image_size ( const int  devid,
int *  width,
int *  height 
)

Largest 2D image the device will accept, which is what bounds tile size.

Parameters
deviddevice id.
widthreceives the maximum width. Not written for an out-of-range id.
heightreceives the maximum height. Same.
Returns
TRUE when both were written.

Definition at line 2058 of file opencl.c.

References _opencl, dt_opencl_t::dev, FALSE, height, dt_opencl_t::inited, IS_NULL_PTR, dt_opencl_device_t::max_image_height, dt_opencl_device_t::max_image_width, dt_opencl_t::num_devs, TRUE, and width.

Referenced by _default_process_tiling_cl_ptp(), and _default_process_tiling_cl_roi().

◆ dt_opencl_get_device_memalloc()

cl_ulong dt_opencl_get_device_memalloc ( const int  devid)

get size of allocatable single buffer

Definition at line 3253 of file opencl.c.

References _opencl, _opencl_get_device_memalloc(), and dt_opencl_t::inited.

Referenced by _default_process_tiling_cl_ptp(), and _default_process_tiling_cl_roi().

◆ dt_opencl_get_device_memory_in_use()

size_t dt_opencl_get_device_memory_in_use ( const int  devid)

Bytes Ansel holds on the device by its own accounting (dt_opencl_memory_statistics()), or 0 for an out-of-range id. What other applications hold there is not in it.

Definition at line 2076 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_t::inited, IS_NULL_PTR, dt_opencl_device_t::memory_in_use, and dt_opencl_t::num_devs.

Referenced by _add_device_section().

◆ dt_opencl_get_device_name()

const char * dt_opencl_get_device_name ( const int  devid)

Human-readable device name, owned by the OpenCL module.

Parameters
deviddevice id.
Returns
the name, or NULL for an out-of-range id or a device with no name. Valid until cleanup; do not free.

Definition at line 2050 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_t::inited, IS_NULL_PTR, dt_opencl_device_t::name, and dt_opencl_t::num_devs.

Referenced by _add_device_section().

◆ dt_opencl_get_image_element_size()

◆ dt_opencl_get_image_height()

◆ dt_opencl_get_image_width()

◆ dt_opencl_get_kernel_work_group_size()

int dt_opencl_get_kernel_work_group_size ( const int  dev,
const int  kernel,
size_t *  kernelworkgroupsize 
)

◆ dt_opencl_get_max_work_item_sizes()

int dt_opencl_get_max_work_item_sizes ( const int  dev,
size_t *  sizes 
)

◆ dt_opencl_get_mem_context_id()

◆ dt_opencl_get_mem_flags()

cl_mem_flags dt_opencl_get_mem_flags ( cl_mem  mem)

◆ dt_opencl_get_mem_object_size()

size_t dt_opencl_get_mem_object_size ( cl_mem  mem)

◆ dt_opencl_get_mem_record()

gboolean dt_opencl_get_mem_record ( cl_mem  mem,
int *  devid,
size_t *  size 
)

◆ dt_opencl_get_num_devices()

int dt_opencl_get_num_devices ( void  )

Number of usable OpenCL devices; 0 when OpenCL is unavailable.

Definition at line 2043 of file opencl.c.

References _opencl, dt_opencl_t::inited, and dt_opencl_t::num_devs.

Referenced by _rebuild_memory(), dt_cleanup(), and dt_dev_pixelpipe_cache_get_entries_stats().

◆ dt_opencl_get_vendor_by_id()

static const char * dt_opencl_get_vendor_by_id ( unsigned int  id)
static

Definition at line 1690 of file opencl.c.

References DT_OPENCL_VENDOR_AMD, DT_OPENCL_VENDOR_INTEL, and DT_OPENCL_VENDOR_NVIDIA.

Referenced by dt_opencl_device_init().

◆ dt_opencl_get_work_group_limits()

int dt_opencl_get_work_group_limits ( const int  dev,
size_t *  sizes,
size_t *  workgroupsize,
unsigned long *  localmemsize 
)

return max size per dimension in sizes[3] and max total size in workgroupsize

Definition at line 2571 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_device_t::devid, dt_opencl_t::dlocl, dt_dlopencl_symbols_t::dt_clGetDeviceInfo, dt_opencl_get_max_work_item_sizes(), dt_opencl_t::inited, and dt_dlopencl_t::symbols.

Referenced by dt_opencl_local_buffer_opt().

◆ dt_opencl_image_fits_device()

gboolean dt_opencl_image_fits_device ( const int  devid,
const size_t  width,
const size_t  height,
const unsigned  bpp,
const float  factor,
const size_t  overhead 
)

check if image size fit into limits given by OpenCL runtime

Definition at line 3308 of file opencl.c.

References bpp, DT_OPENCL_FIT_OK, dt_opencl_image_fits_device_reason(), factor, height, and width.

Referenced by _harmonic_reconstruct_cl(), and guided_filter_cl().

◆ dt_opencl_image_fits_device_reason()

dt_opencl_fit_reason_t dt_opencl_image_fits_device_reason ( const int  devid,
const size_t  width,
const size_t  height,
const unsigned  bpp,
const float  factor,
const size_t  overhead,
size_t *  needed,
size_t *  limit 
)

Like dt_opencl_image_fits_device() but also reports why the image (didn't) fit. needed and limit are filled with the two byte quantities that were actually compared for the returned reason (both 0 for DIMENSION/UNINITED), so a caller can log a message consistent with the real check instead of guessing a limit. Either out-param may be NULL.

Definition at line 3259 of file opencl.c.

References _opencl, _opencl_get_device_memalloc(), bpp, dt_opencl_t::dev, DT_DEBUG_OPENCL, DT_OPENCL_FIT_ALLOC_LIMIT, DT_OPENCL_FIT_AVAILABLE, DT_OPENCL_FIT_DIMENSION, DT_OPENCL_FIT_OK, DT_OPENCL_FIT_UNINITED, dt_opencl_get_device_available(), dt_print(), factor, height, dt_opencl_t::inited, dt_opencl_device_t::max_image_height, dt_opencl_device_t::max_image_width, n, and width.

Referenced by dt_opencl_image_fits_device(), and pixelpipe_process_on_GPU().

◆ dt_opencl_init()

void dt_opencl_init ( const gboolean  exclude_opencl,
const gboolean  print_statistics 
)

Definition at line 1301 of file opencl.c.

References _driver_crash_marker, _opencl, _opencl_driver_crash_marker_path(), _opencl_fold_driver_crashes(), dt_opencl_t::crc, dt_opencl_t::detected_devs, dt_opencl_t::dev, dt_opencl_t::dev_priority_export, dt_opencl_t::dev_priority_image, dt_opencl_t::dev_priority_preview, dt_opencl_t::dev_priority_thumbnail, dt_opencl_t::dlocl, dt_bilateral_init_cl_global(), dt_capabilities_add(), dt_dlopencl_symbols_t::dt_clGetDeviceIDs, dt_dlopencl_symbols_t::dt_clGetPlatformIDs, dt_dlopencl_symbols_t::dt_clGetPlatformInfo, dt_colorspaces_init_cl_global(), dt_conf_get_bool(), dt_conf_get_int(), dt_conf_get_string_const(), DT_DEBUG_OPENCL, dt_develop_blend_init_cl_global(), dt_dlopencl_init(), dt_dwt_init_cl_global(), dt_free, dt_gaussian_init_cl_global(), dt_guided_filter_init_cl_global(), dt_heal_init_cl_global(), dt_interpolation_init_cl_global(), dt_local_laplacian_init_cl_global(), dt_opencl_apply_scheduling_profile(), DT_OPENCL_CBUFFSIZE, dt_opencl_cleanup_device(), dt_opencl_device_init(), DT_OPENCL_MAX_PLATFORMS, dt_print_nts(), dt_pthread_mutex_init(), dt_opencl_t::enabled, dt_opencl_t::error_count, i, dt_opencl_t::inited, IS_NULL_PTR, k, dt_dlopencl_t::library, dt_opencl_t::lock, dt_opencl_t::mandatory, dt_opencl_t::mem_sizes, dt_opencl_t::mem_sizes_lock, n, dt_opencl_device_t::name, dt_opencl_t::num_detected_devs, dt_opencl_t::num_devs, dt_opencl_t::print_statistics, res, dt_opencl_t::stopped, and dt_dlopencl_t::symbols.

Referenced by dt_init().

◆ dt_opencl_is_enabled()

int dt_opencl_is_enabled ( void  )

check if opencl is enabled

Definition at line 3335 of file opencl.c.

References _opencl, dt_opencl_t::enabled, FALSE, and dt_opencl_t::inited.

Referenced by _default_size(), _expand_rating_and_metadata(), and _rebuild_memory().

◆ dt_opencl_is_inited()

int dt_opencl_is_inited ( void  )

◆ dt_opencl_is_pinned_memory()

◆ dt_opencl_load_program()

int dt_opencl_load_program ( const int  dev,
const int  prog,
const char *  filename,
const char *  binname,
const char *  cachedir,
char *  md5sum,
char **  includemd5,
int *  loaded_cached 
)

◆ dt_opencl_local_buffer_opt()

◆ dt_opencl_map_buffer()

void * dt_opencl_map_buffer ( const int  devid,
cl_mem  buffer,
const int  blocking,
const int  flags,
size_t  offset,
size_t  size 
)

◆ dt_opencl_map_image()

◆ dt_opencl_md5sum()

void dt_opencl_md5sum ( const char **  files,
char **  md5sums 
)

calculates md5sums for a list of CL include files.

Definition at line 2126 of file opencl.c.

References dt_concat_path_file(), DT_DEBUG_OPENCL, dt_free, dt_loc_get_kerneldir(), DT_OPENCL_MAX_INCLUDES, DT_PATH_MAX, dt_print(), f, fopen_stat(), IS_NULL_PTR, and n.

Referenced by dt_opencl_device_init().

◆ dt_opencl_memory_statistics()

◆ dt_opencl_micro_nap()

int dt_opencl_micro_nap ( const int  devid)

Definition at line 225 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_t::inited, and dt_opencl_device_t::micro_nap.

Referenced by nlmeans_cl_run().

◆ dt_opencl_note_crash_backtrace()

void dt_opencl_note_crash_backtrace ( const char *  backtrace,
size_t  backtrace_len 
)

Tell the OpenCL module that the process crashed, and let it judge whether the crash was its driver's doing.

internally calls dt_clGetDeviceInfo, and takes care of memory allocation afterwards, *param_value will point to memory block of size at least *param_value which needs to be g_free()'d manually inits the opencl subsystem.

Vendor OpenCL runtimes fault on their own threads, with no frame of ours on the stack, and no code here can prevent that. What this module can do is notice it happening repeatedly and stop enabling OpenCL on the next start. It recognises its own drivers by name in the backtrace; a crash anywhere else is recorded as nothing.

Sentry captures the backtrace and knows nothing about GPUs; this module knows about GPUs and nothing about crash reporting. dt_init() connects the two, so neither has to include the other.

Parameters
backtraceNUL-terminated backtrace text, valid only for the duration of the call.
backtrace_lenits length in bytes.
Warning
Runs in a signal handler. Uses only open/write/close – no allocation, no locks, no conf – and does nothing at all before dt_opencl_init() has built the record's path.

Definition at line 1243 of file opencl.c.

References _driver_crash_marker, _gpu_runtimes, i, IS_NULL_PTR, void(), w1, and w2.

Referenced by dt_init().

◆ dt_opencl_priority_parse()

static void dt_opencl_priority_parse ( dt_opencl_t *  cl,
char *  configstr,
int *  priority_list,
int *  mandatory 
)
static

parse a single token of priority string and store priorities in priority_list

Definition at line 1798 of file opencl.c.

References _device_by_cname(), _take_from_list(), dt_free, i, IS_NULL_PTR, and dt_opencl_t::num_devs.

Referenced by dt_opencl_update_priorities().

◆ dt_opencl_read_buffer_from_device()

◆ dt_opencl_read_device_config()

◆ dt_opencl_read_host_from_device()

int dt_opencl_read_host_from_device ( const int  devid,
void *  host,
void *  device,
const int  width,
const int  height,
const int  bpp 
)

◆ dt_opencl_read_host_from_device_non_blocking()

int dt_opencl_read_host_from_device_non_blocking ( const int  devid,
void *  host,
void *  device,
const int  width,
const int  height,
const int  bpp 
)

Definition at line 2661 of file opencl.c.

References bpp, dt_opencl_read_host_from_device_rowpitch_non_blocking(), height, and width.

◆ dt_opencl_read_host_from_device_raw()

int dt_opencl_read_host_from_device_raw ( const int  devid,
void *  host,
void *  device,
const size_t *  origin,
const size_t *  region,
const int  rowpitch,
const int  blocking 
)

◆ dt_opencl_read_host_from_device_rowpitch()

int dt_opencl_read_host_from_device_rowpitch ( const int  devid,
void *  host,
void *  device,
const int  width,
const int  height,
const int  rowpitch 
)

◆ dt_opencl_read_host_from_device_rowpitch_non_blocking()

int dt_opencl_read_host_from_device_rowpitch_non_blocking ( const int  devid,
void *  host,
void *  device,
const int  width,
const int  height,
const int  rowpitch 
)

◆ dt_opencl_release_device()

void dt_opencl_release_device ( const int  devid)

Release a device reserved by either reserve function.

done with your command queue.

Definition at line 2013 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_pthread_mutex_BAD_unlock(), dt_opencl_t::inited, dt_opencl_device_t::lock, and dt_opencl_t::num_devs.

Referenced by _free_cache_entry(), dt_dev_pixelpipe_cache_flush_clmem_for_pipe(), dt_dev_pixelpipe_process(), and main().

◆ dt_opencl_release_mem_object()

void dt_opencl_release_mem_object ( cl_mem  mem)

Definition at line 2863 of file opencl.c.

References _opencl, dt_opencl_t::dlocl, dt_dlopencl_symbols_t::dt_clReleaseMemObject, dt_opencl_memory_statistics(), dt_opencl_t::inited, IS_NULL_PTR, OPENCL_MEMORY_SUB, and dt_dlopencl_t::symbols.

Referenced by _aniso_stage_cl_selftest(), _blend_layer_over_input_cl(), _cache_entry_clmem_flush_device(), _cache_entry_clmem_flush_host_pinned_locked(), _cf_harmonic_fill_cl_n(), _cf_harmonic_fill_cl_selftest(), _cf_joint_fit_cl(), _cf_joint_stage_cl(), _cf_joint_stage_cl_selftest(), _cf_pair_stage_cl(), _cf_stage_cl(), _cf_stage_cl_selftest(), _chromaticity_gradient_stage_cl_selftest(), _default_process_tiling_cl_ptp(), _default_process_tiling_cl_roi(), _downsample_guided_laplacian_postfilter_cl(), _drawlayer_acquire_source_image(), _harmonic_reconstruct_cl(), _hf_stage_cl(), _hf_stage_cl_selftest(), _hl_cl_count_clipped(), _hl_cl_lch_xtrans(), _hl_cl_visualize(), _hl_knee_apply_cfa_cl(), _hl_knee_estimate_cl(), _joint_core_stage_cl_selftest(), _knee_cl_selftest(), _pixel_cache_clmem_put(), _refine_with_detail_mask_cl(), _region_blur_cl_selftest(), _region_guided_filter_cl_selftest(), _retouch_blur_cl(), _retouch_clone_cl(), _retouch_fill_cl(), _retouch_heal_cl(), _selfdome_stage_cl_selftest(), _simulate_channel_cl(), _sp_chol_cl_free(), _sp_chol_cl_selftest(), _sp_cl_upload(), _unet_forward_cl(), _upload_layer_bank(), _weights_cl(), apply_global_distortion_map_cl(), box_max_cl(), box_min_cl(), color_smoothing_cl(), dt_bilateral_free_cl(), dt_bilateral_slice_to_output_cl(), dt_colorspaces_apply_profile_cl(), dt_dev_pixelpipe_cache_flush_entry_clmem(), dt_dev_pixelpipe_cache_get_pinned_image(), dt_dev_pixelpipe_cache_release_cl_buffer(), dt_develop_blend_process_cl(), dt_gaussian_free_cl(), dt_gaussian_init_cl(), dt_interpolation_resample_cl(), dt_iop_colorreconstruct_bilateral_free_cl(), dt_ioppr_free_iccprofile_params_cl(), dt_ioppr_transform_image_colorspace_rgb_cl(), dt_local_laplacian_free_cl(), dt_nn_model_free_cl(), dual_demosaic_cl(), dwt_wavelet_decompose_cl(), green_equilibration_cl(), guided_filter_cl_impl(), main(), nlmeans_cl_run(), process_cl(), process_cl(), process_cl(), process_default_cl(), process_harmonic_cl(), process_laplacian_bayer_cl(), process_laplacian_passthrough_cl(), process_laplacian_xtrans_cl(), process_markesteijn_cl(), process_nlmeans_cl(), process_rcd_cl(), process_vng_cl(), process_wavelets_cl(), reconstruct_highlights_cl(), rt_copy_image_masked_cl(), rt_copy_in_to_out_cl(), rt_copy_mask_to_alpha_cl(), rt_process_forms_cl(), and rt_upload_scaled_mask_cl().

◆ dt_opencl_report_pipe_error()

int dt_opencl_report_pipe_error ( void  )

Record that a pipe run failed on OpenCL, and decide whether to give up on it.

The count and the give-up threshold belong to the OpenCL module, not to the pipeline: the pipeline's job is to report the failure and be told what to do next. Crossing the threshold also drops the "opencl" capability, so this is the one place that decides OpenCL is finished for the session.

Returns
1 for "this run failed, retry on CPU", 2 for "too many failures, OpenCL is off for the rest of the session".

Definition at line 2093 of file opencl.c.

References _opencl, dt_capabilities_remove(), DT_OPENCL_MAX_ERRORS, dt_opencl_t::error_count, and dt_opencl_t::stopped.

Referenced by dt_dev_pixelpipe_process().

◆ dt_opencl_reserve_device_by_id()

void dt_opencl_reserve_device_by_id ( const int  devid)

Reserve a device the caller has already identified, blocking until it is free.

Parameters
deviddevice id; out-of-range ids are ignored.

Definition at line 2024 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_pthread_mutex_BAD_lock(), dt_opencl_t::inited, dt_opencl_device_t::lock, and dt_opencl_t::num_devs.

Referenced by dt_dev_pixelpipe_cache_flush_clmem_for_pipe().

◆ dt_opencl_reserve_device_for_pipe()

int dt_opencl_reserve_device_for_pipe ( const int  pipetype)

Reserve a device for a pipe run: choose a free one by the pipe's priority list and take its lock. Blocks or gives up per the opencl_mandatory_timeout conf key.

locks a device for your thread's exclusive use

Parameters
pipetypea dt_dev_pixelpipe_type_t; selects which priority list applies.
Returns
the reserved device id, or -1 if none could be had. Release with dt_opencl_release_device().
Note
There is ONE lock per device and this is it – reserving a device and locking it are the same act. dt_opencl_reserve_device_by_id() takes the same lock when the caller already knows which device it needs. This used to be called dt_opencl_lock_device(), which took a PIPE TYPE while its dt_opencl_unlock_device() counterpart took a DEVICE ID – two different ints, one of them silently wrong if the pair were ever read as symmetric. The old names are gone rather than redefined, so a stale caller fails to compile.

Definition at line 1928 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_t::dev_priority_export, dt_opencl_t::dev_priority_image, dt_opencl_t::dev_priority_preview, dt_opencl_t::dev_priority_thumbnail, dt_conf_get_int(), DT_DEBUG_OPENCL, DT_DEV_PIXELPIPE_EXPORT, DT_DEV_PIXELPIPE_FULL, DT_DEV_PIXELPIPE_PREVIEW, DT_DEV_PIXELPIPE_THUMBNAIL, dt_free, dt_iop_nap(), dt_print(), dt_pthread_mutex_BAD_trylock(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_opencl_t::inited, dt_opencl_t::lock, dt_opencl_device_t::lock, dt_opencl_t::mandatory, MAX, n, and dt_opencl_t::num_devs.

Referenced by dt_dev_pixelpipe_process(), and main().

◆ dt_opencl_set_detected_device_enabled()

int dt_opencl_set_detected_device_enabled ( const int  detected,
const gboolean  enabled 
)

◆ dt_opencl_set_detected_device_headroom()

◆ dt_opencl_set_detected_device_pinned_memory()

◆ dt_opencl_set_kernel_arg()

int dt_opencl_set_kernel_arg ( const int  dev,
const int  kernel,
const int  num,
const size_t  size,
const void *  arg 
)

attach arg.

Definition at line 2603 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_opencl_t::dlocl, dt_dlopencl_symbols_t::dt_clSetKernelArg, DT_OPENCL_MAX_KERNELS, dt_opencl_t::inited, kernel(), dt_opencl_device_t::kernel, size, and dt_dlopencl_t::symbols.

Referenced by _cf_harmonic_fill_cl_n(), _cf_joint_fit_cl(), _cf_joint_stage_cl(), _cf_joint_stage_cl_selftest(), _cf_pair_stage_cl(), _cf_stage_cl(), _conv_cl(), _downsample_guided_laplacian_postfilter_cl(), _drawlayer_run_premult_over_kernel(), _harmonic_reconstruct_cl(), _hf_stage_cl(), _hl_cl_clip(), _hl_cl_count_clipped(), _hl_cl_lch_bayer(), _hl_cl_lch_xtrans(), _hl_cl_visualize(), _hl_knee_apply_cfa_cl(), _hl_knee_estimate_cl(), _refine_with_detail_mask_cl(), _region_edge_blur_cl(), _retouch_blur_cl(), _retouch_fill_cl(), _simulate_channel_cl(), _sp_chol_factor_cl(), _sp_chol_solve_cl(), _upsample_cl(), apply_global_distortion_map_cl(), box_max_cl(), box_min_cl(), cl_box_mean(), cl_covariances(), cl_generate_result(), cl_solve(), cl_split_rgb(), cl_update_covariance(), cl_variances(), color_smoothing_cl(), dehaze_cl(), dt_bilateral_blur_cl(), dt_bilateral_init_cl(), dt_bilateral_slice_cl(), dt_bilateral_slice_to_output_cl(), dt_bilateral_splat_cl(), dt_colorspaces_apply_profile_cl(), dt_develop_blend_process_cl(), dt_gaussian_blur_cl(), dt_interpolation_resample_cl(), dt_iop_colorreconstruct_bilateral_blur_cl(), dt_iop_colorreconstruct_bilateral_init_cl(), dt_iop_colorreconstruct_bilateral_slice_cl(), dt_iop_colorreconstruct_bilateral_splat_cl(), dt_ioppr_transform_image_colorspace_rgb_cl(), dt_local_laplacian_cl(), dual_demosaic_cl(), dwt_add_layer_cl(), dwt_subtract_layer_cl(), dwt_wavelet_decompose_cl(), green_equilibration_cl(), nlmeans_cl_accu(), nlmeans_cl_horiz(), nlmeans_cl_init(), nlmeans_cl_run(), process_cl(), process_cl(), process_cl(), process_default_cl(), process_harmonic_cl(), process_laplacian_bayer_cl(), process_laplacian_passthrough_cl(), process_laplacian_xtrans_cl(), process_markesteijn_cl(), process_nlmeans_cl(), process_rcd_cl(), process_vng_cl(), process_wavelets_cl(), reconstruct_highlights_cl(), rt_copy_image_masked_cl(), rt_copy_in_to_out_cl(), rt_copy_mask_to_alpha_cl(), transition_map_cl(), wavelets_process_cl(), and wavelets_process_cl().

◆ dt_opencl_set_synchronization_timeout()

static void dt_opencl_set_synchronization_timeout ( int  value)
static

set opencl specific synchronization timeout

Definition at line 3372 of file opencl.c.

References _opencl, DT_DEBUG_OPENCL, dt_print_nts(), dt_opencl_t::opencl_synchronization_timeout, and value.

Referenced by dt_opencl_apply_scheduling_profile().

◆ dt_opencl_try_reserve_device_by_id()

int dt_opencl_try_reserve_device_by_id ( const int  devid)

Reserve a device only if it is free right now.

Parameters
deviddevice id.
Returns
0 when the device was reserved (pthread convention), non-zero when it was busy or the id was out of range. Never waits – callers use this on paths that must not block behind a pipe that is mid-run.

Definition at line 2035 of file opencl.c.

References _opencl, dt_opencl_t::dev, dt_pthread_mutex_BAD_trylock(), dt_opencl_t::inited, dt_opencl_device_t::lock, and dt_opencl_t::num_devs.

Referenced by _free_cache_entry().

◆ dt_opencl_unmap_mem_object()

◆ dt_opencl_update_priorities()

◆ dt_opencl_update_settings()

int dt_opencl_update_settings ( void  )

update enabled flag and profile with value from preferences, returns enabled flag

Todo:
: This pulls in prefs every time the pixelpipe runs. Instead have a callback for DT_SIGNAL_PREFERENCES_CHANGE?

Definition at line 3352 of file opencl.c.

References _opencl, dt_conf_get_bool(), DT_DEBUG_OPENCL, dt_print(), dt_opencl_t::enabled, dt_opencl_t::error_count, FALSE, dt_opencl_t::inited, and dt_opencl_t::stopped.

Referenced by dt_dev_pixelpipe_process().

◆ dt_opencl_use_pinned_memory()

gboolean dt_opencl_use_pinned_memory ( const int  devid)

◆ dt_opencl_write_buffer_to_device()

◆ dt_opencl_write_device_config()

◆ dt_opencl_write_host_to_device()

◆ dt_opencl_write_host_to_device_non_blocking()

int dt_opencl_write_host_to_device_non_blocking ( const int  devid,
void *  host,
void *  device,
const int  width,
const int  height,
const int  bpp 
)

Definition at line 2708 of file opencl.c.

References bpp, dt_opencl_write_host_to_device_rowpitch_non_blocking(), height, and width.

◆ dt_opencl_write_host_to_device_raw()

int dt_opencl_write_host_to_device_raw ( const int  devid,
const void *  host,
void *  device,
const size_t *  origin,
const size_t *  region,
const int  rowpitch,
const int  blocking 
)

◆ dt_opencl_write_host_to_device_rowpitch()

int dt_opencl_write_host_to_device_rowpitch ( const int  devid,
void *  host,
void *  device,
const int  width,
const int  height,
const int  rowpitch 
)

◆ dt_opencl_write_host_to_device_rowpitch_non_blocking()

int dt_opencl_write_host_to_device_rowpitch_non_blocking ( const int  devid,
void *  host,
void *  device,
const int  width,
const int  height,
const int  rowpitch 
)

◆ fopen_stat()

static FILE * fopen_stat ( const char *  filename,
struct stat *  st 
)
static

Definition at line 2107 of file opencl.c.

References DT_DEBUG_OPENCL, dt_print(), f, and IS_NULL_PTR.

Referenced by dt_opencl_load_program(), and dt_opencl_md5sum().

◆ nextpow2()

static int nextpow2 ( int  n)
static

Definition at line 3776 of file opencl.c.

References k, and n.

Referenced by dt_opencl_local_buffer_opt().

Variable Documentation

◆ _driver_crash_marker

char _driver_crash_marker[DT_PATH_MAX] = { 0 }
static

◆ _gpu_runtimes

const _gpu_runtime_t _gpu_runtimes[]
static
Initial value:
= {
{ "RusticlOpenCL", "rusticl", "rusticl" },
{ "libMesaOpenCL", "Clover", "clover" },
{ "amdocl", "AMD", "amd" },
{ "libigdfcl", "Intel(R) OpenCL", "intel" },
{ "libigdrcl", "Intel(R) OpenCL", "intel" },
{ "intelocl", "Intel(R) OpenCL", "intel" },
{ "libnvidia-opencl", "NVIDIA", "nvidia" },
{ "nvopencl", "NVIDIA", "nvidia" },
{ NULL, NULL, NULL }
}

Definition at line 1183 of file opencl.c.

Referenced by _gpu_runtime_of_platform(), _opencl_fold_driver_crashes(), and dt_opencl_note_crash_backtrace().

◆ _opencl

dt_opencl_t* _opencl = NULL
static

Definition at line 131 of file opencl.c.

Referenced by _device_by_cname(), _dt_opencl_alloc_image2d(), _opencl_get_device_memalloc(), dt_opencl_alloc_device_buffer_with_flags(), dt_opencl_apply_scheduling_profile(), dt_opencl_avoid_atomics(), dt_opencl_build_program(), dt_opencl_check_tuning(), dt_opencl_cleanup(), dt_opencl_clear_driver_crash_streak(), dt_opencl_copy_host_to_device_constant(), dt_opencl_copy_host_to_device_rowpitch(), dt_opencl_create_kernel(), dt_opencl_dev_roundup_height(), dt_opencl_dev_roundup_width(), dt_opencl_disable(), dt_opencl_enqueue_barrier(), dt_opencl_enqueue_copy_buffer_to_buffer(), dt_opencl_enqueue_copy_buffer_to_image(), dt_opencl_enqueue_copy_image(), dt_opencl_enqueue_copy_image_to_buffer(), dt_opencl_enqueue_kernel_2d_with_local(), dt_opencl_events_flush(), dt_opencl_events_get_slot(), dt_opencl_events_profiling(), dt_opencl_events_reset(), dt_opencl_events_wait_for(), dt_opencl_finish(), dt_opencl_free_kernel(), dt_opencl_get_detected_device(), dt_opencl_get_detected_device_count(), dt_opencl_get_device_available(), dt_opencl_get_device_headroom(), dt_opencl_get_device_max_global_mem(), dt_opencl_get_device_max_image_size(), dt_opencl_get_device_memalloc(), dt_opencl_get_device_memory_in_use(), dt_opencl_get_device_name(), dt_opencl_get_image_element_size(), dt_opencl_get_image_height(), dt_opencl_get_image_width(), dt_opencl_get_kernel_work_group_size(), dt_opencl_get_max_work_item_sizes(), dt_opencl_get_mem_context_id(), dt_opencl_get_mem_flags(), dt_opencl_get_mem_object_size(), dt_opencl_get_mem_record(), dt_opencl_get_num_devices(), dt_opencl_get_work_group_limits(), dt_opencl_image_fits_device_reason(), dt_opencl_init(), dt_opencl_is_enabled(), dt_opencl_is_inited(), dt_opencl_load_program(), dt_opencl_local_buffer_opt(), dt_opencl_map_buffer(), dt_opencl_map_image(), dt_opencl_memory_statistics(), dt_opencl_micro_nap(), dt_opencl_read_buffer_from_device(), dt_opencl_read_device_config(), dt_opencl_read_host_from_device_raw(), dt_opencl_read_host_from_device_rowpitch(), dt_opencl_read_host_from_device_rowpitch_non_blocking(), dt_opencl_release_device(), dt_opencl_release_mem_object(), dt_opencl_report_pipe_error(), dt_opencl_reserve_device_by_id(), dt_opencl_reserve_device_for_pipe(), dt_opencl_set_detected_device_enabled(), dt_opencl_set_detected_device_headroom(), dt_opencl_set_detected_device_pinned_memory(), dt_opencl_set_kernel_arg(), dt_opencl_set_synchronization_timeout(), dt_opencl_try_reserve_device_by_id(), dt_opencl_unmap_mem_object(), dt_opencl_update_priorities(), dt_opencl_update_settings(), dt_opencl_use_pinned_memory(), dt_opencl_write_buffer_to_device(), dt_opencl_write_device_config(), dt_opencl_write_host_to_device_raw(), dt_opencl_write_host_to_device_rowpitch(), and dt_opencl_write_host_to_device_rowpitch_non_blocking().