|
19 | 19 | //
|
20 | 20 | *******************************************************************************/
|
21 | 21 |
|
| 22 | +#ifndef __SYCLCTS_TESTS_COMMON_RANGE_INDEX_SPACE_ID_H |
| 23 | +#define __SYCLCTS_TESTS_COMMON_RANGE_INDEX_SPACE_ID_H |
| 24 | + |
22 | 25 | #ifndef SYCL_CTS_COMPILING_WITH_ADAPTIVECPP
|
23 | 26 | #include "../common/type_coverage.h"
|
24 | 27 | #endif
|
25 | 28 |
|
| 29 | +#include "once_per_unit.h" |
| 30 | + |
26 | 31 | namespace range_index_space_id {
|
27 | 32 |
|
28 | 33 | enum class check_codes : size_t {
|
@@ -95,3 +100,44 @@ void check_members_test(const std::string& type_name) {
|
95 | 100 | }
|
96 | 101 |
|
97 | 102 | } // namespace range_index_space_id
|
| 103 | + |
| 104 | +/// Linearizes a multi-dimensional index according to the specification. |
| 105 | +template <unsigned int dimension> |
| 106 | +size_t linearize(sycl::range<dimension> range, sycl::id<dimension> id); |
| 107 | + |
| 108 | +inline size_t linearize(sycl::range<1> range, sycl::id<1> id) { |
| 109 | + static_cast<void>(range); |
| 110 | + return id[0]; |
| 111 | +} |
| 112 | + |
| 113 | +inline size_t linearize(sycl::range<2> range, sycl::id<2> id) { |
| 114 | + return id[1] + id[0] * range[1]; |
| 115 | +} |
| 116 | + |
| 117 | +inline size_t linearize(sycl::range<3> range, sycl::id<3> id) { |
| 118 | + return id[2] + id[1] * range[2] + id[0] * range[1] * range[2]; |
| 119 | +} |
| 120 | + |
| 121 | +/** |
| 122 | +Computes a multi-dimensional index such that id = unlinearize(range, |
| 123 | +linearize(range, id)) if id is a valid index in range. */ |
| 124 | +template <unsigned int dimension> |
| 125 | +sycl::id<dimension> unlinearize(sycl::range<dimension> range, size_t id); |
| 126 | + |
| 127 | +inline sycl::id<1> unlinearize(sycl::range<1>, size_t id) { return {id}; } |
| 128 | + |
| 129 | +inline sycl::id<2> unlinearize(sycl::range<2> range, size_t id) { |
| 130 | + size_t id0 = id / range[1]; |
| 131 | + size_t id1 = id % range[1]; |
| 132 | + return {id0, id1}; |
| 133 | +} |
| 134 | + |
| 135 | +inline sycl::id<3> unlinearize(sycl::range<3> range, size_t id) { |
| 136 | + size_t id0 = id / (range[1] * range[2]); |
| 137 | + size_t rem = id % (range[1] * range[2]); |
| 138 | + size_t id1 = rem / range[2]; |
| 139 | + size_t id2 = rem % range[2]; |
| 140 | + return {id0, id1, id2}; |
| 141 | +} |
| 142 | + |
| 143 | +#endif // __SYCLCTS_TESTS_COMMON_RANGE_INDEX_SPACE_ID_H |
0 commit comments