@@ -230,65 +230,105 @@ double atomicAdd_system(double* address, double val) {
230230__device__
231231inline
232232int 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__
237241inline
238242int 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__
243251inline
244252unsigned 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__
249261inline
250262unsigned 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__
255271inline
256272unsigned 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__
261281inline
262282unsigned 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__
267291inline
268292unsigned 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__
273301inline
274302unsigned 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__
279311inline
280312float 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__
289325inline
290326float 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__
305345inline
306346double 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