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
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
0021 template <typename T>
0022 struct PortableCollectionTrait<T, alpaka_common::DevHost> {
0023 using CollectionType = PortableHostCollection<T>;
0024 };
0025
0026
0027 template <typename TDev, typename T0, typename... Args>
0028 struct PortableMultiCollectionTrait {
0029 using CollectionType = PortableDeviceMultiCollection<TDev, T0, Args...>;
0030 };
0031
0032
0033 template <typename T0, typename... Args>
0034 struct PortableMultiCollectionTrait<alpaka_common::DevHost, T0, Args...> {
0035 using CollectionType = PortableHostMultiCollection<T0, Args...>;
0036 };
0037
0038 }
0039
0040
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
0045 template <typename TDev, typename T0, typename... Args>
0046 using PortableMultiCollection = typename traits::PortableMultiCollectionTrait<TDev, T0, Args...>::CollectionType;
0047
0048
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 }
0096
0097 #endif