8
8
9
9
#include " helper.hpp"
10
10
#include < CL/sycl.hpp>
11
- template <typename T, int N>
12
- class sycl_subgr ;
11
+ template <typename T, int N> class sycl_subgr ;
13
12
14
13
using namespace cl ::sycl;
15
14
@@ -66,8 +65,9 @@ void check(queue &Queue, size_t G = 240, size_t L = 60) {
66
65
acc_up[NdItem.get_global_id ()] = SG.shuffle_up (vwggid, sgid);
67
66
/* Save GID+SGID */
68
67
acc_down[NdItem.get_global_id ()] = SG.shuffle_down (vwggid, sgid);
69
- /* Save GID XOR SGID */
70
- acc_xor[NdItem.get_global_id ()] = SG.shuffle_xor (vwggid, sgid);
68
+ /* Save GID with SGLID = ( SGLID XOR SGID ) % SGMaxSize */
69
+ acc_xor[NdItem.get_global_id ()] =
70
+ SG.shuffle_xor (vwggid, sgid % SG.get_max_local_range ()[0 ]);
71
71
});
72
72
});
73
73
auto acc = buf.template get_access <access::mode::read_write>();
@@ -81,12 +81,18 @@ void check(queue &Queue, size_t G = 240, size_t L = 60) {
81
81
82
82
size_t sg_size = sgsizeacc[0 ];
83
83
int SGid = 0 ;
84
+ int SGLid = 0 ;
85
+ int SGBeginGid = 0 ;
84
86
for (int j = 0 ; j < G; j++) {
85
87
if (j % L % sg_size == 0 ) {
86
88
SGid++;
89
+ SGLid = 0 ;
90
+ SGBeginGid = j;
87
91
}
88
92
if (j % L == 0 ) {
89
93
SGid = 0 ;
94
+ SGLid = 0 ;
95
+ SGBeginGid = j;
90
96
}
91
97
/* GID of middle element in every subgroup*/
92
98
exit_if_not_equal_vec<T, N>(
@@ -115,17 +121,19 @@ void check(queue &Queue, size_t G = 240, size_t L = 60) {
115
121
exit_if_not_equal_vec (acc2_up[j], vec<T, N>(j - SGid + sg_size),
116
122
" shuffle2_up" );
117
123
}
118
- /* GID XOR SGID */
119
- exit_if_not_equal_vec (acc_xor[j], vec<T, N>(j ^ SGid), " shuffle_xor" );
124
+ /* Value GID with SGLID = ( SGLID XOR SGID ) % SGMaxSize */
125
+ exit_if_not_equal_vec (acc_xor[j],
126
+ vec<T, N>(SGBeginGid + (SGLid ^ (SGid % sg_size))),
127
+ " shuffle_xor" );
128
+ SGLid++;
120
129
}
121
130
} catch (exception e) {
122
131
std::cout << " SYCL exception caught: " << e.what ();
123
132
exit (1 );
124
133
}
125
134
}
126
135
127
- template <typename T>
128
- void check (queue &Queue, size_t G = 240 , size_t L = 60 ) {
136
+ template <typename T> void check (queue &Queue, size_t G = 240 , size_t L = 60 ) {
129
137
try {
130
138
nd_range<1 > NdRange (G, L);
131
139
buffer<T> buf2 (G);
@@ -171,8 +179,9 @@ void check(queue &Queue, size_t G = 240, size_t L = 60) {
171
179
acc_up[NdItem.get_global_id ()] = SG.shuffle_up <T>(wggid, sgid);
172
180
/* Save GID+SGID */
173
181
acc_down[NdItem.get_global_id ()] = SG.shuffle_down <T>(wggid, sgid);
174
- /* Save GID XOR SGID */
175
- acc_xor[NdItem.get_global_id ()] = SG.shuffle_xor <T>(wggid, sgid);
182
+ /* Save GID with SGLID = ( SGLID XOR SGID ) % SGMaxSize */
183
+ acc_xor[NdItem.get_global_id ()] =
184
+ SG.shuffle_xor <T>(wggid, sgid % SG.get_max_local_range ()[0 ]);
176
185
});
177
186
});
178
187
auto acc = buf.template get_access <access::mode::read_write>();
@@ -186,13 +195,20 @@ void check(queue &Queue, size_t G = 240, size_t L = 60) {
186
195
187
196
size_t sg_size = sgsizeacc[0 ];
188
197
int SGid = 0 ;
198
+ int SGLid = 0 ;
199
+ int SGBeginGid = 0 ;
189
200
for (int j = 0 ; j < G; j++) {
190
201
if (j % L % sg_size == 0 ) {
191
202
SGid++;
203
+ SGLid = 0 ;
204
+ SGBeginGid = j;
192
205
}
193
206
if (j % L == 0 ) {
194
207
SGid = 0 ;
208
+ SGLid = 0 ;
209
+ SGBeginGid = j;
195
210
}
211
+
196
212
/* GID of middle element in every subgroup*/
197
213
exit_if_not_equal<T>(acc[j], j / L * L + SGid * sg_size + sg_size / 2 ,
198
214
" shuffle" );
@@ -215,8 +231,10 @@ void check(queue &Queue, size_t G = 240, size_t L = 60) {
215
231
if (j % L - SGid + sg_size < L) /* Do not go out LG*/
216
232
exit_if_not_equal<T>(acc2_up[j], j - SGid + sg_size, " shuffle2_up" );
217
233
}
218
- /* GID XOR SGID */
219
- exit_if_not_equal<T>(acc_xor[j], j ^ SGid, " shuffle_xor" );
234
+ /* Value GID with SGLID = ( SGLID XOR SGID ) % SGMaxSize */
235
+ exit_if_not_equal<T>(acc_xor[j], SGBeginGid + (SGLid ^ (SGid % sg_size)),
236
+ " shuffle_xor" );
237
+ SGLid++;
220
238
}
221
239
} catch (exception e) {
222
240
std::cout << " SYCL exception caught: " << e.what ();
0 commit comments