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

Commit

Permalink
Use __hip_atomic_fetch_sub
Browse files Browse the repository at this point in the history
Where available, `__hip_atomic_fetch_sub` can be used to implement the
`atomicSub` family.

Introduced in llvm e3fbede7f3f
  • Loading branch information
ldrumm committed May 30, 2023
1 parent 4209792 commit ce52b1c
Showing 1 changed file with 44 additions and 0 deletions.
44 changes: 44 additions & 0 deletions include/hip/amd_detail/amd_hip_atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -230,65 +230,105 @@ double atomicAdd_system(double* address, double val) {
__device__
inline
int atomicSub(int* address, int val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#endif
}

__device__
inline
int atomicSub_system(int* address, int val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#endif
}

__device__
inline
unsigned int atomicSub(unsigned int* address, unsigned int val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#endif
}

__device__
inline
unsigned int atomicSub_system(unsigned int* address, unsigned int val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#endif
}

__device__
inline
unsigned long atomicSub(unsigned long* address, unsigned long val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#endif
}

__device__
inline
unsigned long atomicSub_system(unsigned long* address, unsigned long val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#endif
}

__device__
inline
unsigned long long atomicSub(unsigned long long* address, unsigned long long val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#endif
}

__device__
inline
unsigned long long atomicSub_system(unsigned long long* address, unsigned long long val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#endif
}

__device__
inline
float atomicSub(float* address, float val) {
#if defined(__AMDGCN_UNSAFE_FP_ATOMICS__)
return unsafeAtomicAdd(address, -val);
#else
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);
#endif
#endif
}

__device__
inline
float atomicSub_system(float* address, float val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#endif
}

__device__
Expand All @@ -304,7 +344,11 @@ double atomicSub(double* address, double val) {
__device__
inline
double atomicSub_system(double* address, double val) {
#if __has_builtin(__hip_atomic_fetch_sub)
return __hip_atomic_fetch_sub(address, val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#else
return __hip_atomic_fetch_add(address, -val, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_SYSTEM);
#endif
}

__device__
Expand Down

0 comments on commit ce52b1c

Please sign in to comment.