Skip to content

Commit 4646fc1

Browse files
kbobrovsbader
authored andcommitted
[SYCL] Implement hierarchical parallelism API.
This is the first part of SYCL hierarchical parallelism implementation. It implements main related APIs: - h_item class - group::parallel_for_work_item functions - handler::parallel_for_work_group functions It is able to run workloads which use these APIs but do not contain data or code with group-visible side effects between the work group and work item scopes. Signed-off-by: Konstantin S Bobrovsky <konstantin.s.bobrovsky@intel.com>
1 parent b5af95f commit 4646fc1

File tree

11 files changed

+834
-101
lines changed

11 files changed

+834
-101
lines changed

sycl/include/CL/sycl/accessor.hpp

Lines changed: 44 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,6 @@ class accessor_common {
198198
template <int SubDims> class AccessorSubscript {
199199
static constexpr int Dims = Dimensions;
200200

201-
template <bool B, class T = void>
202-
using enable_if_t = typename std::enable_if<B, T>::type;
203-
204201
mutable id<Dims> MIDs;
205202
AccType MAccessor;
206203

@@ -215,21 +212,21 @@ class accessor_common {
215212
}
216213

217214
template <int CurDims = SubDims>
218-
typename std::enable_if<(CurDims > 1), AccessorSubscript<CurDims - 1>>::type
215+
typename detail::enable_if_t<(CurDims > 1), AccessorSubscript<CurDims - 1>>
219216
operator[](size_t Index) {
220217
MIDs[Dims - CurDims] = Index;
221218
return AccessorSubscript<CurDims - 1>(MAccessor, MIDs);
222219
}
223220

224221
template <int CurDims = SubDims,
225-
typename = enable_if_t<CurDims == 1 && IsAccessAnyWrite>>
222+
typename = detail::enable_if_t<CurDims == 1 && IsAccessAnyWrite>>
226223
RefType operator[](size_t Index) const {
227224
MIDs[Dims - CurDims] = Index;
228225
return MAccessor[MIDs];
229226
}
230227

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

256-
template <bool B, class T = void>
257-
using enable_if_t = typename std::enable_if<B, T>::type;
258-
259253
using AccessorCommonT = detail::accessor_common<DataT, Dimensions, AccessMode,
260254
AccessTarget, IsPlaceholder>;
261255

@@ -340,7 +334,7 @@ class accessor :
340334

341335
template <int Dims = Dimensions>
342336
accessor(
343-
enable_if_t<Dims == 0 && ((!IsPlaceH && IsHostBuf) ||
337+
detail::enable_if_t<Dims == 0 && ((!IsPlaceH && IsHostBuf) ||
344338
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))),
345339
buffer<DataT, 1>> &BufferRef)
346340
#ifdef __SYCL_DEVICE_ONLY__
@@ -362,7 +356,7 @@ class accessor :
362356
template <int Dims = Dimensions>
363357
accessor(
364358
buffer<DataT, 1> &BufferRef,
365-
enable_if_t<Dims == 0 && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf)),
359+
detail::enable_if_t<Dims == 0 && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf)),
366360
handler> &CommandGroupHandler)
367361
#ifdef __SYCL_DEVICE_ONLY__
368362
: impl(id<AdjustedDim>(), BufferRef.get_range(), BufferRef.MemRange) {
@@ -379,7 +373,7 @@ class accessor :
379373
#endif
380374

381375
template <int Dims = Dimensions,
382-
typename = enable_if_t<
376+
typename = detail::enable_if_t<
383377
(Dims > 0) && ((!IsPlaceH && IsHostBuf) ||
384378
(IsPlaceH && (IsGlobalBuf || IsConstantBuf)))>>
385379
accessor(buffer<DataT, Dimensions> &BufferRef)
@@ -401,7 +395,7 @@ class accessor :
401395
#endif
402396

403397
template <int Dims = Dimensions,
404-
typename = enable_if_t<
398+
typename = detail::enable_if_t<
405399
(Dims > 0) && (!IsPlaceH && (IsGlobalBuf || IsConstantBuf))>>
406400
accessor(buffer<DataT, Dimensions> &BufferRef, handler &CommandGroupHandler)
407401
#ifdef __SYCL_DEVICE_ONLY__
@@ -419,7 +413,7 @@ class accessor :
419413
#endif
420414

421415
template <int Dims = Dimensions,
422-
typename = enable_if_t<
416+
typename = detail::enable_if_t<
423417
(Dims > 0) && ((!IsPlaceH && IsHostBuf) ||
424418
(IsPlaceH && (IsGlobalBuf || IsConstantBuf)))>>
425419
accessor(buffer<DataT, Dimensions> &BufferRef, range<Dimensions> AccessRange,
@@ -441,7 +435,7 @@ class accessor :
441435
#endif
442436

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

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

467-
template <int Dims = Dimensions, typename = enable_if_t<(Dims > 0)>>
461+
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 0)>>
468462
range<Dimensions> get_range() const {
469463
return detail::convertToArrayOfN<Dimensions, 1>(getAccessRange());
470464
}
471465

472-
template <int Dims = Dimensions, typename = enable_if_t<(Dims > 0)>>
466+
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 0)>>
473467
id<Dimensions> get_offset() const {
474468
return detail::convertToArrayOfN<Dimensions, 0>(getOffset());
475469
}
476470

477471
template <int Dims = Dimensions,
478-
typename = enable_if_t<Dims == 0 && IsAccessAnyWrite>>
472+
typename = detail::enable_if_t<Dims == 0 && IsAccessAnyWrite>>
479473
operator RefType() const {
480474
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
481475
return *(getQualifiedPtr() + LinearIndex);
482476
}
483477

484478
template <int Dims = Dimensions,
485-
typename = enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
479+
typename = detail::enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
486480
RefType operator[](id<Dimensions> Index) const {
487481
const size_t LinearIndex = getLinearIndex(Index);
488482
return getQualifiedPtr()[LinearIndex];
489483
}
490484

491485
template <int Dims = Dimensions,
492-
typename = enable_if_t<Dims == 1 && IsAccessAnyWrite>>
486+
typename = detail::enable_if_t<Dims == 1 && IsAccessAnyWrite>>
493487
RefType operator[](size_t Index) const {
494488
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
495489
return getQualifiedPtr()[LinearIndex];
496490
}
497491

498492
template <int Dims = Dimensions,
499-
typename = enable_if_t<Dims == 0 && IsAccessReadOnly>>
493+
typename = detail::enable_if_t<Dims == 0 && IsAccessReadOnly>>
500494
operator DataT() const {
501495
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
502496
return *(getQualifiedPtr() + LinearIndex);
503497
}
504498

505499
template <int Dims = Dimensions,
506-
typename = enable_if_t<(Dims > 0) && IsAccessReadOnly>>
500+
typename = detail::enable_if_t<(Dims > 0) && IsAccessReadOnly>>
507501
DataT operator[](id<Dimensions> Index) const {
508502
const size_t LinearIndex = getLinearIndex(Index);
509503
return getQualifiedPtr()[LinearIndex];
510504
}
511505

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

537531
template <int Dims = Dimensions>
538-
typename enable_if_t<Dims == 1 && AccessMode == access::mode::atomic,
539-
atomic<DataT, AS>>::type
532+
typename detail::enable_if_t<Dims == 1 && AccessMode == access::mode::atomic,
533+
atomic<DataT, AS>>::type
540534
operator[](size_t Index) const {
541535
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>(Index));
542536
return atomic<DataT, AS>(
543537
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
544538
}
545539

546-
template <int Dims = Dimensions, typename = enable_if_t<(Dims > 1)>>
540+
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 1)>>
547541
typename AccessorCommonT::template AccessorSubscript<Dims - 1>
548542
operator[](size_t Index) const {
549543
return AccessorSubscript<Dims - 1>(*this, Index);
550544
}
551545

552-
template <
553-
access::target AccessTarget_ = AccessTarget,
554-
typename = enable_if_t<AccessTarget_ == access::target::host_buffer>>
546+
template <access::target AccessTarget_ = AccessTarget,
547+
typename = detail::enable_if_t<AccessTarget_ ==
548+
access::target::host_buffer>>
555549
DataT *get_pointer() const {
556550
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
557551
return getQualifiedPtr() + LinearIndex;
558552
}
559553

560-
template <
561-
access::target AccessTarget_ = AccessTarget,
562-
typename = enable_if_t<AccessTarget_ == access::target::global_buffer>>
554+
template <access::target AccessTarget_ = AccessTarget,
555+
typename = detail::enable_if_t<AccessTarget_ ==
556+
access::target::global_buffer>>
563557
global_ptr<DataT> get_pointer() const {
564558
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
565559
return global_ptr<DataT>(getQualifiedPtr() + LinearIndex);
566560
}
567561

568-
template <
569-
access::target AccessTarget_ = AccessTarget,
570-
typename = enable_if_t<AccessTarget_ == access::target::constant_buffer>>
562+
template <access::target AccessTarget_ = AccessTarget,
563+
typename = detail::enable_if_t<AccessTarget_ ==
564+
access::target::constant_buffer>>
571565
constant_ptr<DataT> get_pointer() const {
572566
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
573567
return constant_ptr<DataT>(getQualifiedPtr() + LinearIndex);
@@ -603,9 +597,6 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
603597
using RefType = typename detail::PtrValueType<DataT, AS>::type &;
604598
using PtrType = typename detail::PtrValueType<DataT, AS>::type *;
605599

606-
template <bool B, class T = void>
607-
using enable_if_t = typename std::enable_if<B, T>::type;
608-
609600
#ifdef __SYCL_DEVICE_ONLY__
610601
detail::LocalAccessorBaseDevice<AdjustedDim> impl;
611602

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

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

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

676667
template <int Dims = Dimensions,
677-
typename = enable_if_t<Dims == 0 && IsAccessAnyWrite>>
668+
typename = detail::enable_if_t<Dims == 0 && IsAccessAnyWrite>>
678669
operator RefType() const {
679670
return *getQualifiedPtr();
680671
}
681672

682673
template <int Dims = Dimensions,
683-
typename = enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
674+
typename = detail::enable_if_t<(Dims > 0) && IsAccessAnyWrite>>
684675
RefType operator[](id<Dimensions> Index) const {
685676
const size_t LinearIndex = getLinearIndex(Index);
686677
return getQualifiedPtr()[LinearIndex];
687678
}
688679

689680
template <int Dims = Dimensions,
690-
typename = enable_if_t<Dims == 1 && IsAccessAnyWrite>>
681+
typename = detail::enable_if_t<Dims == 1 && IsAccessAnyWrite>>
691682
RefType operator[](size_t Index) const {
692683
return getQualifiedPtr()[Index];
693684
}
694685

695-
template <
696-
int Dims = Dimensions,
697-
typename = enable_if_t<Dims == 0 && AccessMode == access::mode::atomic>>
686+
template <int Dims = Dimensions,
687+
typename = detail::enable_if_t<Dims == 0 &&
688+
AccessMode == access::mode::atomic>>
698689
operator atomic<DataT, AS>() const {
699690
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr()));
700691
}
701692

702-
template <
703-
int Dims = Dimensions,
704-
typename = enable_if_t<(Dims > 0) && AccessMode == access::mode::atomic>>
693+
template <int Dims = Dimensions,
694+
typename = detail::enable_if_t<(Dims > 0) &&
695+
AccessMode == access::mode::atomic>>
705696
atomic<DataT, AS> operator[](id<Dimensions> Index) const {
706697
const size_t LinearIndex = getLinearIndex(Index);
707698
return atomic<DataT, AS>(
708699
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
709700
}
710701

711-
template <
712-
int Dims = Dimensions,
713-
typename = enable_if_t<Dims == 1 && AccessMode == access::mode::atomic>>
702+
template <int Dims = Dimensions,
703+
typename = detail::enable_if_t<Dims == 1 &&
704+
AccessMode == access::mode::atomic>>
714705
atomic<DataT, AS> operator[](size_t Index) const {
715706
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr() + Index));
716707
}
717708

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

0 commit comments

Comments
 (0)