File indexing completed on 2025-01-05 23:44:52
0001 #ifndef DataFormats_TrackingRecHitSoA_interface_alpaka_TrackingRecHitsSoACollection_h
0002 #define DataFormats_TrackingRecHitSoA_interface_alpaka_TrackingRecHitsSoACollection_h
0003
0004 #include <cstdint>
0005 #include <type_traits>
0006
0007 #include <alpaka/alpaka.hpp>
0008
0009 #include "DataFormats/Portable/interface/alpaka/PortableCollection.h"
0010 #include "DataFormats/TrackingRecHitSoA/interface/TrackingRecHitsDevice.h"
0011 #include "DataFormats/TrackingRecHitSoA/interface/TrackingRecHitsHost.h"
0012 #include "DataFormats/TrackingRecHitSoA/interface/TrackingRecHitsSoA.h"
0013 #include "Geometry/CommonTopologies/interface/SimplePixelTopology.h"
0014 #include "HeterogeneousCore/AlpakaInterface/interface/CopyToHost.h"
0015 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0016
0017 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0018
0019 template <typename TrackerTraits>
0020 using TrackingRecHitsSoACollection = std::conditional_t<std::is_same_v<Device, alpaka::DevCpu>,
0021 TrackingRecHitHost<TrackerTraits>,
0022 TrackingRecHitDevice<TrackerTraits, Device>>;
0023
0024
0025 using TrackingRecHitSoAPhase1 = TrackingRecHitsSoACollection<pixelTopology::Phase1>;
0026 using TrackingRecHitSoAPhase2 = TrackingRecHitsSoACollection<pixelTopology::Phase2>;
0027 using TrackingRecHitSoAHIonPhase1 = TrackingRecHitsSoACollection<pixelTopology::HIonPhase1>;
0028
0029 }
0030
0031 namespace cms::alpakatools {
0032 template <typename TrackerTraits, typename TDevice>
0033 struct CopyToHost<TrackingRecHitDevice<TrackerTraits, TDevice>> {
0034 template <typename TQueue>
0035 static auto copyAsync(TQueue& queue, TrackingRecHitDevice<TrackerTraits, TDevice> const& deviceData) {
0036 TrackingRecHitHost<TrackerTraits> hostData(queue, deviceData.view().metadata().size());
0037
0038
0039 if (deviceData.view().metadata().size() == 0) {
0040 std::memset(hostData.buffer().data(),
0041 0,
0042 alpaka::getExtentProduct(hostData.buffer()) *
0043 sizeof(alpaka::Elem<typename TrackingRecHitHost<TrackerTraits>::Buffer>));
0044 return hostData;
0045 }
0046
0047 alpaka::memcpy(queue, hostData.buffer(), deviceData.buffer());
0048 #ifdef GPU_DEBUG
0049 printf("TrackingRecHitsSoACollection: I'm copying to host.\n");
0050 alpaka::wait(queue);
0051 assert(deviceData.nHits() == hostData.nHits());
0052 assert(deviceData.offsetBPIX2() == hostData.offsetBPIX2());
0053 #endif
0054 return hostData;
0055 }
0056
0057
0058 static void postCopy(TrackingRecHitHost<TrackerTraits>& hostData) {
0059
0060 if (hostData.view().metadata().size() == 0) {
0061 return;
0062 }
0063 typename TrackingRecHitSoA<TrackerTraits>::PhiBinnerView pbv;
0064 pbv.assoc = &(hostData.view().phiBinner());
0065 pbv.offSize = -1;
0066 pbv.offStorage = nullptr;
0067 pbv.contentSize = hostData.nHits();
0068 pbv.contentStorage = hostData.view().phiBinnerStorage();
0069 hostData.view().phiBinner().initStorage(pbv);
0070 }
0071 };
0072 }
0073
0074 ASSERT_DEVICE_MATCHES_HOST_COLLECTION(TrackingRecHitSoAPhase1, TrackingRecHitHostPhase1);
0075 ASSERT_DEVICE_MATCHES_HOST_COLLECTION(TrackingRecHitSoAPhase2, TrackingRecHitHostPhase2);
0076 ASSERT_DEVICE_MATCHES_HOST_COLLECTION(TrackingRecHitSoAHIonPhase1, TrackingRecHitHostHIonPhase1);
0077
0078 #endif