Skip to content

[SYCL] get_access and get_host access enabling #1943

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 77 additions & 33 deletions sycl/include/CL/sycl/accessor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1223,42 +1223,69 @@ class accessor :

#if __cplusplus > 201402L

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

template <typename DataT, int Dimensions, typename AllocatorT, typename... Ts>
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Ts...)
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1>
accessor(buffer<DataT, Dimensions, AllocatorT>, Type1)
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type1>(),
detail::deduceAccessTarget<Type1, Type1>(target::global_buffer),
access::placeholder::true_t>;

template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2>
accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2)
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type2>(),
detail::deduceAccessTarget<Type1, Type2>(target::global_buffer),
access::placeholder::true_t>;

template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2, typename Type3>
accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3)
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type2, Type3>(),
detail::deduceAccessTarget<Type2, Type3>(target::global_buffer),
access::placeholder::true_t>;

template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2, typename Type3, typename Type4>
accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3, Type4)
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type3, Type4>(),
detail::deduceAccessTarget<Type3, Type4>(target::global_buffer),
access::placeholder::true_t>;

template <typename DataT, int Dimensions, typename AllocatorT>
accessor(buffer<DataT, Dimensions, AllocatorT>, handler)
->accessor<DataT, Dimensions, access::mode::read_write,
target::global_buffer, access::placeholder::false_t>;

template <typename DataT, int Dimensions, typename AllocatorT,
access_mode AccessMode, typename... Ts>
accessor(buffer<DataT, Dimensions, AllocatorT>, Ts..., mode_tag_t<AccessMode>,
property_list = {})
->accessor<DataT, Dimensions, AccessMode, target::global_buffer,
access::placeholder::true_t>;
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1>
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Type1)
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type1>(),
detail::deduceAccessTarget<Type1, Type1>(target::global_buffer),
access::placeholder::false_t>;

template <typename DataT, int Dimensions, typename AllocatorT,
access_mode AccessMode, typename... Ts>
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Ts...,
mode_tag_t<AccessMode>, property_list = {})
->accessor<DataT, Dimensions, AccessMode, target::global_buffer,
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2>
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Type1, Type2)
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type1, Type2>(),
detail::deduceAccessTarget<Type1, Type2>(target::global_buffer),
access::placeholder::false_t>;

template <typename DataT, int Dimensions, typename AllocatorT,
access_mode AccessMode, target AccessTarget, typename... Ts>
accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...,
mode_target_tag_t<AccessMode, AccessTarget>, property_list = {})
->accessor<DataT, Dimensions, AccessMode, AccessTarget,
access::placeholder::true_t>;
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2, typename Type3>
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Type1, Type2, Type3)
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type2, Type3>(),
detail::deduceAccessTarget<Type2, Type3>(target::global_buffer),
access::placeholder::false_t>;

template <typename DataT, int Dimensions, typename AllocatorT,
access_mode AccessMode, target AccessTarget, typename... Ts>
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Ts...,
mode_target_tag_t<AccessMode, AccessTarget>, property_list = {})
->accessor<DataT, Dimensions, AccessMode, AccessTarget,
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2, typename Type3, typename Type4>
accessor(buffer<DataT, Dimensions, AllocatorT>, handler, Type1, Type2, Type3,
Type4)
->accessor<DataT, Dimensions, detail::deduceAccessMode<Type3, Type4>(),
detail::deduceAccessTarget<Type3, Type4>(target::global_buffer),
access::placeholder::false_t>;

#endif
Expand Down Expand Up @@ -1658,15 +1685,32 @@ class host_accessor

#if __cplusplus > 201402L

template <typename DataT, int Dimensions, typename AllocatorT, typename... Ts>
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...)
template <typename DataT, int Dimensions, typename AllocatorT>
host_accessor(buffer<DataT, Dimensions, AllocatorT>)
->host_accessor<DataT, Dimensions, access::mode::read_write>;

template <typename DataT, int Dimensions, typename AllocatorT,
access_mode AccessMode, typename... Ts>
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Ts...,
mode_tag_t<AccessMode>, property_list = {})
->host_accessor<DataT, Dimensions, AccessMode>;
template <typename DataT, int Dimensions, typename AllocatorT, typename Type1>
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1)
->host_accessor<DataT, Dimensions,
detail::deduceAccessMode<Type1, Type1>()>;

template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2>
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2)
->host_accessor<DataT, Dimensions,
detail::deduceAccessMode<Type1, Type2>()>;

template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2, typename Type3>
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3)
->host_accessor<DataT, Dimensions,
detail::deduceAccessMode<Type2, Type3>()>;

template <typename DataT, int Dimensions, typename AllocatorT, typename Type1,
typename Type2, typename Type3, typename Type4>
host_accessor(buffer<DataT, Dimensions, AllocatorT>, Type1, Type2, Type3, Type4)
->host_accessor<DataT, Dimensions,
detail::deduceAccessMode<Type3, Type4>()>;

#endif

Expand Down
17 changes: 17 additions & 0 deletions sycl/include/CL/sycl/buffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,23 @@ class buffer {
accessOffset);
}

#if __cplusplus > 201402L

template <typename... Ts> auto get_access(Ts... args) {
return accessor{*this, args...};
}

template <typename... Ts>
auto get_access(handler &commandGroupHandler, Ts... args) {
return accessor{*this, commandGroupHandler, args...};
}

template <typename... Ts> auto get_host_access(Ts... args) {
return host_accessor{*this, args...};
}

#endif

template <typename Destination = std::nullptr_t>
void set_final_data(Destination finalData = nullptr) {
impl->set_final_data(finalData);
Expand Down
51 changes: 51 additions & 0 deletions sycl/include/CL/sycl/detail/accessor_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,57 @@ using Requirement = AccessorImplHost;

void __SYCL_EXPORT addHostAccessorAndWait(Requirement *Req);

#if __cplusplus > 201402L

template <typename MayBeTag1, typename MayBeTag2>
constexpr access::mode deduceAccessMode() {
// property_list = {} is not properly detected by deduction guide,
// when parameter is passed without curly braces: access(buffer, noinit)
// thus simplest approach is to check 2 last arguments for being a tag
if constexpr (std::is_same<MayBeTag1,
mode_tag_t<access::mode::read>>::value ||
std::is_same<MayBeTag2,
mode_tag_t<access::mode::read>>::value) {
return access::mode::read;
}

if constexpr (std::is_same<MayBeTag1,
mode_tag_t<access::mode::write>>::value ||
std::is_same<MayBeTag2,
mode_tag_t<access::mode::write>>::value) {
return access::mode::write;
}

if constexpr (
std::is_same<MayBeTag1,
mode_target_tag_t<access::mode::read,
access::target::constant_buffer>>::value ||
std::is_same<MayBeTag2,
mode_target_tag_t<access::mode::read,
access::target::constant_buffer>>::value) {
return access::mode::read;
}

return access::mode::read_write;
}

template <typename MayBeTag1, typename MayBeTag2>
constexpr access::target deduceAccessTarget(access::target defaultTarget) {
if constexpr (
std::is_same<MayBeTag1,
mode_target_tag_t<access::mode::read,
access::target::constant_buffer>>::value ||
std::is_same<MayBeTag2,
mode_target_tag_t<access::mode::read,
access::target::constant_buffer>>::value) {
return access::target::constant_buffer;
}

return defaultTarget;
}

#endif

} // namespace detail
} // namespace sycl
} // __SYCL_INLINE_NAMESPACE(cl)
2 changes: 2 additions & 0 deletions sycl/include/CL/sycl/detail/buffer_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ template <typename DataT, int Dimensions, access::mode AccessMode,
class accessor;
template <typename T, int Dimensions, typename AllocatorT, typename Enable>
class buffer;
template <typename DataT, int Dimensions, access::mode AccessMode>
class host_accessor;

using buffer_allocator = detail::sycl_memory_object_allocator;

Expand Down
Loading