Skip to content

Commit 7e65688

Browse files
romanovvladvladimirlaz
authored andcommitted
[SYCL] Switch to use of SPIR-V encoding for indexing built-ins.
This patch changes usages of OpenCL indexing biltins with special values recognized by SPIRV translator, for instance: get_global_id(0) replaced with VarLocalInvocationId.x Signed-off-by: Romanov, Vlad <[email protected]> Signed-off-by: Vladimir Lazarev <[email protected]>
1 parent 8b1894b commit 7e65688

File tree

2 files changed

+98
-26
lines changed

2 files changed

+98
-26
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//==---------- spirv_vars.hpp --- SPIRV variables -------------------------==//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
// ===-------------------------------------------------------------------=== //
8+
9+
#pragma once
10+
11+
#ifdef __SYCL_DEVICE_ONLY__
12+
13+
namespace cl {
14+
namespace __spirv {
15+
typedef size_t size_t_vec __attribute__((ext_vector_type(3)));
16+
17+
extern const __constant size_t_vec VarGlobalSize;
18+
extern const __constant size_t_vec VarGlobalInvocationId;
19+
extern const __constant size_t_vec VarWorkgroupSize;
20+
extern const __constant size_t_vec VarLocalInvocationId;
21+
extern const __constant size_t_vec VarWorkgroupId;
22+
extern const __constant size_t_vec VarGlobalOffset;
23+
24+
#define DEFINE_INT_ID_TO_XYZ_CONVERTER(POSTFIX) \
25+
template <int ID> static size_t get##POSTFIX(); \
26+
template <> static size_t get##POSTFIX<0>() { return Var##POSTFIX.x; } \
27+
template <> static size_t get##POSTFIX<1>() { return Var##POSTFIX.y; } \
28+
template <> static size_t get##POSTFIX<2>() { return Var##POSTFIX.z; }
29+
30+
DEFINE_INT_ID_TO_XYZ_CONVERTER(GlobalSize);
31+
DEFINE_INT_ID_TO_XYZ_CONVERTER(GlobalInvocationId)
32+
DEFINE_INT_ID_TO_XYZ_CONVERTER(WorkgroupSize)
33+
DEFINE_INT_ID_TO_XYZ_CONVERTER(LocalInvocationId)
34+
DEFINE_INT_ID_TO_XYZ_CONVERTER(WorkgroupId)
35+
DEFINE_INT_ID_TO_XYZ_CONVERTER(GlobalOffset)
36+
37+
#undef DEFINE_INT_ID_TO_XYZ_CONVERTER
38+
39+
} // namespace __spirv
40+
} // namespace cl
41+
#endif // __SYCL_DEVICE_ONLY__

sycl/include/CL/sycl/handler.hpp

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99

1010
#pragma once
1111

12+
#include <CL/__spirv/spirv_vars.hpp>
1213
#include <CL/sycl/access/access.hpp>
1314
#include <CL/sycl/context.hpp>
1415
#include <CL/sycl/detail/common.hpp>
16+
#include <CL/sycl/detail/scheduler/scheduler.h>
1517
#include <CL/sycl/event.hpp>
1618
#include <CL/sycl/id.hpp>
1719
#include <CL/sycl/kernel.hpp>
@@ -20,21 +22,10 @@
2022
#include <CL/sycl/property_list.hpp>
2123
#include <CL/sycl/stl.hpp>
2224

23-
#include <CL/sycl/detail/scheduler/scheduler.h>
24-
2525
#include <functional>
2626
#include <memory>
2727
#include <type_traits>
2828

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-
3829
template <typename T_src, int dim_src, cl::sycl::access::mode mode_src,
3930
cl::sycl::access::target tgt_src, typename T_dest, int dim_dest,
4031
cl::sycl::access::mode mode_dest, cl::sycl::access::target tgt_dest,
@@ -62,6 +53,48 @@ template <typename DataT, int Dimensions, access::mode AccessMode,
6253
class accessor;
6354
template <typename T, int Dimensions, typename AllocatorT> class buffer;
6455
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+
6598
class queue_impl;
6699
template <typename dataT, int dimensions, access::mode accessMode,
67100
access::target accessTarget, access::placeholder isPlaceholder,
@@ -263,9 +296,9 @@ class handler {
263296
(dimensions > 0 && dimensions < 4),
264297
KernelType>::type kernelFunc) {
265298
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+
269302
kernelFunc(global_id);
270303
}
271304

@@ -277,10 +310,10 @@ class handler {
277310
KernelType>::type kernelFunc) {
278311
id<dimensions> global_id;
279312
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+
284317
item<dimensions, false> Item =
285318
detail::Builder::createItem<dimensions, false>(global_size, global_id);
286319
kernelFunc(Item);
@@ -299,14 +332,12 @@ class handler {
299332
id<dimensions> local_id;
300333
id<dimensions> global_offset;
301334

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);
310341

311342
group<dimensions> Group = detail::Builder::createGroup<dimensions>(
312343
global_size, local_size, group_id);

0 commit comments

Comments
 (0)