Skip to content

[SYCL] Implement hierarchical parallelism API. #221

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 1 commit into from
Jul 2, 2019
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
97 changes: 44 additions & 53 deletions sycl/include/CL/sycl/accessor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,6 @@ class accessor_common {
template <int SubDims> class AccessorSubscript {
static constexpr int Dims = Dimensions;

template <bool B, class T = void>
using enable_if_t = typename std::enable_if<B, T>::type;

mutable id<Dims> MIDs;
AccType MAccessor;

Expand All @@ -215,21 +212,21 @@ class accessor_common {
}

template <int CurDims = SubDims>
typename std::enable_if<(CurDims > 1), AccessorSubscript<CurDims - 1>>::type
typename detail::enable_if_t<(CurDims > 1), AccessorSubscript<CurDims - 1>>
operator[](size_t Index) {
MIDs[Dims - CurDims] = Index;
return AccessorSubscript<CurDims - 1>(MAccessor, MIDs);
}

template <int CurDims = SubDims,
typename = enable_if_t<CurDims == 1 && IsAccessAnyWrite>>
typename = detail::enable_if_t<CurDims == 1 && IsAccessAnyWrite>>
RefType operator[](size_t Index) const {
MIDs[Dims - CurDims] = Index;
return MAccessor[MIDs];
}

template <int CurDims = SubDims,
typename = enable_if_t<CurDims == 1 && IsAccessReadOnly>>
typename = detail::enable_if_t<CurDims == 1 && IsAccessReadOnly>>
DataT operator[](size_t Index) const {
MIDs[Dims - SubDims] = Index;
return MAccessor[MIDs];
Expand All @@ -253,9 +250,6 @@ class accessor :
AccessTarget == access::target::host_buffer),
"Expected buffer type");

template <bool B, class T = void>
using enable_if_t = typename std::enable_if<B, T>::type;

using AccessorCommonT = detail::accessor_common<DataT, Dimensions, AccessMode,
AccessTarget, IsPlaceholder>;

Expand Down Expand Up @@ -340,7 +334,7 @@ class accessor :

template <int Dims = Dimensions>
accessor(
enable_if_t<Dims == 0 && ((!IsPlaceH && IsHostBuf) ||
detail::enable_if_t<Dims == 0 && ((!IsPlaceH && IsHostBuf) ||
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))),
buffer<DataT, 1>> &BufferRef)
#ifdef __SYCL_DEVICE_ONLY__
Expand All @@ -362,7 +356,7 @@ class accessor :
template <int Dims = Dimensions>
accessor(
buffer<DataT, 1> &BufferRef,
enable_if_t<Dims == 0 && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf)),
detail::enable_if_t<Dims == 0 && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf)),
handler> &CommandGroupHandler)
#ifdef __SYCL_DEVICE_ONLY__
: impl(id<AdjustedDim>(), BufferRef.get_range(), BufferRef.MemRange) {
Expand All @@ -379,7 +373,7 @@ class accessor :
#endif

template <int Dims = Dimensions,
typename = enable_if_t<
typename = detail::enable_if_t<
(Dims > 0) && ((!IsPlaceH && IsHostBuf) ||
(IsPlaceH && (IsGlobalBuf || IsConstantBuf)))>>
accessor(buffer<DataT, Dimensions> &BufferRef)
Expand All @@ -401,7 +395,7 @@ class accessor :
#endif

template <int Dims = Dimensions,
typename = enable_if_t<
typename = detail::enable_if_t<
(Dims > 0) && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf))>>
accessor(buffer<DataT, Dimensions> &BufferRef, handler &CommandGroupHandler)
#ifdef __SYCL_DEVICE_ONLY__
Expand All @@ -419,7 +413,7 @@ class accessor :
#endif

template <int Dims = Dimensions,
typename = enable_if_t<
typename = detail::enable_if_t<
(Dims > 0) && ((!IsPlaceH && IsHostBuf) ||
(IsPlaceH && (IsGlobalBuf || IsConstantBuf)))>>
accessor(buffer<DataT, Dimensions> &BufferRef, range<Dimensions> AccessRange,
Expand All @@ -441,7 +435,7 @@ class accessor :
#endif

template <int Dims = Dimensions,
typename = enable_if_t<
typename = detail::enable_if_t<
(Dims > 0) && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf))>>
accessor(buffer<DataT, Dimensions> &BufferRef, handler &CommandGroupHandler,
range<Dimensions> AccessRange, id<Dimensions> AccessOffset = {})
Expand All @@ -464,53 +458,53 @@ class accessor :

size_t get_count() const { return getMemoryRange().size(); }

template <int Dims = Dimensions, typename = enable_if_t<(Dims > 0)>>
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 0)>>
range<Dimensions> get_range() const {
return detail::convertToArrayOfN<Dimensions, 1>(getAccessRange());
}

template <int Dims = Dimensions, typename = enable_if_t<(Dims > 0)>>
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 0)>>
id<Dimensions> get_offset() const {
return detail::convertToArrayOfN<Dimensions, 0>(getOffset());
}

template <int Dims = Dimensions,
typename = enable_if_t<Dims == 0 && IsAccessAnyWrite>>
typename = detail::enable_if_t<Dims == 0 && IsAccessAnyWrite>>
operator RefType() const {
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
return *(getQualifiedPtr() + LinearIndex);
}

template <int Dims = Dimensions,
typename = enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
typename = detail::enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
RefType operator[](id<Dimensions> Index) const {
const size_t LinearIndex = getLinearIndex(Index);
return getQualifiedPtr()[LinearIndex];
}

template <int Dims = Dimensions,
typename = enable_if_t<Dims == 1 && IsAccessAnyWrite>>
typename = detail::enable_if_t<Dims == 1 && IsAccessAnyWrite>>
RefType operator[](size_t Index) const {
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
return getQualifiedPtr()[LinearIndex];
}

template <int Dims = Dimensions,
typename = enable_if_t<Dims == 0 && IsAccessReadOnly>>
typename = detail::enable_if_t<Dims == 0 && IsAccessReadOnly>>
operator DataT() const {
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
return *(getQualifiedPtr() + LinearIndex);
}

template <int Dims = Dimensions,
typename = enable_if_t<(Dims > 0) && IsAccessReadOnly>>
typename = detail::enable_if_t<(Dims > 0) && IsAccessReadOnly>>
DataT operator[](id<Dimensions> Index) const {
const size_t LinearIndex = getLinearIndex(Index);
return getQualifiedPtr()[LinearIndex];
}

template <int Dims = Dimensions,
typename = enable_if_t<Dims == 1 && IsAccessReadOnly>>
typename = detail::enable_if_t<Dims == 1 && IsAccessReadOnly>>
DataT operator[](size_t Index) const {
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
return getQualifiedPtr()[LinearIndex];
Expand All @@ -535,39 +529,39 @@ class accessor :
}

template <int Dims = Dimensions>
typename enable_if_t<Dims == 1 && AccessMode == access::mode::atomic,
atomic<DataT, AS>>::type
typename detail::enable_if_t<Dims == 1 && AccessMode == access::mode::atomic,
atomic<DataT, AS>>::type
operator[](size_t Index) const {
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>(Index));
return atomic<DataT, AS>(
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
}

template <int Dims = Dimensions, typename = enable_if_t<(Dims > 1)>>
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 1)>>
typename AccessorCommonT::template AccessorSubscript<Dims - 1>
operator[](size_t Index) const {
return AccessorSubscript<Dims - 1>(*this, Index);
}

template <
access::target AccessTarget_ = AccessTarget,
typename = enable_if_t<AccessTarget_ == access::target::host_buffer>>
template <access::target AccessTarget_ = AccessTarget,
typename = detail::enable_if_t<AccessTarget_ ==
access::target::host_buffer>>
DataT *get_pointer() const {
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
return getQualifiedPtr() + LinearIndex;
}

template <
access::target AccessTarget_ = AccessTarget,
typename = enable_if_t<AccessTarget_ == access::target::global_buffer>>
template <access::target AccessTarget_ = AccessTarget,
typename = detail::enable_if_t<AccessTarget_ ==
access::target::global_buffer>>
global_ptr<DataT> get_pointer() const {
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
return global_ptr<DataT>(getQualifiedPtr() + LinearIndex);
}

template <
access::target AccessTarget_ = AccessTarget,
typename = enable_if_t<AccessTarget_ == access::target::constant_buffer>>
template <access::target AccessTarget_ = AccessTarget,
typename = detail::enable_if_t<AccessTarget_ ==
access::target::constant_buffer>>
constant_ptr<DataT> get_pointer() const {
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
return constant_ptr<DataT>(getQualifiedPtr() + LinearIndex);
Expand Down Expand Up @@ -603,9 +597,6 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
using RefType = typename detail::PtrValueType<DataT, AS>::type &;
using PtrType = typename detail::PtrValueType<DataT, AS>::type *;

template <bool B, class T = void>
using enable_if_t = typename std::enable_if<B, T>::type;

#ifdef __SYCL_DEVICE_ONLY__
detail::LocalAccessorBaseDevice<AdjustedDim> impl;

Expand Down Expand Up @@ -648,7 +639,7 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
using reference = DataT &;
using const_reference = const DataT &;

template <int Dims = Dimensions, typename = enable_if_t<Dims == 0>>
template <int Dims = Dimensions, typename = detail::enable_if_t<Dims == 0>>
accessor(handler &CommandGroupHandler)
#ifdef __SYCL_DEVICE_ONLY__
: impl(range<AdjustedDim>{1}) {
Expand All @@ -658,7 +649,7 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
}
#endif

template <int Dims = Dimensions, typename = enable_if_t<(Dims > 0)>>
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 0)>>
accessor(range<Dimensions> AllocationSize, handler &CommandGroupHandler)
#ifdef __SYCL_DEVICE_ONLY__
: impl(AllocationSize) {
Expand All @@ -674,48 +665,48 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
size_t get_count() const { return getSize().size(); }

template <int Dims = Dimensions,
typename = enable_if_t<Dims == 0 && IsAccessAnyWrite>>
typename = detail::enable_if_t<Dims == 0 && IsAccessAnyWrite>>
operator RefType() const {
return *getQualifiedPtr();
}

template <int Dims = Dimensions,
typename = enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
typename = detail::enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
RefType operator[](id<Dimensions> Index) const {
const size_t LinearIndex = getLinearIndex(Index);
return getQualifiedPtr()[LinearIndex];
}

template <int Dims = Dimensions,
typename = enable_if_t<Dims == 1 && IsAccessAnyWrite>>
typename = detail::enable_if_t<Dims == 1 && IsAccessAnyWrite>>
RefType operator[](size_t Index) const {
return getQualifiedPtr()[Index];
}

template <
int Dims = Dimensions,
typename = enable_if_t<Dims == 0 && AccessMode == access::mode::atomic>>
template <int Dims = Dimensions,
typename = detail::enable_if_t<Dims == 0 &&
AccessMode == access::mode::atomic>>
operator atomic<DataT, AS>() const {
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr()));
}

template <
int Dims = Dimensions,
typename = enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic>>
template <int Dims = Dimensions,
typename = detail::enable_if_t<(Dims > 0) &&
AccessMode == access::mode::atomic>>
atomic<DataT, AS> operator[](id<Dimensions> Index) const {
const size_t LinearIndex = getLinearIndex(Index);
return atomic<DataT, AS>(
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
}

template <
int Dims = Dimensions,
typename = enable_if_t<Dims == 1 && AccessMode == access::mode::atomic>>
template <int Dims = Dimensions,
typename = detail::enable_if_t<Dims == 1 &&
AccessMode == access::mode::atomic>>
atomic<DataT, AS> operator[](size_t Index) const {
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr() + Index));
}

template <int Dims = Dimensions, typename = enable_if_t<(Dims > 1)>>
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 1)>>
typename AccessorCommonT::template AccessorSubscript<Dims - 1>
operator[](size_t Index) const {
return AccessorSubscript<Dims - 1>(*this, Index);
Expand Down
Loading