Skip to content

Commit 51b7f78

Browse files
authored
[SYCL] Implement accessors implicit conversions (#8369)
- Implement implicit conversions between readonly accessors with const / non const types. [4.7.6.9.3. Read only buffer command accessors and implicit conversions](https://registry.khronos.org/SYCL/specs/sycl-2020/html/sycl-2020.html#sec:accessor.command.buffer.conversions) - Implement implicit conversion from read_write T accessor to read only T (const) accessor - Add test for conversion.
1 parent f206ad6 commit 51b7f78

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed

sycl/include/sycl/accessor.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,37 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
12571257
// -------+---------+-------+----+-----+--------------
12581258

12591259
public:
1260+
// implicit conversion between const / non-const types for read only accessors
1261+
template <typename DataT_,
1262+
typename = detail::enable_if_t<
1263+
IsAccessReadOnly && !std::is_same_v<DataT_, DataT> &&
1264+
std::is_same_v<std::remove_const_t<DataT_>,
1265+
std::remove_const_t<DataT>>>>
1266+
accessor(const accessor<DataT_, Dimensions, AccessMode, AccessTarget,
1267+
IsPlaceholder, PropertyListT> &other)
1268+
#ifdef __SYCL_DEVICE_ONLY__
1269+
: impl(other.impl) {
1270+
#else
1271+
: accessor(other.impl) {
1272+
#endif // __SYCL_DEVICE_ONLY__
1273+
}
1274+
1275+
// implicit conversion from read_write T accessor to read only T (const)
1276+
// accessor
1277+
template <typename DataT_, access::mode AccessMode_,
1278+
typename = detail::enable_if_t<
1279+
(AccessMode_ == access_mode::read_write) && IsAccessReadOnly &&
1280+
std::is_same_v<std::remove_const_t<DataT_>,
1281+
std::remove_const_t<DataT>>>>
1282+
accessor(const accessor<DataT_, Dimensions, AccessMode_, AccessTarget,
1283+
IsPlaceholder, PropertyListT> &other)
1284+
#ifdef __SYCL_DEVICE_ONLY__
1285+
: impl(other.impl) {
1286+
#else
1287+
: accessor(other.impl) {
1288+
#endif // __SYCL_DEVICE_ONLY__
1289+
}
1290+
12601291
template <typename T = DataT, int Dims = Dimensions, typename AllocatorT,
12611292
typename detail::enable_if_t<
12621293
detail::IsRunTimePropertyListT<PropertyListT>::value &&
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#include <gtest/gtest.h>
2+
3+
#include <sycl/sycl.hpp>
4+
5+
TEST(AccessorImplicitConversionTest, NonConstToConstTypeInReadAccessor) {
6+
using accessor_non_const_type =
7+
sycl::accessor<int, 1, sycl::access::mode::read, sycl::target::device>;
8+
using acc_const_type = sycl::accessor<const int, 1, sycl::access::mode::read,
9+
sycl::target::device>;
10+
accessor_non_const_type acc_a;
11+
auto acc_b = acc_const_type(acc_a);
12+
acc_const_type acc_c = acc_a;
13+
EXPECT_EQ(acc_a, acc_b);
14+
EXPECT_EQ(acc_a, acc_c);
15+
}
16+
17+
TEST(AccessorImplicitConversionTest, ConstToNonConstTypeInReadAccessor) {
18+
using accessor_non_const_type =
19+
sycl::accessor<int, 1, sycl::access::mode::read, sycl::target::device>;
20+
using acc_const_type =
21+
sycl::accessor<int, 1, sycl::access::mode::read, sycl::target::device>;
22+
acc_const_type acc_a;
23+
auto acc_b = accessor_non_const_type(acc_a);
24+
accessor_non_const_type acc_c = acc_a;
25+
EXPECT_EQ(acc_a, acc_b);
26+
EXPECT_EQ(acc_a, acc_c);
27+
}
28+
29+
TEST(AccessorImplicitConversionTest, ReadWriteAccessorToReadAccessorNonConst) {
30+
using read_write_accessor_non_const_type =
31+
sycl::accessor<int, 1, sycl::access::mode::read_write,
32+
sycl::target::device>;
33+
using read_accessor_non_const_type =
34+
sycl::accessor<int, 1, sycl::access::mode::read, sycl::target::device>;
35+
read_write_accessor_non_const_type acc_a;
36+
auto acc_b = read_accessor_non_const_type(acc_a);
37+
read_accessor_non_const_type acc_c = acc_a;
38+
EXPECT_EQ(acc_a.impl, acc_b.impl);
39+
EXPECT_EQ(acc_a.impl, acc_c.impl);
40+
}
41+
42+
TEST(AccessorImplicitConversionTest, ReadWriteAccessorToReadAccessorConst) {
43+
using read_write_accessor_non_const_type =
44+
sycl::accessor<int, 1, sycl::access::mode::read_write,
45+
sycl::target::device>;
46+
using read_accessor_non_const_type =
47+
sycl::accessor<const int, 1, sycl::access::mode::read,
48+
sycl::target::device>;
49+
read_write_accessor_non_const_type acc_a;
50+
auto acc_b = read_accessor_non_const_type(acc_a);
51+
read_accessor_non_const_type acc_c = acc_a;
52+
EXPECT_EQ(acc_a.impl, acc_b.impl);
53+
EXPECT_EQ(acc_a.impl, acc_c.impl);
54+
}

sycl/unittests/accessor/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
add_sycl_unittest(AccessorTests OBJECT
22
AccessorHostTask.cpp
3+
AccessorImplicitConversion.cpp
34
AccessorIterator.cpp
45
AccessorPlaceholder.cpp
56
AccessorReverseIterator.cpp

0 commit comments

Comments
 (0)