Skip to content

Commit 44d4633

Browse files
authored
[SYCL] Optimize createSyclObjFromImpl usage (#17396)
This PR tries to decrease the number of times the copy ctor of `std::shared_ptr` is called. Before this PR the `createSyclObjFromImpl` function took `std::shared_ptr` as an argument by value.
1 parent a0df523 commit 44d4633

25 files changed

+189
-62
lines changed

sycl/include/sycl/accessor.hpp

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,11 @@ class __SYCL_EXPORT AccessorBaseHost {
556556
friend const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject);
557557

558558
template <class T>
559-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
559+
friend T detail::createSyclObjFromImpl(
560+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
561+
template <class T>
562+
friend T detail::createSyclObjFromImpl(
563+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
560564

561565
template <typename, int, access::mode, access::target, access::placeholder,
562566
typename>
@@ -592,7 +596,11 @@ class __SYCL_EXPORT LocalAccessorBaseHost {
592596
detail::getSyclObjImpl(const Obj &SyclObject);
593597

594598
template <class T>
595-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
599+
friend T detail::createSyclObjFromImpl(
600+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
601+
template <class T>
602+
friend T detail::createSyclObjFromImpl(
603+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
596604

597605
LocalAccessorImplPtr impl;
598606
};
@@ -851,7 +859,11 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
851859
detail::getSyclObjImpl(const Obj &SyclObject);
852860

853861
template <class T>
854-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
862+
friend T detail::createSyclObjFromImpl(
863+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
864+
template <class T>
865+
friend T detail::createSyclObjFromImpl(
866+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
855867

856868
public:
857869
// 4.7.6.9.1. Interface for buffer command accessors
@@ -2242,7 +2254,11 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
22422254
detail::getSyclObjImpl(const Obj &SyclObject);
22432255

22442256
template <class T>
2245-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
2257+
friend T detail::createSyclObjFromImpl(
2258+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
2259+
template <class T>
2260+
friend T detail::createSyclObjFromImpl(
2261+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
22462262

22472263
template <typename DataT_, int Dimensions_> friend class local_accessor;
22482264

@@ -2658,7 +2674,11 @@ class __SYCL_EBO host_accessor
26582674
friend const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject);
26592675

26602676
template <class T>
2661-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
2677+
friend T detail::createSyclObjFromImpl(
2678+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
2679+
template <class T>
2680+
friend T detail::createSyclObjFromImpl(
2681+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
26622682
#endif // __SYCL_DEVICE_ONLY__
26632683

26642684
public:

sycl/include/sycl/accessor_image.hpp

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,12 @@ class __SYCL_EXPORT UnsampledImageAccessorBaseHost {
102102
detail::getSyclObjImpl(const Obj &SyclObject);
103103

104104
template <class T>
105-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
105+
friend T detail::createSyclObjFromImpl(
106+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
107+
108+
template <class T>
109+
friend T detail::createSyclObjFromImpl(
110+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
106111

107112
UnsampledImageAccessorImplPtr impl;
108113

@@ -173,7 +178,12 @@ class __SYCL_EXPORT SampledImageAccessorBaseHost {
173178
detail::getSyclObjImpl(const Obj &SyclObject);
174179

175180
template <class T>
176-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
181+
friend T detail::createSyclObjFromImpl(
182+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
183+
184+
template <class T>
185+
friend T detail::createSyclObjFromImpl(
186+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
177187

178188
SampledImageAccessorImplPtr impl;
179189

@@ -936,7 +946,12 @@ class __SYCL_EBO unsampled_image_accessor :
936946
detail::getSyclObjImpl(const Obj &SyclObject);
937947

938948
template <class T>
939-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
949+
friend T detail::createSyclObjFromImpl(
950+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
951+
952+
template <class T>
953+
friend T detail::createSyclObjFromImpl(
954+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
940955
};
941956

942957
template <typename DataT, int Dimensions = 1,
@@ -1073,7 +1088,12 @@ class __SYCL_EBO host_unsampled_image_accessor
10731088
detail::getSyclObjImpl(const Obj &SyclObject);
10741089

10751090
template <class T>
1076-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
1091+
friend T detail::createSyclObjFromImpl(
1092+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1093+
1094+
template <class T>
1095+
friend T detail::createSyclObjFromImpl(
1096+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
10771097
};
10781098

10791099
template <typename DataT, int Dimensions,
@@ -1217,7 +1237,12 @@ class __SYCL_EBO sampled_image_accessor :
12171237
detail::getSyclObjImpl(const Obj &SyclObject);
12181238

12191239
template <class T>
1220-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
1240+
friend T detail::createSyclObjFromImpl(
1241+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1242+
1243+
template <class T>
1244+
friend T detail::createSyclObjFromImpl(
1245+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
12211246
};
12221247

12231248
template <typename DataT, int Dimensions>
@@ -1321,7 +1346,12 @@ class __SYCL_EBO host_sampled_image_accessor
13211346
detail::getSyclObjImpl(const Obj &SyclObject);
13221347

13231348
template <class T>
1324-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
1349+
friend T detail::createSyclObjFromImpl(
1350+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1351+
1352+
template <class T>
1353+
friend T detail::createSyclObjFromImpl(
1354+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
13251355
};
13261356

13271357
} // namespace _V1

sycl/include/sycl/context.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,11 @@ class __SYCL_EXPORT context : public detail::OwnerLessBase<context> {
261261
detail::getSyclObjImpl(const Obj &SyclObject);
262262

263263
template <class T>
264-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
264+
friend T detail::createSyclObjFromImpl(
265+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
266+
template <class T>
267+
friend T detail::createSyclObjFromImpl(
268+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
265269

266270
const property_list &getPropList() const;
267271
};

sycl/include/sycl/detail/impl_utils.hpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <cassert> // for assert
1212
#include <type_traits> // for add_pointer_t
13+
#include <utility> // for forward
1314

1415
namespace sycl {
1516
inline namespace _V1 {
@@ -34,10 +35,18 @@ const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject) {
3435
}
3536

3637
// Helper function for creation SYCL interface objects from implementations.
37-
// Note! This function relies on the fact that all SYCL interface classes
38+
// Note! These functions rely on the fact that all SYCL interface classes
3839
// contain "impl" field that points to implementation object. "impl" field
39-
// should be accessible from this function.
40-
template <class T> T createSyclObjFromImpl(decltype(T::impl) ImplObj) {
40+
// should be accessible from these functions.
41+
template <class T>
42+
T createSyclObjFromImpl(
43+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj) {
44+
return T(std::forward<decltype(ImplObj)>(ImplObj));
45+
}
46+
47+
template <class T>
48+
T createSyclObjFromImpl(
49+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj) {
4150
return T(ImplObj);
4251
}
4352

sycl/include/sycl/device.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ class __SYCL_EXPORT device : public detail::OwnerLessBase<device> {
362362

363363
private:
364364
std::shared_ptr<detail::device_impl> impl;
365-
device(std::shared_ptr<detail::device_impl> impl) : impl(impl) {}
365+
device(std::shared_ptr<detail::device_impl> Impl) : impl(std::move(Impl)) {}
366366

367367
ur_native_handle_t getNative() const;
368368

@@ -371,7 +371,11 @@ class __SYCL_EXPORT device : public detail::OwnerLessBase<device> {
371371
detail::getSyclObjImpl(const Obj &SyclObject);
372372

373373
template <class T>
374-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
374+
friend T detail::createSyclObjFromImpl(
375+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
376+
template <class T>
377+
friend T detail::createSyclObjFromImpl(
378+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
375379

376380
template <backend BackendName, class SyclObjectT>
377381
friend auto get_native(const SyclObjectT &Obj)

sycl/include/sycl/event.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,11 @@ class __SYCL_EXPORT event : public detail::OwnerLessBase<event> {
161161
detail::getSyclObjImpl(const Obj &SyclObject);
162162

163163
template <class T>
164-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
164+
friend T detail::createSyclObjFromImpl(
165+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
166+
template <class T>
167+
friend T detail::createSyclObjFromImpl(
168+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
165169

166170
template <backend BackendName, class SyclObjectT>
167171
friend auto get_native(const SyclObjectT &Obj)

sycl/include/sycl/ext/oneapi/backend/level_zero.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ make_kernel_bundle<backend::ext_oneapi_level_zero, bundle_state::executable>(
185185
BackendObject.Ownership == ext::oneapi::level_zero::ownership::keep,
186186
bundle_state::executable, backend::ext_oneapi_level_zero);
187187
return detail::createSyclObjFromImpl<kernel_bundle<bundle_state::executable>>(
188-
KBImpl);
188+
std::move(KBImpl));
189189
}
190190

191191
// Specialization of sycl::make_kernel for Level-Zero backend.

sycl/include/sycl/ext/oneapi/experimental/graph.hpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,11 @@ class __SYCL_EXPORT node {
158158
friend const decltype(Obj::impl) &
159159
sycl::detail::getSyclObjImpl(const Obj &SyclObject);
160160
template <class T>
161-
friend T sycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
161+
friend T sycl::detail::createSyclObjFromImpl(
162+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
163+
template <class T>
164+
friend T sycl::detail::createSyclObjFromImpl(
165+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
162166

163167
std::shared_ptr<detail::node_impl> impl;
164168
};
@@ -371,7 +375,11 @@ class __SYCL_EXPORT modifiable_command_graph
371375
friend const decltype(Obj::impl) &
372376
sycl::detail::getSyclObjImpl(const Obj &SyclObject);
373377
template <class T>
374-
friend T sycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
378+
friend T sycl::detail::createSyclObjFromImpl(
379+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
380+
template <class T>
381+
friend T sycl::detail::createSyclObjFromImpl(
382+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
375383
std::shared_ptr<detail::graph_impl> impl;
376384

377385
static void checkNodePropertiesAndThrow(const property_list &Properties);
@@ -471,7 +479,11 @@ class command_graph : public detail::modifiable_command_graph {
471479
: modifiable_command_graph(Impl) {}
472480

473481
template <class T>
474-
friend T sycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
482+
friend T sycl::detail::createSyclObjFromImpl(
483+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
484+
template <class T>
485+
friend T sycl::detail::createSyclObjFromImpl(
486+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
475487
};
476488

477489
template <>

sycl/include/sycl/ext/oneapi/virtual_mem/physical_mem.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ class __SYCL_EXPORT physical_mem
6363
sycl::detail::getSyclObjImpl(const Obj &SyclObject);
6464

6565
template <class T>
66-
friend T sycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
66+
friend T sycl::detail::createSyclObjFromImpl(
67+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
6768
};
6869

6970
} // namespace ext::oneapi::experimental

sycl/include/sycl/handler.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ class __SYCL_EXPORT handler {
639639
int ArgIndex,
640640
accessor<DataT, Dims, AccessMode, AccessTarget, IsPlaceholder> &&Arg) {
641641
detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Arg;
642-
detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl(*AccBase);
642+
const detail::AccessorImplPtr &AccImpl = detail::getSyclObjImpl(*AccBase);
643643
detail::AccessorImplHost *Req = AccImpl.get();
644644
// Add accessor to the list of arguments.
645645
addArg(detail::kernel_param_kind_t::kind_accessor, Req,

sycl/include/sycl/image.hpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,7 +1003,12 @@ class unsampled_image
10031003
detail::getSyclObjImpl(const Obj &SyclObject);
10041004

10051005
template <class T>
1006-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
1006+
friend T detail::createSyclObjFromImpl(
1007+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1008+
1009+
template <class T>
1010+
friend T detail::createSyclObjFromImpl(
1011+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
10071012

10081013
template <typename DataT, int Dims, access_mode AccessMode>
10091014
friend class host_unsampled_image_accessor;
@@ -1139,7 +1144,12 @@ class sampled_image
11391144
detail::getSyclObjImpl(const Obj &SyclObject);
11401145

11411146
template <class T>
1142-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
1147+
friend T detail::createSyclObjFromImpl(
1148+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1149+
1150+
template <class T>
1151+
friend T detail::createSyclObjFromImpl(
1152+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
11431153

11441154
template <typename DataT, int Dims> friend class host_sampled_image_accessor;
11451155

sycl/include/sycl/kernel.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,11 @@ class __SYCL_EXPORT kernel : public detail::OwnerLessBase<kernel> {
264264
friend const decltype(Obj::impl) &
265265
detail::getSyclObjImpl(const Obj &SyclObject);
266266
template <class T>
267-
friend T detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
267+
friend T detail::createSyclObjFromImpl(
268+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
269+
template <class T>
270+
friend T detail::createSyclObjFromImpl(
271+
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
268272
template <backend BackendName, class SyclObjectT>
269273
friend auto get_native(const SyclObjectT &Obj)
270274
-> backend_return_t<BackendName, SyclObjectT>;

0 commit comments

Comments
 (0)