@@ -63,13 +63,22 @@ class ArgDesc {
63
63
// The structure represents NDRange - global, local sizes, global offset and
64
64
// number of dimensions.
65
65
class NDRDescT {
66
- template <int Dims>
67
- static sycl::range<3 > padRange (sycl::range<Dims> Range,
68
- [[maybe_unused]] size_t DefaultValue = 0 ) {
66
+ // The method initializes all sizes for dimensions greater than the passed one
67
+ // to the default values, so they will not affect execution.
68
+ void setNDRangeLeftover () {
69
+ for (int I = Dims; I < 3 ; ++I) {
70
+ GlobalSize[I] = 1 ;
71
+ LocalSize[I] = LocalSize[0 ] ? 1 : 0 ;
72
+ GlobalOffset[I] = 0 ;
73
+ NumWorkGroups[I] = 0 ;
74
+ }
75
+ }
76
+
77
+ template <int Dims> static sycl::range<3 > padRange (sycl::range<Dims> Range) {
69
78
if constexpr (Dims == 3 ) {
70
79
return Range;
71
80
} else {
72
- sycl::range<3 > Res{DefaultValue, DefaultValue, DefaultValue };
81
+ sycl::range<3 > Res{0 , 0 , 0 };
73
82
for (int I = 0 ; I < Dims; ++I)
74
83
Res[I] = Range[I];
75
84
return Res;
@@ -93,36 +102,37 @@ class NDRDescT {
93
102
NDRDescT (NDRDescT &&Desc) = default ;
94
103
95
104
NDRDescT (sycl::range<3 > N, bool SetNumWorkGroups, int DimsArg)
96
- : Dims{size_t (DimsArg)} {
97
- if (SetNumWorkGroups) {
98
- NumWorkGroups = N;
99
- } else {
100
- GlobalSize = N;
101
- }
105
+ : GlobalSize{SetNumWorkGroups ? sycl::range<3 >{0 , 0 , 0 } : N},
106
+ NumWorkGroups{SetNumWorkGroups ? N : sycl::range<3 >{0 , 0 , 0 }},
107
+ Dims{size_t (DimsArg)} {
108
+ setNDRangeLeftover ();
102
109
}
103
110
104
111
NDRDescT (sycl::range<3 > NumWorkItems, sycl::range<3 > LocalSize,
105
112
sycl::id<3 > Offset, int DimsArg)
106
113
: GlobalSize{NumWorkItems}, LocalSize{LocalSize}, GlobalOffset{Offset},
107
- Dims{size_t (DimsArg)} {}
114
+ Dims{size_t (DimsArg)} {
115
+ setNDRangeLeftover ();
116
+ }
108
117
109
118
NDRDescT (sycl::range<3 > NumWorkItems, sycl::id<3 > Offset, int DimsArg)
110
119
: GlobalSize{NumWorkItems}, GlobalOffset{Offset}, Dims{size_t (DimsArg)} {}
111
120
112
121
template <int Dims_>
113
122
NDRDescT (sycl::nd_range<Dims_> ExecutionRange, int DimsArg)
114
- : NDRDescT(padRange(ExecutionRange.get_global_range(), 1 ),
115
- padRange (ExecutionRange.get_local_range(),
116
- ExecutionRange.get_local_range()[0] ? 1 : 0),
117
- padId(ExecutionRange.get_offset()), size_t(DimsArg)) {}
123
+ : NDRDescT(padRange(ExecutionRange.get_global_range()),
124
+ padRange (ExecutionRange.get_local_range()),
125
+ padId(ExecutionRange.get_offset()), size_t(DimsArg)) {
126
+ setNDRangeLeftover ();
127
+ }
118
128
119
129
template <int Dims_>
120
130
NDRDescT (sycl::nd_range<Dims_> ExecutionRange)
121
131
: NDRDescT(ExecutionRange, Dims_) {}
122
132
123
133
template <int Dims_>
124
134
NDRDescT (sycl::range<Dims_> Range)
125
- : NDRDescT(padRange(Range, 1 ), /* SetNumWorkGroups=*/ false, Dims_) {}
135
+ : NDRDescT(padRange(Range), /* SetNumWorkGroups=*/ false, Dims_) {}
126
136
127
137
void setClusterDimensions (sycl::range<3 > N, int Dims) {
128
138
if (this ->Dims != size_t (Dims)) {
0 commit comments