Skip to content

Commit

Permalink
Restructure code to work around CUDA build limitations (#483)
Browse files Browse the repository at this point in the history
Move ECAL and HCAL CUDA code to plugins.
General cleanup: remove unused code, apply clang-format and various include changes.
Fix product labels for HCAL rechits on CPU.

Co-authored-by: Andrea Bocci <andrea.bocci@cern.ch>
  • Loading branch information
fwyzard committed Nov 26, 2020
1 parent 656f4b3 commit 7b3807c
Show file tree
Hide file tree
Showing 28 changed files with 5,215 additions and 148 deletions.
3 changes: 0 additions & 3 deletions EventFilter/EcalRawToDigi/BuildFile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
<use name="DataFormats/EcalDetId"/>
<use name="DataFormats/EcalDigi"/>
<use name="DataFormats/EcalRawData"/>
<use name="DataFormats/EcalRecHit"/>
<use name="DataFormats/FEDRawData"/>
<use name="FWCore/Framework"/>
<use name="FWCore/MessageLogger"/>
Expand All @@ -18,8 +17,6 @@
<use name="Geometry/Records"/>
<use name="HeterogeneousCore/CUDACore"/>
<use name="HeterogeneousCore/CUDAUtilities"/>
<use name="RecoLocalCalo/EcalRecAlgos"/>
<use name="RecoLocalCalo/EcalRecProducers"/>
<use name="Utilities/StorageFactory"/>
<export>
<lib name="1"/>
Expand Down
15 changes: 6 additions & 9 deletions EventFilter/EcalRawToDigi/interface/EcalRegionCabling.h
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
#ifndef EcalRegionCabling_H
#define EcalRegionCabling_H
#ifndef EventFilter_EcalRawToDigi_interface_EcalRegionCabling_h
#define EventFilter_EcalRawToDigi_interface_EcalRegionCabling_h

#include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
#include "Geometry/EcalMapping/interface/ESElectronicsMapper.h"

#include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "Geometry/EcalMapping/interface/ESElectronicsMapper.h"
#include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"

class EcalRegionCabling {
public:
Expand Down Expand Up @@ -73,4 +70,4 @@ class EcalRegionCabling {
const ESElectronicsMapper* es_mapping_;
};

#endif
#endif // EventFilter_EcalRawToDigi_interface_EcalRegionCabling_h
7 changes: 1 addition & 6 deletions EventFilter/EcalRawToDigi/plugins/BuildFile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
<use name="EventFilter/EcalRawToDigi"/>
<use name="CUDADataFormats/EcalDigi" />
<use name="DataFormats/Candidate"/>
<use name="DataFormats/EcalRecHit"/>
<use name="DataFormats/L1GlobalMuonTrigger"/>
<use name="DataFormats/L1Trigger"/>
<use name="CondFormats/L1TObjects"/>
Expand All @@ -14,10 +13,6 @@
<use name="FWCore/Framework"/>
<use name="HeterogeneousCore/CUDACore"/>
<use name="HeterogeneousCore/CUDAUtilities"/>
<use name="RecoEcal/EgammaCoreTools"/>
<use name="TrackingTools/Records"/>
<use name="TrackingTools/GeomPropagators"/>
<use name="TrackingTools/TrajectoryState"/>
<library file="*.cc" name="EventFilterEcalRawToDigiPlugins">
<library file="*.cc *.cu" name="EventFilterEcalRawToDigiPlugins">
<flags EDM_PLUGIN="1"/>
</library>
108 changes: 108 additions & 0 deletions EventFilter/EcalRawToDigi/plugins/DeclsForKernels.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#ifndef EventFilter_EcalRawToDigi_plugins_DeclsForKernels_h
#define EventFilter_EcalRawToDigi_plugins_DeclsForKernels_h

#include <vector>

#include "EventFilter/EcalRawToDigi/interface/DCCRawDataDefinitions.h"
#include "EventFilter/EcalRawToDigi/interface/ElectronicsMappingGPU.h"
#include "HeterogeneousCore/CUDAUtilities/interface/HostAllocator.h"
#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h"

namespace ecal {
namespace raw {

constexpr auto empty_event_size = EMPTYEVENTSIZE;
constexpr uint32_t nfeds_max = 54;
constexpr uint32_t nbytes_per_fed_max = 10 * 1024;

struct InputDataCPU {
std::vector<unsigned char, cms::cuda::HostAllocator<unsigned char>> data;
std::vector<uint32_t, cms::cuda::HostAllocator<uint32_t>> offsets;
std::vector<int, cms::cuda::HostAllocator<int>> feds;

void allocate() {
// 2KB per FED resize
data.resize(nfeds_max * sizeof(unsigned char) * nbytes_per_fed_max);
offsets.resize(nfeds_max, 0);
feds.resize(nfeds_max, 0);
}
};

struct ConfigurationParameters {
uint32_t maxChannels;
};

struct OutputDataCPU {
// [0] - eb, [1] - ee
std::vector<uint32_t, cms::cuda::HostAllocator<uint32_t>> nchannels;

void allocate() { nchannels.resize(2); }
};

struct OutputDataGPU {
uint16_t *samplesEB = nullptr, *samplesEE = nullptr;
uint32_t *idsEB = nullptr, *idsEE = nullptr;

// FIXME: we should separate max channels parameter for eb and ee
// FIXME: replace hardcoded values
void allocate(ConfigurationParameters const &config) {
cudaCheck(cudaMalloc((void **)&samplesEB, config.maxChannels * sizeof(uint16_t) * 10));
cudaCheck(cudaMalloc((void **)&samplesEE, config.maxChannels * sizeof(uint16_t) * 10));
cudaCheck(cudaMalloc((void **)&idsEB, config.maxChannels * sizeof(uint32_t)));
cudaCheck(cudaMalloc((void **)&idsEE, config.maxChannels * sizeof(uint32_t)));
}

void deallocate(ConfigurationParameters const &config) {
if (samplesEB) {
cudaCheck(cudaFree(samplesEB));
cudaCheck(cudaFree(samplesEE));
cudaCheck(cudaFree(idsEB));
cudaCheck(cudaFree(idsEE));
}
}
};

struct ScratchDataGPU {
// [0] = EB
// [1] = EE
uint32_t *pChannelsCounter = nullptr;

void allocate(ConfigurationParameters const &config) {
cudaCheck(cudaMalloc((void **)&pChannelsCounter, sizeof(uint32_t) * 2));
}

void deallocate(ConfigurationParameters const &config) {
if (pChannelsCounter) {
cudaCheck(cudaFree(pChannelsCounter));
}
}
};

struct InputDataGPU {
unsigned char *data = nullptr;
uint32_t *offsets = nullptr;
int *feds = nullptr;

void allocate() {
cudaCheck(cudaMalloc((void **)&data, sizeof(unsigned char) * nbytes_per_fed_max * nfeds_max));
cudaCheck(cudaMalloc((void **)&offsets, sizeof(uint32_t) * nfeds_max));
cudaCheck(cudaMalloc((void **)&feds, sizeof(int) * nfeds_max));
}

void deallocate() {
if (data) {
cudaCheck(cudaFree(data));
cudaCheck(cudaFree(offsets));
cudaCheck(cudaFree(feds));
}
}
};

struct ConditionsProducts {
ElectronicsMappingGPU::Product const &eMappingProduct;
};

} // namespace raw
} // namespace ecal

#endif // EventFilter_EcalRawToDigi_plugins_DeclsForKernels_h
5 changes: 3 additions & 2 deletions EventFilter/EcalRawToDigi/plugins/EcalCPUDigisProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
#include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
#include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "EventFilter/EcalRawToDigi/interface/DeclsForKernels.h"
#include "EventFilter/EcalRawToDigi/interface/ElectronicsMappingGPU.h"
#include "EventFilter/EcalRawToDigi/interface/UnpackGPU.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/MakerMacros.h"
Expand All @@ -18,6 +16,9 @@
#include "HeterogeneousCore/CUDAUtilities/interface/HostAllocator.h"
#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h"

#include "DeclsForKernels.h"
#include "UnpackGPU.h"

class EcalCPUDigisProducer : public edm::stream::EDProducer<edm::ExternalWork> {
public:
explicit EcalCPUDigisProducer(edm::ParameterSet const& ps);
Expand Down
31 changes: 11 additions & 20 deletions EventFilter/EcalRawToDigi/plugins/EcalRawToDigiGPU.cc
Original file line number Diff line number Diff line change
@@ -1,29 +1,20 @@
#include <iostream>

// framework
#include "FWCore/Framework/interface/stream/EDProducer.h"
//#include "HeterogeneousCore/Producer/interface/HeterogeneousEDProducer.h"
//#include "HeterogeneousCore/Producer/interface/HeterogeneousEvent.h"

#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h"
#include "HeterogeneousCore/CUDACore/interface/ScopedContext.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/MakerMacros.h"

// algorithm specific

#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
#include "CUDADataFormats/EcalDigi/interface/DigisCollection.h"

#include "CondFormats/DataRecord/interface/EcalMappingElectronicsRcd.h"

#include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "EventFilter/EcalRawToDigi/interface/ElectronicsMappingGPU.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "HeterogeneousCore/CUDACore/interface/ScopedContext.h"
#include "HeterogeneousCore/CUDAUtilities/interface/cudaCheck.h"

#include "EventFilter/EcalRawToDigi/interface/DeclsForKernels.h"
#include "EventFilter/EcalRawToDigi/interface/UnpackGPU.h"
#include "DeclsForKernels.h"
#include "UnpackGPU.h"

class EcalRawToDigiGPU : public edm::stream::EDProducer<edm::ExternalWork> {
public:
Expand Down
Loading

0 comments on commit 7b3807c

Please sign in to comment.