Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // trait for a generic struct-based product
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   // specialise for host device
0022   template <typename T>
0023   struct PortableObjectTrait<T, alpaka_common::DevHost> {
0024     using ProductType = PortableHostObject<T>;
0025   };
0026 
0027 }  // namespace traits
0028 
0029 // type alias for a generic struct-based product
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 // define how to copy PortableObject between host and device
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 }  // namespace cms::alpakatools
0056 
0057 #endif  // DataFormats_Portable_interface_PortableObject_h