1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include "CondFormats/EcalObjects/interface/EcalPulseCovariancesGPU.h"
#include "FWCore/Utilities/interface/typelookup.h"
#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h"
EcalPulseCovariancesGPU::EcalPulseCovariancesGPU(EcalPulseCovariances const& values)
: valuesEB_{values.barrelItems()}, valuesEE_{values.endcapItems()} {}
EcalPulseCovariancesGPU::Product::~Product() {
// deallocation
cudaCheck(cudaFree(values));
}
EcalPulseCovariancesGPU::Product const& EcalPulseCovariancesGPU::getProduct(cudaStream_t cudaStream) const {
auto const& product = product_.dataForCurrentDeviceAsync(
cudaStream, [this](EcalPulseCovariancesGPU::Product& product, cudaStream_t cudaStream) {
// malloc
cudaCheck(cudaMalloc((void**)&product.values,
(this->valuesEE_.size() + this->valuesEB_.size()) * sizeof(EcalPulseCovariance)));
// offset in terms of sizeof(EcalPulseCovariance)
uint32_t offset = this->valuesEB_.size();
// transfer eb
cudaCheck(cudaMemcpyAsync(product.values,
this->valuesEB_.data(),
this->valuesEB_.size() * sizeof(EcalPulseCovariance),
cudaMemcpyHostToDevice,
cudaStream));
// transfer ee starting at values + offset
cudaCheck(cudaMemcpyAsync(product.values + offset,
this->valuesEE_.data(),
this->valuesEE_.size() * sizeof(EcalPulseCovariance),
cudaMemcpyHostToDevice,
cudaStream));
});
return product;
}
TYPELOOKUP_DATA_REG(EcalPulseCovariancesGPU);
|