File indexing completed on 2025-01-16 23:23:43
0001 #ifndef DataFormats_Portable_interface_PortableObject_h
0002 #define DataFormats_Portable_interface_PortableObject_h
0003
0004 #include <type_traits>
0005
0006 #include <alpaka/alpaka.hpp>
0007
0008 #include "DataFormats/Portable/interface/PortableHostObject.h"
0009 #include "DataFormats/Portable/interface/PortableDeviceObject.h"
0010 #include "HeterogeneousCore/AlpakaInterface/interface/concepts.h"
0011 #include "HeterogeneousCore/AlpakaInterface/interface/CopyToDevice.h"
0012 #include "HeterogeneousCore/AlpakaInterface/interface/CopyToHost.h"
0013
0014 namespace traits {
0015
0016
0017 template <typename T, typename TDev, typename = std::enable_if_t<alpaka::isDevice<TDev>>>
0018 struct PortableObjectTrait {
0019 using ProductType = PortableDeviceObject<T, TDev>;
0020 };
0021
0022
0023 template <typename T>
0024 struct PortableObjectTrait<T, alpaka_common::DevHost> {
0025 using ProductType = PortableHostObject<T>;
0026 };
0027
0028 }
0029
0030
0031 template <typename T, typename TDev, typename = std::enable_if_t<alpaka::isDevice<TDev>>>
0032 using PortableObject = typename traits::PortableObjectTrait<T, TDev>::ProductType;
0033
0034
0035 namespace cms::alpakatools {
0036 template <typename TProduct, typename TDevice>
0037 requires alpaka::isDevice<TDevice>
0038 struct CopyToHost<PortableDeviceObject<TProduct, TDevice>> {
0039 template <typename TQueue>
0040 requires alpaka::isQueue<TQueue>
0041 static auto copyAsync(TQueue& queue, PortableDeviceObject<TProduct, TDevice> const& srcData) {
0042 PortableHostObject<TProduct> dstData(queue);
0043 alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
0044 return dstData;
0045 }
0046 };
0047
0048 template <typename TProduct>
0049 struct CopyToDevice<PortableHostObject<TProduct>> {
0050 template <cms::alpakatools::NonCPUQueue TQueue>
0051 static auto copyAsync(TQueue& queue, PortableHostObject<TProduct> const& srcData) {
0052 using TDevice = typename alpaka::trait::DevType<TQueue>::type;
0053 PortableDeviceObject<TProduct, TDevice> dstData(queue);
0054 alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
0055 return dstData;
0056 }
0057 };
0058 }
0059
0060 #endif