@@ -62,99 +62,96 @@ class ArgDesc {
62
62
63
63
// The structure represents NDRange - global, local sizes, global offset and
64
64
// number of dimensions.
65
- class NDRDescT {
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
65
77
- template <int Dims> static sycl::range<3 > padRange (sycl::range<Dims> Range) {
78
- if constexpr (Dims == 3 ) {
79
- return Range;
80
- } else {
81
- sycl::range<3 > Res{0 , 0 , 0 };
82
- for (int I = 0 ; I < Dims; ++I)
83
- Res[I] = Range[I];
84
- return Res;
85
- }
86
- }
87
-
88
- template <int Dims> static sycl::id<3 > padId (sycl::id<Dims> Id) {
89
- if constexpr (Dims == 3 ) {
90
- return Id;
91
- } else {
92
- sycl::id<3 > Res{0 , 0 , 0 };
93
- for (int I = 0 ; I < Dims; ++I)
94
- Res[I] = Id[I];
95
- return Res;
96
- }
97
- }
66
+ // TODO: A lot of tests rely on particular values to be set for dimensions that
67
+ // are not used. To clarify, for example, if a 2D kernel is invoked, in
68
+ // NDRDescT, the value of index 2 in GlobalSize must be set to either 1 or 0
69
+ // depending on which constructor is used for no clear reason.
70
+ // Instead, only sensible defaults should be used and tests should be updated
71
+ // to reflect this.
72
+ class NDRDescT {
98
73
99
74
public:
100
75
NDRDescT () = default ;
101
76
NDRDescT (const NDRDescT &Desc) = default ;
102
77
NDRDescT (NDRDescT &&Desc) = default ;
103
78
104
- NDRDescT (sycl::range<3 > N, bool SetNumWorkGroups, int DimsArg)
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 ();
109
- }
79
+ template <int Dims_>
80
+ NDRDescT (sycl::range<Dims_> N, bool SetNumWorkGroups) : Dims{size_t (Dims_)} {
81
+ if (SetNumWorkGroups) {
82
+ for (size_t I = 0 ; I < Dims_; ++I) {
83
+ NumWorkGroups[I] = N[I];
84
+ }
85
+ } else {
86
+ for (size_t I = 0 ; I < Dims_; ++I) {
87
+ GlobalSize[I] = N[I];
88
+ }
110
89
111
- NDRDescT (sycl::range<3 > NumWorkItems, sycl::range<3 > LocalSize,
112
- sycl::id<3 > Offset, int DimsArg)
113
- : GlobalSize{NumWorkItems}, LocalSize{LocalSize}, GlobalOffset{Offset},
114
- Dims{size_t (DimsArg)} {
115
- setNDRangeLeftover ();
90
+ for (int I = Dims_; I < 3 ; ++I) {
91
+ GlobalSize[I] = 1 ;
92
+ }
93
+ }
116
94
}
117
95
118
- NDRDescT (sycl::range<3 > NumWorkItems, sycl::id<3 > Offset, int DimsArg)
119
- : GlobalSize{NumWorkItems}, GlobalOffset{Offset}, Dims{size_t (DimsArg)} {}
96
+ template <int Dims_>
97
+ NDRDescT (sycl::range<Dims_> NumWorkItems, sycl::range<Dims_> LocalSizes,
98
+ sycl::id<Dims_> Offset)
99
+ : Dims{size_t (Dims_)} {
100
+ for (size_t I = 0 ; I < Dims_; ++I) {
101
+ GlobalSize[I] = NumWorkItems[I];
102
+ LocalSize[I] = LocalSizes[I];
103
+ GlobalOffset[I] = Offset[I];
104
+ }
105
+
106
+ for (int I = Dims_; I < 3 ; ++I) {
107
+ LocalSize[I] = LocalSizes[0 ] ? 1 : 0 ;
108
+ }
109
+
110
+ for (int I = Dims_; I < 3 ; ++I) {
111
+ GlobalSize[I] = 1 ;
112
+ }
113
+ }
120
114
121
115
template <int Dims_>
122
- NDRDescT (sycl::nd_range<Dims_> ExecutionRange, int DimsArg)
123
- : NDRDescT(padRange(ExecutionRange.get_global_range()),
124
- padRange (ExecutionRange.get_local_range()),
125
- padId(ExecutionRange.get_offset()), size_t(DimsArg)) {
126
- setNDRangeLeftover ();
116
+ NDRDescT (sycl::range<Dims_> NumWorkItems, sycl::id<Dims_> Offset)
117
+ : Dims{size_t (Dims_)} {
118
+ for (size_t I = 0 ; I < Dims_; ++I) {
119
+ GlobalSize[I] = NumWorkItems[I];
120
+ GlobalOffset[I] = Offset[I];
121
+ }
127
122
}
128
123
129
124
template <int Dims_>
130
125
NDRDescT (sycl::nd_range<Dims_> ExecutionRange)
131
- : NDRDescT(ExecutionRange, Dims_) {}
126
+ : NDRDescT(ExecutionRange.get_global_range(),
127
+ ExecutionRange.get_local_range(),
128
+ ExecutionRange.get_offset()) {}
132
129
133
130
template <int Dims_>
134
131
NDRDescT (sycl::range<Dims_> Range)
135
- : NDRDescT(padRange( Range) , /* SetNumWorkGroups=*/ false, Dims_ ) {}
132
+ : NDRDescT(Range, /* SetNumWorkGroups=*/ false ) {}
136
133
137
- void setClusterDimensions (sycl::range<3 > N, int Dims ) {
138
- if (this ->Dims != size_t (Dims )) {
134
+ template < int Dims_> void setClusterDimensions (sycl::range<Dims_ > N) {
135
+ if (this ->Dims != size_t (Dims_ )) {
139
136
throw std::runtime_error (
140
137
" Dimensionality of cluster, global and local ranges must be same" );
141
138
}
142
139
143
- for (int I = 0 ; I < 3 ; ++I)
144
- ClusterDimensions[I] = (I < Dims) ? N[I] : 1 ;
140
+ for (int I = 0 ; I < Dims_ ; ++I)
141
+ ClusterDimensions[I] = N[I];
145
142
}
146
143
147
144
NDRDescT &operator =(const NDRDescT &Desc) = default ;
148
145
NDRDescT &operator =(NDRDescT &&Desc) = default ;
149
146
150
- sycl::range< 3 > GlobalSize{0 , 0 , 0 };
151
- sycl::range< 3 > LocalSize{0 , 0 , 0 };
152
- sycl::id< 3 > GlobalOffset{0 , 0 , 0 };
147
+ std::array< size_t , 3 > GlobalSize{0 , 0 , 0 };
148
+ std::array< size_t , 3 > LocalSize{0 , 0 , 0 };
149
+ std::array< size_t , 3 > GlobalOffset{0 , 0 , 0 };
153
150
// / Number of workgroups, used to record the number of workgroups from the
154
151
// / simplest form of parallel_for_work_group. If set, all other fields must be
155
152
// / zero
156
- sycl::range< 3 > NumWorkGroups{0 , 0 , 0 };
157
- sycl::range< 3 > ClusterDimensions{1 , 1 , 1 };
153
+ std::array< size_t , 3 > NumWorkGroups{0 , 0 , 0 };
154
+ std::array< size_t , 3 > ClusterDimensions{1 , 1 , 1 };
158
155
size_t Dims = 0 ;
159
156
};
160
157
0 commit comments