CCCC
C bytecode compiler + VM interpreter
Loading...
Searching...
No Matches
Macros | Typedefs | Functions
opencl.h File Reference

Maps OpenCL C 1.2 onto the kernel model of <cccc/kernel.h>. Included automatically ahead of every input read as OpenCL C (-x cl, .cl). See docs/opencl.md. More...

#include <cccc/kernel.h>
Include dependency graph for opencl.h:

Go to the source code of this file.

Macros

#define __CL_VECTOR(base, name, bytes)    typedef base name __attribute__((vector_size(bytes)))
 
#define __CL_VECTOR3(base, name, bytes)    typedef base name __attribute__((vector_size(bytes), cccc_visible_lanes(3)))
 
Version
#define __OPENCL_C_VERSION__   120
 
#define __OPENCL_VERSION__   120
 
#define CL_VERSION_1_0   100
 
#define CL_VERSION_1_1   110
 
#define CL_VERSION_1_2   120
 
#define __ENDIAN_LITTLE__   1
 
Qualifiers
#define __kernel   [[cccc::__kernel__]]
 
#define kernel   [[cccc::__kernel__]]
 
#define __global   [[cccc::__global__]]
 
#define global   [[cccc::__global__]]
 
#define __local   [[cccc::__local__]]
 
#define local   [[cccc::__local__]]
 
#define __constant   [[cccc::__constant__]]
 
#define constant   [[cccc::__constant__]]
 
#define __private   [[cccc::__private__]]
 
#define private   [[cccc::__private__]]
 
Work-item functions

Map onto the cccc_* builtins of kernel.h.

#define get_work_dim()   cccc_work_dim()
 
#define get_global_id(d)   cccc_global_id(d)
 
#define get_local_id(d)   cccc_local_id(d)
 
#define get_group_id(d)   cccc_group_id(d)
 
#define get_global_size(d)   cccc_global_size(d)
 
#define get_local_size(d)   cccc_local_size(d)
 
#define get_num_groups(d)   cccc_num_groups(d)
 
#define get_global_offset(d)   ((size_t)0)
 
Barriers and fences
#define CLK_LOCAL_MEM_FENCE   CCCC_LOCAL_FENCE
 
#define CLK_GLOBAL_MEM_FENCE   CCCC_GLOBAL_FENCE
 
#define barrier(flags)   cccc_barrier(flags)
 
#define mem_fence(flags)   __atomic_thread_fence(__ATOMIC_SEQ_CST)
 
#define read_mem_fence(flags)   __atomic_thread_fence(__ATOMIC_SEQ_CST)
 
#define write_mem_fence(flags)   __atomic_thread_fence(__ATOMIC_SEQ_CST)
 
Atomics

Return the old value. Also available under the OpenCL 1.0 atom_* spellings.

#define atomic_add(p, v)   __atomic_fetch_add(p, v, __ATOMIC_SEQ_CST)
 
#define atomic_sub(p, v)   __atomic_fetch_sub(p, v, __ATOMIC_SEQ_CST)
 
#define atomic_and(p, v)   __atomic_fetch_and(p, v, __ATOMIC_SEQ_CST)
 
#define atomic_or(p, v)   __atomic_fetch_or(p, v, __ATOMIC_SEQ_CST)
 
#define atomic_xor(p, v)   __atomic_fetch_xor(p, v, __ATOMIC_SEQ_CST)
 
#define atomic_inc(p)   __atomic_fetch_add(p, 1, __ATOMIC_SEQ_CST)
 
#define atomic_dec(p)   __atomic_fetch_sub(p, 1, __ATOMIC_SEQ_CST)
 
#define __CL_XCHG_F32(p, val)
 
#define atomic_xchg(p, val)
 
#define atomic_cmpxchg(p, cmp, val)
 
#define __CL_ATOMIC_EXTREMUM(p, val, stops)
 
#define atomic_min(p, val)   __CL_ATOMIC_EXTREMUM(p, val, __cl_v < __cl_o)
 
#define atomic_max(p, val)   __CL_ATOMIC_EXTREMUM(p, val, __cl_v > __cl_o)
 
#define atom_add   atomic_add
 
#define atom_sub   atomic_sub
 
#define atom_and   atomic_and
 
#define atom_or   atomic_or
 
#define atom_xor   atomic_xor
 
#define atom_xchg   atomic_xchg
 
#define atom_inc   atomic_inc
 
#define atom_dec   atomic_dec
 
#define atom_cmpxchg   atomic_cmpxchg
 
#define atom_min   atomic_min
 
#define atom_max   atomic_max
 

Typedefs

typedef unsigned __cl_generic_uint
 
Scalar typedefs
typedef unsigned char uchar
 
typedef unsigned short ushort
 
typedef unsigned int uint
 
typedef unsigned long ulong
 

Functions

 __CL_VECTOR (signed char, char16, 16)
 
 __CL_VECTOR (unsigned char, uchar16, 16)
 
 __CL_VECTOR (short, short8, 16)
 
 __CL_VECTOR (short, short16, 32)
 
 __CL_VECTOR (unsigned short, ushort8, 16)
 
 __CL_VECTOR (unsigned short, ushort16, 32)
 
 __CL_VECTOR3 (int, int3, 16)
 
 __CL_VECTOR (int, int4, 16)
 
 __CL_VECTOR (int, int8, 32)
 
 __CL_VECTOR (int, int16, 64)
 
 __CL_VECTOR3 (unsigned int, uint3, 16)
 
 __CL_VECTOR (unsigned int, uint4, 16)
 
 __CL_VECTOR (unsigned int, uint8, 32)
 
 __CL_VECTOR (unsigned int, uint16, 64)
 
 __CL_VECTOR (long, long2, 16)
 
 __CL_VECTOR3 (long, long3, 32)
 
 __CL_VECTOR (long, long4, 32)
 
 __CL_VECTOR (long, long8, 64)
 
 __CL_VECTOR (unsigned long, ulong2, 16)
 
 __CL_VECTOR3 (unsigned long, ulong3, 32)
 
 __CL_VECTOR (unsigned long, ulong4, 32)
 
 __CL_VECTOR (unsigned long, ulong8, 64)
 
 __CL_VECTOR3 (float, float3, 16)
 
 __CL_VECTOR (float, float4, 16)
 
 __CL_VECTOR (float, float8, 32)
 
 __CL_VECTOR (float, float16, 64)
 

Detailed Description

Maps OpenCL C 1.2 onto the kernel model of <cccc/kernel.h>. Included automatically ahead of every input read as OpenCL C (-x cl, .cl). See docs/opencl.md.

Macro Definition Documentation

◆ __CL_ATOMIC_EXTREMUM

#define __CL_ATOMIC_EXTREMUM (   p,
  val,
  stops 
)
Value:
({ \
auto __cl_p = (p); \
typeof_unqual(*__cl_p) __cl_v = (val); \
typeof_unqual(*__cl_p) __cl_o = \
__atomic_load_n(__cl_p, __ATOMIC_SEQ_CST); \
while (stops && !__atomic_compare_exchange_n(__cl_p, &__cl_o, __cl_v, \
0, __ATOMIC_SEQ_CST, \
__ATOMIC_SEQ_CST)) { \
} \
__cl_o; \
})

◆ __CL_VECTOR

#define __CL_VECTOR (   base,
  name,
  bytes 
)     typedef base name __attribute__((vector_size(bytes)))

◆ __CL_VECTOR3

#define __CL_VECTOR3 (   base,
  name,
  bytes 
)     typedef base name __attribute__((vector_size(bytes), cccc_visible_lanes(3)))

◆ __CL_XCHG_F32

#define __CL_XCHG_F32 (   p,
  val 
)
Value:
({ \
union { \
float f; \
unsigned u; \
} __cl_in = {.f = (val)}, __cl_out; \
__cl_out.u = __atomic_exchange_n((__cl_generic_uint *)(p), __cl_in.u, \
__ATOMIC_SEQ_CST); \
__cl_out.f; \
})
unsigned __cl_generic_uint
Definition opencl.h:68

◆ __constant

#define __constant   [[cccc::__constant__]]

◆ __ENDIAN_LITTLE__

#define __ENDIAN_LITTLE__   1

◆ __global

#define __global   [[cccc::__global__]]

◆ __kernel

#define __kernel   [[cccc::__kernel__]]

◆ __local

#define __local   [[cccc::__local__]]

◆ __OPENCL_C_VERSION__

#define __OPENCL_C_VERSION__   120

◆ __OPENCL_VERSION__

#define __OPENCL_VERSION__   120

◆ __private

#define __private   [[cccc::__private__]]

◆ atom_add

#define atom_add   atomic_add

◆ atom_and

#define atom_and   atomic_and

◆ atom_cmpxchg

#define atom_cmpxchg   atomic_cmpxchg

◆ atom_dec

#define atom_dec   atomic_dec

◆ atom_inc

#define atom_inc   atomic_inc

◆ atom_max

#define atom_max   atomic_max

◆ atom_min

#define atom_min   atomic_min

◆ atom_or

#define atom_or   atomic_or

◆ atom_sub

#define atom_sub   atomic_sub

◆ atom_xchg

#define atom_xchg   atomic_xchg

◆ atom_xor

#define atom_xor   atomic_xor

◆ atomic_add

#define atomic_add (   p,
  v 
)    __atomic_fetch_add(p, v, __ATOMIC_SEQ_CST)

◆ atomic_and

#define atomic_and (   p,
  v 
)    __atomic_fetch_and(p, v, __ATOMIC_SEQ_CST)

◆ atomic_cmpxchg

#define atomic_cmpxchg (   p,
  cmp,
  val 
)
Value:
({ \
auto __cl_p = (p); \
typeof_unqual(*__cl_p) __cl_e = (cmp); \
__atomic_compare_exchange_n(__cl_p, &__cl_e, (val), 0, \
__ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \
__cl_e; \
})

◆ atomic_dec

#define atomic_dec (   p)    __atomic_fetch_sub(p, 1, __ATOMIC_SEQ_CST)

◆ atomic_inc

#define atomic_inc (   p)    __atomic_fetch_add(p, 1, __ATOMIC_SEQ_CST)

◆ atomic_max

#define atomic_max (   p,
  val 
)    __CL_ATOMIC_EXTREMUM(p, val, __cl_v > __cl_o)

◆ atomic_min

#define atomic_min (   p,
  val 
)    __CL_ATOMIC_EXTREMUM(p, val, __cl_v < __cl_o)

◆ atomic_or

#define atomic_or (   p,
  v 
)    __atomic_fetch_or(p, v, __ATOMIC_SEQ_CST)

◆ atomic_sub

#define atomic_sub (   p,
  v 
)    __atomic_fetch_sub(p, v, __ATOMIC_SEQ_CST)

◆ atomic_xchg

#define atomic_xchg (   p,
  val 
)
Value:
_Generic(*(p), \
float: __CL_XCHG_F32(p, val), \
default: __atomic_exchange_n(p, val, __ATOMIC_SEQ_CST))
#define __CL_XCHG_F32(p, val)
Definition opencl.h:148

◆ atomic_xor

#define atomic_xor (   p,
  v 
)    __atomic_fetch_xor(p, v, __ATOMIC_SEQ_CST)

◆ barrier

#define barrier (   flags)    cccc_barrier(flags)

◆ CL_VERSION_1_0

#define CL_VERSION_1_0   100

◆ CL_VERSION_1_1

#define CL_VERSION_1_1   110

◆ CL_VERSION_1_2

#define CL_VERSION_1_2   120

◆ CLK_GLOBAL_MEM_FENCE

#define CLK_GLOBAL_MEM_FENCE   CCCC_GLOBAL_FENCE

◆ CLK_LOCAL_MEM_FENCE

#define CLK_LOCAL_MEM_FENCE   CCCC_LOCAL_FENCE

◆ constant

#define constant   [[cccc::__constant__]]

◆ get_global_id

#define get_global_id (   d)    cccc_global_id(d)

◆ get_global_offset

#define get_global_offset (   d)    ((size_t)0)

◆ get_global_size

#define get_global_size (   d)    cccc_global_size(d)

◆ get_group_id

#define get_group_id (   d)    cccc_group_id(d)

◆ get_local_id

#define get_local_id (   d)    cccc_local_id(d)

◆ get_local_size

#define get_local_size (   d)    cccc_local_size(d)

◆ get_num_groups

#define get_num_groups (   d)    cccc_num_groups(d)

◆ get_work_dim

#define get_work_dim ( )    cccc_work_dim()

◆ global

#define global   [[cccc::__global__]]

◆ kernel

#define kernel   [[cccc::__kernel__]]

◆ local

#define local   [[cccc::__local__]]

◆ mem_fence

#define mem_fence (   flags)    __atomic_thread_fence(__ATOMIC_SEQ_CST)

◆ private

#define private   [[cccc::__private__]]

◆ read_mem_fence

#define read_mem_fence (   flags)    __atomic_thread_fence(__ATOMIC_SEQ_CST)

◆ write_mem_fence

#define write_mem_fence (   flags)    __atomic_thread_fence(__ATOMIC_SEQ_CST)

Typedef Documentation

◆ __cl_generic_uint

typedef unsigned __cl_generic_uint

◆ uchar

typedef unsigned char uchar

◆ uint

typedef unsigned int uint

◆ ulong

typedef unsigned long ulong

◆ ushort

typedef unsigned short ushort

Function Documentation

◆ __CL_VECTOR() [1/21]

__CL_VECTOR ( float  ,
float16  ,
64   
)

◆ __CL_VECTOR() [2/21]

__CL_VECTOR ( float  ,
float4  ,
16   
)

◆ __CL_VECTOR() [3/21]

__CL_VECTOR ( float  ,
float8  ,
32   
)

◆ __CL_VECTOR() [4/21]

__CL_VECTOR ( int  ,
int16  ,
64   
)

◆ __CL_VECTOR() [5/21]

__CL_VECTOR ( int  ,
int4  ,
16   
)

◆ __CL_VECTOR() [6/21]

__CL_VECTOR ( int  ,
int8  ,
32   
)

◆ __CL_VECTOR() [7/21]

__CL_VECTOR ( long  ,
long2  ,
16   
)

◆ __CL_VECTOR() [8/21]

__CL_VECTOR ( long  ,
long4  ,
32   
)

◆ __CL_VECTOR() [9/21]

__CL_VECTOR ( long  ,
long8  ,
64   
)

◆ __CL_VECTOR() [10/21]

__CL_VECTOR ( short  ,
short16  ,
32   
)

◆ __CL_VECTOR() [11/21]

__CL_VECTOR ( short  ,
short8  ,
16   
)

◆ __CL_VECTOR() [12/21]

__CL_VECTOR ( signed char  ,
char16  ,
16   
)

◆ __CL_VECTOR() [13/21]

__CL_VECTOR ( unsigned char  ,
uchar16  ,
16   
)

◆ __CL_VECTOR() [14/21]

__CL_VECTOR ( unsigned int  ,
uint16  ,
64   
)

◆ __CL_VECTOR() [15/21]

__CL_VECTOR ( unsigned int  ,
uint4  ,
16   
)

◆ __CL_VECTOR() [16/21]

__CL_VECTOR ( unsigned int  ,
uint8  ,
32   
)

◆ __CL_VECTOR() [17/21]

__CL_VECTOR ( unsigned long  ,
ulong2  ,
16   
)

◆ __CL_VECTOR() [18/21]

__CL_VECTOR ( unsigned long  ,
ulong4  ,
32   
)

◆ __CL_VECTOR() [19/21]

__CL_VECTOR ( unsigned long  ,
ulong8  ,
64   
)

◆ __CL_VECTOR() [20/21]

__CL_VECTOR ( unsigned short  ,
ushort16  ,
32   
)

◆ __CL_VECTOR() [21/21]

__CL_VECTOR ( unsigned short  ,
ushort8  ,
16   
)

◆ __CL_VECTOR3() [1/5]

__CL_VECTOR3 ( float  ,
float3  ,
16   
)

◆ __CL_VECTOR3() [2/5]

__CL_VECTOR3 ( int  ,
int3  ,
16   
)

◆ __CL_VECTOR3() [3/5]

__CL_VECTOR3 ( long  ,
long3  ,
32   
)

◆ __CL_VECTOR3() [4/5]

__CL_VECTOR3 ( unsigned int  ,
uint3  ,
16   
)

◆ __CL_VECTOR3() [5/5]

__CL_VECTOR3 ( unsigned long  ,
ulong3  ,
32   
)