| <para> | |
| In these operation definitions: | |
| </para> | |
| <para> | |
| <itemizedlist> | |
| <listitem> | |
| An <code>A</code> refers to one of the atomic types. | |
| </listitem> | |
| <listitem> | |
| A <code>C</code> refers to its corresponding non-atomic type. | |
| </listitem> | |
| <listitem> | |
| An <code>M</code> refers to the type of the other | |
| argument for arithmetic operations. For atomic | |
| integer types, <code>M</code> is <code>C</code>. | |
| </listitem> | |
| <listitem> | |
| The functions not ending in explicit have the same semantics as the corresponding | |
| explicit function with <constant>memory_order_seq_cst</constant> | |
| for the <code>memory_order</code> argument. | |
| </listitem> | |
| <listitem> | |
| The functions that do not have <code>memory_scope</code> | |
| argument have the same semantics as | |
| the corresponding functions with the <code>memory_scope</code> argument set to | |
| <constant>memory_scope_device</constant>. | |
| </listitem> | |
| </itemizedlist> | |
| </para> | |
| <para> | |
| NOTE: With fine-grained system SVM, sharing | |
| happens at the granularity of individual loads | |
| and stores anywhere in host memory. Memory | |
| consistency is always guaranteed at | |
| synchronization points, but to obtain finer | |
| control over consistency, the OpenCL atomics | |
| functions may be used to ensure that the updates | |
| to individual data values made by one unit of | |
| execution are visible to other execution units. | |
| In particular, when a host thread needs fine | |
| control over the consistency of memory that is | |
| shared with one or more OpenCL devices, it must | |
| use atomic and fence operations that are | |
| compatible with the C11 atomic operations. | |
| </para> | |
| <para> | |
| We can't require C11 atomics since host programs can | |
| be implemented in other programming languages and | |
| versions of C or C++, but we do require that the host | |
| programs use atomics and that those atomics be compatible | |
| with those in C11. | |
| </para> | |
| <bridgehead>Restrictions</bridgehead> | |
| <para> | |
| All operations on atomic types must be performed using the built-in atomic | |
| functions. C11 and C++11 support operators on atomic types. OpenCL C does not | |
| support operators with atomic types. Using atomic types with operators should result in a | |
| compilation error. | |
| </para> | |
| <para> | |
| The <type>atomic_bool</type>, <type>atomic_char</type>, | |
| <type>atomic_uchar</type>, <type>atomic_short</type>, | |
| <type>atomic_ushort</type>, <type>atomic_intmax_t</type> | |
| and <type>atomic_uintmax_t</type> types are not | |
| supported by OpenCL C. | |
| </para> | |
| <para> | |
| OpenCL C requires that the built-in atomic functions on | |
| atomic types are lock-free. | |
| </para> | |
| <para> | |
| The <code>_Atomic</code> type specifier and <code>_Atomic</code> | |
| type qualifier are not supported by OpenCL C. | |
| </para> | |
| <para> | |
| The behavior of atomic operations where pointer | |
| arguments to the atomic functions refers | |
| to an atomic type in the private address space is undefined. | |
| </para> | |
| <!-- 28-Oct-2015, Ext ver 2.1 rev 10; C lang ver 2.0 rev 30 --> | |