| //===----------------------------------------------------------------------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include <detail/handler_impl.hpp> |
| #include <detail/offload/offload_utils.hpp> |
| #include <detail/queue_impl.hpp> |
| #include <sycl/__impl/handler.hpp> |
| |
| _LIBSYCL_BEGIN_NAMESPACE_SYCL |
| |
| static void checkCommandGroupFunction( |
| const std::function<std::shared_ptr<detail::EventImpl>()> &CGF) { |
| if (CGF) { |
| throw sycl::exception( |
| sycl::make_error_code(sycl::errc::invalid), |
| "Attempt to set multiple actions for the command group"); |
| } |
| } |
| |
| void handler::submitKernelImpl(detail::DeviceKernelInfo &KernelInfo, |
| void *ArgData, size_t ArgSize) { |
| checkCommandGroupFunction(MImpl.MCGF); |
| MImpl.MArgData.resize(ArgSize); |
| std::memcpy(MImpl.MArgData.data(), ArgData, ArgSize); |
| MImpl.MCGF = [this, &KernelInfo]() { |
| auto EventsImpl = detail::getSyclObjImpls(MDepEvents); |
| MImpl.MQueue.setKernelLaunchParams(std::move(EventsImpl), MImpl.MRange); |
| MImpl.MQueue.submitKernelImpl(KernelInfo, MImpl.MArgData.data(), |
| MImpl.MArgData.size()); |
| return MImpl.MQueue.getLastEvent(); |
| }; |
| } |
| |
| void handler::setKernelRange(const detail::UnifiedRangeView &Range) { |
| MImpl.MRange = convertToOlRange(Range); |
| } |
| |
| void handler::memcpy(void *dest, const void *src, std::size_t numBytes) { |
| checkCommandGroupFunction(MImpl.MCGF); |
| MImpl.MCGF = [this, dest, src, numBytes]() { |
| return MImpl.MQueue.memcpy(dest, src, numBytes, |
| detail::getSyclObjImpls(MDepEvents)); |
| }; |
| } |
| |
| std::shared_ptr<detail::EventImpl> handler::finalize() { |
| if (MImpl.MCGF) |
| return MImpl.MCGF(); |
| |
| auto EventsImpl = detail::getSyclObjImpls(MDepEvents); |
| return MImpl.MQueue.submitWait(EventsImpl); |
| } |
| |
| _LIBSYCL_END_NAMESPACE_SYCL |