Skip to content

[SYCL] Remove handler::copy() support of atomic accessors. #3118

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
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
62 changes: 3 additions & 59 deletions sycl/include/CL/sycl/handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#include <CL/sycl/access/access.hpp>
#include <CL/sycl/accessor.hpp>
#include <CL/sycl/atomic.hpp>
#include <CL/sycl/context.hpp>
#include <CL/sycl/detail/cg.hpp>
#include <CL/sycl/detail/cg_types.hpp>
Expand Down Expand Up @@ -533,7 +532,6 @@ class __SYCL_EXPORT handler {
///
/// \param Src is a source SYCL accessor.
/// \param Dst is a destination SYCL accessor.
// TODO: support atomic accessor in Src or/and Dst.
template <typename TSrc, int DimSrc, access::mode ModeSrc,
access::target TargetSrc, typename TDst, int DimDst,
access::mode ModeDst, access::target TargetDst,
Expand All @@ -558,60 +556,6 @@ class __SYCL_EXPORT handler {
return true;
}

template <typename T, int Dim, access::mode Mode, access::target Target,
access::placeholder IsPH>
static detail::enable_if_t<Dim == 0 && Mode == access::mode::atomic, T>
readFromFirstAccElement(accessor<T, Dim, Mode, Target, IsPH> Src) {
#ifdef __ENABLE_USM_ADDR_SPACE__
atomic<T, access::address_space::global_device_space> AtomicSrc = Src;
#else
atomic<T, access::address_space::global_space> AtomicSrc = Src;
#endif // __ENABLE_USM_ADDR_SPACE__
return AtomicSrc.load();
}

template <typename T, int Dim, access::mode Mode, access::target Target,
access::placeholder IsPH>
static detail::enable_if_t<(Dim > 0) && Mode == access::mode::atomic, T>
readFromFirstAccElement(accessor<T, Dim, Mode, Target, IsPH> Src) {
id<Dim> Id = getDelinearizedIndex(Src.get_range(), 0);
return Src[Id].load();
}

template <typename T, int Dim, access::mode Mode, access::target Target,
access::placeholder IsPH>
static detail::enable_if_t<Mode != access::mode::atomic, T>
readFromFirstAccElement(accessor<T, Dim, Mode, Target, IsPH> Src) {
return *(Src.get_pointer());
}

template <typename T, int Dim, access::mode Mode, access::target Target,
access::placeholder IsPH>
static detail::enable_if_t<Dim == 0 && Mode == access::mode::atomic, void>
writeToFirstAccElement(accessor<T, Dim, Mode, Target, IsPH> Dst, T V) {
#ifdef __ENABLE_USM_ADDR_SPACE__
atomic<T, access::address_space::global_device_space> AtomicDst = Dst;
#else
atomic<T, access::address_space::global_space> AtomicDst = Dst;
#endif // __ENABLE_USM_ADDR_SPACE__
AtomicDst.store(V);
}

template <typename T, int Dim, access::mode Mode, access::target Target,
access::placeholder IsPH>
static detail::enable_if_t<(Dim > 0) && Mode == access::mode::atomic, void>
writeToFirstAccElement(accessor<T, Dim, Mode, Target, IsPH> Dst, T V) {
id<Dim> Id = getDelinearizedIndex(Dst.get_range(), 0);
Dst[Id].store(V);
}

template <typename T, int Dim, access::mode Mode, access::target Target,
access::placeholder IsPH>
static detail::enable_if_t<Mode != access::mode::atomic, void>
writeToFirstAccElement(accessor<T, Dim, Mode, Target, IsPH> Dst, T V) {
*(Dst.get_pointer()) = V;
}

/// Handles some special cases of the copy operation from one accessor
/// to another accessor. Returns true if the copy is handled here.
///
Expand All @@ -632,7 +576,7 @@ class __SYCL_EXPORT handler {
single_task<class __copyAcc2Acc<TSrc, DimSrc, ModeSrc, TargetSrc,
TDst, DimDst, ModeDst, TargetDst,
IsPHSrc, IsPHDst>> ([=]() {
writeToFirstAccElement(Dst, readFromFirstAccElement(Src));
*(Dst.get_pointer()) = *(Src.get_pointer());
});
return true;
}
Expand Down Expand Up @@ -670,7 +614,7 @@ class __SYCL_EXPORT handler {
single_task<class __copyAcc2Ptr<TSrc, TDst, Dim, AccMode, AccTarget, IsPH>>
([=]() {
using TSrcNonConst = typename detail::remove_const_t<TSrc>;
*(reinterpret_cast<TSrcNonConst *>(Dst)) = readFromFirstAccElement(Src);
*(reinterpret_cast<TSrcNonConst *>(Dst)) = *(Src.get_pointer());
});
}

Expand Down Expand Up @@ -703,7 +647,7 @@ class __SYCL_EXPORT handler {
accessor<TDst, Dim, AccMode, AccTarget, IsPH> Dst) {
single_task<class __copyPtr2Acc<TSrc, TDst, Dim, AccMode, AccTarget, IsPH>>
([=]() {
writeToFirstAccElement(Dst, *(reinterpret_cast<const TDst *>(Src)));
*(Dst.get_pointer()) = *(reinterpret_cast<const TDst *>(Src));
});
}
#endif // __SYCL_DEVICE_ONLY__
Expand Down