Skip to content

Commit 54655a2

Browse files
[SYCL][ABI-break] Promote extended CG/handler members (#6555)
Several new members were added to CG/handler via the extended member workaround. This patch promotes them to actual fields of those classes now that the ABI can be broken.
1 parent c759789 commit 54655a2

File tree

13 files changed

+234
-355
lines changed

13 files changed

+234
-355
lines changed

sycl/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ set(SYCL_MINOR_VERSION 7)
3030
set(SYCL_PATCH_VERSION 0)
3131
# Don't forget to re-enable sycl_symbols_windows.dump once we leave ABI-breaking
3232
# window!
33-
set(SYCL_DEV_ABI_VERSION 8)
33+
set(SYCL_DEV_ABI_VERSION 9)
3434
if (SYCL_ADD_DEV_VERSION_POSTFIX)
3535
set(SYCL_VERSION_POSTFIX "-${SYCL_DEV_ABI_VERSION}")
3636
endif()

sycl/include/sycl/detail/cg.hpp

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,9 @@ namespace detail {
8888
// with the desired type.
8989
// This allows changing/extending the contents of this vector without changing
9090
// the version.
91-
//
9291

9392
// Used to represent a type of an extended member
94-
enum class ExtendedMembersType : unsigned int {
95-
HANDLER_KERNEL_BUNDLE = 0,
96-
HANDLER_MEM_ADVICE,
97-
// handler_impl is stored in the exended members to avoid breaking ABI.
98-
// TODO: This should be made a member of the handler class once ABI can be
99-
// broken.
100-
HANDLER_IMPL,
101-
};
93+
enum class ExtendedMembersType : unsigned int { PLACEHOLDER_TYPE };
10294

10395
// Holds a pointer to an object of an arbitrary type and an ID value which
10496
// should be used to understand what type pointer points to.
@@ -244,6 +236,7 @@ class CGExecKernel : public CG {
244236
NDRDescT MNDRDesc;
245237
std::unique_ptr<HostKernelBase> MHostKernel;
246238
std::shared_ptr<detail::kernel_impl> MSyclKernel;
239+
std::shared_ptr<detail::kernel_bundle_impl> MKernelBundle;
247240
std::vector<ArgDesc> MArgs;
248241
std::string MKernelName;
249242
detail::OSModuleHandle MOSModuleHandle;
@@ -252,6 +245,7 @@ class CGExecKernel : public CG {
252245

253246
CGExecKernel(NDRDescT NDRDesc, std::unique_ptr<HostKernelBase> HKernel,
254247
std::shared_ptr<detail::kernel_impl> SyclKernel,
248+
std::shared_ptr<detail::kernel_bundle_impl> KernelBundle,
255249
std::vector<std::vector<char>> ArgsStorage,
256250
std::vector<detail::AccessorImplPtr> AccStorage,
257251
std::vector<std::shared_ptr<const void>> SharedPtrStorage,
@@ -266,7 +260,8 @@ class CGExecKernel : public CG {
266260
std::move(SharedPtrStorage), std::move(Requirements),
267261
std::move(Events), std::move(loc)),
268262
MNDRDesc(std::move(NDRDesc)), MHostKernel(std::move(HKernel)),
269-
MSyclKernel(std::move(SyclKernel)), MArgs(std::move(Args)),
263+
MSyclKernel(std::move(SyclKernel)),
264+
MKernelBundle(std::move(KernelBundle)), MArgs(std::move(Args)),
270265
MKernelName(std::move(KernelName)), MOSModuleHandle(OSModuleHandle),
271266
MStreams(std::move(Streams)),
272267
MAuxiliaryResources(std::move(AuxiliaryResources)) {
@@ -285,15 +280,7 @@ class CGExecKernel : public CG {
285280
}
286281

287282
std::shared_ptr<detail::kernel_bundle_impl> getKernelBundle() {
288-
const std::shared_ptr<std::vector<ExtendedMemberT>> &ExtendedMembers =
289-
getExtendedMembers();
290-
if (!ExtendedMembers)
291-
return nullptr;
292-
for (const ExtendedMemberT &EMember : *ExtendedMembers)
293-
if (ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType)
294-
return std::static_pointer_cast<detail::kernel_bundle_impl>(
295-
EMember.MData);
296-
return nullptr;
283+
return MKernelBundle;
297284
}
298285

299286
void clearStreams() { MStreams.clear(); }
@@ -435,9 +422,10 @@ class CGPrefetchUSM : public CG {
435422
class CGAdviseUSM : public CG {
436423
void *MDst;
437424
size_t MLength;
425+
pi_mem_advice MAdvice;
438426

439427
public:
440-
CGAdviseUSM(void *DstPtr, size_t Length,
428+
CGAdviseUSM(void *DstPtr, size_t Length, pi_mem_advice Advice,
441429
std::vector<std::vector<char>> ArgsStorage,
442430
std::vector<detail::AccessorImplPtr> AccStorage,
443431
std::vector<std::shared_ptr<const void>> SharedPtrStorage,
@@ -447,19 +435,10 @@ class CGAdviseUSM : public CG {
447435
: CG(Type, std::move(ArgsStorage), std::move(AccStorage),
448436
std::move(SharedPtrStorage), std::move(Requirements),
449437
std::move(Events), std::move(loc)),
450-
MDst(DstPtr), MLength(Length) {}
438+
MDst(DstPtr), MLength(Length), MAdvice(Advice) {}
451439
void *getDst() { return MDst; }
452440
size_t getLength() { return MLength; }
453-
454-
pi_mem_advice getAdvice() {
455-
auto ExtendedMembers = getExtendedMembers();
456-
if (!ExtendedMembers)
457-
return PI_MEM_ADVICE_UNKNOWN;
458-
for (const ExtendedMemberT &EM : *ExtendedMembers)
459-
if ((ExtendedMembersType::HANDLER_MEM_ADVICE == EM.MType) && EM.MData)
460-
return *std::static_pointer_cast<pi_mem_advice>(EM.MData);
461-
return PI_MEM_ADVICE_UNKNOWN;
462-
}
441+
pi_mem_advice getAdvice() { return MAdvice; }
463442
};
464443

465444
class CGInteropTask : public CG {

sycl/include/sycl/handler.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,9 +1283,6 @@ class __SYCL_EXPORT handler {
12831283
kernel_parallel_for_work_group<KernelName, ElementType>(KernelFunc);
12841284
}
12851285

1286-
std::shared_ptr<detail::handler_impl> getHandlerImpl() const;
1287-
std::shared_ptr<detail::handler_impl> evictHandlerImpl() const;
1288-
12891286
void setStateExplicitKernelBundle();
12901287
void setStateSpecConstSet();
12911288
bool isStateExplicitKernelBundle() const;
@@ -2568,6 +2565,7 @@ class __SYCL_EXPORT handler {
25682565
void mem_advise(const void *Ptr, size_t Length, int Advice);
25692566

25702567
private:
2568+
std::shared_ptr<detail::handler_impl> MImpl;
25712569
std::shared_ptr<detail::queue_impl> MQueue;
25722570
/// The storage for the arguments passed.
25732571
/// We need to store a copy of values that are passed explicitly through

sycl/source/detail/handler_impl.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ class handler_impl {
6868

6969
// Stores auxiliary resources used by internal operations.
7070
std::vector<std::shared_ptr<const void>> MAuxiliaryResources;
71+
72+
std::shared_ptr<detail::kernel_bundle_impl> MKernelBundle;
73+
74+
pi_mem_advice MAdvice;
7175
};
7276

7377
} // namespace detail

sycl/source/handler.cpp

Lines changed: 26 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -35,139 +35,51 @@ handler::handler(std::shared_ptr<detail::queue_impl> Queue,
3535
std::shared_ptr<detail::queue_impl> PrimaryQueue,
3636
std::shared_ptr<detail::queue_impl> SecondaryQueue,
3737
bool IsHost)
38-
: MQueue(std::move(Queue)), MIsHost(IsHost) {
38+
: MImpl(std::make_shared<detail::handler_impl>(std::move(PrimaryQueue),
39+
std::move(SecondaryQueue))),
40+
MQueue(std::move(Queue)), MIsHost(IsHost) {
3941
// Create extended members and insert handler_impl
40-
// TODO: When allowed to break ABI the handler_impl should be made a member
41-
// of the handler class.
4242
auto ExtendedMembers =
4343
std::make_shared<std::vector<detail::ExtendedMemberT>>();
44-
detail::ExtendedMemberT HandlerImplMember = {
45-
detail::ExtendedMembersType::HANDLER_IMPL,
46-
std::make_shared<detail::handler_impl>(std::move(PrimaryQueue),
47-
std::move(SecondaryQueue))};
48-
ExtendedMembers->push_back(std::move(HandlerImplMember));
4944
MSharedPtrStorage.push_back(std::move(ExtendedMembers));
5045
}
5146

52-
static detail::ExtendedMemberT &getHandlerImplMember(
53-
std::vector<std::shared_ptr<const void>> &SharedPtrStorage) {
54-
assert(!SharedPtrStorage.empty());
55-
std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
56-
detail::convertToExtendedMembers(SharedPtrStorage[0]);
57-
assert(ExtendedMembersVec->size() > 0);
58-
auto &HandlerImplMember = (*ExtendedMembersVec)[0];
59-
assert(detail::ExtendedMembersType::HANDLER_IMPL == HandlerImplMember.MType);
60-
return HandlerImplMember;
61-
}
62-
63-
/// Gets the handler_impl at the start of the extended members.
64-
std::shared_ptr<detail::handler_impl> handler::getHandlerImpl() const {
65-
std::lock_guard<std::mutex> Lock(
66-
detail::GlobalHandler::instance().getHandlerExtendedMembersMutex());
67-
return std::static_pointer_cast<detail::handler_impl>(
68-
getHandlerImplMember(MSharedPtrStorage).MData);
69-
}
70-
71-
/// Gets the handler_impl at the start of the extended members and removes it.
72-
std::shared_ptr<detail::handler_impl> handler::evictHandlerImpl() const {
73-
std::lock_guard<std::mutex> Lock(
74-
detail::GlobalHandler::instance().getHandlerExtendedMembersMutex());
75-
auto &HandlerImplMember = getHandlerImplMember(MSharedPtrStorage);
76-
auto Impl =
77-
std::static_pointer_cast<detail::handler_impl>(HandlerImplMember.MData);
78-
79-
// Reset the data of the member.
80-
// NOTE: We let it stay because removing the front can be expensive. This will
81-
// be improved when the impl is made a member of handler. In fact eviction is
82-
// likely to not be needed when that happens.
83-
HandlerImplMember.MData.reset();
84-
85-
return Impl;
86-
}
87-
8847
// Sets the submission state to indicate that an explicit kernel bundle has been
8948
// set. Throws a sycl::exception with errc::invalid if the current state
9049
// indicates that a specialization constant has been set.
9150
void handler::setStateExplicitKernelBundle() {
92-
getHandlerImpl()->setStateExplicitKernelBundle();
51+
MImpl->setStateExplicitKernelBundle();
9352
}
9453

9554
// Sets the submission state to indicate that a specialization constant has been
9655
// set. Throws a sycl::exception with errc::invalid if the current state
9756
// indicates that an explicit kernel bundle has been set.
98-
void handler::setStateSpecConstSet() {
99-
getHandlerImpl()->setStateSpecConstSet();
100-
}
57+
void handler::setStateSpecConstSet() { MImpl->setStateSpecConstSet(); }
10158

10259
// Returns true if the submission state is EXPLICIT_KERNEL_BUNDLE_STATE and
10360
// false otherwise.
10461
bool handler::isStateExplicitKernelBundle() const {
105-
return getHandlerImpl()->isStateExplicitKernelBundle();
62+
return MImpl->isStateExplicitKernelBundle();
10663
}
10764

108-
// Returns a shared_ptr to kernel_bundle stored in the extended members vector.
65+
// Returns a shared_ptr to the kernel_bundle.
10966
// If there is no kernel_bundle created:
11067
// returns newly created kernel_bundle if Insert is true
11168
// returns shared_ptr(nullptr) if Insert is false
11269
std::shared_ptr<detail::kernel_bundle_impl>
11370
handler::getOrInsertHandlerKernelBundle(bool Insert) const {
114-
115-
std::lock_guard<std::mutex> Lock(
116-
detail::GlobalHandler::instance().getHandlerExtendedMembersMutex());
117-
118-
assert(!MSharedPtrStorage.empty());
119-
120-
std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
121-
detail::convertToExtendedMembers(MSharedPtrStorage[0]);
122-
// Look for the kernel bundle in extended members
123-
std::shared_ptr<detail::kernel_bundle_impl> KernelBundleImpPtr;
124-
for (const detail::ExtendedMemberT &EMember : *ExtendedMembersVec)
125-
if (detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType) {
126-
KernelBundleImpPtr =
127-
std::static_pointer_cast<detail::kernel_bundle_impl>(EMember.MData);
128-
break;
129-
}
130-
131-
// No kernel bundle yet, create one
132-
if (!KernelBundleImpPtr && Insert) {
133-
// Create an empty kernel bundle to add kernels to later
134-
KernelBundleImpPtr =
71+
if (!MImpl->MKernelBundle && Insert) {
72+
MImpl->MKernelBundle =
13573
detail::getSyclObjImpl(get_kernel_bundle<bundle_state::input>(
13674
MQueue->get_context(), {MQueue->get_device()}, {}));
137-
138-
detail::ExtendedMemberT EMember = {
139-
detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE, KernelBundleImpPtr};
140-
ExtendedMembersVec->push_back(EMember);
14175
}
142-
143-
return KernelBundleImpPtr;
76+
return MImpl->MKernelBundle;
14477
}
14578

146-
// Sets kernel bundle to the provided one. Either replaces existing one or
147-
// create a new entry in the extended members vector.
79+
// Sets kernel bundle to the provided one.
14880
void handler::setHandlerKernelBundle(
14981
const std::shared_ptr<detail::kernel_bundle_impl> &NewKernelBundleImpPtr) {
150-
assert(!MSharedPtrStorage.empty());
151-
152-
std::lock_guard<std::mutex> Lock(
153-
detail::GlobalHandler::instance().getHandlerExtendedMembersMutex());
154-
155-
std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExendedMembersVec =
156-
detail::convertToExtendedMembers(MSharedPtrStorage[0]);
157-
158-
// Look for kernel bundle in extended members and overwrite it.
159-
for (detail::ExtendedMemberT &EMember : *ExendedMembersVec) {
160-
if (detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType) {
161-
EMember.MData = NewKernelBundleImpPtr;
162-
return;
163-
}
164-
}
165-
166-
// Kernel bundle was set found so we add it.
167-
detail::ExtendedMemberT EMember = {
168-
detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE,
169-
NewKernelBundleImpPtr};
170-
ExendedMembersVec->push_back(EMember);
82+
MImpl->MKernelBundle = NewKernelBundleImpPtr;
17183
}
17284

17385
event handler::finalize() {
@@ -186,7 +98,7 @@ event handler::finalize() {
18698
if (KernelBundleImpPtr) {
18799
// Make sure implicit non-interop kernel bundles have the kernel
188100
if (!KernelBundleImpPtr->isInterop() &&
189-
!getHandlerImpl()->isStateExplicitKernelBundle()) {
101+
!MImpl->isStateExplicitKernelBundle()) {
190102
kernel_id KernelID =
191103
detail::ProgramManager::getInstance().getSYCLKernelID(MKernelName);
192104
bool KernelInserted =
@@ -299,10 +211,6 @@ event handler::finalize() {
299211
return MLastEvent;
300212
}
301213

302-
// Evict handler_impl from extended members to make sure the command group
303-
// does not keep it alive.
304-
std::shared_ptr<detail::handler_impl> Impl = evictHandlerImpl();
305-
306214
std::unique_ptr<detail::CG> CommandGroup;
307215
switch (type) {
308216
case detail::CG::Kernel:
@@ -312,11 +220,11 @@ event handler::finalize() {
312220
// assert feature to check if kernel uses assertions
313221
CommandGroup.reset(new detail::CGExecKernel(
314222
std::move(MNDRDesc), std::move(MHostKernel), std::move(MKernel),
315-
std::move(MArgsStorage), std::move(MAccStorage),
316-
std::move(MSharedPtrStorage), std::move(MRequirements),
317-
std::move(MEvents), std::move(MArgs), MKernelName, MOSModuleHandle,
318-
std::move(MStreamStorage), std::move(Impl->MAuxiliaryResources),
319-
MCGType, MCodeLoc));
223+
std::move(MImpl->MKernelBundle), std::move(MArgsStorage),
224+
std::move(MAccStorage), std::move(MSharedPtrStorage),
225+
std::move(MRequirements), std::move(MEvents), std::move(MArgs),
226+
MKernelName, MOSModuleHandle, std::move(MStreamStorage),
227+
std::move(MImpl->MAuxiliaryResources), MCGType, MCodeLoc));
320228
break;
321229
}
322230
case detail::CG::CodeplayInteropTask:
@@ -365,9 +273,9 @@ event handler::finalize() {
365273
break;
366274
case detail::CG::AdviseUSM:
367275
CommandGroup.reset(new detail::CGAdviseUSM(
368-
MDstPtr, MLength, std::move(MArgsStorage), std::move(MAccStorage),
369-
std::move(MSharedPtrStorage), std::move(MRequirements),
370-
std::move(MEvents), MCGType, MCodeLoc));
276+
MDstPtr, MLength, MImpl->MAdvice, std::move(MArgsStorage),
277+
std::move(MAccStorage), std::move(MSharedPtrStorage),
278+
std::move(MRequirements), std::move(MEvents), MCGType, MCodeLoc));
371279
break;
372280
case detail::CG::CodeplayHostTask:
373281
CommandGroup.reset(new detail::CGHostTask(
@@ -405,7 +313,7 @@ event handler::finalize() {
405313
}
406314

407315
void handler::addReduction(const std::shared_ptr<const void> &ReduObj) {
408-
getHandlerImpl()->MAuxiliaryResources.push_back(ReduObj);
316+
MImpl->MAuxiliaryResources.push_back(ReduObj);
409317
}
410318

411319
void handler::associateWithHandler(detail::AccessorBaseHost *AccBase,
@@ -674,7 +582,7 @@ void handler::verifyUsedKernelBundle(const std::string &KernelName) {
674582
return;
675583

676584
// Implicit kernel bundles are populated late so we ignore them
677-
if (!getHandlerImpl()->isStateExplicitKernelBundle())
585+
if (!MImpl->isStateExplicitKernelBundle())
678586
return;
679587

680588
kernel_id KernelID = detail::get_kernel_id_impl(KernelName);
@@ -741,36 +649,23 @@ void handler::mem_advise(const void *Ptr, size_t Count, int Advice) {
741649
throwIfActionIsCreated();
742650
MDstPtr = const_cast<void *>(Ptr);
743651
MLength = Count;
652+
MImpl->MAdvice = static_cast<pi_mem_advice>(Advice);
744653
setType(detail::CG::AdviseUSM);
745-
746-
assert(!MSharedPtrStorage.empty());
747-
748-
std::lock_guard<std::mutex> Lock(
749-
detail::GlobalHandler::instance().getHandlerExtendedMembersMutex());
750-
751-
std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
752-
detail::convertToExtendedMembers(MSharedPtrStorage[0]);
753-
754-
detail::ExtendedMemberT EMember = {
755-
detail::ExtendedMembersType::HANDLER_MEM_ADVICE,
756-
std::make_shared<pi_mem_advice>(pi_mem_advice(Advice))};
757-
758-
ExtendedMembersVec->push_back(EMember);
759654
}
760655

761656
void handler::use_kernel_bundle(
762657
const kernel_bundle<bundle_state::executable> &ExecBundle) {
763658

764659
std::shared_ptr<detail::queue_impl> PrimaryQueue =
765-
getHandlerImpl()->MSubmissionPrimaryQueue;
660+
MImpl->MSubmissionPrimaryQueue;
766661
if (PrimaryQueue->get_context() != ExecBundle.get_context())
767662
throw sycl::exception(
768663
make_error_code(errc::invalid),
769664
"Context associated with the primary queue is different from the "
770665
"context associated with the kernel bundle");
771666

772667
std::shared_ptr<detail::queue_impl> SecondaryQueue =
773-
getHandlerImpl()->MSubmissionSecondaryQueue;
668+
MImpl->MSubmissionSecondaryQueue;
774669
if (SecondaryQueue &&
775670
SecondaryQueue->get_context() != ExecBundle.get_context())
776671
throw sycl::exception(

0 commit comments

Comments
 (0)