File indexing completed on 2024-04-06 12:05:01
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/CopyToDevice.h"
0011 #include "HeterogeneousCore/AlpakaInterface/interface/CopyToHost.h"
0012
0013 namespace traits {
0014
0015
0016 template <typename T, typename TDev, typename = std::enable_if_t<alpaka::isDevice<TDev>>>
0017 struct PortableObjectTrait {
0018 using ProductType = PortableDeviceObject<T, TDev>;
0019 };
0020
0021
0022 template <typename T>
0023 struct PortableObjectTrait<T, alpaka_common::DevHost> {
0024 using ProductType = PortableHostObject<T>;
0025 };
0026
0027 }
0028
0029
0030 template <typename T, typename TDev, typename = std::enable_if_t<alpaka::isDevice<TDev>>>
0031 using PortableObject = typename traits::PortableObjectTrait<T, TDev>::ProductType;
0032
0033
0034 namespace cms::alpakatools {
0035 template <typename TProduct, typename TDevice>
0036 struct CopyToHost<PortableDeviceObject<TProduct, TDevice>> {
0037 template <typename TQueue>
0038 static auto copyAsync(TQueue& queue, PortableDeviceObject<TProduct, TDevice> const& srcData) {
0039 PortableHostObject<TProduct> dstData(queue);
0040 alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
0041 return dstData;
0042 }
0043 };
0044
0045 template <typename TProduct>
0046 struct CopyToDevice<PortableHostObject<TProduct>> {
0047 template <typename TQueue>
0048 static auto copyAsync(TQueue& queue, PortableHostObject<TProduct> const& srcData) {
0049 using TDevice = typename alpaka::trait::DevType<TQueue>::type;
0050 PortableDeviceObject<TProduct, TDevice> dstData(queue);
0051 alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
0052 return dstData;
0053 }
0054 };
0055 }
0056
0057 #endif