Skip to content

Commit 680c1b3

Browse files
[SYCL] Fix marray aliases (#8272)
SYCL 2020 introduced the marray type with a number of aliases for fixed sizes and types. In the DPC++ device headers these are not using the types specified by the specification. This commit fixes the types in the aliases. Signed-off-by: Larsen, Steffen <[email protected]>
1 parent becc391 commit 680c1b3

File tree

2 files changed

+43
-23
lines changed

2 files changed

+43
-23
lines changed

sycl/include/sycl/marray.hpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -392,22 +392,27 @@ template <typename Type, std::size_t NumElements> class marray {
392392
using ALIAS##N = sycl::marray<TYPE, N>;
393393

394394
#define __SYCL_MAKE_MARRAY_ALIASES_FOR_ARITHMETIC_TYPES(N) \
395-
__SYCL_MAKE_MARRAY_ALIAS(mchar, char, N) \
396-
__SYCL_MAKE_MARRAY_ALIAS(mshort, short, N) \
397-
__SYCL_MAKE_MARRAY_ALIAS(mint, int, N) \
398-
__SYCL_MAKE_MARRAY_ALIAS(mlong, long, N) \
395+
__SYCL_MAKE_MARRAY_ALIAS(mbool, bool, N) \
396+
__SYCL_MAKE_MARRAY_ALIAS(mchar, std::int8_t, N) \
397+
__SYCL_MAKE_MARRAY_ALIAS(mshort, std::int16_t, N) \
398+
__SYCL_MAKE_MARRAY_ALIAS(mint, std::int32_t, N) \
399+
__SYCL_MAKE_MARRAY_ALIAS(mlong, std::int64_t, N) \
400+
__SYCL_MAKE_MARRAY_ALIAS(mlonglong, std::int64_t, N) \
399401
__SYCL_MAKE_MARRAY_ALIAS(mfloat, float, N) \
400402
__SYCL_MAKE_MARRAY_ALIAS(mdouble, double, N) \
401403
__SYCL_MAKE_MARRAY_ALIAS(mhalf, half, N)
402404

405+
// FIXME: schar, longlong and ulonglong aliases are not defined by SYCL 2020
406+
// spec, but they are preserved in SYCL 2020 mode, because SYCL-CTS is
407+
// still using them.
408+
// See KhronosGroup/SYCL-CTS#446 and KhronosGroup/SYCL-Docs#335
403409
#define __SYCL_MAKE_MARRAY_ALIASES_FOR_SIGNED_AND_UNSIGNED_TYPES(N) \
404-
__SYCL_MAKE_MARRAY_ALIAS(mschar, signed char, N) \
405-
__SYCL_MAKE_MARRAY_ALIAS(muchar, unsigned char, N) \
406-
__SYCL_MAKE_MARRAY_ALIAS(mushort, unsigned short, N) \
407-
__SYCL_MAKE_MARRAY_ALIAS(muint, unsigned int, N) \
408-
__SYCL_MAKE_MARRAY_ALIAS(mulong, unsigned long, N) \
409-
__SYCL_MAKE_MARRAY_ALIAS(mlonglong, long long, N) \
410-
__SYCL_MAKE_MARRAY_ALIAS(mulonglong, unsigned long long, N)
410+
__SYCL_MAKE_MARRAY_ALIAS(mschar, std::int8_t, N) \
411+
__SYCL_MAKE_MARRAY_ALIAS(muchar, std::uint8_t, N) \
412+
__SYCL_MAKE_MARRAY_ALIAS(mushort, std::uint16_t, N) \
413+
__SYCL_MAKE_MARRAY_ALIAS(muint, std::uint32_t, N) \
414+
__SYCL_MAKE_MARRAY_ALIAS(mulong, std::uint64_t, N) \
415+
__SYCL_MAKE_MARRAY_ALIAS(mulonglong, std::uint64_t, N)
411416

412417
#define __SYCL_MAKE_MARRAY_ALIASES_FOR_MARRAY_LENGTH(N) \
413418
__SYCL_MAKE_MARRAY_ALIASES_FOR_ARITHMETIC_TYPES(N) \

sycl/test/basic_tests/marray/marray.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@
1212
#include <sycl/sycl.hpp>
1313
using namespace sycl;
1414

15+
#define CHECK_ALIAS_BY_SIZE(ALIAS_MTYPE, ELEM_TYPE, MARRAY_SIZE) \
16+
static_assert(std::is_same_v<sycl::marray<ELEM_TYPE, MARRAY_SIZE>, \
17+
sycl::ALIAS_MTYPE##MARRAY_SIZE>);
18+
19+
#define CHECK_ALIAS(ALIAS_MTYPE, ELEM_TYPE) \
20+
CHECK_ALIAS_BY_SIZE(ALIAS_MTYPE, ELEM_TYPE, 2) \
21+
CHECK_ALIAS_BY_SIZE(ALIAS_MTYPE, ELEM_TYPE, 3) \
22+
CHECK_ALIAS_BY_SIZE(ALIAS_MTYPE, ELEM_TYPE, 4) \
23+
CHECK_ALIAS_BY_SIZE(ALIAS_MTYPE, ELEM_TYPE, 8) \
24+
CHECK_ALIAS_BY_SIZE(ALIAS_MTYPE, ELEM_TYPE, 16)
25+
1526
struct NotDefaultConstructible {
1627
NotDefaultConstructible() = delete;
1728
constexpr NotDefaultConstructible(int){};
@@ -60,18 +71,22 @@ int main() {
6071
assert(static_cast<float>(b_marray[2]) == static_cast<float>(0.5));
6172
assert(static_cast<float>(b_marray[3]) == static_cast<float>(0.5));
6273

63-
// Check that [u]long[n] type aliases match marray<[unsigned] long, n> types.
64-
assert((std::is_same<sycl::marray<long, 2>, sycl::mlong2>::value));
65-
assert((std::is_same<sycl::marray<long, 3>, sycl::mlong3>::value));
66-
assert((std::is_same<sycl::marray<long, 4>, sycl::mlong4>::value));
67-
assert((std::is_same<sycl::marray<long, 8>, sycl::mlong8>::value));
68-
assert((std::is_same<sycl::marray<long, 16>, sycl::mlong16>::value));
69-
assert((std::is_same<sycl::marray<unsigned long, 2>, sycl::mulong2>::value));
70-
assert((std::is_same<sycl::marray<unsigned long, 3>, sycl::mulong3>::value));
71-
assert((std::is_same<sycl::marray<unsigned long, 4>, sycl::mulong4>::value));
72-
assert((std::is_same<sycl::marray<unsigned long, 8>, sycl::mulong8>::value));
73-
assert(
74-
(std::is_same<sycl::marray<unsigned long, 16>, sycl::mulong16>::value));
74+
// Check alias types.
75+
CHECK_ALIAS(mbool, bool)
76+
CHECK_ALIAS(mchar, std::int8_t)
77+
CHECK_ALIAS(mschar, std::int8_t)
78+
CHECK_ALIAS(muchar, std::uint8_t)
79+
CHECK_ALIAS(mshort, std::int16_t)
80+
CHECK_ALIAS(mushort, std::uint16_t)
81+
CHECK_ALIAS(mint, std::int32_t)
82+
CHECK_ALIAS(muint, std::uint32_t)
83+
CHECK_ALIAS(mlong, std::int64_t)
84+
CHECK_ALIAS(mulong, std::uint64_t)
85+
CHECK_ALIAS(mlonglong, std::int64_t)
86+
CHECK_ALIAS(mulonglong, std::uint64_t)
87+
CHECK_ALIAS(mhalf, sycl::half)
88+
CHECK_ALIAS(mfloat, float)
89+
CHECK_ALIAS(mdouble, double)
7590

7691
mint3 t000;
7792
mint3 t222{2};

0 commit comments

Comments
 (0)