Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-16 23:23:43

0001 #ifndef DataFormats_Portable_interface_PortableCollection_h
0002 #define DataFormats_Portable_interface_PortableCollection_h
0003 
0004 #include <alpaka/alpaka.hpp>
0005 
0006 #include "DataFormats/Portable/interface/PortableHostCollection.h"
0007 #include "DataFormats/Portable/interface/PortableDeviceCollection.h"
0008 #include "HeterogeneousCore/AlpakaInterface/interface/concepts.h"
0009 #include "HeterogeneousCore/AlpakaInterface/interface/CopyToDevice.h"
0010 #include "HeterogeneousCore/AlpakaInterface/interface/CopyToHost.h"
0011 
0012 namespace traits {
0013 
0014   // trait for a generic SoA-based product
0015   template <typename T, typename TDev, typename = std::enable_if_t<alpaka::isDevice<TDev>>>
0016   struct PortableCollectionTrait {
0017     using CollectionType = PortableDeviceCollection<T, TDev>;
0018   };
0019 
0020   // specialise for host device
0021   template <typename T>
0022   struct PortableCollectionTrait<T, alpaka_common::DevHost> {
0023     using CollectionType = PortableHostCollection<T>;
0024   };
0025 
0026   // trait for a generic multi-SoA-based product
0027   template <typename TDev, typename T0, typename... Args>
0028   struct PortableMultiCollectionTrait {
0029     using CollectionType = PortableDeviceMultiCollection<TDev, T0, Args...>;
0030   };
0031 
0032   // specialise for host device
0033   template <typename T0, typename... Args>
0034   struct PortableMultiCollectionTrait<alpaka_common::DevHost, T0, Args...> {
0035     using CollectionType = PortableHostMultiCollection<T0, Args...>;
0036   };
0037 
0038 }  // namespace traits
0039 
0040 // type alias for a generic SoA-based product
0041 template <typename T, typename TDev, typename = std::enable_if_t<alpaka::isDevice<TDev>>>
0042 using PortableCollection = typename traits::PortableCollectionTrait<T, TDev>::CollectionType;
0043 
0044 // type alias for a generic SoA-based product
0045 template <typename TDev, typename T0, typename... Args>
0046 using PortableMultiCollection = typename traits::PortableMultiCollectionTrait<TDev, T0, Args...>::CollectionType;
0047 
0048 // define how to copy PortableCollection between host and device
0049 namespace cms::alpakatools {
0050   template <typename TLayout, typename TDevice>
0051     requires alpaka::isDevice<TDevice>
0052   struct CopyToHost<PortableDeviceCollection<TLayout, TDevice>> {
0053     template <typename TQueue>
0054       requires alpaka::isQueue<TQueue>
0055     static auto copyAsync(TQueue& queue, PortableDeviceCollection<TLayout, TDevice> const& srcData) {
0056       PortableHostCollection<TLayout> dstData(srcData->metadata().size(), queue);
0057       alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
0058       return dstData;
0059     }
0060   };
0061 
0062   template <typename TDev, typename T0, typename... Args>
0063     requires alpaka::isDevice<TDev>
0064   struct CopyToHost<PortableDeviceMultiCollection<TDev, T0, Args...>> {
0065     template <typename TQueue>
0066       requires alpaka::isQueue<TQueue>
0067     static auto copyAsync(TQueue& queue, PortableDeviceMultiCollection<TDev, T0, Args...> const& srcData) {
0068       PortableHostMultiCollection<T0, Args...> dstData(srcData.sizes(), queue);
0069       alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
0070       return dstData;
0071     }
0072   };
0073 
0074   template <typename TLayout>
0075   struct CopyToDevice<PortableHostCollection<TLayout>> {
0076     template <cms::alpakatools::NonCPUQueue TQueue>
0077     static auto copyAsync(TQueue& queue, PortableHostCollection<TLayout> const& srcData) {
0078       using TDevice = typename alpaka::trait::DevType<TQueue>::type;
0079       PortableDeviceCollection<TLayout, TDevice> dstData(srcData->metadata().size(), queue);
0080       alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
0081       return dstData;
0082     }
0083   };
0084 
0085   template <typename T0, typename... Args>
0086   struct CopyToDevice<PortableHostMultiCollection<T0, Args...>> {
0087     template <cms::alpakatools::NonCPUQueue TQueue>
0088     static auto copyAsync(TQueue& queue, PortableHostMultiCollection<T0, Args...> const& srcData) {
0089       using TDevice = typename alpaka::trait::DevType<TQueue>::type;
0090       PortableDeviceMultiCollection<TDevice, T0, Args...> dstData(srcData.sizes(), queue);
0091       alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
0092       return dstData;
0093     }
0094   };
0095 }  // namespace cms::alpakatools
0096 
0097 #endif  // DataFormats_Portable_interface_PortableCollection_h