Skip to content

Commit 3df6fdc

Browse files
[SYCL] Adjust multi_ptr deduction guides (#9751)
This commit adjusts the multi_ptr deduction guides following the changes to the SYCL 2020 specification in KhronosGroup/SYCL-Docs#405. Fixes #9692. Signed-off-by: Larsen, Steffen <[email protected]>
1 parent 1496c57 commit 3df6fdc

File tree

3 files changed

+61
-11
lines changed

3 files changed

+61
-11
lines changed

sycl/include/sycl/multi_ptr.hpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,10 +1274,21 @@ class multi_ptr<const void, Space, access::decorated::legacy> {
12741274
};
12751275

12761276
#ifdef __cpp_deduction_guides
1277-
template <int dimensions, access::mode Mode, access::placeholder isPlaceholder,
1277+
template <int dimensions, access::placeholder isPlaceholder,
12781278
typename PropertyListT, class T>
1279-
multi_ptr(accessor<T, dimensions, Mode, access::target::device, isPlaceholder,
1280-
PropertyListT>)
1279+
multi_ptr(accessor<T, dimensions, access::mode::read, access::target::device,
1280+
isPlaceholder, PropertyListT>)
1281+
-> multi_ptr<const T, access::address_space::global_space,
1282+
access::decorated::no>;
1283+
template <int dimensions, access::placeholder isPlaceholder,
1284+
typename PropertyListT, class T>
1285+
multi_ptr(accessor<T, dimensions, access::mode::write, access::target::device,
1286+
isPlaceholder, PropertyListT>)
1287+
-> multi_ptr<T, access::address_space::global_space, access::decorated::no>;
1288+
template <int dimensions, access::placeholder isPlaceholder,
1289+
typename PropertyListT, class T>
1290+
multi_ptr(accessor<T, dimensions, access::mode::read_write,
1291+
access::target::device, isPlaceholder, PropertyListT>)
12811292
-> multi_ptr<T, access::address_space::global_space, access::decorated::no>;
12821293
template <int dimensions, access::mode Mode, access::placeholder isPlaceholder,
12831294
typename PropertyListT, class T>

sycl/test/multi_ptr/ctad.cpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,47 @@ int main() {
1919
using sycl::access::address_space;
2020
using sycl::access::mode;
2121
using sycl::access::target;
22-
using deviceAcc = sycl::accessor<int, 1, mode::read, target::device>;
23-
using globlAcc = sycl::accessor<int, 1, mode::read, target::global_buffer>;
22+
using rDeviceAcc = sycl::accessor<int, 1, mode::read, target::device>;
23+
using rGloblAcc = sycl::accessor<int, 1, mode::read, target::global_buffer>;
24+
using wDeviceAcc = sycl::accessor<int, 1, mode::write, target::device>;
25+
using wGloblAcc = sycl::accessor<int, 1, mode::write, target::global_buffer>;
26+
using rwDeviceAcc = sycl::accessor<int, 1, mode::read_write, target::device>;
27+
using rwGloblAcc =
28+
sycl::accessor<int, 1, mode::read_write, target::global_buffer>;
2429
using constAcc = sycl::accessor<int, 1, mode::read, target::constant_buffer>;
2530
using localAcc = sycl::local_accessor<int, 1>;
26-
using localAccDep = sycl::accessor<int, 1, mode::read, target::local>;
27-
using deviceCTAD = decltype(sycl::multi_ptr(std::declval<deviceAcc>()));
28-
using globlCTAD = decltype(sycl::multi_ptr(std::declval<globlAcc>()));
31+
using localAccDep = sycl::local_accessor<int, 1>;
32+
using rDeviceCTAD = decltype(sycl::multi_ptr(std::declval<rDeviceAcc>()));
33+
using rGloblCTAD = decltype(sycl::multi_ptr(std::declval<rGloblAcc>()));
34+
using wDeviceCTAD = decltype(sycl::multi_ptr(std::declval<wDeviceAcc>()));
35+
using wGloblCTAD = decltype(sycl::multi_ptr(std::declval<wGloblAcc>()));
36+
using rwDeviceCTAD = decltype(sycl::multi_ptr(std::declval<rwDeviceAcc>()));
37+
using rwGloblCTAD = decltype(sycl::multi_ptr(std::declval<rwGloblAcc>()));
2938
using constCTAD = decltype(sycl::multi_ptr(std::declval<constAcc>()));
3039
using localCTAD = decltype(sycl::multi_ptr(std::declval<localAcc>()));
3140
using localCTADDep = decltype(sycl::multi_ptr(std::declval<localAccDep>()));
3241
using deviceMPtr = sycl::multi_ptr<int, address_space::global_space,
3342
sycl::access::decorated::no>;
3443
using globlMPtr = sycl::multi_ptr<int, address_space::global_space,
3544
sycl::access::decorated::no>;
45+
using deviceConstMPtr =
46+
sycl::multi_ptr<const int, address_space::global_space,
47+
sycl::access::decorated::no>;
48+
using globlConstMPtr = sycl::multi_ptr<const int, address_space::global_space,
49+
sycl::access::decorated::no>;
3650
using constMPtr = sycl::multi_ptr<int, address_space::constant_space,
3751
sycl::access::decorated::legacy>;
3852
using localMPtr = sycl::multi_ptr<int, address_space::local_space,
3953
sycl::access::decorated::no>;
40-
static_assert(std::is_same<deviceCTAD, deviceMPtr>::value);
41-
static_assert(std::is_same<deviceCTAD, globlMPtr>::value);
42-
static_assert(std::is_same<globlCTAD, globlMPtr>::value);
54+
static_assert(std::is_same<rwDeviceCTAD, deviceMPtr>::value);
55+
static_assert(std::is_same<rwDeviceCTAD, globlMPtr>::value);
56+
static_assert(std::is_same<rwGloblCTAD, globlMPtr>::value);
57+
static_assert(std::is_same<wDeviceCTAD, deviceMPtr>::value);
58+
static_assert(std::is_same<wDeviceCTAD, globlMPtr>::value);
59+
static_assert(std::is_same<wGloblCTAD, globlMPtr>::value);
60+
static_assert(std::is_same<rDeviceCTAD, deviceConstMPtr>::value);
61+
static_assert(std::is_same<rDeviceCTAD, globlConstMPtr>::value);
62+
static_assert(std::is_same<rGloblCTAD, globlConstMPtr>::value);
4363
static_assert(std::is_same<constCTAD, constMPtr>::value);
4464
static_assert(std::is_same<localCTAD, localMPtr>::value);
4565
static_assert(std::is_same<localCTADDep, localMPtr>::value);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %clangxx -fsycl -fsyntax-only -Xclang -verify %s -Xclang -verify-ignore-unexpected=note,warning
2+
// expected-no-diagnostics
3+
4+
// Tests that read-only accessors can be used in multi_ptr deduction guides.
5+
6+
#include <sycl/sycl.hpp>
7+
8+
int main() {
9+
sycl::queue Q;
10+
int Data = 0;
11+
sycl::buffer<int, 1> Buf{&Data, {1}};
12+
13+
Q.submit([&](sycl::handler &CGH) {
14+
sycl::accessor<int, 1, sycl::access_mode::read, sycl::target::device> Acc(
15+
Buf, CGH);
16+
CGH.single_task([=] { auto MPtr = sycl::multi_ptr(Acc); });
17+
}).wait_and_throw();
18+
return 0;
19+
}

0 commit comments

Comments
 (0)