9
9
#pragma once
10
10
11
11
#include < CL/__spirv/spirv_types.hpp>
12
+ #include < CL/__spirv/spirv_vars.hpp>
12
13
#include < CL/sycl/access/access.hpp>
13
14
#include < CL/sycl/detail/common.hpp>
14
15
#include < CL/sycl/detail/pi.hpp>
16
+ #include < CL/sycl/detail/type_traits.hpp>
15
17
16
18
#include < memory>
17
19
#include < stdexcept>
@@ -22,13 +24,13 @@ namespace cl {
22
24
namespace sycl {
23
25
class context ;
24
26
class event ;
25
- template <int dimensions, bool with_offset> class item ;
26
- template <int dimensions> class group ;
27
- template <int dimensions> class range ;
28
- template <int dimensions> class id ;
29
- template <int dimensions> class nd_item ;
27
+ template <int Dims, bool WithOffset> class item ;
28
+ template <int Dims> class group ;
29
+ template <int Dims> class range ;
30
+ template <int Dims> class id ;
31
+ template <int Dims> class nd_item ;
32
+ template <int Dims> class h_item ;
30
33
enum class memory_order ;
31
- template <int dimensions> class h_item ;
32
34
33
35
namespace detail {
34
36
class context_impl ;
@@ -43,70 +45,119 @@ void waitEvents(std::vector<cl::sycl::event> DepEvents);
43
45
class Builder {
44
46
public:
45
47
Builder () = delete ;
46
- template <int dimensions>
47
- static group<dimensions>
48
- createGroup (const cl::sycl::range<dimensions> &G,
49
- const cl::sycl::range<dimensions> &L,
50
- const cl::sycl::range<dimensions> &GroupRange,
51
- const cl::sycl::id<dimensions> &I) {
52
- return cl::sycl::group<dimensions>(G, L, GroupRange, I);
48
+
49
+ template <int Dims>
50
+ static group<Dims>
51
+ createGroup (const range<Dims> &Global, const range<Dims> &Local,
52
+ const range<Dims> &Group, const id<Dims> &Index) {
53
+ return group<Dims>(Global, Local, Group, Index);
54
+ }
55
+
56
+ template <int Dims>
57
+ static group<Dims> createGroup (const range<Dims> &Global,
58
+ const range<Dims> &Local,
59
+ const id<Dims> &Index) {
60
+ return group<Dims>(Global, Local, Global / Local, Index);
61
+ }
62
+
63
+ template <int Dims, bool WithOffset>
64
+ static detail::enable_if_t <WithOffset, item<Dims, WithOffset>>
65
+ createItem (const range<Dims> &Extent, const id<Dims> &Index,
66
+ const id<Dims> &Offset) {
67
+ return item<Dims, WithOffset>(Extent, Index, Offset);
68
+ }
69
+
70
+ template <int Dims, bool WithOffset>
71
+ static detail::enable_if_t <!WithOffset, item<Dims, WithOffset>>
72
+ createItem (const range<Dims> &Extent, const id<Dims> &Index) {
73
+ return item<Dims, WithOffset>(Extent, Index);
53
74
}
54
75
55
- template <int dimensions >
56
- static group<dimensions> createGroup (const cl::sycl::range<dimensions > &G ,
57
- const cl::sycl::range<dimensions > &L ,
58
- const cl::sycl::id<dimensions > &I ) {
59
- return cl::sycl::group<dimensions>(G, L, G / L, I );
76
+ template <int Dims >
77
+ static nd_item<Dims> createNDItem (const item<Dims, true > &Global ,
78
+ const item<Dims, false > &Local ,
79
+ const group<Dims > &Group ) {
80
+ return nd_item<Dims>(Global, Local, Group );
60
81
}
61
82
62
- template <int dimensions, bool with_offset>
63
- static item<dimensions, with_offset> createItem (
64
- typename std::enable_if<(with_offset == true ),
65
- const cl::sycl::range<dimensions>>::type &R,
66
- const cl::sycl::id<dimensions> &I, const cl::sycl::id<dimensions> &O) {
67
- return cl::sycl::item<dimensions, with_offset>(R, I, O);
83
+ template <int Dims>
84
+ static h_item<Dims> createHItem (const item<Dims, false > &Global,
85
+ const item<Dims, false > &Local) {
86
+ return h_item<Dims>(Global, Local);
68
87
}
69
88
70
- template <int dimensions, bool with_offset>
71
- static item<dimensions, with_offset> createItem (
72
- typename std::enable_if<(with_offset == false ),
73
- const cl::sycl::range<dimensions>>::type &R,
74
- const cl::sycl::id<dimensions> &I) {
75
- return cl::sycl::item<dimensions, with_offset>(R, I);
89
+ template <int Dims>
90
+ static h_item<Dims> createHItem (const item<Dims, false > &Global,
91
+ const item<Dims, false > &Local,
92
+ const range<Dims> &Flex) {
93
+ return h_item<Dims>(Global, Local, Flex);
76
94
}
77
95
78
- template <int dimensions , bool with_offset >
79
- static void updateItemIndex (cl::sycl::item<dimensions, with_offset > &Item,
80
- const id<dimensions > &NextIndex) {
96
+ template <int Dims , bool WithOffset >
97
+ static void updateItemIndex (cl::sycl::item<Dims, WithOffset > &Item,
98
+ const id<Dims > &NextIndex) {
81
99
Item.MImpl .MIndex = NextIndex;
82
100
}
83
101
84
- template <int dimensions>
85
- static nd_item<dimensions>
86
- createNDItem (const cl::sycl::item<dimensions, true > &GL,
87
- const cl::sycl::item<dimensions, false > &L,
88
- const cl::sycl::group<dimensions> &GR) {
89
- return cl::sycl::nd_item<dimensions>(GL, L, GR);
102
+ #ifdef __SYCL_DEVICE_ONLY__
103
+
104
+ template <int N>
105
+ using is_valid_dimensions = std::integral_constant<bool , (N > 0 ) && (N < 4 )>;
106
+
107
+ template <int Dims> static const id<Dims> getId () {
108
+ static_assert (is_valid_dimensions<Dims>::value, " invalid dimensions" );
109
+ return __spirv::initGlobalInvocationId<Dims, id<Dims>>();
110
+ }
111
+
112
+ template <int Dims> static const group<Dims> getGroup () {
113
+ static_assert (is_valid_dimensions<Dims>::value, " invalid dimensions" );
114
+ range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
115
+ range<Dims> LocalSize{__spirv::initWorkgroupSize<Dims, range<Dims>>()};
116
+ range<Dims> GroupRange{__spirv::initNumWorkgroups<Dims, range<Dims>>()};
117
+ id<Dims> GroupId{__spirv::initWorkgroupId<Dims, id<Dims>>()};
118
+ return createGroup<Dims>(GlobalSize, LocalSize, GroupRange, GroupId);
119
+ }
120
+
121
+ template <int Dims, bool WithOffset>
122
+ static detail::enable_if_t <WithOffset, const item<Dims, WithOffset>>
123
+ getItem () {
124
+ static_assert (is_valid_dimensions<Dims>::value, " invalid dimensions" );
125
+ id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
126
+ range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
127
+ id<Dims> GlobalOffset{__spirv::initGlobalOffset<Dims, id<Dims>>()};
128
+ return createItem<Dims, true >(GlobalSize, GlobalId, GlobalOffset);
90
129
}
91
130
92
- template <int dimensions>
93
- static h_item<dimensions>
94
- createHItem (const cl::sycl::item<dimensions, false > &GlobalItem,
95
- const cl::sycl::item<dimensions, false > &LocalItem) {
96
- return cl::sycl::h_item<dimensions>(GlobalItem, LocalItem);
131
+ template <int Dims, bool WithOffset>
132
+ static detail::enable_if_t <!WithOffset, const item<Dims, WithOffset>>
133
+ getItem () {
134
+ static_assert (is_valid_dimensions<Dims>::value, " invalid dimensions" );
135
+ id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
136
+ range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
137
+ return createItem<Dims, false >(GlobalSize, GlobalId);
97
138
}
98
139
99
- template <int dimensions>
100
- static h_item<dimensions>
101
- createHItem (const cl::sycl::item<dimensions, false > &GlobalItem,
102
- const cl::sycl::item<dimensions, false > &LocalItem,
103
- const cl::sycl::range<dimensions> &FlexRange) {
104
- return cl::sycl::h_item<dimensions>(GlobalItem, LocalItem, FlexRange);
140
+ template <int Dims> static const nd_item<Dims> getNDItem () {
141
+ static_assert (is_valid_dimensions<Dims>::value, " invalid dimensions" );
142
+ range<Dims> GlobalSize{__spirv::initGlobalSize<Dims, range<Dims>>()};
143
+ range<Dims> LocalSize{__spirv::initWorkgroupSize<Dims, range<Dims>>()};
144
+ range<Dims> GroupRange{__spirv::initNumWorkgroups<Dims, range<Dims>>()};
145
+ id<Dims> GroupId{__spirv::initWorkgroupId<Dims, id<Dims>>()};
146
+ id<Dims> GlobalId{__spirv::initGlobalInvocationId<Dims, id<Dims>>()};
147
+ id<Dims> LocalId{__spirv::initLocalInvocationId<Dims, id<Dims>>()};
148
+ id<Dims> GlobalOffset{__spirv::initGlobalOffset<Dims, id<Dims>>()};
149
+ group<Dims> Group =
150
+ createGroup<Dims>(GlobalSize, LocalSize, GroupRange, GroupId);
151
+ item<Dims, true > GlobalItem =
152
+ createItem<Dims, true >(GlobalSize, GlobalId, GlobalOffset);
153
+ item<Dims, false > LocalItem = createItem<Dims, false >(LocalSize, LocalId);
154
+ return createNDItem<Dims>(GlobalItem, LocalItem, Group);
105
155
}
156
+ #endif // __SYCL_DEVICE_ONLY__
106
157
};
107
158
108
- inline constexpr
109
- __spv::MemorySemanticsMask getSPIRVMemorySemanticsMask (memory_order) {
159
+ inline constexpr __spv::MemorySemanticsMask
160
+ getSPIRVMemorySemanticsMask (memory_order) {
110
161
return __spv::MemorySemanticsMask::None;
111
162
}
112
163
0 commit comments