-
Notifications
You must be signed in to change notification settings - Fork 809
[SYCL] Handler exceptions on mutually exclusive operations #4639
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
ef79ff6
4a25092
6626bd3
99c4a0e
8391e73
16880f2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| //==---------------- handler_impl.hpp - SYCL handler -----------------------==// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #pragma once | ||
|
|
||
| #include <detail/kernel_bundle_impl.hpp> | ||
|
|
||
| __SYCL_INLINE_NAMESPACE(cl) { | ||
| namespace sycl { | ||
| namespace detail { | ||
|
|
||
| using KernelBundleImplPtr = std::shared_ptr<detail::kernel_bundle_impl>; | ||
|
|
||
| enum class HandlerSubmissionState : std::uint8_t { | ||
| NO_STATE = 0, | ||
| EXPLICIT_KERNEL_BUNDLE_STATE, | ||
| SPEC_CONST_SET_STATE, | ||
| }; | ||
|
|
||
| class handler_impl { | ||
| public: | ||
| handler_impl() = default; | ||
|
|
||
| /// Registers mutually exclusive submission states. | ||
| HandlerSubmissionState MSubmissionState = | ||
| detail::HandlerSubmissionState::NO_STATE; | ||
| }; | ||
|
|
||
| } // namespace detail | ||
| } // namespace sycl | ||
| } // __SYCL_INLINE_NAMESPACE(cl) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -17,6 +17,7 @@ | |
| #include <CL/sycl/stream.hpp> | ||
| #include <detail/config.hpp> | ||
| #include <detail/global_handler.hpp> | ||
| #include <detail/handler_impl.hpp> | ||
| #include <detail/kernel_bundle_impl.hpp> | ||
| #include <detail/kernel_impl.hpp> | ||
| #include <detail/queue_impl.hpp> | ||
|
|
@@ -27,8 +28,124 @@ namespace sycl { | |
|
|
||
| handler::handler(std::shared_ptr<detail::queue_impl> Queue, bool IsHost) | ||
| : MQueue(std::move(Queue)), MIsHost(IsHost) { | ||
| MSharedPtrStorage.emplace_back( | ||
| std::make_shared<std::vector<detail::ExtendedMemberT>>()); | ||
| // Create extended members and insert handler_impl | ||
| // TODO: When allowed to break ABI the handler_impl should be made a member | ||
| // of the handler class. | ||
| auto ExtendedMembers = | ||
| std::make_shared<std::vector<detail::ExtendedMemberT>>(); | ||
| detail::ExtendedMemberT HandlerImplMember = { | ||
| detail::ExtendedMembersType::HANDLER_IMPL, | ||
| std::make_shared<detail::handler_impl>()}; | ||
| ExtendedMembers->push_back(std::move(HandlerImplMember)); | ||
| MSharedPtrStorage.push_back(std::move(ExtendedMembers)); | ||
| } | ||
|
|
||
| /// Gets the handler_impl at the start of the extended members. | ||
| // detail::GlobalHandler::instance().getHandlerExtendedMembersMutex() must | ||
| // be held when calling this function. | ||
| std::shared_ptr<detail::handler_impl> | ||
| getHandlerImpl(const std::shared_ptr<std::vector<detail::ExtendedMemberT>> | ||
| &ExtendedMembersVec) { | ||
| assert(ExtendedMembersVec->size() > 0); | ||
|
|
||
| auto HandlerImplMember = (*ExtendedMembersVec)[0]; | ||
|
|
||
| assert(detail::ExtendedMembersType::HANDLER_IMPL == HandlerImplMember.MType); | ||
|
|
||
| return std::static_pointer_cast<detail::handler_impl>( | ||
| HandlerImplMember.MData); | ||
| } | ||
|
|
||
| // Common implementation for getting/inserting handler kernel bundle. | ||
| // detail::GlobalHandler::instance().getHandlerExtendedMembersMutex() must | ||
| // be held when calling this function. | ||
| std::shared_ptr<detail::kernel_bundle_impl> | ||
| getOrInsertHandlerKernelBundleCommon( | ||
steffenlarsen marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| const std::shared_ptr<std::vector<detail::ExtendedMemberT>> | ||
| &ExtendedMembersVec, | ||
| const std::shared_ptr<detail::queue_impl> &Queue, bool Insert) { | ||
| // Look for the kernel bundle in extended members | ||
| std::shared_ptr<detail::kernel_bundle_impl> KernelBundleImpPtr; | ||
| for (const detail::ExtendedMemberT &EMember : *ExtendedMembersVec) | ||
| if (detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType) { | ||
| KernelBundleImpPtr = | ||
| std::static_pointer_cast<detail::kernel_bundle_impl>(EMember.MData); | ||
| break; | ||
| } | ||
|
|
||
| // No kernel bundle yet, create one | ||
| if (!KernelBundleImpPtr && Insert) { | ||
| KernelBundleImpPtr = detail::getSyclObjImpl( | ||
| get_kernel_bundle<bundle_state::input>(Queue->get_context())); | ||
| if (KernelBundleImpPtr->empty()) { | ||
| KernelBundleImpPtr = detail::getSyclObjImpl( | ||
| get_kernel_bundle<bundle_state::executable>(Queue->get_context())); | ||
| } | ||
|
|
||
| detail::ExtendedMemberT EMember = { | ||
| detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE, KernelBundleImpPtr}; | ||
| ExtendedMembersVec->push_back(EMember); | ||
| } | ||
|
|
||
| return KernelBundleImpPtr; | ||
| } | ||
|
|
||
| // If the submission state is SPEC_CONST_SET_STATE this function returns false. | ||
| // Otherwise it sets the submission state to EXPLICIT_KERNEL_BUNDLE_STATE and | ||
| // returns true. | ||
| bool handler::setStateExplicitKernel() { | ||
steffenlarsen marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| std::lock_guard<std::mutex> Lock( | ||
| detail::GlobalHandler::instance().getHandlerExtendedMembersMutex()); | ||
|
|
||
| assert(!MSharedPtrStorage.empty()); | ||
|
|
||
| std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExendedMembersVec = | ||
| detail::convertToExtendedMembers(MSharedPtrStorage[0]); | ||
|
|
||
| auto HandlerImpl = getHandlerImpl(ExendedMembersVec); | ||
steffenlarsen marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if (HandlerImpl->MSubmissionState == | ||
| detail::HandlerSubmissionState::SPEC_CONST_SET_STATE) | ||
| return false; | ||
|
||
| HandlerImpl->MSubmissionState = | ||
| detail::HandlerSubmissionState::EXPLICIT_KERNEL_BUNDLE_STATE; | ||
| return true; | ||
| } | ||
|
|
||
| // If the submission state is EXPLICIT_KERNEL_BUNDLE_STATE this function returns | ||
| // false. Otherwise it sets the submission state to SPEC_CONST_SET_STATE and | ||
| // returns true. | ||
| bool handler::setStateSpecConstSet() { | ||
| std::lock_guard<std::mutex> Lock( | ||
| detail::GlobalHandler::instance().getHandlerExtendedMembersMutex()); | ||
|
|
||
| assert(!MSharedPtrStorage.empty()); | ||
|
|
||
| std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExendedMembersVec = | ||
| detail::convertToExtendedMembers(MSharedPtrStorage[0]); | ||
|
|
||
| auto HandlerImpl = getHandlerImpl(ExendedMembersVec); | ||
| if (HandlerImpl->MSubmissionState == | ||
| detail::HandlerSubmissionState::EXPLICIT_KERNEL_BUNDLE_STATE) | ||
| return false; | ||
| HandlerImpl->MSubmissionState = | ||
| detail::HandlerSubmissionState::SPEC_CONST_SET_STATE; | ||
| return true; | ||
| } | ||
|
|
||
| // Returns true if the submission state is EXPLICIT_KERNEL_BUNDLE_STATE and | ||
| // false otherwise. | ||
| bool handler::isStateExplicitKernel() const { | ||
| std::lock_guard<std::mutex> Lock( | ||
| detail::GlobalHandler::instance().getHandlerExtendedMembersMutex()); | ||
|
|
||
| assert(!MSharedPtrStorage.empty()); | ||
|
|
||
| std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExendedMembersVec = | ||
| detail::convertToExtendedMembers(MSharedPtrStorage[0]); | ||
|
|
||
| auto HandlerImpl = getHandlerImpl(ExendedMembersVec); | ||
| return HandlerImpl->MSubmissionState == | ||
| detail::HandlerSubmissionState::EXPLICIT_KERNEL_BUNDLE_STATE; | ||
| } | ||
|
|
||
| // Returns a shared_ptr to kernel_bundle stored in the extended members vector. | ||
|
|
@@ -43,12 +160,11 @@ handler::getOrInsertHandlerKernelBundle(bool Insert) const { | |
|
|
||
| assert(!MSharedPtrStorage.empty()); | ||
|
|
||
| std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExendedMembersVec = | ||
| std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec = | ||
| detail::convertToExtendedMembers(MSharedPtrStorage[0]); | ||
|
|
||
| // Look for the kernel bundle in extended members | ||
| std::shared_ptr<detail::kernel_bundle_impl> KernelBundleImpPtr; | ||
| for (const detail::ExtendedMemberT &EMember : *ExendedMembersVec) | ||
| for (const detail::ExtendedMemberT &EMember : *ExtendedMembersVec) | ||
| if (detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType) { | ||
| KernelBundleImpPtr = | ||
| std::static_pointer_cast<detail::kernel_bundle_impl>(EMember.MData); | ||
|
|
@@ -66,8 +182,7 @@ handler::getOrInsertHandlerKernelBundle(bool Insert) const { | |
|
|
||
| detail::ExtendedMemberT EMember = { | ||
| detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE, KernelBundleImpPtr}; | ||
|
|
||
| ExendedMembersVec->push_back(EMember); | ||
| ExtendedMembersVec->push_back(EMember); | ||
| } | ||
|
|
||
| return KernelBundleImpPtr; | ||
|
|
@@ -85,16 +200,18 @@ void handler::setHandlerKernelBundle( | |
| std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExendedMembersVec = | ||
| detail::convertToExtendedMembers(MSharedPtrStorage[0]); | ||
|
|
||
| for (detail::ExtendedMemberT &EMember : *ExendedMembersVec) | ||
| // Look for kernel bundle in extended members and overwrite it. | ||
| for (detail::ExtendedMemberT &EMember : *ExendedMembersVec) { | ||
| if (detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType) { | ||
| EMember.MData = NewKernelBundleImpPtr; | ||
| return; | ||
| } | ||
| } | ||
|
|
||
| // Kernel bundle was set found so we add it. | ||
| detail::ExtendedMemberT EMember = { | ||
| detail::ExtendedMembersType::HANDLER_KERNEL_BUNDLE, | ||
| NewKernelBundleImpPtr}; | ||
|
|
||
| ExendedMembersVec->push_back(EMember); | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.