Skip to content

Commit d17840d

Browse files
author
aidan.belton
committed
Add support for kernel function interop
1 parent 589ec40 commit d17840d

File tree

4 files changed

+38
-24
lines changed

4 files changed

+38
-24
lines changed

sycl/include/CL/sycl/accessor.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,6 +2134,12 @@ class __SYCL_SPECIAL_CLASS accessor<DataT, Dimensions, AccessMode,
21342134
bool operator!=(const accessor &Rhs) const { return !(*this == Rhs); }
21352135
};
21362136

2137+
// local_accessor
2138+
// Same semantics and restrictions as accessor with target::local
2139+
template <typename DataT, int Dimensions = 1>
2140+
using local_accessor =
2141+
accessor<DataT, Dimensions, access_mode::read_write, access::target::local>;
2142+
21372143
/// Image accessors.
21382144
///
21392145
/// Available only when accessTarget == access::target::image.

sycl/include/CL/sycl/backend.hpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,25 @@ inline backend_return_t<backend::opencl, event> get_native<
115115
}
116116
#endif
117117

118-
// Native handle of an accessor should be accessed through interop_handler
118+
// Native accessor handle for kernel function interop
119119
template <backend BackendName, typename DataT, int Dimensions,
120120
access::mode AccessMode, access::target AccessTarget,
121121
access::placeholder IsPlaceholder>
122122
auto get_native(const accessor<DataT, Dimensions, AccessMode, AccessTarget,
123123
IsPlaceholder> &Obj) ->
124-
typename detail::interop<
125-
BackendName, accessor<DataT, Dimensions, AccessMode, AccessTarget,
126-
IsPlaceholder>>::type = delete;
124+
typename detail::interop<BackendName,
125+
accessor<DataT, Dimensions, AccessMode,
126+
AccessTarget, IsPlaceholder>>::type {
127+
#ifdef __SYCL_DEVICE_ONLY__
128+
return reinterpret_cast<typename detail::interop<
129+
BackendName, accessor<DataT, Dimensions, AccessMode, AccessTarget,
130+
IsPlaceholder>>::type>(Obj.get_pointer().get());
131+
132+
#else
133+
throw runtime_error("Get native accessor is not support on host.",
134+
PI_INVALID_VALUE);
135+
#endif
136+
}
127137

128138
namespace detail {
129139
// Forward declaration

sycl/include/sycl/ext/oneapi/experimental/backend/backend_traits_cuda.hpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,6 @@ typedef struct CUstream_st *CUstream;
3030
typedef struct CUevent_st *CUevent;
3131
typedef struct CUmod_st *CUmodule;
3232

33-
// As defined in the CUDA 10.1 header file. This requires CUDA version > 3.2
34-
#if defined(_WIN64) || defined(__LP64__)
35-
typedef unsigned long long CUdeviceptr;
36-
#else
37-
typedef unsigned int CUdeviceptr;
38-
#endif
39-
4033
__SYCL_INLINE_NAMESPACE(cl) {
4134
namespace sycl {
4235
namespace detail {
@@ -72,33 +65,38 @@ template <> struct interop<backend::ext_oneapi_cuda, program> {
7265
};
7366
#endif
7467

75-
// TODO the interops for accessor is used in the already deprecated class
76-
// interop_handler and can be removed after API cleanup.
7768
template <typename DataT, int Dimensions, access::mode AccessMode>
7869
struct interop<backend::ext_oneapi_cuda,
7970
accessor<DataT, Dimensions, AccessMode, access::target::device,
8071
access::placeholder::false_t>> {
81-
using type = CUdeviceptr;
72+
using type = DataT *;
8273
};
8374

8475
template <typename DataT, int Dimensions, access::mode AccessMode>
8576
struct interop<
8677
backend::ext_oneapi_cuda,
8778
accessor<DataT, Dimensions, AccessMode, access::target::constant_buffer,
8879
access::placeholder::false_t>> {
89-
using type = CUdeviceptr;
80+
using type = DataT *;
81+
};
82+
83+
template <typename DataT, int Dimensions, access::mode AccessMode>
84+
struct interop<backend::ext_oneapi_cuda,
85+
accessor<DataT, Dimensions, AccessMode, access::target::local,
86+
access::placeholder::false_t>> {
87+
using type = DataT *;
9088
};
9189

9290
template <typename DataT, int Dimensions, typename AllocatorT>
9391
struct BackendInput<backend::ext_oneapi_cuda,
9492
buffer<DataT, Dimensions, AllocatorT>> {
95-
using type = CUdeviceptr;
93+
using type = DataT *;
9694
};
9795

9896
template <typename DataT, int Dimensions, typename AllocatorT>
9997
struct BackendReturn<backend::ext_oneapi_cuda,
10098
buffer<DataT, Dimensions, AllocatorT>> {
101-
using type = void *;
99+
using type = DataT *;
102100
};
103101

104102
template <> struct BackendInput<backend::ext_oneapi_cuda, context> {

sycl/include/sycl/ext/oneapi/experimental/backend/cuda.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ namespace oneapi {
2121
namespace cuda {
2222

2323
// Implementation of cuda::make<device>
24-
__SYCL_EXPORT device make_device(pi_native_handle NativeHandle) {
24+
inline __SYCL_EXPORT device make_device(pi_native_handle NativeHandle) {
2525
return detail::make_device(NativeHandle, backend::cuda);
2626
}
2727

2828
// Implementation of cuda::make<platform>
29-
__SYCL_EXPORT platform make_platform(pi_native_handle NativeHandle) {
29+
inline __SYCL_EXPORT platform make_platform(pi_native_handle NativeHandle) {
3030
return detail::make_platform(NativeHandle, backend::cuda);
3131
}
3232

@@ -36,7 +36,7 @@ __SYCL_EXPORT platform make_platform(pi_native_handle NativeHandle) {
3636

3737
// CUDA context specialization
3838
template <>
39-
auto get_native<backend::ext_oneapi_cuda, context>(const context &C)
39+
inline auto get_native<backend::ext_oneapi_cuda, context>(const context &C)
4040
-> backend_return_t<backend::ext_oneapi_cuda, context> {
4141
// create a vector to be returned
4242
backend_return_t<backend::ext_oneapi_cuda, context> ret;
@@ -52,15 +52,15 @@ auto get_native<backend::ext_oneapi_cuda, context>(const context &C)
5252

5353
// CUDA device specialization
5454
template <>
55-
device make_device<backend::ext_oneapi_cuda>(
55+
inline device make_device<backend::ext_oneapi_cuda>(
5656
const backend_input_t<backend::ext_oneapi_cuda, device> &BackendObject) {
5757
pi_native_handle NativeHandle = static_cast<pi_native_handle>(BackendObject);
5858
return ext::oneapi::cuda::make_device(NativeHandle);
5959
}
6060

6161
// CUDA platform specialization
6262
template <>
63-
auto get_native<backend::ext_oneapi_cuda, platform>(const platform &C)
63+
inline auto get_native<backend::ext_oneapi_cuda, platform>(const platform &C)
6464
-> backend_return_t<backend::ext_oneapi_cuda, platform> {
6565
// get list of platform devices, and transfer to native platform type
6666
std::vector<device> platform_devices = C.get_devices();
@@ -75,7 +75,7 @@ auto get_native<backend::ext_oneapi_cuda, platform>(const platform &C)
7575
}
7676

7777
template <>
78-
platform make_platform<backend::ext_oneapi_cuda>(
78+
inline platform make_platform<backend::ext_oneapi_cuda>(
7979
const backend_input_t<backend::ext_oneapi_cuda, platform> &BackendObject) {
8080
pi_native_handle NativeHandle =
8181
detail::pi::cast<pi_native_handle>(&BackendObject);
@@ -84,7 +84,7 @@ platform make_platform<backend::ext_oneapi_cuda>(
8484

8585
// Specialisation of interop_handles get_native_context
8686
template <>
87-
backend_return_t<backend::ext_oneapi_cuda, context>
87+
inline backend_return_t<backend::ext_oneapi_cuda, context>
8888
interop_handle::get_native_context<backend::ext_oneapi_cuda>() const {
8989
#ifndef __SYCL_DEVICE_ONLY__
9090
return std::vector{reinterpret_cast<CUcontext>(getNativeContext())};

0 commit comments

Comments
 (0)