@@ -718,8 +718,10 @@ template <typename T, int NElts = 1,
718
718
lsc_data_size DS = lsc_data_size::default_size,
719
719
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
720
720
int N, typename AccessorTy>
721
- __ESIMD_API std::enable_if_t <!std::is_pointer_v<AccessorTy>,
722
- __ESIMD_NS::simd<T, N * NElts>>
721
+ __ESIMD_API std::enable_if_t <
722
+ !std::is_pointer_v<AccessorTy> &&
723
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy>,
724
+ __ESIMD_NS::simd<T, N * NElts>>
723
725
lsc_gather (AccessorTy acc,
724
726
#ifdef __ESIMD_FORCE_STATELESS_MEM
725
727
__ESIMD_NS::simd<uint64_t , N> offsets,
@@ -755,17 +757,31 @@ template <typename T, int NElts = 1,
755
757
lsc_data_size DS = lsc_data_size::default_size,
756
758
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
757
759
int N, typename AccessorTy, typename Toffset>
758
- __ESIMD_API std::enable_if_t <!std::is_pointer_v<AccessorTy> &&
759
- std::is_integral_v<Toffset> &&
760
- !std::is_same_v<Toffset, uint64_t >,
761
- __ESIMD_NS::simd<T, N * NElts>>
760
+ __ESIMD_API std::enable_if_t <
761
+ !std::is_pointer_v<AccessorTy> &&
762
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
763
+ std::is_integral_v<Toffset> && !std::is_same_v<Toffset, uint64_t >,
764
+ __ESIMD_NS::simd<T, N * NElts>>
762
765
lsc_gather (AccessorTy acc, __ESIMD_NS::simd<Toffset, N> offsets,
763
766
__ESIMD_NS::simd_mask<N> pred = 1 ) {
764
767
return lsc_gather<T, NElts, DS, L1H, L3H, N, AccessorTy>(
765
768
acc, convert<uint64_t >(offsets), pred);
766
769
}
767
770
#endif
768
771
772
+ template <typename T, int NElts = 1 ,
773
+ lsc_data_size DS = lsc_data_size::default_size,
774
+ cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
775
+ int N, typename AccessorTy>
776
+ __ESIMD_API std::enable_if_t <
777
+ sycl::detail::acc_properties::is_local_accessor_v<AccessorTy>,
778
+ __ESIMD_NS::simd<T, N * NElts>>
779
+ lsc_gather (AccessorTy acc, __ESIMD_NS::simd<uint32_t , N> offsets,
780
+ __ESIMD_NS::simd_mask<N> pred = 1 ) {
781
+ return lsc_slm_gather<T, NElts, DS>(
782
+ offsets + __ESIMD_DNS::localAccessorToOffset (acc), pred);
783
+ }
784
+
769
785
// / Accessor-based gather.
770
786
// / Supported platforms: DG2, PVC
771
787
// / VISA instruction: lsc_load.ugm
@@ -791,8 +807,10 @@ template <typename T, int NElts = 1,
791
807
lsc_data_size DS = lsc_data_size::default_size,
792
808
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
793
809
int N, typename AccessorTy>
794
- __ESIMD_API std::enable_if_t <!std::is_pointer_v<AccessorTy>,
795
- __ESIMD_NS::simd<T, N * NElts>>
810
+ __ESIMD_API std::enable_if_t <
811
+ !std::is_pointer_v<AccessorTy> &&
812
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy>,
813
+ __ESIMD_NS::simd<T, N * NElts>>
796
814
lsc_gather (AccessorTy acc,
797
815
#ifdef __ESIMD_FORCE_STATELESS_MEM
798
816
__ESIMD_NS::simd<uint64_t , N> offsets,
@@ -833,10 +851,11 @@ template <typename T, int NElts = 1,
833
851
lsc_data_size DS = lsc_data_size::default_size,
834
852
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
835
853
int N, typename AccessorTy, typename Toffset>
836
- __ESIMD_API std::enable_if_t <!std::is_pointer_v<AccessorTy> &&
837
- std::is_integral_v<Toffset> &&
838
- !std::is_same_v<Toffset, uint64_t >,
839
- __ESIMD_NS::simd<T, N * NElts>>
854
+ __ESIMD_API std::enable_if_t <
855
+ !std::is_pointer_v<AccessorTy> &&
856
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
857
+ std::is_integral_v<Toffset> && !std::is_same_v<Toffset, uint64_t >,
858
+ __ESIMD_NS::simd<T, N * NElts>>
840
859
lsc_gather (AccessorTy acc, __ESIMD_NS::simd<Toffset, N> offsets,
841
860
__ESIMD_NS::simd_mask<N> pred,
842
861
__ESIMD_NS::simd<T, N * NElts> old_values) {
@@ -845,6 +864,20 @@ lsc_gather(AccessorTy acc, __ESIMD_NS::simd<Toffset, N> offsets,
845
864
}
846
865
#endif
847
866
867
+ template <typename T, int NElts = 1 ,
868
+ lsc_data_size DS = lsc_data_size::default_size,
869
+ cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
870
+ int N, typename AccessorTy>
871
+ __ESIMD_API std::enable_if_t <
872
+ sycl::detail::acc_properties::is_local_accessor_v<AccessorTy>,
873
+ __ESIMD_NS::simd<T, N * NElts>>
874
+ lsc_gather (AccessorTy acc, __ESIMD_NS::simd<uint32_t , N> offsets,
875
+ __ESIMD_NS::simd_mask<N> pred,
876
+ __ESIMD_NS::simd<T, N * NElts> old_values) {
877
+ return lsc_slm_gather<T, NElts, DS>(
878
+ offsets + __ESIMD_DNS::localAccessorToOffset (acc), pred, old_values);
879
+ }
880
+
848
881
// / USM pointer transposed gather with 1 channel.
849
882
// / Supported platforms: DG2, PVC
850
883
// / VISA instruction: lsc_load.ugm
@@ -1136,9 +1169,11 @@ template <typename T, int NElts, lsc_data_size DS = lsc_data_size::default_size,
1136
1169
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1137
1170
typename AccessorTy,
1138
1171
typename FlagsT = __ESIMD_DNS::dqword_element_aligned_tag>
1139
- __ESIMD_API std::enable_if_t <!std::is_pointer<AccessorTy>::value &&
1140
- __ESIMD_NS::is_simd_flag_type_v<FlagsT>,
1141
- __ESIMD_NS::simd<T, NElts>>
1172
+ __ESIMD_API std::enable_if_t <
1173
+ !std::is_pointer<AccessorTy>::value &&
1174
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
1175
+ __ESIMD_NS::is_simd_flag_type_v<FlagsT>,
1176
+ __ESIMD_NS::simd<T, NElts>>
1142
1177
lsc_block_load (AccessorTy acc,
1143
1178
#ifdef __ESIMD_FORCE_STATELESS_MEM
1144
1179
uint64_t offset,
@@ -1209,6 +1244,20 @@ lsc_block_load(AccessorTy acc,
1209
1244
#endif // !__ESIMD_FORCE_STATELESS_MEM
1210
1245
}
1211
1246
1247
+ template <typename T, int NElts, lsc_data_size DS = lsc_data_size::default_size,
1248
+ cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1249
+ typename AccessorTy,
1250
+ typename FlagsT = __ESIMD_DNS::dqword_element_aligned_tag>
1251
+ __ESIMD_API std::enable_if_t <
1252
+ sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
1253
+ __ESIMD_NS::is_simd_flag_type_v<FlagsT>,
1254
+ __ESIMD_NS::simd<T, NElts>>
1255
+ lsc_block_load (AccessorTy acc, uint32_t offset,
1256
+ __ESIMD_NS::simd_mask<1 > pred = 1 , FlagsT flags = FlagsT{}) {
1257
+ return lsc_slm_block_load<T, NElts, DS>(
1258
+ offset + __ESIMD_DNS::localAccessorToOffset (acc), pred);
1259
+ }
1260
+
1212
1261
// / A variation of lsc_block_load without predicate parameter to simplify use
1213
1262
// / of alignment parameter
1214
1263
// /
@@ -1300,9 +1349,11 @@ template <typename T, int NElts, lsc_data_size DS = lsc_data_size::default_size,
1300
1349
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1301
1350
typename AccessorTy,
1302
1351
typename FlagsT = __ESIMD_DNS::dqword_element_aligned_tag>
1303
- __ESIMD_API std::enable_if_t <!std::is_pointer<AccessorTy>::value &&
1304
- __ESIMD_NS::is_simd_flag_type_v<FlagsT>,
1305
- __ESIMD_NS::simd<T, NElts>>
1352
+ __ESIMD_API std::enable_if_t <
1353
+ !std::is_pointer<AccessorTy>::value &&
1354
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
1355
+ __ESIMD_NS::is_simd_flag_type_v<FlagsT>,
1356
+ __ESIMD_NS::simd<T, NElts>>
1306
1357
lsc_block_load (AccessorTy acc,
1307
1358
#ifdef __ESIMD_FORCE_STATELESS_MEM
1308
1359
uint64_t offset,
@@ -1373,6 +1424,19 @@ lsc_block_load(AccessorTy acc,
1373
1424
#endif // !__ESIMD_FORCE_STATELESS_MEM
1374
1425
}
1375
1426
1427
+ template <typename T, int NElts, lsc_data_size DS = lsc_data_size::default_size,
1428
+ cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1429
+ typename AccessorTy,
1430
+ typename FlagsT = __ESIMD_DNS::dqword_element_aligned_tag>
1431
+ __ESIMD_API std::enable_if_t <
1432
+ sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
1433
+ __ESIMD_NS::is_simd_flag_type_v<FlagsT>,
1434
+ __ESIMD_NS::simd<T, NElts>>
1435
+ lsc_block_load (AccessorTy acc, uint32_t offset, __ESIMD_NS::simd_mask<1 > pred,
1436
+ __ESIMD_NS::simd<T, NElts> old_values, FlagsT flags = FlagsT{}) {
1437
+ return lsc_slm_block_load<T, NElts, DS>(
1438
+ offset + __ESIMD_DNS::localAccessorToOffset (acc), pred, old_values);
1439
+ }
1376
1440
// / USM pointer prefetch gather.
1377
1441
// / Supported platforms: DG2, PVC
1378
1442
// / VISA instruction: lsc_load.ugm
@@ -1494,7 +1558,9 @@ template <typename T, int NElts = 1,
1494
1558
lsc_data_size DS = lsc_data_size::default_size,
1495
1559
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1496
1560
int N, typename AccessorTy>
1497
- __ESIMD_API std::enable_if_t <!std::is_pointer<AccessorTy>::value>
1561
+ __ESIMD_API std::enable_if_t <
1562
+ !std::is_pointer<AccessorTy>::value &&
1563
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy>>
1498
1564
lsc_prefetch (AccessorTy acc,
1499
1565
#ifdef __ESIMD_FORCE_STATELESS_MEM
1500
1566
__ESIMD_NS::simd<uint64_t , N> offsets,
@@ -1528,9 +1594,10 @@ template <typename T, int NElts = 1,
1528
1594
lsc_data_size DS = lsc_data_size::default_size,
1529
1595
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1530
1596
int N, typename AccessorTy, typename Toffset>
1531
- __ESIMD_API std::enable_if_t <!std::is_pointer<AccessorTy>::value &&
1532
- std::is_integral_v<Toffset> &&
1533
- !std::is_same_v<Toffset, uint64_t >>
1597
+ __ESIMD_API std::enable_if_t <
1598
+ !std::is_pointer<AccessorTy>::value &&
1599
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
1600
+ std::is_integral_v<Toffset> && !std::is_same_v<Toffset, uint64_t >>
1534
1601
lsc_prefetch (AccessorTy acc, __ESIMD_NS::simd<Toffset, N> offsets,
1535
1602
__ESIMD_NS::simd_mask<N> pred = 1 ) {
1536
1603
lsc_prefetch<T, NElts, DS, L1H, L3H, N, AccessorTy>(
@@ -1557,7 +1624,9 @@ template <typename T, int NElts = 1,
1557
1624
lsc_data_size DS = lsc_data_size::default_size,
1558
1625
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1559
1626
typename AccessorTy>
1560
- __ESIMD_API std::enable_if_t <!std::is_pointer<AccessorTy>::value>
1627
+ __ESIMD_API std::enable_if_t <
1628
+ !std::is_pointer<AccessorTy>::value &&
1629
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy>>
1561
1630
lsc_prefetch (AccessorTy acc,
1562
1631
#ifdef __ESIMD_FORCE_STATELESS_MEM
1563
1632
uint64_t offset
@@ -1748,7 +1817,9 @@ template <typename T, int NElts = 1,
1748
1817
lsc_data_size DS = lsc_data_size::default_size,
1749
1818
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1750
1819
int N, typename AccessorTy>
1751
- __ESIMD_API std::enable_if_t <!std::is_pointer<AccessorTy>::value>
1820
+ __ESIMD_API std::enable_if_t <
1821
+ !std::is_pointer<AccessorTy>::value &&
1822
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy>>
1752
1823
lsc_scatter (AccessorTy acc,
1753
1824
#ifdef __ESIMD_FORCE_STATELESS_MEM
1754
1825
__ESIMD_NS::simd<uint64_t , N> offsets,
@@ -1786,16 +1857,31 @@ template <typename T, int NElts = 1,
1786
1857
lsc_data_size DS = lsc_data_size::default_size,
1787
1858
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1788
1859
int N, typename AccessorTy, typename Toffset>
1789
- __ESIMD_API std::enable_if_t <!std::is_pointer<AccessorTy>::value &&
1790
- std::is_integral_v<Toffset> &&
1791
- !std::is_same_v<Toffset, uint64_t >>
1860
+ __ESIMD_API std::enable_if_t <
1861
+ !std::is_pointer<AccessorTy>::value &&
1862
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
1863
+ std::is_integral_v<Toffset> && !std::is_same_v<Toffset, uint64_t >>
1792
1864
lsc_scatter (AccessorTy acc, __ESIMD_NS::simd<Toffset, N> offsets,
1793
1865
__ESIMD_NS::simd<T, N * NElts> vals,
1794
1866
__ESIMD_NS::simd_mask<N> pred = 1 ) {
1795
1867
lsc_scatter<T, NElts, DS, L1H, L3H, N, AccessorTy>(
1796
1868
acc, convert<uint64_t >(offsets), vals, pred);
1797
1869
}
1798
1870
#endif
1871
+
1872
+ template <typename T, int NElts = 1 ,
1873
+ lsc_data_size DS = lsc_data_size::default_size,
1874
+ cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1875
+ int N, typename AccessorTy>
1876
+ __ESIMD_API std::enable_if_t <
1877
+ sycl::detail::acc_properties::is_local_accessor_v<AccessorTy>>
1878
+ lsc_scatter (AccessorTy acc, __ESIMD_NS::simd<uint32_t , N> offsets,
1879
+ __ESIMD_NS::simd<T, N * NElts> vals,
1880
+ __ESIMD_NS::simd_mask<N> pred = 1 ) {
1881
+ lsc_slm_scatter<T, NElts, DS>(
1882
+ offsets + __ESIMD_DNS::localAccessorToOffset (acc), vals, pred);
1883
+ }
1884
+
1799
1885
// / USM pointer transposed scatter with 1 channel.
1800
1886
// / Supported platforms: DG2, PVC
1801
1887
// / VISA instruction: lsc_store.ugm
@@ -1967,8 +2053,10 @@ template <typename T, int NElts, lsc_data_size DS = lsc_data_size::default_size,
1967
2053
cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
1968
2054
typename AccessorTy,
1969
2055
typename FlagsT = __ESIMD_DNS::dqword_element_aligned_tag>
1970
- __ESIMD_API std::enable_if_t <!std::is_pointer<AccessorTy>::value &&
1971
- __ESIMD_NS::is_simd_flag_type_v<FlagsT>>
2056
+ __ESIMD_API std::enable_if_t <
2057
+ !std::is_pointer<AccessorTy>::value &&
2058
+ !sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
2059
+ __ESIMD_NS::is_simd_flag_type_v<FlagsT>>
1972
2060
lsc_block_store (AccessorTy acc,
1973
2061
#ifdef __ESIMD_FORCE_STATELESS_MEM
1974
2062
uint64_t offset,
@@ -2042,6 +2130,19 @@ lsc_block_store(AccessorTy acc,
2042
2130
#endif
2043
2131
}
2044
2132
2133
+ template <typename T, int NElts, lsc_data_size DS = lsc_data_size::default_size,
2134
+ cache_hint L1H = cache_hint::none, cache_hint L3H = cache_hint::none,
2135
+ typename AccessorTy,
2136
+ typename FlagsT = __ESIMD_DNS::dqword_element_aligned_tag>
2137
+ __ESIMD_API std::enable_if_t <
2138
+ sycl::detail::acc_properties::is_local_accessor_v<AccessorTy> &&
2139
+ __ESIMD_NS::is_simd_flag_type_v<FlagsT>>
2140
+ lsc_block_store (AccessorTy acc, uint32_t offset,
2141
+ __ESIMD_NS::simd<T, NElts> vals, FlagsT flags = FlagsT{}) {
2142
+ lsc_slm_block_store<T, NElts, DS>(
2143
+ offset + __ESIMD_DNS::localAccessorToOffset (acc), vals);
2144
+ }
2145
+
2045
2146
// / A variation of lsc_block_store without predicate parameter to simplify
2046
2147
// / use of alignment parameter
2047
2148
// /
0 commit comments