Skip to content

Commit f8b8414

Browse files
authored
Modernizing iree_atomic_*. (#18910)
C11's _Generic lets us avoid the need for specifying the type in the name and more closely match the C11 atomic syntax. This assumes that any C compiler we have that goes down the disabled atomics path supports _Generic (modern GCC, Clang, and MSVC all have for awhile). This allows us to drop-in replace C11-style atomics (useful in the new AMDGPU backend) and on MSVC will allow us to use their implementation when it's ready (it's way better than the Interlocked solution we have now).
1 parent 4823dc0 commit f8b8414

34 files changed

+794
-606
lines changed

experimental/webgpu/nop_semaphore.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ iree_status_t iree_hal_webgpu_nop_semaphore_create(
3838
iree_hal_resource_initialize(&iree_hal_webgpu_nop_semaphore_vtable,
3939
&semaphore->resource);
4040
semaphore->host_allocator = host_allocator;
41-
iree_atomic_store_int64(&semaphore->value, initial_value,
42-
iree_memory_order_seq_cst);
41+
iree_atomic_store(&semaphore->value, initial_value,
42+
iree_memory_order_seq_cst);
4343
*out_semaphore = (iree_hal_semaphore_t*)semaphore;
4444
}
4545

@@ -63,17 +63,15 @@ static iree_status_t iree_hal_webgpu_nop_semaphore_query(
6363
iree_hal_semaphore_t* base_semaphore, uint64_t* out_value) {
6464
iree_hal_webgpu_nop_semaphore_t* semaphore =
6565
iree_hal_webgpu_nop_semaphore_cast(base_semaphore);
66-
*out_value =
67-
iree_atomic_load_int64(&semaphore->value, iree_memory_order_seq_cst);
66+
*out_value = iree_atomic_load(&semaphore->value, iree_memory_order_seq_cst);
6867
return iree_ok_status();
6968
}
7069

7170
static iree_status_t iree_hal_webgpu_nop_semaphore_signal(
7271
iree_hal_semaphore_t* base_semaphore, uint64_t new_value) {
7372
iree_hal_webgpu_nop_semaphore_t* semaphore =
7473
iree_hal_webgpu_nop_semaphore_cast(base_semaphore);
75-
iree_atomic_store_int64(&semaphore->value, new_value,
76-
iree_memory_order_seq_cst);
74+
iree_atomic_store(&semaphore->value, new_value, iree_memory_order_seq_cst);
7775
return iree_ok_status();
7876
}
7977

@@ -88,7 +86,7 @@ static iree_status_t iree_hal_webgpu_nop_semaphore_wait(
8886
iree_hal_webgpu_nop_semaphore_t* semaphore =
8987
iree_hal_webgpu_nop_semaphore_cast(base_semaphore);
9088
uint64_t current_value =
91-
iree_atomic_load_int64(&semaphore->value, iree_memory_order_seq_cst);
89+
iree_atomic_load(&semaphore->value, iree_memory_order_seq_cst);
9290
if (current_value < value) {
9391
return iree_make_status(
9492
IREE_STATUS_FAILED_PRECONDITION,

runtime/src/iree/base/internal/atomics.h

Lines changed: 7 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -86,47 +86,6 @@ extern "C" {
8686

8787
#endif // IREE_COMPILER_*
8888

89-
// If the compiler can automatically determine the types:
90-
#ifdef iree_atomic_load_auto
91-
92-
#define iree_atomic_load_int32 iree_atomic_load_auto
93-
#define iree_atomic_store_int32 iree_atomic_store_auto
94-
#define iree_atomic_fetch_add_int32 iree_atomic_fetch_add_auto
95-
#define iree_atomic_fetch_sub_int32 iree_atomic_fetch_sub_auto
96-
#define iree_atomic_fetch_and_int32 iree_atomic_fetch_and_auto
97-
#define iree_atomic_fetch_or_int32 iree_atomic_fetch_or_auto
98-
#define iree_atomic_fetch_xor_int32 iree_atomic_fetch_xor_auto
99-
#define iree_atomic_exchange_int32 iree_atomic_exchange_auto
100-
#define iree_atomic_compare_exchange_strong_int32 \
101-
iree_atomic_compare_exchange_strong_auto
102-
#define iree_atomic_compare_exchange_weak_int32 \
103-
iree_atomic_compare_exchange_weak_auto
104-
105-
#define iree_atomic_load_int64 iree_atomic_load_auto
106-
#define iree_atomic_store_int64 iree_atomic_store_auto
107-
#define iree_atomic_fetch_add_int64 iree_atomic_fetch_add_auto
108-
#define iree_atomic_fetch_sub_int64 iree_atomic_fetch_sub_auto
109-
#define iree_atomic_fetch_and_int64 iree_atomic_fetch_and_auto
110-
#define iree_atomic_fetch_or_int64 iree_atomic_fetch_or_auto
111-
#define iree_atomic_fetch_xor_int64 iree_atomic_fetch_xor_auto
112-
#define iree_atomic_exchange_int64 iree_atomic_exchange_auto
113-
#define iree_atomic_compare_exchange_strong_int64 \
114-
iree_atomic_compare_exchange_strong_auto
115-
#define iree_atomic_compare_exchange_weak_int64 \
116-
iree_atomic_compare_exchange_weak_auto
117-
118-
#define iree_atomic_load_intptr iree_atomic_load_auto
119-
#define iree_atomic_store_intptr iree_atomic_store_auto
120-
#define iree_atomic_fetch_add_intptr iree_atomic_fetch_add_auto
121-
#define iree_atomic_fetch_sub_intptr iree_atomic_fetch_sub_auto
122-
#define iree_atomic_exchange_intptr iree_atomic_exchange_auto
123-
#define iree_atomic_compare_exchange_strong_intptr \
124-
iree_atomic_compare_exchange_strong_auto
125-
#define iree_atomic_compare_exchange_weak_intptr \
126-
iree_atomic_compare_exchange_weak_auto
127-
128-
#endif // iree_atomic_load_auto
129-
13089
//==============================================================================
13190
// Reference count atomics
13291
//==============================================================================
@@ -140,10 +99,10 @@ typedef iree_atomic_int32_t iree_atomic_ref_count_t;
14099
// should use IREE_ATOMIC_VAR_INIT, but apparently this has to be fixed
141100
// at call sites (where the variables are initialized in the first place).
142101
#define iree_atomic_ref_count_init_value(count_ptr, value) \
143-
iree_atomic_store_int32(count_ptr, value, iree_memory_order_relaxed)
102+
iree_atomic_store((count_ptr), (value), iree_memory_order_relaxed)
144103

145104
#define iree_atomic_ref_count_init(count_ptr) \
146-
iree_atomic_ref_count_init_value(count_ptr, 1)
105+
iree_atomic_ref_count_init_value((count_ptr), 1)
147106

148107
// Why relaxed order:
149108
// https://www.boost.org/doc/libs/1_57_0/doc/html/atomic/usage_examples.html#boost_atomic.usage_examples.example_reference_counters.discussion
@@ -155,9 +114,9 @@ typedef iree_atomic_int32_t iree_atomic_ref_count_t;
155114
// value (unlike iree_atomic_ref_count_dec), so we make sure that it does not,
156115
// which allows the implementation to use faster atomic instructions where
157116
// available, e.g. STADD on ARMv8.1-a.
158-
#define iree_atomic_ref_count_inc(count_ptr) \
159-
do { \
160-
iree_atomic_fetch_add_int32(count_ptr, 1, iree_memory_order_relaxed); \
117+
#define iree_atomic_ref_count_inc(count_ptr) \
118+
do { \
119+
iree_atomic_fetch_add((count_ptr), 1, iree_memory_order_relaxed); \
161120
} while (false)
162121

163122
// For now we stick to acq_rel order. TODO: should we follow Boost's advice?
@@ -169,13 +128,13 @@ typedef iree_atomic_int32_t iree_atomic_ref_count_t;
169128
// may be a pessimization... I would like to hear a second opinion on this,
170129
// particularly regarding how x86-centric this might be.
171130
#define iree_atomic_ref_count_dec(count_ptr) \
172-
iree_atomic_fetch_sub_int32(count_ptr, 1, iree_memory_order_acq_rel)
131+
iree_atomic_fetch_sub((count_ptr), 1, iree_memory_order_acq_rel)
173132

174133
// memory_order_acquire order ensures that this sees decrements from
175134
// iree_atomic_ref_count_dec. On the other hand, there is no ordering with
176135
// iree_atomic_ref_count_inc.
177136
#define iree_atomic_ref_count_load(count_ptr) \
178-
iree_atomic_load_int32(count_ptr, iree_memory_order_acquire)
137+
iree_atomic_load((count_ptr), iree_memory_order_acquire)
179138

180139
// Aborts the program if the given reference count value is not 1.
181140
// This should be avoided in all situations but those where continuing execution

runtime/src/iree/base/internal/atomics_clang.h

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,37 +33,38 @@ typedef enum iree_memory_order_e {
3333

3434
typedef _Atomic int32_t iree_atomic_int32_t;
3535
typedef _Atomic int64_t iree_atomic_int64_t;
36+
typedef _Atomic uint32_t iree_atomic_uint32_t;
37+
typedef _Atomic uint64_t iree_atomic_uint64_t;
3638
// TODO(#3453): check for __int128 support before using
3739
// typedef _Atomic __int128 iree_atomic_int128_t;
3840
typedef _Atomic intptr_t iree_atomic_intptr_t;
3941

40-
#define iree_atomic_load_auto(object, order) \
41-
__c11_atomic_load((object), (order))
42-
#define iree_atomic_store_auto(object, desired, order) \
42+
#define iree_atomic_thread_fence(order) __c11_atomic_thread_fence(order)
43+
44+
#define iree_atomic_load(object, order) __c11_atomic_load((object), (order))
45+
#define iree_atomic_store(object, desired, order) \
4346
__c11_atomic_store((object), (desired), (order))
44-
#define iree_atomic_fetch_add_auto(object, operand, order) \
47+
#define iree_atomic_fetch_add(object, operand, order) \
4548
__c11_atomic_fetch_add((object), (operand), (order))
46-
#define iree_atomic_fetch_sub_auto(object, operand, order) \
49+
#define iree_atomic_fetch_sub(object, operand, order) \
4750
__c11_atomic_fetch_sub((object), (operand), (order))
48-
#define iree_atomic_fetch_and_auto(object, operand, order) \
51+
#define iree_atomic_fetch_and(object, operand, order) \
4952
__c11_atomic_fetch_and((object), (operand), (order))
50-
#define iree_atomic_fetch_or_auto(object, operand, order) \
53+
#define iree_atomic_fetch_or(object, operand, order) \
5154
__c11_atomic_fetch_or((object), (operand), (order))
52-
#define iree_atomic_fetch_xor_auto(object, operand, order) \
55+
#define iree_atomic_fetch_xor(object, operand, order) \
5356
__c11_atomic_fetch_xor((object), (operand), (order))
54-
#define iree_atomic_exchange_auto(object, operand, order) \
57+
#define iree_atomic_exchange(object, operand, order) \
5558
__c11_atomic_exchange((object), (operand), (order))
56-
#define iree_atomic_compare_exchange_strong_auto(object, expected, desired, \
57-
order_succ, order_fail) \
58-
__c11_atomic_compare_exchange_strong((object), (expected), (desired), \
59+
#define iree_atomic_compare_exchange_strong(object, expected, desired, \
60+
order_succ, order_fail) \
61+
__c11_atomic_compare_exchange_strong((object), (expected), (desired), \
5962
(order_succ), (order_fail))
60-
#define iree_atomic_compare_exchange_weak_auto(object, expected, desired, \
61-
order_succ, order_fail) \
62-
__c11_atomic_compare_exchange_weak((object), (expected), (desired), \
63+
#define iree_atomic_compare_exchange_weak(object, expected, desired, \
64+
order_succ, order_fail) \
65+
__c11_atomic_compare_exchange_weak((object), (expected), (desired), \
6366
(order_succ), (order_fail))
6467

65-
#define iree_atomic_thread_fence(order) __c11_atomic_thread_fence(order)
66-
6768
#ifdef __cplusplus
6869
} // extern "C"
6970
#endif

0 commit comments

Comments
 (0)