CMS 3D CMS Logo

PortableCollection.h
Go to the documentation of this file.
1 #ifndef DataFormats_Portable_interface_PortableCollection_h
2 #define DataFormats_Portable_interface_PortableCollection_h
3 
4 #include <alpaka/alpaka.hpp>
5 
10 
11 namespace traits {
12 
13  // trait for a generic SoA-based product
14  template <typename T, typename TDev, typename = std::enable_if_t<alpaka::isDevice<TDev>>>
17  };
18 
19  // specialise for host device
20  template <typename T>
23  };
24 
25  template <typename TDev, typename T0, typename... Args>
27 } // namespace traits
28 
29 // type alias for a generic SoA-based product
30 template <typename T, typename TDev, typename = std::enable_if_t<alpaka::isDevice<TDev>>>
32 
33 // type alias for a generic SoA-based product
34 template <typename TDev, typename T0, typename... Args>
35 using PortableMultiCollection = typename traits::PortableMultiCollectionTrait<TDev, T0, Args...>::CollectionType;
36 
37 // define how to copy PortableCollection between host and device
38 namespace cms::alpakatools {
39  template <typename TLayout, typename TDevice>
40  struct CopyToHost<PortableDeviceCollection<TLayout, TDevice>> {
41  template <typename TQueue>
42  static auto copyAsync(TQueue& queue, PortableDeviceCollection<TLayout, TDevice> const& srcData) {
43  PortableHostCollection<TLayout> dstData(srcData->metadata().size(), queue);
44  alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
45  return dstData;
46  }
47  };
48 
49  template <typename TDev, typename T0, typename... Args>
50  struct CopyToHost<PortableDeviceMultiCollection<TDev, T0, Args...>> {
51  template <typename TQueue>
52  static auto copyAsync(TQueue& queue, PortableDeviceMultiCollection<TDev, T0, Args...> const& srcData) {
53  PortableHostMultiCollection<T0, Args...> dstData(srcData.sizes(), queue);
54  alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
55  return dstData;
56  }
57  };
58 
59  template <typename TLayout>
61  template <typename TQueue>
62  static auto copyAsync(TQueue& queue, PortableHostCollection<TLayout> const& srcData) {
63  using TDevice = typename alpaka::trait::DevType<TQueue>::type;
64  PortableDeviceCollection<TLayout, TDevice> dstData(srcData->metadata().size(), queue);
65  alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
66  return dstData;
67  }
68  };
69 
70  template <typename TDev, typename T0, typename... Args>
71  struct CopyToDevice<PortableHostMultiCollection<TDev, T0, Args...>> {
72  template <typename TQueue>
73  static auto copyAsync(TQueue& queue, PortableHostMultiCollection<TDev, T0, Args...> const& srcData) {
74  using TDevice = typename alpaka::trait::DevType<TQueue>::type;
75  PortableDeviceMultiCollection<TDev, T0, Args...> dstData(srcData.sizes(), queue);
76  alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
77  return dstData;
78  }
79  };
80 } // namespace cms::alpakatools
81 
82 #endif // DataFormats_Portable_interface_PortableCollection_h
static auto copyAsync(TQueue &queue, PortableHostMultiCollection< TDev, T0, Args... > const &srcData)
typename traits::PortableMultiCollectionTrait< TDev, T0, Args... >::CollectionType PortableMultiCollection
static auto copyAsync(TQueue &queue, PortableDeviceCollection< TLayout, TDevice > const &srcData)
static auto copyAsync(TQueue &queue, PortableHostCollection< TLayout > const &srcData)
static auto copyAsync(TQueue &queue, PortableDeviceMultiCollection< TDev, T0, Args... > const &srcData)
typename traits::PortableCollectionTrait< T, TDev >::CollectionType PortableCollection
alpaka::DevCpu DevHost
Definition: config.h:37
long double T