Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prototype for EventSetup data on GPUs #77

Merged

Conversation

makortel
Copy link

@makortel makortel commented Jun 5, 2018

This PR adds a prototype for dealing with EventSetup data on GPUs. Resolves #65. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

About the system

As outlined in the issue, now it is the ESProduct who owns the GPU memory. Currently each of the affected ESProducts have a method getGPUProductAsync(cuda::stream_t<>&) (suggestions for better names are welcome), which will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in HeterogeneousCore/CUDACore/interface/CUDAESProduct.h.

CPE

Adding support to PixelCPEFast was easy, as it was already produced by an ESProducer and dealt with copying the data to GPU.

Cabling map

Cabling map etc required a bit more work, as

  • the SiPixelFedCablingMap comes from the DB (so better not modify it)
  • we actually ship more data than just the cabling map (from geometry and SiPixelQuality)
  • we also ship event-based data for modules to unpack, whose filling has the same loop structure as the other data

I created a new ESProduct SiPixelFedCablingMapGPUWrapper (for time being on CkfComponentsRecord record, maybe we could create a "smaller" record in some more "local reco" package than RecoTracker/Record) to gather all the necessary ES data. The modules-to-unpack is implemented as a nested struct there to benefit from the constants and loop logic. In case the regionality is not used, the modules-to-unpack are transferred only once.

Gains

Gains required also a bit more work, as

  • the SiPixelGainCalibrationForHLT comes from the DB (so better not modify it)
  • there is a rather complex SiPixelGainCalibrationForHLTService class structure to access the gain values in CPU

Fortunately for the GPU we already just transfer the internal data of SiPixelGainCalibrationForHLT to the GPU, so it is enough to create a new ESProduct (SiPixelGainCalibrationForHLTGPU, on a newly created SiPixelGainCalibrationForHLTGPURcd record which depends also from TrackerDigiGeometryRecord), and let it to transfer the necessary data to GPU "as usual".

Other stuff

Following @VinInn's suggestion #65 (comment), the Raw2Cluster is moved to RecoLocalTracker/SiPixelClusterizer. This also allows to revert 766e967 of #62 (but apparently this fact can not be used later to clean the history as I see the PRs are squashed to single commits at the moment).

@fwyzard @felicepantaleo @VinInn @rovere

@cmsbot
Copy link

cmsbot commented Jun 5, 2018

A new Pull Request was created by @makortel (Matti Kortelainen) for CMSSW_10_2_X_Patatrack.

It involves the following packages:

CalibTracker/Records
CalibTracker/SiPixelESProducers
Configuration/StandardSequences
EventFilter/SiPixelRawToDigi
HeterogeneousCore/CUDACore
HeterogeneousCore/CUDAServices
RecoLocalTracker/Configuration
RecoLocalTracker/SiPixelClusterizer
RecoLocalTracker/SiPixelRecHits

The following packages do not have a category, yet:

HeterogeneousCore/CUDACore
Please create a PR for https://github.com/cms-sw/cms-bot/blob/master/categories_map.py to assign category

@cmsbot, @fwyzard can you please review it and eventually sign? Thanks.

cms-bot commands are listed here

@@ -56,7 +56,7 @@
#include <vector>


class PixelThresholdClusterizer final : public PixelClusterizerBase {
class dso_hidden PixelThresholdClusterizer final : public PixelClusterizerBase {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why dso_hidden ?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See also the commit of #62 which (temporarily) removed it
766e967

@fwyzard
Copy link

fwyzard commented Jun 5, 2018

Validation summary

Reference release CMSSW_10_2_0_pre4 at 926a81b
Development branch CMSSW_10_2_X_Patatrack at b1e6d1c
Testing PRs:

makeTrackValidationPlots.py plots

/RelValTTbar_13/CMSSW_10_2_0_pre3-PU25ns_101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

/RelValZMM_13/CMSSW_10_2_0_pre3-101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

DQM GUI plots

/RelValTTbar_13/CMSSW_10_2_0_pre3-PU25ns_101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

  • reference DQM plots for reference release, workflow 10824.5
  • DQM plots for development release, workflow 10824.5
  • DQM plots for development release, workflow 10824.8
  • DQM plots for development release, workflow 10824.7
  • DQM plots for development release, workflow 10824.9 are missing
  • DQM plots for testing release, workflow 10824.5
  • DQM plots for testing release, workflow 10824.8
  • DQM plots for testing release, workflow 10824.7
  • DQM plots for testing release, workflow 10824.9 are missing
  • DQM comparison for reference workflow 10824.5
  • DQM comparison for workflow 10824.8
  • DQM comparison for workflow 10824.7
  • DQM comparison for workflow 10824.9

/RelValZMM_13/CMSSW_10_2_0_pre3-101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

  • reference DQM plots for reference release, workflow 10824.5
  • DQM plots for development release, workflow 10824.5
  • DQM plots for development release, workflow 10824.8 are missing
  • DQM plots for development release, workflow 10824.7
  • DQM plots for development release, workflow 10824.9 are missing
  • DQM plots for testing release, workflow 10824.5
  • DQM plots for testing release, workflow 10824.8
  • DQM plots for testing release, workflow 10824.7
  • DQM plots for testing release, workflow 10824.9 are missing
  • DQM comparison for reference workflow 10824.5
  • DQM comparison for workflow 10824.8
  • DQM comparison for workflow 10824.7
  • DQM comparison for workflow 10824.9

logs and nvprof/nvvp profiles

/RelValTTbar_13/CMSSW_10_2_0_pre3-PU25ns_101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

/RelValZMM_13/CMSSW_10_2_0_pre3-101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

Logs

The full log is available at https://fwyzard.web.cern.ch/fwyzard/patatrack/pulls/e621e735feea29d20cc7017ea6a4b82cd8ead8b2/log .

@fwyzard
Copy link

fwyzard commented Jun 5, 2018

@makortel thanks for the PR, I'm sorry I couldn;t comment on #65 earlier.

Am I correct that this approach mirrors how the event setup works on the CPU ?
That is, conditions are loaded and made available only on demand.

On the other hand, how does this approach deal with an IOV change ?

@makortel
Copy link
Author

makortel commented Jun 5, 2018

@fwyzard

Am I correct that this approach mirrors how the event setup works on the CPU ?
That is, conditions are loaded and made available only on demand.

That is correct.

On the other hand, how does this approach deal with an IOV change ?

My understanding is that on IOV transition the ESProduct of the old IOV is deleted, and the ESProduct of the new IOV is constructed (and in case of multiple lumis in flight these two may coexist for some time). What happens with the approach of this PR is that for the old IOV the GPU memory is deallocated, and for the new IOV the GPU memory is allocated (again) and the CPU->GPU transfer is made (so it continues to mirror how the system works on the CPU).

One could of course argue that the deallocation+allocation cycle is unnecessary. In a sense that is true, because even in case of multiple lumis in flight one could just multiply the buffers by the maximum number of concurrent lumis and add bookkeeping logic. Alternatively we could use custom allocator avoiding cudaMalloc/cudaFree every time. I'm sure we can spend lot's of time discussing how to improve :)

@fwyzard
Copy link

fwyzard commented Jun 5, 2018

Actually, AFAIK the framework does support concurrent runs/lumis, but does not support concurrent IOVs.

I assume the framework team would like to implement support for that as well in the future, so I am fine with an approach that does not prevent it.

@makortel
Copy link
Author

makortel commented Jun 5, 2018

Actually, AFAIK the framework does support concurrent runs/lumis, but does not support concurrent IOVs.

Right, I mixed the thins a bit. My understanding is as well that concurrent IOVs are somewhere in the future plans, so I aimed for a solution that would automatically work with that.

@makortel
Copy link
Author

Could we try to review+merge this one soonish?

@makortel makortel mentioned this pull request Jun 12, 2018
}

SiPixelGainCalibrationForHLTGPU::GPUData::~GPUData() {
if(gainForHLTonGPU != nullptr) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can avoid the check, as cudaFree will not do anything if the argument is a null pointer

@fwyzard
Copy link

fwyzard commented Jun 12, 2018

I don't have other comments, if nobody else has anything to add I will merge this tomorrow morning.

@makortel
Copy link
Author

@fwyzard Let me address your comment #77 (comment) first (doing it right now).

@fwyzard
Copy link

fwyzard commented Jun 14, 2018

Validation summary

Reference release CMSSW_10_2_0_pre5 at 30c7b03
Development branch CMSSW_10_2_X_Patatrack at 655e4ed
Testing PRs:

makeTrackValidationPlots.py plots

/RelValTTbar_13/CMSSW_10_2_0_pre3-PU25ns_101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

/RelValZMM_13/CMSSW_10_2_0_pre3-101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

DQM GUI plots

/RelValTTbar_13/CMSSW_10_2_0_pre3-PU25ns_101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

  • reference DQM plots for reference release, workflow 10824.5
  • DQM plots for development release, workflow 10824.5
  • DQM plots for development release, workflow 10824.8
  • DQM plots for development release, workflow 10824.7
  • DQM plots for development release, workflow 10824.9 are missing
  • DQM plots for testing release, workflow 10824.5
  • DQM plots for testing release, workflow 10824.8
  • DQM plots for testing release, workflow 10824.7
  • DQM plots for testing release, workflow 10824.9 are missing
  • DQM comparison for reference workflow 10824.5
  • DQM comparison for workflow 10824.8
  • DQM comparison for workflow 10824.7
  • DQM comparison for workflow 10824.9

/RelValZMM_13/CMSSW_10_2_0_pre3-101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

  • reference DQM plots for reference release, workflow 10824.5
  • DQM plots for development release, workflow 10824.5
  • DQM plots for development release, workflow 10824.8
  • DQM plots for development release, workflow 10824.7
  • DQM plots for development release, workflow 10824.9 are missing
  • DQM plots for testing release, workflow 10824.5
  • DQM plots for testing release, workflow 10824.8
  • DQM plots for testing release, workflow 10824.7
  • DQM plots for testing release, workflow 10824.9 are missing
  • DQM comparison for reference workflow 10824.5
  • DQM comparison for workflow 10824.8
  • DQM comparison for workflow 10824.7
  • DQM comparison for workflow 10824.9

logs and nvprof/nvvp profiles

/RelValTTbar_13/CMSSW_10_2_0_pre3-PU25ns_101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

/RelValZMM_13/CMSSW_10_2_0_pre3-101X_upgrade2018_realistic_v7-v1/GEN-SIM-DIGI-RAW

Logs

The full log is available at https://fwyzard.web.cern.ch/fwyzard/patatrack/pulls/ca74ef1417f5be3d0316db57ecb0a2d4cf18d9a6/log .

@fwyzard fwyzard merged commit 955d9df into cms-patatrack:CMSSW_10_2_X_Patatrack Jun 14, 2018
@fwyzard fwyzard added this to the CMSSW_10_2_0_pre6_Patatrack milestone Jul 5, 2018
bkilian15 pushed a commit to bkilian15/cmssw that referenced this pull request May 15, 2019
…oMiniAODReview

Cmssw 10 1 x tau reco mini aod review
fwyzard pushed a commit that referenced this pull request Oct 8, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Oct 19, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Oct 20, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Oct 23, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Nov 6, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Nov 16, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Dec 25, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Dec 25, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Dec 29, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard added a commit that referenced this pull request Dec 29, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
fwyzard pushed a commit that referenced this pull request Dec 29, 2020
Adds a prototype for dealing with EventSetup data on GPUs. The prototype is applied to the ES data used by Raw2Cluster (cabling map etc, gains) and RecHits (CPE).

Now it is the `ESProduct` who owns the GPU memory. Currently each of the affected `ESProducts` have a method `getGPUProductAsync(cuda::stream_t<>&)` that will allocate the memory on the current GPU device and transfer the data there asynchronously, if the data is not there yet. The functionality of bookkeeping which devices have the data already, and necessary synchronization between multiple threads (only one thread may do the transfer per device) are abstracted to a helper template in `HeterogeneousCore/CUDACore/interface/CUDAESProduct.h`.

Technical changes:
  - `EventSetup`-based implementation for GPU cabling map, gains, etc
  - add support for multiple devices to `PixelCPEFast`
  - abstract the `EeventSetup` GPU transfer
  - move `malloc` and transfer to the lambda
  - move `cudaFree` outside of the `nullptr` check
  - move files (back) to the plusing directory
  - rename `siPixelDigisHeterogeneous` to `siPixelClustersHeterogeneous`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants