Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/llvmPublic

Commit44d4633

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 parenta0df523 commit44d4633

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
friendconstdecltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject);
557557

558558
template<classT>
559-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
559+
friend Tdetail::createSyclObjFromImpl(
560+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
561+
template<classT>
562+
friend Tdetail::createSyclObjFromImpl(
563+
std::add_lvalue_reference_t<constdecltype(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<classT>
595-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
599+
friend Tdetail::createSyclObjFromImpl(
600+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
601+
template<classT>
602+
friend Tdetail::createSyclObjFromImpl(
603+
std::add_lvalue_reference_t<constdecltype(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<classT>
854-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
862+
friend Tdetail::createSyclObjFromImpl(
863+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
864+
template<classT>
865+
friend Tdetail::createSyclObjFromImpl(
866+
std::add_lvalue_reference_t<constdecltype(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<classT>
2245-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
2257+
friend Tdetail::createSyclObjFromImpl(
2258+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
2259+
template<classT>
2260+
friend Tdetail::createSyclObjFromImpl(
2261+
std::add_lvalue_reference_t<constdecltype(T::impl)> ImplObj);
22462262

22472263
template<typename DataT_,int Dimensions_>friendclasslocal_accessor;
22482264

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

26602676
template<classT>
2661-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
2677+
friend Tdetail::createSyclObjFromImpl(
2678+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
2679+
template<classT>
2680+
friend Tdetail::createSyclObjFromImpl(
2681+
std::add_lvalue_reference_t<constdecltype(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<classT>
105-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
105+
friend Tdetail::createSyclObjFromImpl(
106+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
107+
108+
template<classT>
109+
friend Tdetail::createSyclObjFromImpl(
110+
std::add_lvalue_reference_t<constdecltype(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<classT>
176-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
181+
friend Tdetail::createSyclObjFromImpl(
182+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
183+
184+
template<classT>
185+
friend Tdetail::createSyclObjFromImpl(
186+
std::add_lvalue_reference_t<constdecltype(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<classT>
939-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
949+
friend Tdetail::createSyclObjFromImpl(
950+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
951+
952+
template<classT>
953+
friend Tdetail::createSyclObjFromImpl(
954+
std::add_lvalue_reference_t<constdecltype(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<classT>
1076-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
1091+
friend Tdetail::createSyclObjFromImpl(
1092+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1093+
1094+
template<classT>
1095+
friend Tdetail::createSyclObjFromImpl(
1096+
std::add_lvalue_reference_t<constdecltype(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<classT>
1220-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
1240+
friend Tdetail::createSyclObjFromImpl(
1241+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1242+
1243+
template<classT>
1244+
friend Tdetail::createSyclObjFromImpl(
1245+
std::add_lvalue_reference_t<constdecltype(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<classT>
1324-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
1349+
friend Tdetail::createSyclObjFromImpl(
1350+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1351+
1352+
template<classT>
1353+
friend Tdetail::createSyclObjFromImpl(
1354+
std::add_lvalue_reference_t<constdecltype(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<classT>
264-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
264+
friend Tdetail::createSyclObjFromImpl(
265+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
266+
template<classT>
267+
friend Tdetail::createSyclObjFromImpl(
268+
std::add_lvalue_reference_t<constdecltype(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
namespacesycl {
1516
inlinenamespace_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<classT> TcreateSyclObjFromImpl(decltype(T::impl) ImplObj) {
40+
// should be accessible from these functions.
41+
template<classT>
42+
TcreateSyclObjFromImpl(
43+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj) {
44+
returnT(std::forward<decltype(ImplObj)>(ImplObj));
45+
}
46+
47+
template<classT>
48+
TcreateSyclObjFromImpl(
49+
std::add_lvalue_reference_t<constdecltype(T::impl)> ImplObj) {
4150
returnT(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_tgetNative()const;
368368

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

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

376380
template<backend BackendName,classSyclObjectT>
377381
friendautoget_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<classT>
164-
friend Tdetail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
164+
friend Tdetail::createSyclObjFromImpl(
165+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
166+
template<classT>
167+
friend Tdetail::createSyclObjFromImpl(
168+
std::add_lvalue_reference_t<constdecltype(T::impl)> ImplObj);
165169

166170
template<backend BackendName,classSyclObjectT>
167171
friendautoget_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
friendconstdecltype(Obj::impl) &
159159
sycl::detail::getSyclObjImpl(const Obj &SyclObject);
160160
template<classT>
161-
friend Tsycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
161+
friend Tsycl::detail::createSyclObjFromImpl(
162+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
163+
template<classT>
164+
friend Tsycl::detail::createSyclObjFromImpl(
165+
std::add_lvalue_reference_t<constdecltype(T::impl)> ImplObj);
162166

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

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

473481
template<classT>
474-
friend Tsycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
482+
friend Tsycl::detail::createSyclObjFromImpl(
483+
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
484+
template<classT>
485+
friend Tsycl::detail::createSyclObjFromImpl(
486+
std::add_lvalue_reference_t<constdecltype(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<classT>
66-
friend Tsycl::detail::createSyclObjFromImpl(decltype(T::impl) ImplObj);
66+
friend Tsycl::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+
constdetail::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,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp