Skip to content

Commit af792cb

Browse files
authored
[SYCL] Complete SYCL_INTEL_accessor_simplification extension implementation (#1943)
This second patch finishes the implementation of SYCL_INTEL_accessor_simplification extension. It adds: * `get_host_accessor` to buffer * adds overloads for `get_access` to enable deduction guide * refactored test, as requested in this PR: #1838 * updated deduction guides, based on limitations found via refactored tests
1 parent a285b9d commit af792cb

File tree

11 files changed

+622
-130
lines changed

11 files changed

+622
-130
lines changed

sycl/include/CL/sycl/accessor.hpp

Lines changed: 77 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,42 +1223,69 @@ class accessor :
12231223

12241224
#if __cplusplus > 201402L
12251225

1226-
template <typename DataT, int Dimensions, typename AllocatorT, typename... Ts>
1227-
accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...)
1226+
template <typename DataT, int Dimensions, typename AllocatorT>
1227+
accessor(buffer<DataT, Dimensions, AllocatorT>)
12281228
->accessor<DataT, Dimensions, access::mode::read_write,
12291229
target::global_buffer, access::placeholder::true_t>;
12301230

1231-
template <typename DataT, int Dimensions, typename AllocatorT, typename... Ts>
1232-
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Ts...)
1231+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1>
1232+
accessor(buffer<DataT, Dimensions, AllocatorT>, Type1)
1233+
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type1>(),
1234+
detail::deduceAccessTarget<Type1, Type1>(target::global_buffer),
1235+
access::placeholder::true_t>;
1236+
1237+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1238+
typename Type2>
1239+
accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2)
1240+
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type2>(),
1241+
detail::deduceAccessTarget<Type1, Type2>(target::global_buffer),
1242+
access::placeholder::true_t>;
1243+
1244+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1245+
typename Type2, typename Type3>
1246+
accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3)
1247+
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type2, Type3>(),
1248+
detail::deduceAccessTarget<Type2, Type3>(target::global_buffer),
1249+
access::placeholder::true_t>;
1250+
1251+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1252+
typename Type2, typename Type3, typename Type4>
1253+
accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3, Type4)
1254+
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type3, Type4>(),
1255+
detail::deduceAccessTarget<Type3, Type4>(target::global_buffer),
1256+
access::placeholder::true_t>;
1257+
1258+
template <typename DataT, int Dimensions, typename AllocatorT>
1259+
accessor(buffer<DataT, Dimensions, AllocatorT>, handler)
12331260
->accessor<DataT, Dimensions, access::mode::read_write,
12341261
target::global_buffer, access::placeholder::false_t>;
12351262

1236-
template <typename DataT, int Dimensions, typename AllocatorT,
1237-
access_mode AccessMode, typename... Ts>
1238-
accessor(buffer<DataT, Dimensions, AllocatorT>, Ts..., mode_tag_t<AccessMode>,
1239-
property_list = {})
1240-
->accessor<DataT, Dimensions, AccessMode, target::global_buffer,
1241-
access::placeholder::true_t>;
1263+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1>
1264+
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Type1)
1265+
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type1>(),
1266+
detail::deduceAccessTarget<Type1, Type1>(target::global_buffer),
1267+
access::placeholder::false_t>;
12421268

1243-
template <typename DataT, int Dimensions, typename AllocatorT,
1244-
access_mode AccessMode, typename... Ts>
1245-
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Ts...,
1246-
mode_tag_t<AccessMode>, property_list = {})
1247-
->accessor<DataT, Dimensions, AccessMode, target::global_buffer,
1269+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1270+
typename Type2>
1271+
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Type1, Type2)
1272+
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type2>(),
1273+
detail::deduceAccessTarget<Type1, Type2>(target::global_buffer),
12481274
access::placeholder::false_t>;
12491275

1250-
template <typename DataT, int Dimensions, typename AllocatorT,
1251-
access_mode AccessMode, target AccessTarget, typename... Ts>
1252-
accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...,
1253-
mode_target_tag_t<AccessMode, AccessTarget>, property_list = {})
1254-
->accessor<DataT, Dimensions, AccessMode, AccessTarget,
1255-
access::placeholder::true_t>;
1276+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1277+
typename Type2, typename Type3>
1278+
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Type1, Type2, Type3)
1279+
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type2, Type3>(),
1280+
detail::deduceAccessTarget<Type2, Type3>(target::global_buffer),
1281+
access::placeholder::false_t>;
12561282

1257-
template <typename DataT, int Dimensions, typename AllocatorT,
1258-
access_mode AccessMode, target AccessTarget, typename... Ts>
1259-
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Ts...,
1260-
mode_target_tag_t<AccessMode, AccessTarget>, property_list = {})
1261-
->accessor<DataT, Dimensions, AccessMode, AccessTarget,
1283+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1284+
typename Type2, typename Type3, typename Type4>
1285+
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Type1, Type2, Type3,
1286+
Type4)
1287+
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type3, Type4>(),
1288+
detail::deduceAccessTarget<Type3, Type4>(target::global_buffer),
12621289
access::placeholder::false_t>;
12631290

12641291
#endif
@@ -1658,15 +1685,32 @@ class host_accessor
16581685

16591686
#if __cplusplus > 201402L
16601687

1661-
template <typename DataT, int Dimensions, typename AllocatorT, typename... Ts>
1662-
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...)
1688+
template <typename DataT, int Dimensions, typename AllocatorT>
1689+
host_accessor(buffer<DataT, Dimensions, AllocatorT>)
16631690
->host_accessor<DataT, Dimensions, access::mode::read_write>;
16641691

1665-
template <typename DataT, int Dimensions, typename AllocatorT,
1666-
access_mode AccessMode, typename... Ts>
1667-
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...,
1668-
mode_tag_t<AccessMode>, property_list = {})
1669-
->host_accessor<DataT, Dimensions, AccessMode>;
1692+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1>
1693+
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1)
1694+
->host_accessor<DataT, Dimensions,
1695+
detail::deduceAccessMode<Type1, Type1>()>;
1696+
1697+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1698+
typename Type2>
1699+
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2)
1700+
->host_accessor<DataT, Dimensions,
1701+
detail::deduceAccessMode<Type1, Type2>()>;
1702+
1703+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1704+
typename Type2, typename Type3>
1705+
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3)
1706+
->host_accessor<DataT, Dimensions,
1707+
detail::deduceAccessMode<Type2, Type3>()>;
1708+
1709+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
1710+
typename Type2, typename Type3, typename Type4>
1711+
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3, Type4)
1712+
->host_accessor<DataT, Dimensions,
1713+
detail::deduceAccessMode<Type3, Type4>()>;
16701714

16711715
#endif
16721716

sycl/include/CL/sycl/buffer.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,23 @@ class buffer {
277277
accessOffset);
278278
}
279279

280+
#if __cplusplus > 201402L
281+
282+
template <typename... Ts> auto get_access(Ts... args) {
283+
return accessor{*this, args...};
284+
}
285+
286+
template <typename... Ts>
287+
auto get_access(handler &commandGroupHandler, Ts... args) {
288+
return accessor{*this, commandGroupHandler, args...};
289+
}
290+
291+
template <typename... Ts> auto get_host_access(Ts... args) {
292+
return host_accessor{*this, args...};
293+
}
294+
295+
#endif
296+
280297
template <typename Destination = std::nullptr_t>
281298
void set_final_data(Destination finalData = nullptr) {
282299
impl->set_final_data(finalData);

sycl/include/CL/sycl/detail/accessor_impl.hpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,57 @@ using Requirement = AccessorImplHost;
183183

184184
void __SYCL_EXPORT addHostAccessorAndWait(Requirement *Req);
185185

186+
#if __cplusplus > 201402L
187+
188+
template <typename MayBeTag1, typename MayBeTag2>
189+
constexpr access::mode deduceAccessMode() {
190+
// property_list = {} is not properly detected by deduction guide,
191+
// when parameter is passed without curly braces: access(buffer, noinit)
192+
// thus simplest approach is to check 2 last arguments for being a tag
193+
if constexpr (std::is_same<MayBeTag1,
194+
mode_tag_t<access::mode::read>>::value ||
195+
std::is_same<MayBeTag2,
196+
mode_tag_t<access::mode::read>>::value) {
197+
return access::mode::read;
198+
}
199+
200+
if constexpr (std::is_same<MayBeTag1,
201+
mode_tag_t<access::mode::write>>::value ||
202+
std::is_same<MayBeTag2,
203+
mode_tag_t<access::mode::write>>::value) {
204+
return access::mode::write;
205+
}
206+
207+
if constexpr (
208+
std::is_same<MayBeTag1,
209+
mode_target_tag_t<access::mode::read,
210+
access::target::constant_buffer>>::value ||
211+
std::is_same<MayBeTag2,
212+
mode_target_tag_t<access::mode::read,
213+
access::target::constant_buffer>>::value) {
214+
return access::mode::read;
215+
}
216+
217+
return access::mode::read_write;
218+
}
219+
220+
template <typename MayBeTag1, typename MayBeTag2>
221+
constexpr access::target deduceAccessTarget(access::target defaultTarget) {
222+
if constexpr (
223+
std::is_same<MayBeTag1,
224+
mode_target_tag_t<access::mode::read,
225+
access::target::constant_buffer>>::value ||
226+
std::is_same<MayBeTag2,
227+
mode_target_tag_t<access::mode::read,
228+
access::target::constant_buffer>>::value) {
229+
return access::target::constant_buffer;
230+
}
231+
232+
return defaultTarget;
233+
}
234+
235+
#endif
236+
186237
} // namespace detail
187238
} // namespace sycl
188239
} // __SYCL_INLINE_NAMESPACE(cl)

sycl/include/CL/sycl/detail/buffer_impl.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ template <typename DataT, int Dimensions, access::mode AccessMode,
3131
class accessor;
3232
template <typename T, int Dimensions, typename AllocatorT, typename Enable>
3333
class buffer;
34+
template <typename DataT, int Dimensions, access::mode AccessMode>
35+
class host_accessor;
3436

3537
using buffer_allocator = detail::sycl_memory_object_allocator;
3638

0 commit comments

Comments
 (0)