Description
// Requires OpenCL C 3.0 or newer and both the __opencl_c_atomic_order_seq_cst
// and __opencl_c_atomic_scope_device features.
bool atomic_compare_exchange_strong(
volatile __global A *object,
__global C *expected, C desired)
bool atomic_compare_exchange_strong(
volatile __global A *object,
__local C *expected, C desired)
bool atomic_compare_exchange_strong(
volatile __global A *object,
__private C *expected, C desired)
bool atomic_compare_exchange_strong(
volatile __local A *object,
__global C *expected, C desired)
bool atomic_compare_exchange_strong(
volatile __local A *object,
__local C *expected, C desired)
bool atomic_compare_exchange_strong(
volatile __local A *object,
__private C *expected, C desired)
// Requires OpenCL C 2.0, or OpenCL C 3.0 or newer and all of the
// __opencl_c_generic_address_space, __opencl_c_atomic_order_seq_cst and
// __opencl_c_atomic_scope_device features.
bool atomic_compare_exchange_strong(
volatile A *object,
C *expected, C desired)
// Requires OpenCL C 3.0 or newer and the __opencl_c_atomic_scope_device
// feature.
bool atomic_compare_exchange_strong_explicit(
volatile __global A *object,
__global C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_strong_explicit(
volatile __global A *object,
__local C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_strong_explicit(
volatile __global A *object,
__private C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_strong_explicit(
volatile __local A *object,
__global C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_strong_explicit(
volatile __local A *object,
__local C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_strong_explicit(
volatile __local A *object,
__private C *expected,
C desired,
memory_order success,
memory_order failure)
// Requires OpenCL C 2.0, or OpenCL C 3.0 or newer and both the
// __opencl_c_generic_address_space and
// __opencl_c_atomic_scope_device features.
bool atomic_compare_exchange_strong_explicit(
volatile A *object,
C *expected,
C desired,
memory_order success,
memory_order failure)
// Requires OpenCL C 3.0 or newer.
bool atomic_compare_exchange_strong_explicit(
volatile __global A *object,
__global C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_strong_explicit(
volatile __global A *object,
__local C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_strong_explicit(
volatile __global A *object,
__private C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_strong_explicit(
volatile __local A *object,
__global C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_strong_explicit(
volatile __local A *object,
__local C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_strong_explicit(
volatile __local A *object,
__private C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
// Requires OpenCL C 2.0, or OpenCL C 3.0 or newer and the
// __opencl_c_generic_address_space feature.
bool atomic_compare_exchange_strong_explicit(
volatile A *object,
C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
// Requires OpenCL C 3.0 or newer and both the __opencl_c_atomic_order_seq_cst
// and __opencl_c_atomic_scope_device features.
bool atomic_compare_exchange_weak(
volatile __global A *object,
__global C *expected, C desired)
bool atomic_compare_exchange_weak(
volatile __global A *object,
__local C *expected, C desired)
bool atomic_compare_exchange_weak(
volatile __global A *object,
__private C *expected, C desired)
bool atomic_compare_exchange_weak(
volatile __local A *object,
__global C *expected, C desired)
bool atomic_compare_exchange_weak(
volatile __local A *object,
__local C *expected, C desired)
bool atomic_compare_exchange_weak(
volatile __local A *object,
__private C *expected, C desired)
// Requires OpenCL C 2.0, or OpenCL C 3.0 or newer and all of the
// __opencl_c_generic_address_space, __opencl_c_atomic_order_seq_cst and
// __opencl_c_atomic_scope_device features.
bool atomic_compare_exchange_weak(
volatile A *object,
C *expected, C desired)
// Requires OpenCL C 3.0 or newer and the __opencl_c_atomic_scope_device
// feature.
bool atomic_compare_exchange_weak_explicit(
volatile __global A *object,
__global C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_weak_explicit(
volatile __global A *object,
__local C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_weak_explicit(
volatile __global A *object,
__private C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_weak_explicit(
volatile __local A *object,
__global C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_weak_explicit(
volatile __local A *object,
__local C *expected,
C desired,
memory_order success,
memory_order failure)
bool atomic_compare_exchange_weak_explicit(
volatile __local A *object,
__private C *expected,
C desired,
memory_order success,
memory_order failure)
// Requires OpenCL C 2.0, or OpenCL C 3.0 or newer and both the
// __opencl_c_generic_address_space and
// __opencl_c_atomic_scope_device features.
bool atomic_compare_exchange_weak_explicit(
volatile A *object,
C *expected,
C desired,
memory_order success,
memory_order failure)
// Requires OpenCL C 3.0 or newer.
bool atomic_compare_exchange_weak_explicit(
volatile __global A *object,
__global C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_weak_explicit(
volatile __global A *object,
__local C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_weak_explicit(
volatile __global A *object,
__private C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_weak_explicit(
volatile __local A *object,
__global C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_weak_explicit(
volatile __local A *object,
__local C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
bool atomic_compare_exchange_weak_explicit(
volatile __local A *object,
__private C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
// Requires OpenCL C 2.0, or OpenCL C 3.0 or newer and the
// __opencl_c_generic_address_space feature.
bool atomic_compare_exchange_weak_explicit(
volatile A *object,
C *expected,
C desired,
memory_order success,
memory_order failure,
memory_scope scope)
The failure argument shall not be memory_order_release nor
memory_order_acq_rel.
The failure argument shall be no stronger than the success argument.
Atomically, compares the value pointed to by object for equality with that
in expected, and if true, replaces the value pointed to by object with
desired, and if false, updates the value in expected with the value
pointed to by object.
Further, if the comparison is true, memory is affected according to the
value of success, and if the comparison is false, memory is affected
according to the value of failure.
If the comparison is true, these operations are atomic read-modify-write operations (as defined by
section 5.1.2.4 of the C11 Specification).
Otherwise, these operations are atomic load operations.
|
The effect of the compare-and-exchange operations is
|
The weak compare-and-exchange operations may fail spuriously
[1].
That is, even when the contents of memory referred to by expected and
object are equal, it may return zero and store back to expected the same
memory contents that were originally there.
These generic functions return the result of the comparison.
The non-explicit atomic_compare_exchange_strong and
atomic_compare_exchange_weak functions requires support
for OpenCL C 2.0, or OpenCL C 3.0 or newer and both the
__opencl_c_ and __opencl_c_
features.
For the explicit variants, memory order and scope enumerations must respect the
restrictions section below.
|
The function variants that use the generic address space, i.e. no
explicit address space is listed, require support for OpenCL
C 2.0, or OpenCL C 3.0 or newer and the __opencl_c_
feature.
|
Document Notes
For more information, see the OpenCL C Specification
This page is extracted from the OpenCL C Specification. Fixes and changes should be made to the Specification, not directly.