File indexing completed on 2023-11-11 05:36:29
0001 #ifndef DataFormats_Portable_interface_PortableHostCollection_h
0002 #define DataFormats_Portable_interface_PortableHostCollection_h
0003
0004 #include <cassert>
0005 #include <optional>
0006
0007 #include <alpaka/alpaka.hpp>
0008
0009 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0010 #include "HeterogeneousCore/AlpakaInterface/interface/host.h"
0011 #include "HeterogeneousCore/AlpakaInterface/interface/memory.h"
0012
0013
0014 template <typename T>
0015 class PortableHostCollection {
0016 public:
0017 using Layout = T;
0018 using View = typename Layout::View;
0019 using ConstView = typename Layout::ConstView;
0020 using Buffer = cms::alpakatools::host_buffer<std::byte[]>;
0021 using ConstBuffer = cms::alpakatools::const_host_buffer<std::byte[]>;
0022
0023 PortableHostCollection() = default;
0024
0025 PortableHostCollection(int32_t elements, alpaka_common::DevHost const& host)
0026
0027 : buffer_{cms::alpakatools::make_host_buffer<std::byte[]>(Layout::computeDataSize(elements))},
0028 layout_{buffer_->data(), elements},
0029 view_{layout_} {
0030
0031 assert(reinterpret_cast<uintptr_t>(buffer_->data()) % Layout::alignment == 0);
0032 }
0033
0034 template <typename TQueue, typename = std::enable_if_t<alpaka::isQueue<TQueue>>>
0035 PortableHostCollection(int32_t elements, TQueue const& queue)
0036
0037 : buffer_{cms::alpakatools::make_host_buffer<std::byte[]>(queue, Layout::computeDataSize(elements))},
0038 layout_{buffer_->data(), elements},
0039 view_{layout_} {
0040
0041 assert(reinterpret_cast<uintptr_t>(buffer_->data()) % Layout::alignment == 0);
0042 }
0043
0044
0045 PortableHostCollection(PortableHostCollection const&) = delete;
0046 PortableHostCollection& operator=(PortableHostCollection const&) = delete;
0047
0048
0049 PortableHostCollection(PortableHostCollection&&) = default;
0050 PortableHostCollection& operator=(PortableHostCollection&&) = default;
0051
0052
0053 ~PortableHostCollection() = default;
0054
0055
0056 View& view() { return view_; }
0057 ConstView const& view() const { return view_; }
0058 ConstView const& const_view() const { return view_; }
0059
0060 View& operator*() { return view_; }
0061 ConstView const& operator*() const { return view_; }
0062
0063 View* operator->() { return &view_; }
0064 ConstView const* operator->() const { return &view_; }
0065
0066
0067 Buffer buffer() { return *buffer_; }
0068 ConstBuffer buffer() const { return *buffer_; }
0069 ConstBuffer const_buffer() const { return *buffer_; }
0070
0071
0072 static void ROOTReadStreamer(PortableHostCollection* newObj, Layout& layout) {
0073
0074 newObj->~PortableHostCollection();
0075
0076 new (newObj) PortableHostCollection(layout.metadata().size(), cms::alpakatools::host());
0077
0078 newObj->layout_.ROOTReadStreamer(layout);
0079
0080 layout.ROOTStreamerCleaner();
0081 }
0082
0083 private:
0084 std::optional<Buffer> buffer_;
0085 Layout layout_;
0086 View view_;
0087 };
0088
0089 #endif