Skip to content

Commit 9451403

Browse files
committed
[OPENCL] opencl-c.h: add initial CL 3.0 conditionals for atomic operations.
This adds the optional wrappers around things, however this isn't sufficient yet for CL 3.0 without generic address space, I've got one more additional patch to add all those APIs, but this is an easier to review precursor. Reviewed By: Anastasia Differential Revision: https://reviews.llvm.org/D106111
1 parent df7d9c8 commit 9451403

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

clang/lib/Headers/opencl-c-base.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,9 @@ typedef enum memory_order
353353
memory_order_acquire = __ATOMIC_ACQUIRE,
354354
memory_order_release = __ATOMIC_RELEASE,
355355
memory_order_acq_rel = __ATOMIC_ACQ_REL,
356+
#if defined(__opencl_c_atomic_order_seq_cst)
356357
memory_order_seq_cst = __ATOMIC_SEQ_CST
358+
#endif
357359
} memory_order;
358360

359361
#endif // defined(__OPENCL_CPP_VERSION__) || (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)

clang/lib/Headers/opencl-c.h

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13304,7 +13304,10 @@ void __ovld atomic_init(volatile atomic_double *object, double value);
1330413304
void __ovld atomic_work_item_fence(cl_mem_fence_flags flags, memory_order order, memory_scope scope);
1330513305

1330613306
// atomic_fetch()
13307+
// OpenCL v2.0 s6.13.11.7.5:
13308+
// add/sub: atomic type argument can be uintptr_t/intptr_t, value type argument can be ptrdiff_t.
1330713309

13310+
#if defined(__opencl_c_atomic_order_seq_cst) && defined(__opencl_c_atomic_scope_device)
1330813311
int __ovld atomic_fetch_add(volatile atomic_int *object, int operand);
1330913312
uint __ovld atomic_fetch_add(volatile atomic_uint *object, uint operand);
1331013313
int __ovld atomic_fetch_sub(volatile atomic_int *object, int operand);
@@ -13335,16 +13338,12 @@ long __ovld atomic_fetch_min(volatile atomic_long *object, long operand);
1333513338
ulong __ovld atomic_fetch_min(volatile atomic_ulong *object, ulong operand);
1333613339
long __ovld atomic_fetch_max(volatile atomic_long *object, long operand);
1333713340
ulong __ovld atomic_fetch_max(volatile atomic_ulong *object, ulong operand);
13338-
#endif //defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
13339-
13340-
// OpenCL v2.0 s6.13.11.7.5:
13341-
// add/sub: atomic type argument can be uintptr_t/intptr_t, value type argument can be ptrdiff_t.
13342-
13343-
#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
1334413341
uintptr_t __ovld atomic_fetch_add(volatile atomic_uintptr_t *object, ptrdiff_t operand);
1334513342
uintptr_t __ovld atomic_fetch_sub(volatile atomic_uintptr_t *object, ptrdiff_t operand);
13343+
#endif //defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
1334613344
#endif
1334713345

13346+
#if defined(__opencl_c_atomic_scope_device)
1334813347
int __ovld atomic_fetch_add_explicit(volatile atomic_int *object, int operand, memory_order order);
1334913348
uint __ovld atomic_fetch_add_explicit(volatile atomic_uint *object, uint operand, memory_order order);
1335013349
int __ovld atomic_fetch_sub_explicit(volatile atomic_int *object, int operand, memory_order order);
@@ -13374,10 +13373,9 @@ long __ovld atomic_fetch_min_explicit(volatile atomic_long *object, long operand
1337413373
ulong __ovld atomic_fetch_min_explicit(volatile atomic_ulong *object, ulong operand, memory_order order);
1337513374
long __ovld atomic_fetch_max_explicit(volatile atomic_long *object, long operand, memory_order order);
1337613375
ulong __ovld atomic_fetch_max_explicit(volatile atomic_ulong *object, ulong operand, memory_order order);
13377-
#endif //defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
13378-
#if defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
1337913376
uintptr_t __ovld atomic_fetch_add_explicit(volatile atomic_uintptr_t *object, ptrdiff_t operand, memory_order order);
1338013377
uintptr_t __ovld atomic_fetch_sub_explicit(volatile atomic_uintptr_t *object, ptrdiff_t operand, memory_order order);
13378+
#endif //defined(cl_khr_int64_base_atomics) && defined(cl_khr_int64_extended_atomics)
1338113379
#endif
1338213380

1338313381
int __ovld atomic_fetch_add_explicit(volatile atomic_int *object, int operand, memory_order order, memory_scope scope);
@@ -13417,6 +13415,7 @@ uintptr_t __ovld atomic_fetch_sub_explicit(volatile atomic_uintptr_t *object, pt
1341713415

1341813416
// atomic_store()
1341913417

13418+
#if defined(__opencl_c_atomic_order_seq_cst) && defined(__opencl_c_atomic_scope_device)
1342013419
void __ovld atomic_store(volatile atomic_int *object, int desired);
1342113420
void __ovld atomic_store(volatile atomic_uint *object, uint desired);
1342213421
void __ovld atomic_store(volatile atomic_float *object, float desired);
@@ -13428,7 +13427,9 @@ void __ovld atomic_store(volatile atomic_double *object, double desired);
1342813427
void __ovld atomic_store(volatile atomic_long *object, long desired);
1342913428
void __ovld atomic_store(volatile atomic_ulong *object, ulong desired);
1343013429
#endif
13430+
#endif
1343113431

13432+
#if defined(__opencl_c_atomic_scope_device)
1343213433
void __ovld atomic_store_explicit(volatile atomic_int *object, int desired, memory_order order);
1343313434
void __ovld atomic_store_explicit(volatile atomic_uint *object, uint desired, memory_order order);
1343413435
void __ovld atomic_store_explicit(volatile atomic_float *object, float desired, memory_order order);
@@ -13439,6 +13440,7 @@ void __ovld atomic_store_explicit(volatile atomic_double *object, double desired
1343913440
void __ovld atomic_store_explicit(volatile atomic_long *object, long desired, memory_order order);
1344013441
void __ovld atomic_store_explicit(volatile atomic_ulong *object, ulong desired, memory_order order);
1344113442
#endif
13443+
#endif
1344213444

1344313445
void __ovld atomic_store_explicit(volatile atomic_int *object, int desired, memory_order order, memory_scope scope);
1344413446
void __ovld atomic_store_explicit(volatile atomic_uint *object, uint desired, memory_order order, memory_scope scope);
@@ -13452,7 +13454,7 @@ void __ovld atomic_store_explicit(volatile atomic_ulong *object, ulong desired,
1345213454
#endif
1345313455

1345413456
// atomic_load()
13455-
13457+
#if defined(__opencl_c_atomic_order_seq_cst) && defined(__opencl_c_atomic_scope_device)
1345613458
int __ovld atomic_load(volatile atomic_int *object);
1345713459
uint __ovld atomic_load(volatile atomic_uint *object);
1345813460
float __ovld atomic_load(volatile atomic_float *object);
@@ -13463,7 +13465,9 @@ double __ovld atomic_load(volatile atomic_double *object);
1346313465
long __ovld atomic_load(volatile atomic_long *object);
1346413466
ulong __ovld atomic_load(volatile atomic_ulong *object);
1346513467
#endif
13468+
#endif
1346613469

13470+
#if defined(__opencl_c_atomic_scope_device)
1346713471
int __ovld atomic_load_explicit(volatile atomic_int *object, memory_order order);
1346813472
uint __ovld atomic_load_explicit(volatile atomic_uint *object, memory_order order);
1346913473
float __ovld atomic_load_explicit(volatile atomic_float *object, memory_order order);
@@ -13474,6 +13478,7 @@ double __ovld atomic_load_explicit(volatile atomic_double *object, memory_order
1347413478
long __ovld atomic_load_explicit(volatile atomic_long *object, memory_order order);
1347513479
ulong __ovld atomic_load_explicit(volatile atomic_ulong *object, memory_order order);
1347613480
#endif
13481+
#endif
1347713482

1347813483
int __ovld atomic_load_explicit(volatile atomic_int *object, memory_order order, memory_scope scope);
1347913484
uint __ovld atomic_load_explicit(volatile atomic_uint *object, memory_order order, memory_scope scope);
@@ -13488,6 +13493,7 @@ ulong __ovld atomic_load_explicit(volatile atomic_ulong *object, memory_order or
1348813493

1348913494
// atomic_exchange()
1349013495

13496+
#if defined(__opencl_c_atomic_order_seq_cst) && defined(__opencl_c_atomic_scope_device)
1349113497
int __ovld atomic_exchange(volatile atomic_int *object, int desired);
1349213498
uint __ovld atomic_exchange(volatile atomic_uint *object, uint desired);
1349313499
float __ovld atomic_exchange(volatile atomic_float *object, float desired);
@@ -13498,7 +13504,9 @@ double __ovld atomic_exchange(volatile atomic_double *object, double desired);
1349813504
long __ovld atomic_exchange(volatile atomic_long *object, long desired);
1349913505
ulong __ovld atomic_exchange(volatile atomic_ulong *object, ulong desired);
1350013506
#endif
13507+
#endif
1350113508

13509+
#if defined(__opencl_c_atomic_scope_device)
1350213510
int __ovld atomic_exchange_explicit(volatile atomic_int *object, int desired, memory_order order);
1350313511
uint __ovld atomic_exchange_explicit(volatile atomic_uint *object, uint desired, memory_order order);
1350413512
float __ovld atomic_exchange_explicit(volatile atomic_float *object, float desired, memory_order order);
@@ -13509,6 +13517,7 @@ double __ovld atomic_exchange_explicit(volatile atomic_double *object, double de
1350913517
long __ovld atomic_exchange_explicit(volatile atomic_long *object, long desired, memory_order order);
1351013518
ulong __ovld atomic_exchange_explicit(volatile atomic_ulong *object, ulong desired, memory_order order);
1351113519
#endif
13520+
#endif
1351213521

1351313522
int __ovld atomic_exchange_explicit(volatile atomic_int *object, int desired, memory_order order, memory_scope scope);
1351413523
uint __ovld atomic_exchange_explicit(volatile atomic_uint *object, uint desired, memory_order order, memory_scope scope);
@@ -13522,7 +13531,7 @@ ulong __ovld atomic_exchange_explicit(volatile atomic_ulong *object, ulong desir
1352213531
#endif
1352313532

1352413533
// atomic_compare_exchange_strong() and atomic_compare_exchange_weak()
13525-
13534+
#if defined(__opencl_c_atomic_order_seq_cst) && defined(__opencl_c_atomic_scope_device)
1352613535
bool __ovld atomic_compare_exchange_strong(volatile atomic_int *object, int *expected, int desired);
1352713536
bool __ovld atomic_compare_exchange_strong(volatile atomic_uint *object, uint *expected, uint desired);
1352813537
bool __ovld atomic_compare_exchange_weak(volatile atomic_int *object, int *expected, int desired);
@@ -13540,6 +13549,7 @@ bool __ovld atomic_compare_exchange_weak(volatile atomic_long *object, long *exp
1354013549
bool __ovld atomic_compare_exchange_strong(volatile atomic_ulong *object, ulong *expected, ulong desired);
1354113550
bool __ovld atomic_compare_exchange_weak(volatile atomic_ulong *object, ulong *expected, ulong desired);
1354213551
#endif
13552+
#endif
1354313553

1354413554
bool __ovld atomic_compare_exchange_strong_explicit(volatile atomic_int *object, int *expected,
1354513555
int desired, memory_order success, memory_order failure);
@@ -13600,12 +13610,15 @@ bool __ovld atomic_compare_exchange_weak_explicit(volatile atomic_ulong *object,
1360013610
#endif
1360113611

1360213612
// atomic_flag_test_and_set() and atomic_flag_clear()
13603-
13613+
#if defined(__opencl_c_atomic_order_seq_cst) && defined(__opencl_c_atomic_scope_device)
1360413614
bool __ovld atomic_flag_test_and_set(volatile atomic_flag *object);
1360513615
void __ovld atomic_flag_clear(volatile atomic_flag *object);
13616+
#endif
1360613617

13618+
#if defined(__opencl_c_atomic_scope_device)
1360713619
bool __ovld atomic_flag_test_and_set_explicit(volatile atomic_flag *object, memory_order order);
1360813620
void __ovld atomic_flag_clear_explicit(volatile atomic_flag *object, memory_order order);
13621+
#endif
1360913622

1361013623
bool __ovld atomic_flag_test_and_set_explicit(volatile atomic_flag *object, memory_order order, memory_scope scope);
1361113624
void __ovld atomic_flag_clear_explicit(volatile atomic_flag *object, memory_order order, memory_scope scope);

0 commit comments

Comments
 (0)