| // REQUIRES: any-device | |
| // RUN: %clangxx -fsycl %s -o %t.out | |
| // RUN: %t.out | |
| #include <sycl/sycl.hpp> | |
| #include <cstddef> | |
| template <typename T> void initialize(T *Ptr, size_t Count, T Value) { | |
| for (size_t I = 0; I < Count; ++I) | |
| Ptr[I] = Value; | |
| } | |
| int main() { | |
| sycl::queue Q; | |
| constexpr int Dims = 3; | |
| const sycl::range<Dims> LocalRange{2, 3, 1}; | |
| const sycl::range<Dims> GroupRange{1, 2, 3}; | |
| const sycl::range<Dims> GlobalRange = LocalRange * GroupRange; | |
| const size_t DataLen = GlobalRange.size(); | |
| size_t *GroupRangeData = sycl::malloc_shared<size_t>(DataLen * Dims, Q); | |
| size_t *GroupLinearIdData = sycl::malloc_shared<size_t>(DataLen * Dims, Q); | |
| initialize(GroupRangeData, DataLen * Dims, static_cast<size_t>(0)); | |
| initialize(GroupLinearIdData, DataLen * Dims, static_cast<size_t>(0)); | |
| Q.parallel_for<class group_get_group_range_regression>( | |
| sycl::nd_range<3>{GlobalRange, LocalRange}, [=](sycl::nd_item<3> It) { | |
| const size_t Off = It.get_global_linear_id() * Dims; | |
| const auto GR = It.get_group().get_group_range(); | |
| GroupRangeData[Off + 0] = GR[0]; | |
| GroupRangeData[Off + 1] = GR[1]; | |
| GroupRangeData[Off + 2] = GR[2]; | |
| }); | |
| Q.parallel_for<class group_get_group_linear_id_regression>( | |
| sycl::nd_range<3>{GlobalRange, LocalRange}, [=](sycl::nd_item<3> It) { | |
| const size_t Off = It.get_global_linear_id() * Dims; | |
| const size_t LI = It.get_group().get_group_linear_id(); | |
| GroupLinearIdData[Off + 0] = LI; | |
| GroupLinearIdData[Off + 1] = LI; | |
| GroupLinearIdData[Off + 2] = LI; | |
| }); | |
| Q.wait(); | |
| const size_t SizeZ = GlobalRange.get(0); | |
| const size_t SizeY = GlobalRange.get(1); | |
| const size_t SizeX = GlobalRange.get(2); | |
| bool Fail = false; | |
| for (size_t Z = 0; Z < SizeZ; ++Z) { | |
| for (size_t Y = 0; Y < SizeY; ++Y) { | |
| for (size_t X = 0; X < SizeX; ++X) { | |
| const size_t Ind = Z * SizeX * SizeY + Y * SizeX + X; | |
| const size_t Off = Ind * Dims; | |
| Fail |= GroupRangeData[Off + 0] != GroupRange.get(0); | |
| Fail |= GroupRangeData[Off + 1] != GroupRange.get(1); | |
| Fail |= GroupRangeData[Off + 2] != GroupRange.get(2); | |
| const sycl::id<3> GlobalId{Z, Y, X}; | |
| const sycl::id<3> GroupId = GlobalId / LocalRange; | |
| const size_t GoldLinearId = | |
| GroupId.get(0) * GroupRange.get(1) * GroupRange.get(2) + | |
| GroupId.get(1) * GroupRange.get(2) + GroupId.get(2); | |
| Fail |= GroupLinearIdData[Off + 0] != GoldLinearId; | |
| Fail |= GroupLinearIdData[Off + 1] != GoldLinearId; | |
| Fail |= GroupLinearIdData[Off + 2] != GoldLinearId; | |
| } | |
| } | |
| } | |
| sycl::free(GroupRangeData, Q); | |
| sycl::free(GroupLinearIdData, Q); | |
| return Fail; | |
| } |