Skip to content
This repository was archived by the owner on Jan 26, 2024. It is now read-only.

Commit ce52b1c

Browse files
committed
Use __hip_atomic_fetch_sub
Where available, `__hip_atomic_fetch_sub` can be used to implement the `atomicSub` family. Introduced in llvm e3fbede7f3f
1 parent 4209792 commit ce52b1c

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

include/hip/amd_detail/amd_hip_atomic.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,65 +230,105 @@ double atomicAdd_system(double* address, double val) {
230230
__device__
231231
inline
232232
int atomicSub(int* address, int val) {
233+
#if __has_builtin(__hip_atomic_fetch_sub)
234+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
235+
#else
233236
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
237+
#endif
234238
}
235239

236240
__device__
237241
inline
238242
int atomicSub_system(int* address, int val) {
243+
#if __has_builtin(__hip_atomic_fetch_sub)
244+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
245+
#else
239246
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
247+
#endif
240248
}
241249

242250
__device__
243251
inline
244252
unsigned int atomicSub(unsigned int* address, unsigned int val) {
253+
#if __has_builtin(__hip_atomic_fetch_sub)
254+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
255+
#else
245256
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
257+
#endif
246258
}
247259

248260
__device__
249261
inline
250262
unsigned int atomicSub_system(unsigned int* address, unsigned int val) {
263+
#if __has_builtin(__hip_atomic_fetch_sub)
264+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
265+
#else
251266
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
267+
#endif
252268
}
253269

254270
__device__
255271
inline
256272
unsigned long atomicSub(unsigned long* address, unsigned long val) {
273+
#if __has_builtin(__hip_atomic_fetch_sub)
274+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
275+
#else
257276
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
277+
#endif
258278
}
259279

260280
__device__
261281
inline
262282
unsigned long atomicSub_system(unsigned long* address, unsigned long val) {
283+
#if __has_builtin(__hip_atomic_fetch_sub)
284+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
285+
#else
263286
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
287+
#endif
264288
}
265289

266290
__device__
267291
inline
268292
unsigned long long atomicSub(unsigned long long* address, unsigned long long val) {
293+
#if __has_builtin(__hip_atomic_fetch_sub)
294+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
295+
#else
269296
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
297+
#endif
270298
}
271299

272300
__device__
273301
inline
274302
unsigned long long atomicSub_system(unsigned long long* address, unsigned long long val) {
303+
#if __has_builtin(__hip_atomic_fetch_sub)
304+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
305+
#else
275306
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
307+
#endif
276308
}
277309

278310
__device__
279311
inline
280312
float atomicSub(float* address, float val) {
281313
#if defined(__AMDGCN_UNSAFE_FP_ATOMICS__)
282314
return unsafeAtomicAdd(address, -val);
315+
#else
316+
#if __has_builtin(__hip_atomic_fetch_sub)
317+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
283318
#else
284319
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
285320
#endif
321+
#endif
286322
}
287323

288324
__device__
289325
inline
290326
float atomicSub_system(float* address, float val) {
327+
#if __has_builtin(__hip_atomic_fetch_sub)
328+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
329+
#else
291330
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
331+
#endif
292332
}
293333

294334
__device__
@@ -304,7 +344,11 @@ double atomicSub(double* address, double val) {
304344
__device__
305345
inline
306346
double atomicSub_system(double* address, double val) {
347+
#if __has_builtin(__hip_atomic_fetch_sub)
348+
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
349+
#else
307350
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
351+
#endif
308352
}
309353

310354
__device__

0 commit comments

Comments
 (0)