Skip to content

Commit 35fc029

Browse files
Ilya Stepykinbader
authored andcommitted
[SYCL] Fix host's abs_diff function for unsigned types
Fix incorrect behavior of host's abs_diff function in case if x - y < 0 and x and y are unsigned types. Signed-off-by: Ilya Stepykin <[email protected]>
1 parent ee85233 commit 35fc029

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

sycl/source/detail/builtins_integer.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "builtins_helper.hpp"
1313

1414
#include <algorithm>
15+
#include <type_traits>
1516

1617
namespace s = cl::sycl;
1718
namespace d = s::detail;
@@ -20,7 +21,11 @@ namespace cl {
2021
namespace __host_std {
2122
namespace {
2223

23-
template <typename T> inline T __abs_diff(T x, T y) { return std::abs(x - y); }
24+
template <typename T> inline T __abs_diff(T x, T y) {
25+
static_assert(std::is_integral<T>::value,
26+
"Only integral types are supported");
27+
return (x > y) ? (x - y) : (y - x);
28+
}
2429

2530
template <typename T> inline T __u_add_sat(T x, T y) {
2631
return (x < (d::max_v<T>() - y) ? x + y : d::max_v<T>());
@@ -198,10 +203,18 @@ MAKE_1V(s_abs, s::cl_uint, s::cl_int)
198203
MAKE_1V(s_abs, s::cl_ulong, s::cl_long)
199204

200205
// u_abs_diff
201-
cl_uchar u_abs_diff(s::cl_uchar x, s::cl_uchar y) __NOEXC { return x - y; }
202-
cl_ushort u_abs_diff(s::cl_ushort x, s::cl_ushort y) __NOEXC { return x - y; }
203-
cl_uint u_abs_diff(s::cl_uint x, s::cl_uint y) __NOEXC { return x - y; }
204-
cl_ulong u_abs_diff(s::cl_ulong x, s::cl_ulong y) __NOEXC { return x - y; }
206+
cl_uchar u_abs_diff(s::cl_uchar x, s::cl_uchar y) __NOEXC {
207+
return __abs_diff(x, y);
208+
}
209+
cl_ushort u_abs_diff(s::cl_ushort x, s::cl_ushort y) __NOEXC {
210+
return __abs_diff(x, y);
211+
}
212+
cl_uint u_abs_diff(s::cl_uint x, s::cl_uint y) __NOEXC {
213+
return __abs_diff(x, y);
214+
}
215+
cl_ulong u_abs_diff(s::cl_ulong x, s::cl_ulong y) __NOEXC {
216+
return __abs_diff(x, y);
217+
}
205218

206219
MAKE_1V_2V(u_abs_diff, s::cl_uchar, s::cl_uchar, s::cl_uchar)
207220
MAKE_1V_2V(u_abs_diff, s::cl_ushort, s::cl_ushort, s::cl_ushort)

sycl/test/built-ins/scalar_integer.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ int main() {
107107
}
108108
assert(r == 2);
109109
}
110-
110+
111111
// abs
112112
{
113113
s::cl_uint r{ 0 };
@@ -140,6 +140,22 @@ int main() {
140140
assert(r == 4);
141141
}
142142

143+
// abs_diff(uchar)
144+
{
145+
s::cl_uchar r{ 0 };
146+
{
147+
s::buffer<s::cl_uchar, 1> BufR(&r, s::range<1>(1));
148+
s::queue myQueue;
149+
myQueue.submit([&](s::handler &cgh) {
150+
auto AccR = BufR.get_access<s::access::mode::write>(cgh);
151+
cgh.single_task<class abs_diffUC1UC1>([=]() {
152+
AccR[0] = s::abs_diff(s::uchar{ 3 }, s::uchar{ 250 });
153+
});
154+
});
155+
}
156+
assert(r == 247);
157+
}
158+
143159
// add_sat
144160
{
145161
s::cl_int r{ 0 };

0 commit comments

Comments
 (0)