18
18
#include " helper.hpp"
19
19
#include < CL/sycl.hpp>
20
20
#include < complex>
21
- template <typename T>
22
- class pointer_kernel ;
21
+ template <typename T> class pointer_kernel ;
23
22
24
23
using namespace cl ::sycl;
25
24
@@ -59,8 +58,9 @@ void check_pointer(queue &Queue, size_t G = 240, size_t L = 60) {
59
58
/* Save GID+SGID */
60
59
acc_down[NdItem.get_global_id ()] = SG.shuffle_down (ptr, sgid);
61
60
62
- /* Save GID XOR SGID */
63
- acc_xor[NdItem.get_global_id ()] = SG.shuffle_xor (ptr, sgid);
61
+ /* Save GID with SGLID = ( SGLID XOR SGID ) % SGMaxSize */
62
+ acc_xor[NdItem.get_global_id ()] =
63
+ SG.shuffle_xor (ptr, sgid % SG.get_max_local_range ()[0 ]);
64
64
});
65
65
});
66
66
auto acc = buf.template get_access <access::mode::read_write>();
@@ -71,30 +71,44 @@ void check_pointer(queue &Queue, size_t G = 240, size_t L = 60) {
71
71
72
72
size_t sg_size = sgsizeacc[0 ];
73
73
int SGid = 0 ;
74
+ int SGLid = 0 ;
75
+ int SGBeginGid = 0 ;
74
76
for (int j = 0 ; j < G; j++) {
75
77
if (j % L % sg_size == 0 ) {
76
78
SGid++;
79
+ SGLid = 0 ;
80
+ SGBeginGid = j;
77
81
}
78
82
if (j % L == 0 ) {
79
83
SGid = 0 ;
84
+ SGLid = 0 ;
85
+ SGBeginGid = j;
80
86
}
81
87
82
88
/* GID of middle element in every subgroup*/
83
- exit_if_not_equal (acc[j], static_cast <T *>(0x0 ) + (j / L * L + SGid * sg_size + sg_size / 2 ),
89
+ exit_if_not_equal (acc[j],
90
+ static_cast <T *>(0x0 ) +
91
+ (j / L * L + SGid * sg_size + sg_size / 2 ),
84
92
" shuffle" );
85
93
86
94
/* Value GID+SGID for all element except last SGID in SG*/
87
95
if (j % L % sg_size + SGid < sg_size && j % L + SGid < L) {
88
- exit_if_not_equal (acc_down[j], static_cast <T *>(0x0 ) + (j + SGid), " shuffle_down" );
96
+ exit_if_not_equal (acc_down[j], static_cast <T *>(0x0 ) + (j + SGid),
97
+ " shuffle_down" );
89
98
}
90
99
91
100
/* Value GID-SGID for all element except first SGID in SG*/
92
101
if (j % L % sg_size >= SGid) {
93
- exit_if_not_equal (acc_up[j], static_cast <T *>(0x0 ) + (j - SGid), " shuffle_up" );
102
+ exit_if_not_equal (acc_up[j], static_cast <T *>(0x0 ) + (j - SGid),
103
+ " shuffle_up" );
94
104
}
95
105
96
- /* GID XOR SGID */
97
- exit_if_not_equal (acc_xor[j], static_cast <T *>(0x0 ) + (j ^ SGid), " shuffle_xor" );
106
+ /* Value GID with SGLID = ( SGLID XOR SGID ) % SGMaxSize */
107
+ exit_if_not_equal (acc_xor[j],
108
+ static_cast <T *>(0x0 ) +
109
+ (SGBeginGid + (SGLid ^ (SGid % sg_size))),
110
+ " shuffle_xor" );
111
+ SGLid++;
98
112
}
99
113
} catch (exception e) {
100
114
std::cout << " SYCL exception caught: " << e.what ();
@@ -145,8 +159,9 @@ void check_struct(queue &Queue, Generator &Gen, size_t G = 240, size_t L = 60) {
145
159
/* Save GID+SGID */
146
160
acc_down[NdItem.get_global_id ()] = SG.shuffle_down (val, sgid);
147
161
148
- /* Save GID XOR SGID */
149
- acc_xor[NdItem.get_global_id ()] = SG.shuffle_xor (val, sgid);
162
+ /* Save GID with SGLID = ( SGLID XOR SGID ) % SGMaxSize */
163
+ acc_xor[NdItem.get_global_id ()] =
164
+ SG.shuffle_xor (val, sgid % SG.get_max_local_range ()[0 ]);
150
165
});
151
166
});
152
167
auto acc = buf.template get_access <access::mode::read_write>();
@@ -157,17 +172,23 @@ void check_struct(queue &Queue, Generator &Gen, size_t G = 240, size_t L = 60) {
157
172
158
173
size_t sg_size = sgsizeacc[0 ];
159
174
int SGid = 0 ;
175
+ int SGLid = 0 ;
176
+ int SGBeginGid = 0 ;
160
177
for (int j = 0 ; j < G; j++) {
161
178
if (j % L % sg_size == 0 ) {
162
179
SGid++;
180
+ SGLid = 0 ;
181
+ SGBeginGid = j;
163
182
}
164
183
if (j % L == 0 ) {
165
184
SGid = 0 ;
185
+ SGLid = 0 ;
186
+ SGBeginGid = j;
166
187
}
167
188
168
189
/* GID of middle element in every subgroup*/
169
- exit_if_not_equal (acc[j], values[j / L * L + SGid * sg_size + sg_size / 2 ],
170
- " shuffle" );
190
+ exit_if_not_equal (
191
+ acc[j], values[j / L * L + SGid * sg_size + sg_size / 2 ], " shuffle" );
171
192
172
193
/* Value GID+SGID for all element except last SGID in SG*/
173
194
if (j % L % sg_size + SGid < sg_size && j % L + SGid < L) {
@@ -179,8 +200,11 @@ void check_struct(queue &Queue, Generator &Gen, size_t G = 240, size_t L = 60) {
179
200
exit_if_not_equal (acc_up[j], values[j - SGid], " shuffle_up" );
180
201
}
181
202
182
- /* GID XOR SGID */
183
- exit_if_not_equal (acc_xor[j], values[j ^ SGid], " shuffle_xor" );
203
+ /* Value GID with SGLID = ( SGLID XOR SGID ) % SGMaxSize */
204
+ exit_if_not_equal (acc_xor[j],
205
+ values[SGBeginGid + (SGLid ^ (SGid % sg_size))],
206
+ " shuffle_xor" );
207
+ SGLid++;
184
208
}
185
209
} catch (exception e) {
186
210
std::cout << " SYCL exception caught: " << e.what ();
0 commit comments