Skip to content

Commit aa321f2

Browse files
committed
[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 13a7ee5 commit aa321f2

File tree

12 files changed

+837
-117
lines changed

12 files changed

+837
-117
lines changed

sycl/include/CL/sycl/accessor.hpp

Lines changed: 61 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,6 @@ class accessor_common {
196196
template <int SubDims> class AccessorSubscript {
197197
static constexpr int Dims = Dimensions;
198198

199-
template <bool B, class T = void>
200-
using enable_if_t = typename std::enable_if<B, T>::type;
201-
202199
mutable id<Dims> MIDs;
203200
AccType MAccessor;
204201

@@ -212,21 +209,22 @@ class accessor_common {
212209
MIDs[0] = Index;
213210
}
214211

215-
template <int CurDims = SubDims, typename = enable_if_t<(CurDims > 1)>>
212+
template <int CurDims = SubDims,
213+
typename = detail::enable_if_t<(CurDims > 1)>>
216214
AccessorSubscript<CurDims - 1> operator[](size_t Index) {
217215
MIDs[Dims - CurDims] = Index;
218216
return AccessorSubscript<CurDims - 1>(MAccessor, MIDs);
219217
}
220218

221219
template <int CurDims = SubDims,
222-
typename = enable_if_t<IsAccessAnyWrite && CurDims == 1>>
220+
typename = detail::enable_if_t<IsAccessAnyWrite && CurDims == 1>>
223221
RefType operator[](size_t Index) const {
224222
MIDs[Dims - CurDims] = Index;
225223
return MAccessor[MIDs];
226224
}
227225

228226
template <int CurDims = SubDims,
229-
typename = enable_if_t<IsAccessReadOnly && CurDims == 1>>
227+
typename = detail::enable_if_t<IsAccessReadOnly && CurDims == 1>>
230228
DataT operator[](size_t Index) const {
231229
MIDs[Dims - SubDims] = Index;
232230
return MAccessor[MIDs];
@@ -250,9 +248,6 @@ class accessor :
250248
AccessTarget == access::target::host_buffer),
251249
"Expected buffer type");
252250

253-
template <bool B, class T = void>
254-
using enable_if_t = typename std::enable_if<B, T>::type;
255-
256251
using AccessorCommonT = detail::accessor_common<DataT, Dimensions, AccessMode,
257252
AccessTarget, IsPlaceholder>;
258253

@@ -336,7 +331,7 @@ class accessor :
336331
using const_reference = const DataT &;
337332

338333
template <int Dims = Dimensions>
339-
accessor(enable_if_t<((!IsPlaceH && IsHostBuf) ||
334+
accessor(detail::enable_if_t<((!IsPlaceH && IsHostBuf) ||
340335
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))) &&
341336
Dims == 0, buffer<DataT, 1> > &BufferRef)
342337
#ifdef __SYCL_DEVICE_ONLY__
@@ -358,7 +353,7 @@ class accessor :
358353
template <int Dims = Dimensions>
359354
accessor(
360355
buffer<DataT, 1> &BufferRef,
361-
enable_if_t<(!IsPlaceH && (IsGlobalBuf || IsConstantBuf)) && Dims == 0,
356+
detail::enable_if_t<(!IsPlaceH && (IsGlobalBuf || IsConstantBuf)) && Dims == 0,
362357
handler> &CommandGroupHandler)
363358
#ifdef __SYCL_DEVICE_ONLY__
364359
: impl(id<AdjustedDim>(), BufferRef.get_range(), BufferRef.MemRange) {
@@ -374,11 +369,11 @@ class accessor :
374369
}
375370
#endif
376371

377-
template <
378-
int Dims = Dimensions,
379-
typename = enable_if_t<((!IsPlaceH && IsHostBuf) ||
380-
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))) &&
381-
(Dims > 0)>>
372+
template <int Dims = Dimensions,
373+
typename = detail::enable_if_t<((!IsPlaceH && IsHostBuf) ||
374+
(IsPlaceH &&
375+
(IsGlobalBuf || IsConstantBuf))) &&
376+
(Dims > 0)>>
382377
accessor(buffer<DataT, Dimensions> &BufferRef)
383378
#ifdef __SYCL_DEVICE_ONLY__
384379
: impl(id<Dimensions>(), BufferRef.get_range(), BufferRef.MemRange) {
@@ -398,7 +393,7 @@ class accessor :
398393
#endif
399394

400395
template <int Dims = Dimensions,
401-
typename = enable_if_t<
396+
typename = detail::enable_if_t<
402397
(!IsPlaceH && (IsGlobalBuf || IsConstantBuf)) && (Dims > 0)>>
403398
accessor(buffer<DataT, Dimensions> &BufferRef, handler &CommandGroupHandler)
404399
#ifdef __SYCL_DEVICE_ONLY__
@@ -415,22 +410,22 @@ class accessor :
415410
}
416411
#endif
417412

418-
template <
419-
int Dims = Dimensions,
420-
typename = enable_if_t<((!IsPlaceH && IsHostBuf) ||
421-
(IsPlaceH && (IsGlobalBuf || IsConstantBuf))) &&
422-
(Dims > 0)>>
413+
template <int Dims = Dimensions,
414+
typename = detail::enable_if_t<((!IsPlaceH && IsHostBuf) ||
415+
(IsPlaceH &&
416+
(IsGlobalBuf || IsConstantBuf))) &&
417+
(Dims > 0)>>
423418
accessor(buffer<DataT, Dimensions> &BufferRef, range<Dimensions> AccessRange,
424419
id<Dimensions> AccessOffset = {})
425420
#ifdef __SYCL_DEVICE_ONLY__
426421
: impl(AccessOffset, AccessRange, BufferRef.MemRange) {
427422
}
428423
#else
429424
: AccessorBaseHost(detail::convertToArrayOfN<3, 0>(AccessOffset),
430-
detail::convertToArrayOfN<3, 1>(AccessRange),
431-
detail::convertToArrayOfN<3, 1>(BufferRef.MemRange),
432-
AccessMode, detail::getSyclObjImpl(BufferRef).get(),
433-
Dimensions, sizeof(DataT)) {
425+
detail::convertToArrayOfN<3, 1>(AccessRange),
426+
detail::convertToArrayOfN<3, 1>(BufferRef.MemRange),
427+
AccessMode, detail::getSyclObjImpl(BufferRef).get(),
428+
Dimensions, sizeof(DataT)) {
434429
detail::EventImplPtr Event =
435430
detail::Scheduler::getInstance().addHostAccessor(
436431
AccessorBaseHost::impl.get());
@@ -439,7 +434,7 @@ class accessor :
439434
#endif
440435

441436
template <int Dims = Dimensions,
442-
typename = enable_if_t<
437+
typename = detail::enable_if_t<
443438
(!IsPlaceH && (IsGlobalBuf || IsConstantBuf)) && (Dims > 0)>>
444439
accessor(buffer<DataT, Dimensions> &BufferRef, handler &CommandGroupHandler,
445440
range<Dimensions> AccessRange, id<Dimensions> AccessOffset = {})
@@ -448,10 +443,10 @@ class accessor :
448443
}
449444
#else
450445
: AccessorBaseHost(detail::convertToArrayOfN<3, 0>(AccessOffset),
451-
detail::convertToArrayOfN<3, 1>(AccessRange),
452-
detail::convertToArrayOfN<3, 1>(BufferRef.MemRange),
453-
AccessMode, detail::getSyclObjImpl(BufferRef).get(),
454-
Dimensions, sizeof(DataT)) {
446+
detail::convertToArrayOfN<3, 1>(AccessRange),
447+
detail::convertToArrayOfN<3, 1>(BufferRef.MemRange),
448+
AccessMode, detail::getSyclObjImpl(BufferRef).get(),
449+
Dimensions, sizeof(DataT)) {
455450
CommandGroupHandler.associateWithHandler(*this);
456451
}
457452
#endif
@@ -462,53 +457,53 @@ class accessor :
462457

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

465-
template <int Dims = Dimensions, typename = enable_if_t<(Dims > 0)>>
460+
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 0)>>
466461
range<Dimensions> get_range() const {
467462
return detail::convertToArrayOfN<Dimensions, 1>(getAccessRange());
468463
}
469464

470-
template <int Dims = Dimensions, typename = enable_if_t<(Dims > 0)>>
465+
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 0)>>
471466
id<Dimensions> get_offset() const {
472467
return detail::convertToArrayOfN<Dimensions, 0>(getOffset());
473468
}
474469

475470
template <int Dims = Dimensions,
476-
typename = enable_if_t<IsAccessAnyWrite && Dims == 0>>
471+
typename = detail::enable_if_t<IsAccessAnyWrite && Dims == 0>>
477472
operator RefType() const {
478473
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
479474
return *(getQualifiedPtr() + LinearIndex);
480475
}
481476

482477
template <int Dims = Dimensions,
483-
typename = enable_if_t<IsAccessAnyWrite && (Dims > 0)>>
478+
typename = detail::enable_if_t<IsAccessAnyWrite && (Dims > 0)>>
484479
RefType operator[](id<Dimensions> Index) const {
485480
const size_t LinearIndex = getLinearIndex(Index);
486481
return getQualifiedPtr()[LinearIndex];
487482
}
488483

489484
template <int Dims = Dimensions,
490-
typename = enable_if_t<IsAccessAnyWrite && Dims == 1>>
485+
typename = detail::enable_if_t<IsAccessAnyWrite && Dims == 1>>
491486
RefType operator[](size_t Index) const {
492487
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
493488
return getQualifiedPtr()[LinearIndex];
494489
}
495490

496491
template <int Dims = Dimensions,
497-
typename = enable_if_t<IsAccessReadOnly && Dims == 0>>
492+
typename = detail::enable_if_t<IsAccessReadOnly && Dims == 0>>
498493
operator DataT() const {
499494
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
500495
return *(getQualifiedPtr() + LinearIndex);
501496
}
502497

503498
template <int Dims = Dimensions,
504-
typename = enable_if_t<IsAccessReadOnly && (Dims > 0)>>
499+
typename = detail::enable_if_t<IsAccessReadOnly && (Dims > 0)>>
505500
DataT operator[](id<Dimensions> Index) const {
506501
const size_t LinearIndex = getLinearIndex(Index);
507502
return getQualifiedPtr()[LinearIndex];
508503
}
509504

510505
template <int Dims = Dimensions,
511-
typename = enable_if_t<IsAccessReadOnly && Dims == 1>>
506+
typename = detail::enable_if_t<IsAccessReadOnly && Dims == 1>>
512507
DataT operator[](size_t Index) const {
513508
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
514509
return getQualifiedPtr()[LinearIndex];
@@ -533,39 +528,39 @@ class accessor :
533528
}
534529

535530
template <int Dims = Dimensions>
536-
typename enable_if_t<AccessMode == access::mode::atomic && Dims == 1,
537-
atomic<DataT, AS>>::type
531+
typename detail::enable_if_t<AccessMode == access::mode::atomic && Dims == 1,
532+
atomic<DataT, AS>>::type
538533
operator[](size_t Index) const {
539534
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>(Index));
540535
return atomic<DataT, AS>(
541536
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
542537
}
543538

544-
template <int Dims = Dimensions, typename = enable_if_t<(Dims > 1)>>
539+
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 1)>>
545540
typename AccessorCommonT::template AccessorSubscript<Dims - 1>
546541
operator[](size_t Index) const {
547542
return AccessorSubscript<Dims - 1>(*this, Index);
548543
}
549544

550-
template <
551-
access::target AccessTarget_ = AccessTarget,
552-
typename = enable_if_t<AccessTarget_ == access::target::host_buffer>>
545+
template <access::target AccessTarget_ = AccessTarget,
546+
typename = detail::enable_if_t<AccessTarget_ ==
547+
access::target::host_buffer>>
553548
DataT *get_pointer() const {
554549
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
555550
return getQualifiedPtr() + LinearIndex;
556551
}
557552

558-
template <
559-
access::target AccessTarget_ = AccessTarget,
560-
typename = enable_if_t<AccessTarget_ == access::target::global_buffer>>
553+
template <access::target AccessTarget_ = AccessTarget,
554+
typename = detail::enable_if_t<AccessTarget_ ==
555+
access::target::global_buffer>>
561556
global_ptr<DataT> get_pointer() const {
562557
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
563558
return global_ptr<DataT>(getQualifiedPtr() + LinearIndex);
564559
}
565560

566-
template <
567-
access::target AccessTarget_ = AccessTarget,
568-
typename = enable_if_t<AccessTarget_ == access::target::constant_buffer>>
561+
template <access::target AccessTarget_ = AccessTarget,
562+
typename = detail::enable_if_t<AccessTarget_ ==
563+
access::target::constant_buffer>>
569564
constant_ptr<DataT> get_pointer() const {
570565
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
571566
return constant_ptr<DataT>(getQualifiedPtr() + LinearIndex);
@@ -601,9 +596,6 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
601596
using RefType = typename detail::PtrValueType<DataT, AS>::type &;
602597
using PtrType = typename detail::PtrValueType<DataT, AS>::type *;
603598

604-
template <bool B, class T = void>
605-
using enable_if_t = typename std::enable_if<B, T>::type;
606-
607599
#ifdef __SYCL_DEVICE_ONLY__
608600
detail::LocalAccessorBaseDevice<AdjustedDim> impl;
609601

@@ -646,7 +638,7 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
646638
using reference = DataT &;
647639
using const_reference = const DataT &;
648640

649-
template <int Dims = Dimensions, typename = enable_if_t<Dims == 0>>
641+
template <int Dims = Dimensions, typename = detail::enable_if_t<Dims == 0>>
650642
accessor(handler &CommandGroupHandler)
651643
#ifdef __SYCL_DEVICE_ONLY__
652644
: impl(range<AdjustedDim>{1}) {
@@ -656,7 +648,7 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
656648
}
657649
#endif
658650

659-
template <int Dims = Dimensions, typename = enable_if_t<(Dims > 0)>>
651+
template <int Dims = Dimensions, typename = detail::enable_if_t<(Dims > 0)>>
660652
accessor(range<Dimensions> AllocationSize, handler &CommandGroupHandler)
661653
#ifdef __SYCL_DEVICE_ONLY__
662654
: impl(AllocationSize) {
@@ -672,48 +664,48 @@ class accessor<DataT, Dimensions, AccessMode, access::target::local,
672664
size_t get_count() const { return getSize().size(); }
673665

674666
template <int Dims = Dimensions,
675-
typename = enable_if_t<IsAccessAnyWrite && Dims == 0>>
667+
typename = detail::enable_if_t<IsAccessAnyWrite && Dims == 0>>
676668
operator RefType() const {
677669
return *getQualifiedPtr();
678670
}
679671

680672
template <int Dims = Dimensions,
681-
typename = enable_if_t<IsAccessAnyWrite && (Dims > 0)>>
673+
typename = detail::enable_if_t<IsAccessAnyWrite && (Dims > 0)>>
682674
RefType operator[](id<Dimensions> Index) const {
683675
const size_t LinearIndex = getLinearIndex(Index);
684676
return getQualifiedPtr()[LinearIndex];
685677
}
686678

687679
template <int Dims = Dimensions,
688-
typename = enable_if_t<IsAccessAnyWrite && Dims == 1>>
680+
typename = detail::enable_if_t<IsAccessAnyWrite && Dims == 1>>
689681
RefType operator[](size_t Index) const {
690682
return getQualifiedPtr()[Index];
691683
}
692684

693-
template <
694-
int Dims = Dimensions,
695-
typename = enable_if_t<AccessMode == access::mode::atomic && Dims == 0>>
685+
template <int Dims = Dimensions,
686+
typename = detail::enable_if_t<AccessMode == access::mode::atomic &&
687+
Dims == 0>>
696688
operator atomic<DataT, AS>() const {
697689
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr()));
698690
}
699691

700-
template <
701-
int Dims = Dimensions,
702-
typename = enable_if_t<AccessMode == access::mode::atomic && (Dims > 0)>>
692+
template <int Dims = Dimensions,
693+
typename = detail::enable_if_t<AccessMode == access::mode::atomic &&
694+
(Dims > 0)>>
703695
atomic<DataT, AS> operator[](id<Dimensions> Index) const {
704696
const size_t LinearIndex = getLinearIndex(Index);
705697
return atomic<DataT, AS>(
706698
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
707699
}
708700

709-
template <
710-
int Dims = Dimensions,
711-
typename = enable_if_t<AccessMode == access::mode::atomic && Dims == 1>>
701+
template <int Dims = Dimensions,
702+
typename = detail::enable_if_t<AccessMode == access::mode::atomic &&
703+
Dims == 1>>
712704
atomic<DataT, AS> operator[](size_t Index) const {
713705
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr() + Index));
714706
}
715707

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

0 commit comments

Comments
 (0)