Back to home page

Project CMSSW displayed by LXR

 
 

    


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