| //===----------------------------------------------------------------------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// This file contains the definition of wrappers that manage device resources |
| /// like buffers, binaries, and kernels. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MATHTEST_DEVICERESOURCES_HPP |
| #define MATHTEST_DEVICERESOURCES_HPP |
| |
| #include "mathtest/OffloadForward.hpp" |
| |
| #include "llvm/ADT/ArrayRef.h" |
| |
| #include <cstddef> |
| #include <memory> |
| #include <utility> |
| |
| namespace mathtest { |
| |
| class DeviceContext; |
| |
| namespace detail { |
| |
| void freeDeviceMemory(void *Address) noexcept; |
| } // namespace detail |
| |
| //===----------------------------------------------------------------------===// |
| // ManagedBuffer |
| //===----------------------------------------------------------------------===// |
| |
| template <typename T> class [[nodiscard]] ManagedBuffer { |
| public: |
| ~ManagedBuffer() noexcept { |
| if (Address) |
| detail::freeDeviceMemory(Address); |
| } |
| |
| ManagedBuffer(const ManagedBuffer &) = delete; |
| ManagedBuffer &operator=(const ManagedBuffer &) = delete; |
| |
| ManagedBuffer(ManagedBuffer &&Other) noexcept |
| : Address(Other.Address), Size(Other.Size) { |
| Other.Address = nullptr; |
| Other.Size = 0; |
| } |
| |
| ManagedBuffer &operator=(ManagedBuffer &&Other) noexcept { |
| if (this == &Other) |
| return *this; |
| |
| if (Address) |
| detail::freeDeviceMemory(Address); |
| |
| Address = Other.Address; |
| Size = Other.Size; |
| |
| Other.Address = nullptr; |
| Other.Size = 0; |
| |
| return *this; |
| } |
| |
| [[nodiscard]] T *data() noexcept { return Address; } |
| |
| [[nodiscard]] const T *data() const noexcept { return Address; } |
| |
| [[nodiscard]] std::size_t getSize() const noexcept { return Size; } |
| |
| [[nodiscard]] operator llvm::MutableArrayRef<T>() noexcept { |
| return llvm::MutableArrayRef<T>(data(), getSize()); |
| } |
| |
| [[nodiscard]] operator llvm::ArrayRef<T>() const noexcept { |
| return llvm::ArrayRef<T>(data(), getSize()); |
| } |
| |
| private: |
| friend class DeviceContext; |
| |
| explicit ManagedBuffer(T *Address, std::size_t Size) noexcept |
| : Address(Address), Size(Size) {} |
| |
| T *Address = nullptr; |
| std::size_t Size = 0; |
| }; |
| |
| //===----------------------------------------------------------------------===// |
| // DeviceImage |
| //===----------------------------------------------------------------------===// |
| |
| class [[nodiscard]] DeviceImage { |
| public: |
| ~DeviceImage() noexcept; |
| DeviceImage &operator=(DeviceImage &&Other) noexcept; |
| |
| DeviceImage(const DeviceImage &) = delete; |
| DeviceImage &operator=(const DeviceImage &) = delete; |
| |
| DeviceImage(DeviceImage &&Other) noexcept; |
| |
| private: |
| friend class DeviceContext; |
| |
| explicit DeviceImage(ol_device_handle_t DeviceHandle, |
| ol_program_handle_t Handle) noexcept; |
| |
| ol_device_handle_t DeviceHandle = nullptr; |
| ol_program_handle_t Handle = nullptr; |
| }; |
| |
| //===----------------------------------------------------------------------===// |
| // DeviceKernel |
| //===----------------------------------------------------------------------===// |
| |
| template <typename KernelSignature> class [[nodiscard]] DeviceKernel { |
| public: |
| DeviceKernel() = delete; |
| |
| DeviceKernel(const DeviceKernel &) = default; |
| DeviceKernel &operator=(const DeviceKernel &) = default; |
| DeviceKernel(DeviceKernel &&) noexcept = default; |
| DeviceKernel &operator=(DeviceKernel &&) noexcept = default; |
| |
| private: |
| friend class DeviceContext; |
| |
| explicit DeviceKernel(std::shared_ptr<DeviceImage> Image, |
| ol_symbol_handle_t Kernel) |
| : Image(std::move(Image)), Handle(Kernel) {} |
| |
| std::shared_ptr<DeviceImage> Image; |
| ol_symbol_handle_t Handle = nullptr; |
| }; |
| } // namespace mathtest |
| |
| #endif // MATHTEST_DEVICERESOURCES_HPP |