Skip to content

Commit 1396da2

Browse files
authored
[SYCL][ESIMD]Fix regression in atomic_update (#8673)
1 parent 637cb85 commit 1396da2

File tree

1 file changed

+65
-40
lines changed
  • sycl/include/sycl/ext/intel/experimental/esimd

1 file changed

+65
-40
lines changed

sycl/include/sycl/ext/intel/experimental/esimd/memory.hpp

Lines changed: 65 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2665,7 +2665,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
26652665
lsc_data_size DS = lsc_data_size::default_size,
26662666
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
26672667
typename Toffset>
2668-
__ESIMD_API __ESIMD_NS::simd<T, N>
2668+
__ESIMD_API std::enable_if_t<
2669+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 0,
2670+
__ESIMD_NS::simd<T, N>>
26692671
lsc_atomic_update(T *p, __ESIMD_NS::simd<Toffset, N> offsets,
26702672
__ESIMD_NS::simd_mask<N> pred) {
26712673
static_assert(std::is_integral_v<Toffset>, "Unsupported offset type");
@@ -2697,7 +2699,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
26972699
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
26982700
typename Toffset,
26992701
typename RegionTy = __ESIMD_NS::region1d_t<Toffset, N, 1>>
2700-
__ESIMD_API __ESIMD_NS::simd<T, N>
2702+
__ESIMD_API std::enable_if_t<
2703+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 0,
2704+
__ESIMD_NS::simd<T, N>>
27012705
lsc_atomic_update(T *p, __ESIMD_NS::simd_view<Toffset, RegionTy> offsets,
27022706
__ESIMD_NS::simd_mask<N> pred = 1) {
27032707
using Ty = typename __ESIMD_NS::simd_view<Toffset, RegionTy>::element_type;
@@ -2709,8 +2713,10 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
27092713
lsc_data_size DS = lsc_data_size::default_size,
27102714
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
27112715
typename Toffset>
2712-
__ESIMD_API
2713-
std::enable_if_t<std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
2716+
__ESIMD_API std::enable_if_t<
2717+
std::is_integral_v<Toffset> &&
2718+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 0,
2719+
__ESIMD_NS::simd<T, N>>
27142720
lsc_atomic_update(T *p, Toffset offset, __ESIMD_NS::simd_mask<N> pred = 1) {
27152721
return lsc_atomic_update<Op, T, N, DS, L1H, L3H>(
27162722
p, __ESIMD_NS::simd<Toffset, N>(offset), pred);
@@ -2735,7 +2741,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
27352741
lsc_data_size DS = lsc_data_size::default_size,
27362742
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
27372743
typename Toffset>
2738-
__ESIMD_API __ESIMD_NS::simd<T, N>
2744+
__ESIMD_API std::enable_if_t<
2745+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 1,
2746+
__ESIMD_NS::simd<T, N>>
27392747
lsc_atomic_update(T *p, __ESIMD_NS::simd<Toffset, N> offsets,
27402748
__ESIMD_NS::simd<T, N> src0, __ESIMD_NS::simd_mask<N> pred) {
27412749
static_assert(std::is_integral_v<Toffset>, "Unsupported offset type");
@@ -2768,7 +2776,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
27682776
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
27692777
typename Toffset,
27702778
typename RegionTy = __ESIMD_NS::region1d_t<Toffset, N, 1>>
2771-
__ESIMD_API __ESIMD_NS::simd<T, N>
2779+
__ESIMD_API std::enable_if_t<
2780+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 1,
2781+
__ESIMD_NS::simd<T, N>>
27722782
lsc_atomic_update(T *p, __ESIMD_NS::simd_view<Toffset, RegionTy> offsets,
27732783
__ESIMD_NS::simd<T, N> src0,
27742784
__ESIMD_NS::simd_mask<N> pred = 1) {
@@ -2781,11 +2791,13 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
27812791
lsc_data_size DS = lsc_data_size::default_size,
27822792
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
27832793
typename Toffset>
2784-
__ESIMD_API std::enable_if_t<std::is_integral_v<Toffset> &&
2785-
((Op != __ESIMD_NS::atomic_op::store &&
2786-
Op != __ESIMD_NS::atomic_op::xchg) ||
2787-
N == 1),
2788-
__ESIMD_NS::simd<T, N>>
2794+
__ESIMD_API std::enable_if_t<
2795+
std::is_integral_v<Toffset> &&
2796+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 1 &&
2797+
((Op != __ESIMD_NS::atomic_op::store &&
2798+
Op != __ESIMD_NS::atomic_op::xchg) ||
2799+
N == 1),
2800+
__ESIMD_NS::simd<T, N>>
27892801
lsc_atomic_update(T *p, Toffset offset, __ESIMD_NS::simd<T, N> src0,
27902802
__ESIMD_NS::simd_mask<N> pred = 1) {
27912803
return lsc_atomic_update<Op, T, N, DS, L1H, L3H>(
@@ -2811,7 +2823,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
28112823
lsc_data_size DS = lsc_data_size::default_size,
28122824
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
28132825
typename Toffset>
2814-
__ESIMD_API __ESIMD_NS::simd<T, N>
2826+
__ESIMD_API std::enable_if_t<
2827+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 2,
2828+
__ESIMD_NS::simd<T, N>>
28152829
lsc_atomic_update(T *p, __ESIMD_NS::simd<Toffset, N> offsets,
28162830
__ESIMD_NS::simd<T, N> src0, __ESIMD_NS::simd<T, N> src1,
28172831
__ESIMD_NS::simd_mask<N> pred) {
@@ -2846,7 +2860,9 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
28462860
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
28472861
typename Toffset,
28482862
typename RegionTy = __ESIMD_NS::region1d_t<Toffset, N, 1>>
2849-
__ESIMD_API __ESIMD_NS::simd<T, N>
2863+
__ESIMD_API std::enable_if_t<
2864+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 2,
2865+
__ESIMD_NS::simd<T, N>>
28502866
lsc_atomic_update(T *p, __ESIMD_NS::simd_view<Toffset, RegionTy> offsets,
28512867
__ESIMD_NS::simd<T, N> src0, __ESIMD_NS::simd<T, N> src1,
28522868
__ESIMD_NS::simd_mask<N> pred = 1) {
@@ -2859,8 +2875,10 @@ template <__ESIMD_NS::atomic_op Op, typename T, int N,
28592875
lsc_data_size DS = lsc_data_size::default_size,
28602876
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
28612877
typename Toffset>
2862-
__ESIMD_API
2863-
std::enable_if_t<std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
2878+
__ESIMD_API std::enable_if_t<
2879+
std::is_integral_v<Toffset> &&
2880+
__ESIMD_DNS::get_num_args<__ESIMD_DNS::to_lsc_atomic_op<Op>()>() == 2,
2881+
__ESIMD_NS::simd<T, N>>
28642882
lsc_atomic_update(T *p, Toffset offset, __ESIMD_NS::simd<T, N> src0,
28652883
__ESIMD_NS::simd<T, N> src1,
28662884
__ESIMD_NS::simd_mask<N> pred = 1) {
@@ -3082,58 +3100,64 @@ namespace esimd {
30823100
/// <tt>native::lsc::atomic_op</tt> instead of <tt>atomic_op</tt> as atomic
30833101
/// operation template argument.
30843102
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3085-
__ESIMD_API simd<T, N> atomic_update(T *p, simd<Toffset, N> offset,
3086-
simd_mask<N> mask) {
3103+
__ESIMD_API std::enable_if_t<__ESIMD_DNS::get_num_args<Op>() == 0, simd<T, N>>
3104+
atomic_update(T *p, simd<Toffset, N> offset, simd_mask<N> mask) {
30873105
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
30883106
p, offset, mask);
30893107
}
30903108

30913109
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset,
30923110
typename RegionTy = __ESIMD_NS::region1d_t<Toffset, N, 1>>
3093-
__ESIMD_API simd<T, N> atomic_update(T *p, simd_view<Toffset, RegionTy> offsets,
3094-
simd_mask<N> mask = 1) {
3111+
__ESIMD_API std::enable_if_t<__ESIMD_DNS::get_num_args<Op>() == 0, simd<T, N>>
3112+
atomic_update(T *p, simd_view<Toffset, RegionTy> offsets,
3113+
simd_mask<N> mask = 1) {
30953114
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
30963115
p, offsets, mask);
30973116
}
30983117

30993118
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3100-
__ESIMD_API
3101-
std::enable_if_t<std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
3102-
atomic_update(T *p, Toffset offset, simd_mask<N> mask = 1) {
3119+
__ESIMD_API std::enable_if_t<std::is_integral_v<Toffset> &&
3120+
__ESIMD_DNS::get_num_args<Op>() == 0,
3121+
simd<T, N>>
3122+
atomic_update(T *p, Toffset offset, simd_mask<N> mask = 1) {
31033123
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
31043124
p, offset, mask);
31053125
}
31063126

31073127
/// LSC version of the single-argument atomic update.
31083128
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3109-
__ESIMD_API simd<T, N> atomic_update(T *p, simd<Toffset, N> offset,
3110-
simd<T, N> src0, simd_mask<N> mask) {
3129+
__ESIMD_API __ESIMD_API
3130+
std::enable_if_t<__ESIMD_DNS::get_num_args<Op>() == 1, simd<T, N>>
3131+
atomic_update(T *p, simd<Toffset, N> offset, simd<T, N> src0,
3132+
simd_mask<N> mask) {
31113133
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
31123134
p, offset, src0, mask);
31133135
}
31143136

31153137
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset,
31163138
typename RegionTy = __ESIMD_NS::region1d_t<Toffset, N, 1>>
3117-
__ESIMD_API simd<T, N> atomic_update(T *p, simd_view<Toffset, RegionTy> offsets,
3118-
simd<T, N> src0, simd_mask<N> mask = 1) {
3139+
__ESIMD_API __ESIMD_API
3140+
std::enable_if_t<__ESIMD_DNS::get_num_args<Op>() == 1, simd<T, N>>
3141+
atomic_update(T *p, simd_view<Toffset, RegionTy> offsets, simd<T, N> src0,
3142+
simd_mask<N> mask = 1) {
31193143
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
31203144
p, offsets, src0, mask);
31213145
}
31223146

31233147
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3124-
__ESIMD_API
3125-
std::enable_if_t<std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
3126-
atomic_update(T *p, Toffset offset, simd<T, N> src0,
3127-
simd_mask<N> mask = 1) {
3148+
__ESIMD_API std::enable_if_t<std::is_integral_v<Toffset> &&
3149+
__ESIMD_DNS::get_num_args<Op>() == 1,
3150+
simd<T, N>>
3151+
atomic_update(T *p, Toffset offset, simd<T, N> src0, simd_mask<N> mask = 1) {
31283152
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
31293153
p, offset, src0, mask);
31303154
}
31313155

31323156
/// LSC version of the two-argument atomic update.
31333157
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3134-
__ESIMD_API simd<T, N> atomic_update(T *p, simd<Toffset, N> offset,
3135-
simd<T, N> src0, simd<T, N> src1,
3136-
simd_mask<N> mask) {
3158+
__ESIMD_API std::enable_if_t<__ESIMD_DNS::get_num_args<Op>() == 2, simd<T, N>>
3159+
atomic_update(T *p, simd<Toffset, N> offset, simd<T, N> src0, simd<T, N> src1,
3160+
simd_mask<N> mask) {
31373161
// 2-argument lsc_atomic_update arguments order matches the standard one -
31383162
// expected value first, then new value. But atomic_update uses reverse
31393163
// order, hence the src1/src0 swap.
@@ -3143,18 +3167,19 @@ __ESIMD_API simd<T, N> atomic_update(T *p, simd<Toffset, N> offset,
31433167

31443168
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset,
31453169
typename RegionTy = __ESIMD_NS::region1d_t<Toffset, N, 1>>
3146-
__ESIMD_API simd<T, N> atomic_update(T *p, simd_view<Toffset, RegionTy> offsets,
3147-
simd<T, N> src0, simd<T, N> src1,
3148-
simd_mask<N> mask = 1) {
3170+
__ESIMD_API std::enable_if_t<__ESIMD_DNS::get_num_args<Op>() == 2, simd<T, N>>
3171+
atomic_update(T *p, simd_view<Toffset, RegionTy> offsets, simd<T, N> src0,
3172+
simd<T, N> src1, simd_mask<N> mask = 1) {
31493173
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
31503174
p, offsets, src1, src0, mask);
31513175
}
31523176

31533177
template <native::lsc::atomic_op Op, typename T, int N, typename Toffset>
3154-
__ESIMD_API
3155-
std::enable_if_t<std::is_integral_v<Toffset>, __ESIMD_NS::simd<T, N>>
3156-
atomic_update(T *p, Toffset offset, simd<T, N> src0, simd<T, N> src1,
3157-
simd_mask<N> mask = 1) {
3178+
__ESIMD_API std::enable_if_t<std::is_integral_v<Toffset> &&
3179+
__ESIMD_DNS::get_num_args<Op>() == 2,
3180+
__ESIMD_NS::simd<T, N>>
3181+
atomic_update(T *p, Toffset offset, simd<T, N> src0, simd<T, N> src1,
3182+
simd_mask<N> mask = 1) {
31583183
return __ESIMD_ENS::lsc_atomic_update<detail::to_atomic_op<Op>(), T, N>(
31593184
p, offset, src1, src0, mask);
31603185
}

0 commit comments

Comments
 (0)