18#ifndef DT_SYSTEM_MEM_ALLOC_H
19#define DT_SYSTEM_MEM_ALLOC_H
43#define DT_IS_ALIGNED(x) __builtin_assume_aligned(x, DT_CACHELINE_BYTES)
47#if defined(__APPLE__) && defined(__aarch64__)
48 #define DT_CACHELINE_BYTES 128
49 #define DT_CACHELINE_FLOATS 32
50 #define DT_CACHELINE_PIXELS 8
52 #define DT_CACHELINE_BYTES 64
53 #define DT_CACHELINE_FLOATS 16
54 #define DT_CACHELINE_PIXELS 4
60#define DT_ALIGNED_ARRAY __attribute__((aligned(DT_CACHELINE_BYTES)))
61#define DT_ALIGNED_PIXEL __attribute__((aligned(16)))
71 return ((
size % alignment) == 0) ?
size : ((
size - 1) / alignment + 1) * alignment;
84#if defined(__FreeBSD_version) && __FreeBSD_version < 700013
98 if(!IS_NULL_PTR(ptr)) \
100 g_free((void *)(ptr)); \
101 *(void **)(&(ptr)) = NULL; \
122#define dt_free_align(ptr) \
123 if(!IS_NULL_PTR(ptr)) \
125 dt_free_align_ptr((void *)(ptr)); \
126 *(void **)(&(ptr)) = NULL; \
141 float *
const buf = (
float*)
dt_alloc_align(pixels *
sizeof(
float));
142 if(buf)
memset(buf, 0, pixels *
sizeof(
float));
163 for(
size_t k = 0;
k <
size /
sizeof(
unsigned char);
k++) {
164 unsigned char *
const item = (
unsigned char *
const)buffer +
k;
float *const restrict const size_t k
static void memset_zero(void *const buffer, size_t size)
Set the memory buffer to zero as a pack of unsigned char.
static float * dt_calloc_align_float(size_t pixels)
static void * dt_calloc_align(size_t size)
static void dt_free_align_ptr(void *mem)
static float * dt_alloc_align_float(size_t pixels)
static size_t dt_round_size_sse(const size_t size)
static void * dt_check_sse_aligned(void *pointer)
static void * dt_alloc_align_internal(size_t size)
static void dt_free_gpointer(gpointer ptr)
void * dt_alloc_align(size_t size)
static size_t dt_round_size(const size_t size, const size_t alignment)
static gboolean dt_is_aligned(const void *pointer, size_t byte_count)
#define DT_CACHELINE_BYTES