File indexing completed on 2024-04-06 12:02:16
0001 #include "CondFormats/HcalObjects/interface/HcalSiPMCharacteristics.h"
0002 #include "CondFormats/HcalObjects/interface/HcalSiPMCharacteristicsGPU.h"
0003 #include "FWCore/Utilities/interface/Exception.h"
0004 #include "FWCore/Utilities/interface/typelookup.h"
0005 #include "HeterogeneousCore/CUDAUtilities/interface/copyAsync.h"
0006
0007 HcalSiPMCharacteristicsGPU::HcalSiPMCharacteristicsGPU(HcalSiPMCharacteristics const& parameters)
0008 : pixels_(parameters.getTypes()),
0009 auxi1_(parameters.getTypes()),
0010 parLin1_(parameters.getTypes()),
0011 parLin2_(parameters.getTypes()),
0012 parLin3_(parameters.getTypes()),
0013 crossTalk_(parameters.getTypes()),
0014 auxi2_(parameters.getTypes()) {
0015 for (uint32_t i = 0; i < parameters.getTypes(); i++) {
0016 auto const type = parameters.getType(i);
0017 #ifdef HCAL_MAHI_CPUDEBUG
0018 printf("index = %u type = %d\n", i, type);
0019 #endif
0020
0021
0022 if (static_cast<uint32_t>(type) != i + 1)
0023 throw cms::Exception("HcalSiPMCharacteristics")
0024 << "Wrong assumption for HcalSiPMcharacteristics type values, "
0025 << "should be type value <- type index + 1" << std::endl
0026 << "Observed type value = " << type << " and index = " << i << std::endl;
0027
0028 pixels_[i] = parameters.getPixels(type);
0029 auxi1_[i] = parameters.getAuxi1(type);
0030 parLin1_[i] = parameters.getNonLinearities(type)[0];
0031 parLin2_[i] = parameters.getNonLinearities(type)[1];
0032 parLin3_[i] = parameters.getNonLinearities(type)[2];
0033 crossTalk_[i] = parameters.getCrossTalk(type);
0034 auxi2_[i] = parameters.getAuxi2(type);
0035 }
0036 }
0037
0038 HcalSiPMCharacteristicsGPU::Product const& HcalSiPMCharacteristicsGPU::getProduct(cudaStream_t stream) const {
0039 auto const& product = product_.dataForCurrentDeviceAsync(
0040 stream, [this](HcalSiPMCharacteristicsGPU::Product& product, cudaStream_t stream) {
0041
0042 product.pixels = cms::cuda::make_device_unique<int[]>(pixels_.size(), stream);
0043 product.auxi1 = cms::cuda::make_device_unique<int[]>(auxi1_.size(), stream);
0044 product.parLin1 = cms::cuda::make_device_unique<float[]>(parLin1_.size(), stream);
0045 product.parLin2 = cms::cuda::make_device_unique<float[]>(parLin2_.size(), stream);
0046 product.parLin3 = cms::cuda::make_device_unique<float[]>(parLin3_.size(), stream);
0047 product.crossTalk = cms::cuda::make_device_unique<float[]>(crossTalk_.size(), stream);
0048 product.auxi2 = cms::cuda::make_device_unique<float[]>(auxi2_.size(), stream);
0049
0050
0051 cms::cuda::copyAsync(product.pixels, pixels_, stream);
0052 cms::cuda::copyAsync(product.auxi1, auxi1_, stream);
0053 cms::cuda::copyAsync(product.parLin1, parLin1_, stream);
0054 cms::cuda::copyAsync(product.parLin2, parLin2_, stream);
0055 cms::cuda::copyAsync(product.parLin3, parLin3_, stream);
0056 cms::cuda::copyAsync(product.crossTalk, crossTalk_, stream);
0057 cms::cuda::copyAsync(product.auxi2, auxi2_, stream);
0058 });
0059
0060 return product;
0061 }
0062
0063 TYPELOOKUP_DATA_REG(HcalSiPMCharacteristicsGPU);