Skip to content

Commit c43c6b7

Browse files
author
iburylov
committed
[SYCL] get_access and get_host access enabling
Signed-off-by: iburylov <[email protected]>
1 parent 4dee192 commit c43c6b7

File tree

11 files changed

+621
-118
lines changed

11 files changed

+621
-118
lines changed

sycl/include/CL/sycl/accessor.hpp

Lines changed: 78 additions & 25 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...)
1233-
->accessor<DataT, Dimensions, access::mode::read_write,
1234-
target::global_buffer, access::placeholder::false_t>;
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>;
12351236

12361237
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,
1238+
typename Type1, 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),
12411242
access::placeholder::true_t>;
12421243

12431244
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,
1248-
access::placeholder::false_t>;
1245+
typename Type1, 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>;
12491250

12501251
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,
1252+
typename Type1, 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),
12551256
access::placeholder::true_t>;
12561257

1258+
template <typename DataT, int Dimensions, typename AllocatorT>
1259+
accessor(buffer<DataT, Dimensions, AllocatorT>, handler)
1260+
->accessor<DataT, Dimensions, access::mode::read_write,
1261+
target::global_buffer, access::placeholder::false_t>;
1262+
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>;
1268+
12571269
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,
1270+
typename Type1, 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),
1274+
access::placeholder::false_t>;
1275+
1276+
template <typename DataT, int Dimensions, typename AllocatorT,
1277+
typename Type1, 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>;
1282+
1283+
template <typename DataT, int Dimensions, typename AllocatorT,
1284+
typename Type1, 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,41 @@ class host_accessor
16581685

16591686
#if __cplusplus > 201402L
16601687

1688+
/*
16611689
template <typename DataT, int Dimensions, typename AllocatorT, typename... Ts>
16621690
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...)
16631691
->host_accessor<DataT, Dimensions, access::mode::read_write>;
16641692
16651693
template <typename DataT, int Dimensions, typename AllocatorT,
1666-
access_mode AccessMode, typename... Ts>
1694+
access_mode AccessMode, typename PropertyList = property_list,
1695+
typename... Ts>
16671696
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...,
1668-
mode_tag_t<AccessMode>, property_list = {})
1697+
mode_tag_t<AccessMode>, PropertyList = {})
16691698
->host_accessor<DataT, Dimensions, AccessMode>;
1699+
*/
1700+
1701+
template <typename DataT, int Dimensions, typename AllocatorT>
1702+
host_accessor(buffer<DataT, Dimensions, AllocatorT>)
1703+
->host_accessor<DataT, Dimensions, access::mode::read_write>;
1704+
1705+
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1>
1706+
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1)
1707+
->host_accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type1>()>;
1708+
1709+
template <typename DataT, int Dimensions, typename AllocatorT,
1710+
typename Type1, typename Type2>
1711+
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2)
1712+
->host_accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type2>()>;
1713+
1714+
template <typename DataT, int Dimensions, typename AllocatorT,
1715+
typename Type1, typename Type2, typename Type3>
1716+
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3)
1717+
->host_accessor<DataT, Dimensions, detail::deduceAccessMode<Type2, Type3>()>;
1718+
1719+
template <typename DataT, int Dimensions, typename AllocatorT,
1720+
typename Type1, typename Type2, typename Type3, typename Type4>
1721+
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3, Type4)
1722+
->host_accessor<DataT, Dimensions, detail::deduceAccessMode<Type3, Type4>()>;
16701723

16711724
#endif
16721725

sycl/include/CL/sycl/buffer.hpp

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

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

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,43 @@ 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, mode_tag_t<access::mode::read>>::value ||
194+
std::is_same<MayBeTag2, mode_tag_t<access::mode::read>>::value ) {
195+
return access::mode::read;
196+
}
197+
else if constexpr ( std::is_same<MayBeTag1, mode_tag_t<access::mode::write>>::value ||
198+
std::is_same<MayBeTag2, mode_tag_t<access::mode::write>>::value ) {
199+
return access::mode::write;
200+
}
201+
else if constexpr ( std::is_same<MayBeTag1, mode_target_tag_t<access::mode::read, access::target::constant_buffer>>::value ||
202+
std::is_same<MayBeTag2, mode_target_tag_t<access::mode::read, access::target::constant_buffer>>::value ) {
203+
return access::mode::read;
204+
}
205+
else {
206+
return access::mode::read_write;
207+
}
208+
}
209+
210+
template <typename MayBeTag1, typename MayBeTag2>
211+
constexpr access::target deduceAccessTarget(access::target defaultTarget) {
212+
if constexpr ( std::is_same<MayBeTag1, mode_target_tag_t<access::mode::read, access::target::constant_buffer>>::value ||
213+
std::is_same<MayBeTag2, mode_target_tag_t<access::mode::read, access::target::constant_buffer>>::value) {
214+
return access::target::constant_buffer;
215+
}
216+
else {
217+
return defaultTarget;
218+
}
219+
}
220+
221+
#endif
222+
186223
} // namespace detail
187224
} // namespace sycl
188225
} // __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)