Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // Classes definition for Phase1/Phase2, to make the classes_def lighter. Not actually used in the code.
0025   using TrackingRecHitSoAPhase1 = TrackingRecHitsSoACollection<pixelTopology::Phase1>;
0026   using TrackingRecHitSoAPhase2 = TrackingRecHitsSoACollection<pixelTopology::Phase2>;
0027   using TrackingRecHitSoAHIonPhase1 = TrackingRecHitsSoACollection<pixelTopology::HIonPhase1>;
0028 
0029 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
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       // Don't bother if zero hits
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     // Update the contents address of the phiBinner histo container after the copy from device happened
0058     static void postCopy(TrackingRecHitHost<TrackerTraits>& hostData) {
0059       // Don't bother if zero hits
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 }  // namespace cms::alpakatools
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  // DataFormats_TrackingRecHitSoA_interface_alpaka_TrackingRecHitsSoACollection_h