SWDEV-401847 - Update atomicMin/Max for float and double.
Change-Id: Ib5be459b8a24f0739e299ed12c9f877f8baa02b1
[ROCm/hipother commit: 01dc9ce02e]
This commit is contained in:
committed by
Jaydeepkumar Patel
parent
790f51e1f3
commit
562be5c864
@@ -25,51 +25,43 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
|
|
||||||
__device__ inline float atomicMax(float* addr, float val) {
|
__device__ inline float atomicMax(float* addr, float val) {
|
||||||
unsigned int *uaddr = (unsigned int *)addr;
|
int ret = __float_as_int(*addr);
|
||||||
float value = __uint_as_float(*uaddr);
|
while (val > __int_as_float(ret)) {
|
||||||
|
int old = ret;
|
||||||
while (value < val) {
|
if ((ret = atomicCAS((int *)addr, old, __float_as_int(val))) == old)
|
||||||
value = __uint_as_float(atomicCAS(uaddr, __float_as_uint(value),
|
break;
|
||||||
__float_as_uint(val)));
|
|
||||||
}
|
}
|
||||||
return value;
|
return __int_as_float(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
__device__ inline double atomicMax(double* addr, double val) {
|
__device__ inline double atomicMax(double* addr, double val) {
|
||||||
unsigned long long* uaddr = (unsigned long long *)addr;
|
unsigned long long ret = __double_as_longlong(*addr);
|
||||||
double value = __longlong_as_double(*uaddr);
|
while (val > __longlong_as_double(ret)) {
|
||||||
|
unsigned long long old = ret;
|
||||||
while (value < val) {
|
if ((ret = atomicCAS((unsigned long long *)addr, old, __double_as_longlong(val))) == old)
|
||||||
value = __longlong_as_double(atomicCAS(uaddr,
|
break;
|
||||||
__double_as_longlong(value),
|
|
||||||
__double_as_longlong(val)));
|
|
||||||
}
|
}
|
||||||
|
return __longlong_as_double(ret);
|
||||||
return value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__device__ inline float atomicMin(float* addr, float val) {
|
__device__ inline float atomicMin(float* addr, float val) {
|
||||||
unsigned int *uaddr = (unsigned int *)addr;
|
int ret = __float_as_int(*addr);
|
||||||
float value = __uint_as_float(*uaddr);
|
while (val < __int_as_float(ret)) {
|
||||||
|
int old = ret;
|
||||||
while (value > val) {
|
if ((ret = atomicCAS((int *)addr, old, __float_as_int(val))) == old)
|
||||||
value = __uint_as_float(atomicCAS(uaddr, __float_as_uint(value),
|
break;
|
||||||
__float_as_uint(val)));
|
|
||||||
}
|
}
|
||||||
return value;
|
return __int_as_float(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
__device__ inline double atomicMin(double* addr, double val) {
|
__device__ inline double atomicMin(double* addr, double val) {
|
||||||
unsigned long long* uaddr = (unsigned long long *)addr;
|
unsigned long long ret = __double_as_longlong(*addr);
|
||||||
double value = __longlong_as_double(*uaddr);
|
while (val < __longlong_as_double(ret)) {
|
||||||
|
unsigned long long old = ret;
|
||||||
while (value > val) {
|
if ((ret = atomicCAS((unsigned long long *)addr, old, __double_as_longlong(val))) == old)
|
||||||
value = __longlong_as_double(atomicCAS(uaddr,
|
break;
|
||||||
__double_as_longlong(value),
|
|
||||||
__double_as_longlong(val)));
|
|
||||||
}
|
}
|
||||||
|
return __longlong_as_double(ret);
|
||||||
return value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user