9
9
10
10
#pragma once
11
11
12
+ #include < CL/__spirv/spirv_vars.hpp>
12
13
#include < CL/sycl/access/access.hpp>
13
14
#include < CL/sycl/context.hpp>
14
15
#include < CL/sycl/detail/common.hpp>
16
+ #include < CL/sycl/detail/scheduler/scheduler.h>
15
17
#include < CL/sycl/event.hpp>
16
18
#include < CL/sycl/id.hpp>
17
19
#include < CL/sycl/kernel.hpp>
20
22
#include < CL/sycl/property_list.hpp>
21
23
#include < CL/sycl/stl.hpp>
22
24
23
- #include < CL/sycl/detail/scheduler/scheduler.h>
24
-
25
25
#include < functional>
26
26
#include < memory>
27
27
#include < type_traits>
28
28
29
- #ifdef __SYCL_DEVICE_ONLY__
30
- size_t get_global_size (uint dimindx);
31
- size_t get_local_size (uint dimindx);
32
- size_t get_global_id (uint dimindx);
33
- size_t get_local_id (uint dimindx);
34
- size_t get_global_offset (uint dimindx);
35
- size_t get_group_id (uint dimindx);
36
- #endif
37
-
38
29
template <typename T_src, int dim_src, cl::sycl::access::mode mode_src,
39
30
cl::sycl::access::target tgt_src, typename T_dest, int dim_dest,
40
31
cl::sycl::access::mode mode_dest, cl::sycl::access::target tgt_dest,
@@ -62,6 +53,48 @@ template <typename DataT, int Dimensions, access::mode AccessMode,
62
53
class accessor ;
63
54
template <typename T, int Dimensions, typename AllocatorT> class buffer ;
64
55
namespace detail {
56
+
57
+ #ifdef __SYCL_DEVICE_ONLY__
58
+
59
+ #define DEFINE_INIT_SIZES (POSTFIX ) \
60
+ \
61
+ template <int Dim, class DstT > struct InitSizesST ##POSTFIX; \
62
+ \
63
+ template <class DstT > struct InitSizesST ##POSTFIX<1 , DstT> { \
64
+ static INLINE_IF_DEVICE void initSize (DstT &Dst) { \
65
+ Dst[0 ] = cl::__spirv::get##POSTFIX<0 >(); \
66
+ } \
67
+ }; \
68
+ \
69
+ template <class DstT > struct InitSizesST ##POSTFIX<2 , DstT> { \
70
+ static INLINE_IF_DEVICE void initSize (DstT &Dst) { \
71
+ Dst[1 ] = cl::__spirv::get##POSTFIX<1 >(); \
72
+ InitSizesST##POSTFIX<1 , DstT>::initSize (Dst); \
73
+ } \
74
+ }; \
75
+ \
76
+ template <class DstT > struct InitSizesST ##POSTFIX<3 , DstT> { \
77
+ static INLINE_IF_DEVICE void initSize (DstT &Dst) { \
78
+ Dst[2 ] = cl::__spirv::get##POSTFIX<2 >(); \
79
+ InitSizesST##POSTFIX<2 , DstT>::initSize (Dst); \
80
+ } \
81
+ }; \
82
+ \
83
+ template <int Dims, class DstT > static void init##POSTFIX(DstT &Dst) { \
84
+ InitSizesST##POSTFIX<Dims, DstT>::initSize (Dst); \
85
+ }
86
+
87
+ DEFINE_INIT_SIZES (GlobalSize);
88
+ DEFINE_INIT_SIZES (GlobalInvocationId)
89
+ DEFINE_INIT_SIZES(WorkgroupSize)
90
+ DEFINE_INIT_SIZES(LocalInvocationId)
91
+ DEFINE_INIT_SIZES(WorkgroupId)
92
+ DEFINE_INIT_SIZES(GlobalOffset)
93
+
94
+ #undef DEFINE_INIT_SIZES
95
+
96
+ #endif // __SYCL_DEVICE_ONLY__
97
+
65
98
class queue_impl ;
66
99
template <typename dataT, int dimensions, access::mode accessMode,
67
100
access::target accessTarget, access::placeholder isPlaceholder,
@@ -263,9 +296,9 @@ class handler {
263
296
(dimensions > 0 && dimensions < 4 ),
264
297
KernelType>::type kernelFunc) {
265
298
id<dimensions> global_id;
266
- for ( int i = 0 ; i < dimensions; ++i) {
267
- global_id[i] = get_global_id (i );
268
- }
299
+
300
+ detail::initGlobalInvocationId<dimensions>(global_id );
301
+
269
302
kernelFunc (global_id);
270
303
}
271
304
@@ -277,10 +310,10 @@ class handler {
277
310
KernelType>::type kernelFunc) {
278
311
id<dimensions> global_id;
279
312
range<dimensions> global_size;
280
- for ( int i = 0 ; i < dimensions; ++i) {
281
- global_id[i] = get_global_id (i );
282
- global_size[i] = get_global_size (i );
283
- }
313
+
314
+ detail::initGlobalInvocationId<dimensions>(global_id );
315
+ detail::initGlobalSize<dimensions>(global_size );
316
+
284
317
item<dimensions, false > Item =
285
318
detail::Builder::createItem<dimensions, false >(global_size, global_id);
286
319
kernelFunc (Item);
@@ -299,14 +332,12 @@ class handler {
299
332
id<dimensions> local_id;
300
333
id<dimensions> global_offset;
301
334
302
- for (int i = 0 ; i < dimensions; ++i) {
303
- global_size[i] = get_global_size (i);
304
- local_size[i] = get_local_size (i);
305
- group_id[i] = get_group_id (i);
306
- global_id[i] = get_global_id (i);
307
- local_id[i] = get_local_id (i);
308
- global_offset[i] = get_global_offset (i);
309
- }
335
+ detail::initGlobalSize<dimensions>(global_size);
336
+ detail::initWorkgroupSize<dimensions>(local_size);
337
+ detail::initWorkgroupId<dimensions>(group_id);
338
+ detail::initGlobalInvocationId<dimensions>(global_id);
339
+ detail::initLocalInvocationId<dimensions>(local_id);
340
+ detail::initGlobalOffset<dimensions>(global_offset);
310
341
311
342
group<dimensions> Group = detail::Builder::createGroup<dimensions>(
312
343
global_size, local_size, group_id);
0 commit comments