From 5763dbcfba648814bb0be72eebcbb43279472eb7 Mon Sep 17 00:00:00 2001 From: PietroGhg Date: Mon, 15 Apr 2024 16:08:54 +0100 Subject: [PATCH 1/3] implement generic atomic store --- .../generic/libspirv/atomic/atomic_store.cl | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/libclc/generic/libspirv/atomic/atomic_store.cl b/libclc/generic/libspirv/atomic/atomic_store.cl index d24672957ddc4..fb23ae8bacbc5 100644 --- a/libclc/generic/libspirv/atomic/atomic_store.cl +++ b/libclc/generic/libspirv/atomic/atomic_store.cl @@ -29,26 +29,27 @@ _Z19__spirv_AtomicStorePU3AS3fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE #define FDECL(TYPE, PREFIX, AS, BYTE_SIZE, MEM_ORDER) \ TYPE __clc__atomic_##PREFIX##store_##AS##_##BYTE_SIZE##_##MEM_ORDER(volatile AS const TYPE *, TYPE); -#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, PREFIX, BYTE_SIZE) \ - FDECL(TYPE, PREFIX, AS, BYTE_SIZE, unordered) \ - FDECL(TYPE, PREFIX, AS, BYTE_SIZE, release) \ - FDECL(TYPE, PREFIX, AS, BYTE_SIZE, seq_cst) \ - _CLC_DEF void \ - _Z19__spirv_AtomicStorePU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \ - volatile AS TYPE *p, enum Scope scope, \ - enum MemorySemanticsMask semantics, TYPE val) { \ - if (semantics == Release) { \ - __clc__atomic_##PREFIX##store_##AS##_##BYTE_SIZE##_release(p, val); \ - } else if (semantics == SequentiallyConsistent) { \ - __clc__atomic_##PREFIX##store_##AS##_##BYTE_SIZE##_seq_cst(p, val); \ - } else { \ - __clc__atomic_##PREFIX##store_##AS##_##BYTE_SIZE##_unordered(p, val); \ - } \ +#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, PREFIX, BYTE_SIZE) \ + FDECL(TYPE, PREFIX, AS, BYTE_SIZE, unordered) \ + FDECL(TYPE, PREFIX, AS, BYTE_SIZE, release) \ + FDECL(TYPE, PREFIX, AS, BYTE_SIZE, seq_cst) \ + _CLC_DEF void \ + _Z19__spirv_AtomicStoreP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \ + volatile AS TYPE *p, enum Scope scope, \ + enum MemorySemanticsMask semantics, TYPE val) { \ + if (semantics == Release) { \ + __clc__atomic_##PREFIX##store_##AS##_##BYTE_SIZE##_release(p, val); \ + } else if (semantics == SequentiallyConsistent) { \ + __clc__atomic_##PREFIX##store_##AS##_##BYTE_SIZE##_seq_cst(p, val); \ + } else { \ + __clc__atomic_##PREFIX##store_##AS##_##BYTE_SIZE##_unordered(p, val); \ + } \ } -#define IMPL_AS(TYPE, TYPE_MANGLED, PREFIX, BYTE_SIZE) \ -IMPL(TYPE, TYPE_MANGLED, global, AS1, PREFIX, BYTE_SIZE) \ -IMPL(TYPE, TYPE_MANGLED, local, AS3, PREFIX, BYTE_SIZE) +#define IMPL_AS(TYPE, TYPE_MANGLED, PREFIX, BYTE_SIZE) \ + IMPL(TYPE, TYPE_MANGLED, global, U3AS1, 1, PREFIX, BYTE_SIZE) \ + IMPL(TYPE, TYPE_MANGLED, local, U3AS3, 1, PREFIX, BYTE_SIZE) \ + IMPL(TYPE, TYPE_MANGLED, , , 0, PREFIX, BYTE_SIZE) IMPL_AS(int, i, , 4) IMPL_AS(unsigned int, j, u, 4) From a49837a6d9d9c46ad6b892861fb7584ecf7c88da Mon Sep 17 00:00:00 2001 From: PietroGhg Date: Tue, 23 Apr 2024 14:29:12 +0100 Subject: [PATCH 2/3] use _CLC_GENERIC_AS_SUPPORTED macro --- libclc/generic/libspirv/atomic/atomic_load.cl | 18 ++++++++++++++++-- libclc/generic/libspirv/atomic/atomic_store.cl | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/libclc/generic/libspirv/atomic/atomic_load.cl b/libclc/generic/libspirv/atomic/atomic_load.cl index 8fd849e72a181..29288771ba6d1 100644 --- a/libclc/generic/libspirv/atomic/atomic_load.cl +++ b/libclc/generic/libspirv/atomic/atomic_load.cl @@ -32,8 +32,7 @@ TYPE __clc__atomic_##PREFIX##load_##AS##_##BYTE_SIZE##_##MEM_ORDER(volatile AS c #define IMPL_AS(TYPE, TYPE_MANGLED, PREFIX, BYTE_SIZE) \ IMPL(TYPE, TYPE_MANGLED, global, U3AS1, PREFIX, BYTE_SIZE) \ - IMPL(TYPE, TYPE_MANGLED, local, U3AS3, PREFIX, BYTE_SIZE) \ - IMPL(TYPE, TYPE_MANGLED, , , PREFIX, BYTE_SIZE) + IMPL(TYPE, TYPE_MANGLED, local, U3AS3, PREFIX, BYTE_SIZE) IMPL_AS(int, i, , 4) IMPL_AS(unsigned int, j, u, 4) @@ -43,6 +42,21 @@ IMPL_AS(long, l, , 8) IMPL_AS(unsigned long, m, u, 8) #endif +#ifdef _CLC_GENERIC_AS_SUPPORTED + +#define IMPL_GENERIC(TYPE, TYPE_MANGLED, PREFIX, BYTE_SIZE) \ + IMPL(TYPE, TYPE_MANGLED, , , PREFIX, BYTE_SIZE) + +IMPL_GENERIC(int, i, , 4) +IMPL_GENERIC(unsigned int, j, u, 4) + +#ifdef cl_khr_int64_base_atomics +IMPL_GENERIC(long, l, , 8) +IMPL_GENERIC(unsigned long, m, u, 8) +#endif + +#endif //_CLC_GENERIC_AS_SUPPORTED + #undef FDECL #undef IMPL_AS #undef IMPL diff --git a/libclc/generic/libspirv/atomic/atomic_store.cl b/libclc/generic/libspirv/atomic/atomic_store.cl index fb23ae8bacbc5..22c9ed3b11bde 100644 --- a/libclc/generic/libspirv/atomic/atomic_store.cl +++ b/libclc/generic/libspirv/atomic/atomic_store.cl @@ -48,8 +48,7 @@ TYPE __clc__atomic_##PREFIX##store_##AS##_##BYTE_SIZE##_##MEM_ORDER(volatile AS #define IMPL_AS(TYPE, TYPE_MANGLED, PREFIX, BYTE_SIZE) \ IMPL(TYPE, TYPE_MANGLED, global, U3AS1, 1, PREFIX, BYTE_SIZE) \ - IMPL(TYPE, TYPE_MANGLED, local, U3AS3, 1, PREFIX, BYTE_SIZE) \ - IMPL(TYPE, TYPE_MANGLED, , , 0, PREFIX, BYTE_SIZE) + IMPL(TYPE, TYPE_MANGLED, local, U3AS3, 1, PREFIX, BYTE_SIZE) IMPL_AS(int, i, , 4) IMPL_AS(unsigned int, j, u, 4) @@ -59,6 +58,21 @@ IMPL_AS(long, l, , 8) IMPL_AS(unsigned long, m, u, 8) #endif +#ifdef _CLC_GENERIC_AS_SUPPORTED + +#define IMPL_GENERIC(TYPE, TYPE_MANGLED, PREFIX, BYTE_SIZE) \ + IMPL(TYPE, TYPE_MANGLED, , , 0, PREFIX, BYTE_SIZE) + +IMPL_GENERIC(int, i, , 4) +IMPL_GENERIC(unsigned int, j, u, 4) + +#ifdef cl_khr_int64_base_atomics +IMPL_GENERIC(long, l, , 8) +IMPL_GENERIC(unsigned long, m, u, 8) +#endif + +#endif //_CLC_GENERIC_AS_SUPPORTED + #undef FDECL #undef IMPL_AS #undef IMPL From e3e4211a98e7626d2f91b83e63fcb62fce1d46bc Mon Sep 17 00:00:00 2001 From: PietroGhg Date: Tue, 21 May 2024 10:41:55 +0100 Subject: [PATCH 3/3] use #if for generic AS check --- libclc/generic/libspirv/atomic/atomic_load.cl | 2 +- libclc/generic/libspirv/atomic/atomic_store.cl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libclc/generic/libspirv/atomic/atomic_load.cl b/libclc/generic/libspirv/atomic/atomic_load.cl index 29288771ba6d1..b235700e1e92a 100644 --- a/libclc/generic/libspirv/atomic/atomic_load.cl +++ b/libclc/generic/libspirv/atomic/atomic_load.cl @@ -42,7 +42,7 @@ IMPL_AS(long, l, , 8) IMPL_AS(unsigned long, m, u, 8) #endif -#ifdef _CLC_GENERIC_AS_SUPPORTED +#if _CLC_GENERIC_AS_SUPPORTED #define IMPL_GENERIC(TYPE, TYPE_MANGLED, PREFIX, BYTE_SIZE) \ IMPL(TYPE, TYPE_MANGLED, , , PREFIX, BYTE_SIZE) diff --git a/libclc/generic/libspirv/atomic/atomic_store.cl b/libclc/generic/libspirv/atomic/atomic_store.cl index 22c9ed3b11bde..cba8c5c8f02cf 100644 --- a/libclc/generic/libspirv/atomic/atomic_store.cl +++ b/libclc/generic/libspirv/atomic/atomic_store.cl @@ -58,7 +58,7 @@ IMPL_AS(long, l, , 8) IMPL_AS(unsigned long, m, u, 8) #endif -#ifdef _CLC_GENERIC_AS_SUPPORTED +#if _CLC_GENERIC_AS_SUPPORTED #define IMPL_GENERIC(TYPE, TYPE_MANGLED, PREFIX, BYTE_SIZE) \ IMPL(TYPE, TYPE_MANGLED, , , 0, PREFIX, BYTE_SIZE)