Skip to content

Commit ab3e71e

Browse files
kbobrovsbader
authored andcommitted
[SYCL] Fix h_item initialization bug when flexible range is used.
Signed-off-by: Konstantin S Bobrovsky <[email protected]>
1 parent dc9db24 commit ab3e71e

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

sycl/include/CL/sycl/group.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ template <int dimensions = 1> class group {
202202
detail::Builder::createItem<dimensions, false>(GlobalSize, GlobalId);
203203
item<dimensions, false> LocalItem =
204204
detail::Builder::createItem<dimensions, false>(LocalSize, LocalId);
205-
h_item<dimensions> HItem =
206-
detail::Builder::createHItem<dimensions>(GlobalItem, LocalItem);
205+
h_item<dimensions> HItem = detail::Builder::createHItem<dimensions>(
206+
GlobalItem, LocalItem, flexibleRange);
207207

208208
// iterate over flexible range with work group size stride; each item
209209
// performs flexibleRange/LocalSize iterations (if the former is divisible
@@ -225,8 +225,8 @@ template <int dimensions = 1> class group {
225225
item<dimensions, false> LocalItem =
226226
detail::Builder::createItem<dimensions, false>(localRange,
227227
LocalID);
228-
h_item<dimensions> HItem =
229-
detail::Builder::createHItem<dimensions>(GlobalItem, LocalItem);
228+
h_item<dimensions> HItem = detail::Builder::createHItem<dimensions>(
229+
GlobalItem, LocalItem, flexibleRange);
230230

231231
detail::NDLoop<dimensions>::iterate(
232232
LocalID, localRange, flexibleRange,

sycl/test/hier_par/hier_par_basic.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,45 @@ int main() {
264264
passed &= verify(3, range_length, ptr1,
265265
[&](int i) -> int { return N_ITER * (1 + i + 5); });
266266
}
267+
{
268+
// Testcase5
269+
// - flexible range different from the physical one is used,
270+
// get_logical_local_range and get_physical_local_range apis are tested
271+
const int wi_chunk = 2;
272+
constexpr size_t range_length =
273+
N_WG * WG_SIZE_GREATER_THAN_PHYSICAL * wi_chunk;
274+
std::unique_ptr<int[]> data(new int[range_length]);
275+
int *ptr = data.get();
276+
277+
std::memset(ptr, 0, range_length * sizeof(ptr[0]));
278+
buffer<int, 1> buf(ptr, range<1>(range_length));
279+
myQueue.submit([&](handler &cgh) {
280+
auto dev_ptr = buf.get_access<access::mode::read_write>(cgh);
281+
282+
cgh.parallel_for_work_group<class hpar_ranges>(
283+
range<1>(N_WG), range<1>(WG_SIZE_PHYSICAL), [=](group<1> g) {
284+
for (int cnt = 0; cnt < N_ITER; cnt++) {
285+
g.parallel_for_work_item(
286+
range<1>(WG_SIZE_GREATER_THAN_PHYSICAL), [&](h_item<1> i) {
287+
size_t wg_offset = WG_SIZE_GREATER_THAN_PHYSICAL *
288+
wi_chunk * g.get_id(0);
289+
size_t wi_offset =
290+
wg_offset +
291+
i.get_logical_local_id().get(0) * wi_chunk;
292+
dev_ptr[wi_offset + 0] += i.get_logical_local_range()[0];
293+
dev_ptr[wi_offset + 1] += i.get_physical_local_range()[0];
294+
});
295+
}
296+
});
297+
});
298+
auto ptr1 = buf.get_access<access::mode::read>().get_pointer();
299+
passed &= verify(5, range_length, ptr1, [&](int i) -> int {
300+
int gold =
301+
i % 2 == 0 ? WG_SIZE_GREATER_THAN_PHYSICAL : WG_SIZE_PHYSICAL;
302+
gold *= N_ITER;
303+
return gold;
304+
});
305+
}
267306
} catch (cl::sycl::exception const &e) {
268307
std::cout << "SYCL exception caught: " << e.what() << '\n';
269308
return 2;

0 commit comments

Comments
 (0)