From 85505bdb386a426310c1fb0a845780beeeec4353 Mon Sep 17 00:00:00 2001 From: haonanya Date: Wed, 9 Feb 2022 09:16:35 +0800 Subject: [PATCH] Support cl_ext_float_atomics This backports https://reviews.llvm.org/D106343 and https://reviews.llvm.org/D109740 Signed-off-by: haonanya Upstream-Status: Backport https://github.com/llvm/llvm-project/commit/d353d1c50112a1cb315eccdab18ce7bd1563cd06 https://github.com/llvm/llvm-project/commit/544d89e847d42ce8856296752b0fb279aa89aace Signed-off-by: Naveen Saini --- clang/lib/Headers/opencl-c-base.h | 19 ++ clang/lib/Headers/opencl-c.h | 378 ++++++++++++++++++++++++++ clang/lib/Sema/Sema.cpp | 3 + clang/test/Headers/opencl-c-header.cl | 84 ++++++ 4 files changed, 484 insertions(+) diff --git a/clang/lib/Headers/opencl-c-base.h b/clang/lib/Headers/opencl-c-base.h index e8dcd70377e5..d94d64372dbb 100644 --- a/clang/lib/Headers/opencl-c-base.h +++ b/clang/lib/Headers/opencl-c-base.h @@ -21,6 +21,25 @@ #define cl_khr_subgroup_shuffle 1 #define cl_khr_subgroup_shuffle_relative 1 #define cl_khr_subgroup_clustered_reduce 1 +#define cl_ext_float_atomics +#ifdef cl_khr_fp16 +#define __opencl_c_ext_fp16_global_atomic_load_store 1 +#define __opencl_c_ext_fp16_local_atomic_load_store 1 +#define __opencl_c_ext_fp16_global_atomic_add 1 +#define __opencl_c_ext_fp16_local_atomic_add 1 +#define __opencl_c_ext_fp16_global_atomic_min_max 1 +#define __opencl_c_ext_fp16_local_atomic_min_max 1 +#endif +#ifdef cl_khr_fp64 +#define __opencl_c_ext_fp64_global_atomic_add 1 +#define __opencl_c_ext_fp64_local_atomic_add 1 +#define __opencl_c_ext_fp64_global_atomic_min_max 1 +#define __opencl_c_ext_fp64_local_atomic_min_max 1 +#endif +#define __opencl_c_ext_fp32_global_atomic_add 1 +#define __opencl_c_ext_fp32_local_atomic_add 1 +#define __opencl_c_ext_fp32_global_atomic_min_max 1 +#define __opencl_c_ext_fp32_local_atomic_min_max 1 #endif // defined(__SPIR__) #endif // (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200) diff --git a/clang/lib/Headers/opencl-c.h b/clang/lib/Headers/opencl-c.h index ab665628c8e1..584db7e81e04 100644 --- a/clang/lib/Headers/opencl-c.h +++ b/clang/lib/Headers/opencl-c.h @@ -13531,6 +13531,384 @@ intptr_t __ovld atomic_fetch_max_explicit(volatile atomic_intptr_t *object, uint intptr_t __ovld atomic_fetch_max_explicit(volatile atomic_intptr_t *object, uintptr_t opermax, memory_order minder, memory_scope scope); #endif +// The functionality added by cl_ext_float_atomics extension +#if defined(cl_ext_float_atomics) + +#if defined(__opencl_c_ext_fp16_global_atomic_load_store) +void __ovld atomic_store(volatile __global atomic_half *object, half operand); +void __ovld atomic_store_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +void __ovld atomic_store_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_load(volatile __global atomic_half *object); +half __ovld atomic_load_explicit(volatile __global atomic_half *object, + memory_order order); +half __ovld atomic_load_explicit(volatile __global atomic_half *object, + memory_order order, memory_scope scope); +half __ovld atomic_exchange(volatile __global atomic_half *object, + half operand); +half __ovld atomic_exchange_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_exchange_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store) + +#if defined(__opencl_c_ext_fp16_local_atomic_load_store) +void __ovld atomic_store(volatile __local atomic_half *object, half operand); +void __ovld atomic_store_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +void __ovld atomic_store_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_load(volatile __local atomic_half *object); +half __ovld atomic_load_explicit(volatile __local atomic_half *object, + memory_order order); +half __ovld atomic_load_explicit(volatile __local atomic_half *object, + memory_order order, memory_scope scope); +half __ovld atomic_exchange(volatile __local atomic_half *object, half operand); +half __ovld atomic_exchange_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_exchange_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_local_atomic_load_store) + +#if defined(__opencl_c_ext_fp16_global_atomic_load_store) && \ + defined(__opencl_c_ext_fp16_local_atomic_load_store) +void __ovld atomic_store(volatile atomic_half *object, half operand); +void __ovld atomic_store_explicit(volatile atomic_half *object, half operand, + memory_order order); +void __ovld atomic_store_explicit(volatile atomic_half *object, half operand, + memory_order order, memory_scope scope); +half __ovld atomic_load(volatile atomic_half *object); +half __ovld atomic_load_explicit(volatile atomic_half *object, + memory_order order); +half __ovld atomic_load_explicit(volatile atomic_half *object, + memory_order order, memory_scope scope); +half __ovld atomic_exchange(volatile atomic_half *object, half operand); +half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand, + memory_order order); +half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand, + memory_order order, memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store) && + // defined(__opencl_c_ext_fp16_local_atomic_load_store) + +#if defined(__opencl_c_ext_fp16_global_atomic_min_max) +half __ovld atomic_fetch_min(volatile __global atomic_half *object, + half operand); +half __ovld atomic_fetch_max(volatile __global atomic_half *object, + half operand); +half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max) + +#if defined(__opencl_c_ext_fp16_local_atomic_min_max) +half __ovld atomic_fetch_min(volatile __local atomic_half *object, + half operand); +half __ovld atomic_fetch_max(volatile __local atomic_half *object, + half operand); +half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_local_atomic_min_max) + +#if defined(__opencl_c_ext_fp16_global_atomic_min_max) && \ + defined(__opencl_c_ext_fp16_local_atomic_min_max) +half __ovld atomic_fetch_min(volatile atomic_half *object, half operand); +half __ovld atomic_fetch_max(volatile atomic_half *object, half operand); +half __ovld atomic_fetch_min_explicit(volatile atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_max_explicit(volatile atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_min_explicit(volatile atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_max_explicit(volatile atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max) && \ + defined(__opencl_c_ext_fp16_local_atomic_min_max) + +#if defined(__opencl_c_ext_fp32_global_atomic_min_max) +float __ovld atomic_fetch_min(volatile __global atomic_float *object, + float operand); +float __ovld atomic_fetch_max(volatile __global atomic_float *object, + float operand); +float __ovld atomic_fetch_min_explicit(volatile __global atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_max_explicit(volatile __global atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_min_explicit(volatile __global atomic_float *object, + float operand, memory_order order, + memory_scope scope); +float __ovld atomic_fetch_max_explicit(volatile __global atomic_float *object, + float operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp32_global_atomic_min_max) + +#if defined(__opencl_c_ext_fp32_local_atomic_min_max) +float __ovld atomic_fetch_min(volatile __local atomic_float *object, + float operand); +float __ovld atomic_fetch_max(volatile __local atomic_float *object, + float operand); +float __ovld atomic_fetch_min_explicit(volatile __local atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_max_explicit(volatile __local atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_min_explicit(volatile __local atomic_float *object, + float operand, memory_order order, + memory_scope scope); +float __ovld atomic_fetch_max_explicit(volatile __local atomic_float *object, + float operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp32_local_atomic_min_max) + +#if defined(__opencl_c_ext_fp32_global_atomic_min_max) && \ + defined(__opencl_c_ext_fp32_local_atomic_min_max) +float __ovld atomic_fetch_min(volatile atomic_float *object, float operand); +float __ovld atomic_fetch_max(volatile atomic_float *object, float operand); +float __ovld atomic_fetch_min_explicit(volatile atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_max_explicit(volatile atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_min_explicit(volatile atomic_float *object, + float operand, memory_order order, + memory_scope scope); +float __ovld atomic_fetch_max_explicit(volatile atomic_float *object, + float operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp32_global_atomic_min_max) && \ + defined(__opencl_c_ext_fp32_local_atomic_min_max) + +#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics) +#if defined(__opencl_c_ext_fp64_global_atomic_min_max) +double __ovld atomic_fetch_min(volatile __global atomic_double *object, + double operand); +double __ovld atomic_fetch_max(volatile __global atomic_double *object, + double operand); +double __ovld atomic_fetch_min_explicit(volatile __global atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_max_explicit(volatile __global atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_min_explicit(volatile __global atomic_double *object, + double operand, memory_order order, + memory_scope scope); +double __ovld atomic_fetch_max_explicit(volatile __global atomic_double *object, + double operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp64_global_atomic_min_max) + +#if defined(__opencl_c_ext_fp64_local_atomic_min_max) +double __ovld atomic_fetch_min(volatile __local atomic_double *object, + double operand); +double __ovld atomic_fetch_max(volatile __local atomic_double *object, + double operand); +double __ovld atomic_fetch_min_explicit(volatile __local atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_max_explicit(volatile __local atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_min_explicit(volatile __local atomic_double *object, + double operand, memory_order order, + memory_scope scope); +double __ovld atomic_fetch_max_explicit(volatile __local atomic_double *object, + double operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp64_local_atomic_min_max) + +#if defined(__opencl_c_ext_fp64_global_atomic_min_max) && \ + defined(__opencl_c_ext_fp64_local_atomic_min_max) +double __ovld atomic_fetch_min(volatile atomic_double *object, double operand); +double __ovld atomic_fetch_max(volatile atomic_double *object, double operand); +double __ovld atomic_fetch_min_explicit(volatile atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_max_explicit(volatile atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_min_explicit(volatile atomic_double *object, + double operand, memory_order order, + memory_scope scope); +double __ovld atomic_fetch_max_explicit(volatile atomic_double *object, + double operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp64_global_atomic_min_max) && \ + defined(__opencl_c_ext_fp64_local_atomic_min_max) +#endif // defined(cl_khr_int64_base_atomics) && + // defined(cl_khr_int64_extended_atomics) + +#if defined(__opencl_c_ext_fp16_global_atomic_add) +half __ovld atomic_fetch_add(volatile __global atomic_half *object, + half operand); +half __ovld atomic_fetch_sub(volatile __global atomic_half *object, + half operand); +half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_add) + +#if defined(__opencl_c_ext_fp16_local_atomic_add) +half __ovld atomic_fetch_add(volatile __local atomic_half *object, + half operand); +half __ovld atomic_fetch_sub(volatile __local atomic_half *object, + half operand); +half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_local_atomic_add) + +#if defined(__opencl_c_ext_fp16_global_atomic_add) && \ + defined(__opencl_c_ext_fp16_local_atomic_add) +half __ovld atomic_fetch_add(volatile atomic_half *object, half operand); +half __ovld atomic_fetch_sub(volatile atomic_half *object, half operand); +half __ovld atomic_fetch_add_explicit(volatile atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_add_explicit(volatile atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_add) && \ + defined(__opencl_c_ext_fp16_local_atomic_add) + +#if defined(__opencl_c_ext_fp32_global_atomic_add) +float __ovld atomic_fetch_add(volatile __global atomic_float *object, + float operand); +float __ovld atomic_fetch_sub(volatile __global atomic_float *object, + float operand); +float __ovld atomic_fetch_add_explicit(volatile __global atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_sub_explicit(volatile __global atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_add_explicit(volatile __global atomic_float *object, + float operand, memory_order order, + memory_scope scope); +float __ovld atomic_fetch_sub_explicit(volatile __global atomic_float *object, + float operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp32_global_atomic_add) + +#if defined(__opencl_c_ext_fp32_local_atomic_add) +float __ovld atomic_fetch_add(volatile __local atomic_float *object, + float operand); +float __ovld atomic_fetch_sub(volatile __local atomic_float *object, + float operand); +float __ovld atomic_fetch_add_explicit(volatile __local atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_sub_explicit(volatile __local atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_add_explicit(volatile __local atomic_float *object, + float operand, memory_order order, + memory_scope scope); +float __ovld atomic_fetch_sub_explicit(volatile __local atomic_float *object, + float operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp32_local_atomic_add) + +#if defined(__opencl_c_ext_fp32_global_atomic_add) && \ + defined(__opencl_c_ext_fp32_local_atomic_add) +float __ovld atomic_fetch_add(volatile atomic_float *object, float operand); +float __ovld atomic_fetch_sub(volatile atomic_float *object, float operand); +float __ovld atomic_fetch_add_explicit(volatile atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_sub_explicit(volatile atomic_float *object, + float operand, memory_order order); +float __ovld atomic_fetch_add_explicit(volatile atomic_float *object, + float operand, memory_order order, + memory_scope scope); +float __ovld atomic_fetch_sub_explicit(volatile atomic_float *object, + float operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp32_global_atomic_add) && \ + defined(__opencl_c_ext_fp32_local_atomic_add) + +#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics) +#if defined(__opencl_c_ext_fp64_global_atomic_add) +double __ovld atomic_fetch_add(volatile __global atomic_double *object, + double operand); +double __ovld atomic_fetch_sub(volatile __global atomic_double *object, + double operand); +double __ovld atomic_fetch_add_explicit(volatile __global atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_sub_explicit(volatile __global atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_add_explicit(volatile __global atomic_double *object, + double operand, memory_order order, + memory_scope scope); +double __ovld atomic_fetch_sub_explicit(volatile __global atomic_double *object, + double operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp64_global_atomic_add) + +#if defined(__opencl_c_ext_fp64_local_atomic_add) +double __ovld atomic_fetch_add(volatile __local atomic_double *object, + double operand); +double __ovld atomic_fetch_sub(volatile __local atomic_double *object, + double operand); +double __ovld atomic_fetch_add_explicit(volatile __local atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_sub_explicit(volatile __local atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_add_explicit(volatile __local atomic_double *object, + double operand, memory_order order, + memory_scope scope); +double __ovld atomic_fetch_sub_explicit(volatile __local atomic_double *object, + double operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp64_local_atomic_add) + +#if defined(__opencl_c_ext_fp64_global_atomic_add) && \ + defined(__opencl_c_ext_fp64_local_atomic_add) +double __ovld atomic_fetch_add(volatile atomic_double *object, double operand); +double __ovld atomic_fetch_sub(volatile atomic_double *object, double operand); +double __ovld atomic_fetch_add_explicit(volatile atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_sub_explicit(volatile atomic_double *object, + double operand, memory_order order); +double __ovld atomic_fetch_add_explicit(volatile atomic_double *object, + double operand, memory_order order, + memory_scope scope); +double __ovld atomic_fetch_sub_explicit(volatile atomic_double *object, + double operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp64_global_atomic_add) && \ + defined(__opencl_c_ext_fp64_local_atomic_add) +#endif // defined(cl_khr_int64_base_atomics) && + // defined(cl_khr_int64_extended_atomics) + +#endif // cl_ext_float_atomics + // atomic_store() void __ovld atomic_store(volatile atomic_int *object, int desired); diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 450f9c020f7f..a91291c7af38 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -313,6 +313,9 @@ void Sema::Initialize() { addImplicitTypedef("atomic_long", AtomicLongT); auto AtomicULongT = Context.getAtomicType(Context.UnsignedLongTy); addImplicitTypedef("atomic_ulong", AtomicULongT); + auto AtomicHalfT = Context.getAtomicType(Context.HalfTy); + addImplicitTypedef("atomic_half", AtomicHalfT); + setOpenCLExtensionForType(AtomicHalfT, "cl_khr_fp16"); addImplicitTypedef("atomic_float", Context.getAtomicType(Context.FloatTy)); auto AtomicDoubleT = Context.getAtomicType(Context.DoubleTy); diff --git a/clang/test/Headers/opencl-c-header.cl b/clang/test/Headers/opencl-c-header.cl index 13a3b62481ec..443f682c711a 100644 --- a/clang/test/Headers/opencl-c-header.cl +++ b/clang/test/Headers/opencl-c-header.cl @@ -124,6 +124,48 @@ global atomic_int z = ATOMIC_VAR_INIT(99); #if cl_khr_subgroup_clustered_reduce != 1 #error "Incorrectly defined cl_khr_subgroup_clustered_reduce" #endif +#if __opencl_c_ext_fp16_global_atomic_load_store != 1 +#error "Incorrectly defined __opencl_c_ext_fp16_global_atomic_load_store" +#endif +#if __opencl_c_ext_fp16_local_atomic_load_store != 1 +#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_load_store" +#endif +#if __opencl_c_ext_fp16_global_atomic_add != 1 +#error "Incorrectly defined __opencl_c_ext_fp16_global_atomic_add" +#endif +#if __opencl_c_ext_fp32_global_atomic_add != 1 +#error "Incorrectly defined __opencl_c_ext_fp32_global_atomic_add" +#endif +#if __opencl_c_ext_fp64_global_atomic_add != 1 +#error "Incorrectly defined __opencl_c_ext_fp64_global_atomic_add" +#endif +#if __opencl_c_ext_fp16_local_atomic_add != 1 +#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_add" +#endif +#if __opencl_c_ext_fp32_local_atomic_add != 1 +#error "Incorrectly defined __opencl_c_ext_fp32_local_atomic_add" +#endif +#if __opencl_c_ext_fp64_local_atomic_add != 1 +#error "Incorrectly defined __opencl_c_ext_fp64_local_atomic_add" +#endif +#if __opencl_c_ext_fp16_global_atomic_min_max != 1 +#error "Incorrectly defined __opencl_c_ext_fp16_global_atomic_min_max" +#endif +#if __opencl_c_ext_fp32_global_atomic_min_max != 1 +#error "Incorrectly defined __opencl_c_ext_fp32_global_atomic_min_max" +#endif +#if __opencl_c_ext_fp64_global_atomic_min_max != 1 +#error "Incorrectly defined __opencl_c_ext_fp64_global_atomic_min_max" +#endif +#if __opencl_c_ext_fp16_local_atomic_min_max != 1 +#error "Incorrectly defined __opencl_c_ext_fp16_local_atomic_min_max" +#endif +#if __opencl_c_ext_fp32_local_atomic_min_max != 1 +#error "Incorrectly defined __opencl_c_ext_fp32_local_atomic_min_max" +#endif +#if __opencl_c_ext_fp64_local_atomic_min_max != 1 +#error "Incorrectly defined __opencl_c_ext_fp64_local_atomic_min_max" +#endif #else @@ -148,6 +190,48 @@ global atomic_int z = ATOMIC_VAR_INIT(99); #ifdef cl_khr_subgroup_clustered_reduce #error "Incorrect cl_khr_subgroup_clustered_reduce define" #endif +#ifdef __opencl_c_ext_fp16_global_atomic_load_store +#error "Incorrectly __opencl_c_ext_fp16_global_atomic_load_store defined" +#endif +#ifdef __opencl_c_ext_fp16_local_atomic_load_store +#error "Incorrectly __opencl_c_ext_fp16_local_atomic_load_store defined" +#endif +#ifdef __opencl_c_ext_fp16_global_atomic_add +#error "Incorrectly __opencl_c_ext_fp16_global_atomic_add defined" +#endif +#ifdef __opencl_c_ext_fp32_global_atomic_add +#error "Incorrectly __opencl_c_ext_fp32_global_atomic_add defined" +#endif +#ifdef __opencl_c_ext_fp64_global_atomic_add +#error "Incorrectly __opencl_c_ext_fp64_global_atomic_add defined" +#endif +#ifdef __opencl_c_ext_fp16_local_atomic_add +#error "Incorrectly __opencl_c_ext_fp16_local_atomic_add defined" +#endif +#ifdef __opencl_c_ext_fp32_local_atomic_add +#error "Incorrectly __opencl_c_ext_fp32_local_atomic_add defined" +#endif +#ifdef __opencl_c_ext_fp64_local_atomic_add +#error "Incorrectly __opencl_c_ext_fp64_local_atomic_add defined" +#endif +#ifdef __opencl_c_ext_fp16_global_atomic_min_max +#error "Incorrectly __opencl_c_ext_fp16_global_atomic_min_max defined" +#endif +#ifdef __opencl_c_ext_fp32_global_atomic_min_max +#error "Incorrectly __opencl_c_ext_fp32_global_atomic_min_max defined" +#endif +#ifdef __opencl_c_ext_fp64_global_atomic_min_max +#error "Incorrectly __opencl_c_ext_fp64_global_atomic_min_max defined" +#endif +#ifdef __opencl_c_ext_fp16_local_atomic_min_max +#error "Incorrectly __opencl_c_ext_fp16_local_atomic_min_max defined" +#endif +#ifdef __opencl_c_ext_fp32_local_atomic_min_max +#error "Incorrectly __opencl_c_ext_fp32_local_atomic_min_max defined" +#endif +#ifdef __opencl_c_ext_fp64_local_atomic_min_max +#error "Incorrectly __opencl_c_ext_fp64_local_atomic_min_max defined" +#endif #endif //(defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200) -- 2.29.2