Skip to content

Commit fe2ee2a

Browse files
authored
Merge pull request cms-sw#43298 from makortel/alpakaESProducerNull
Allow Alpaka ESProducer to produce a 'null' data product
2 parents 8279597 + 30467dc commit fe2ee2a

File tree

4 files changed

+133
-5
lines changed

4 files changed

+133
-5
lines changed

HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define HeterogeneousCore_AlpakaCore_interface_alpaka_ESProducer_h
33

44
#include "FWCore/Framework/interface/ESProducer.h"
5+
#include "FWCore/Framework/interface/MakeDataException.h"
56
#include "FWCore/Framework/interface/produce_helpers.h"
67
#include "HeterogeneousCore/AlpakaCore/interface/module_backend_config.h"
78
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESDeviceProduct.h"
@@ -49,9 +50,13 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
4950
auto tokenPtr = std::make_shared<edm::ESGetToken<TProduct, TRecord>>();
5051
auto ccDev = setWhatProducedDevice<TRecord>(
5152
[tokenPtr](device::Record<TRecord> const& iRecord) {
52-
auto handle = iRecord.getTransientHandle(*tokenPtr);
5353
using CopyT = cms::alpakatools::CopyToDevice<TProduct>;
54-
return std::optional{CopyT::copyAsync(iRecord.queue(), *handle)};
54+
try {
55+
auto handle = iRecord.getTransientHandle(*tokenPtr);
56+
return std::optional{CopyT::copyAsync(iRecord.queue(), *handle)};
57+
} catch (edm::eventsetup::MakeDataException& e) {
58+
return std::optional<decltype(CopyT::copyAsync(std::declval<Queue&>(), std::declval<TProduct>()))>();
59+
}
5560
},
5661
label);
5762
*tokenPtr = ccDev.consumes(edm::ESInputTag{moduleLabel_, label.default_ + appendToDataLabel_});
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "FWCore/Framework/interface/ESTransientHandle.h"
2+
#include "FWCore/ParameterSet/interface/ParameterSet.h"
3+
#include "FWCore/Utilities/interface/ESGetToken.h"
4+
#include "FWCore/Utilities/interface/ESInputTag.h"
5+
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h"
6+
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h"
7+
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h"
8+
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"
9+
#include "HeterogeneousCore/AlpakaInterface/interface/memory.h"
10+
#include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestData.h"
11+
#include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestRecords.h"
12+
#include "HeterogeneousCore/AlpakaTest/interface/ESTestData.h"
13+
#include "HeterogeneousCore/AlpakaTest/interface/alpaka/AlpakaESTestData.h"
14+
15+
namespace ALPAKA_ACCELERATOR_NAMESPACE {
16+
/**
17+
* This class demonstrates an ESProducer that
18+
* - produces a null in a host produce function
19+
* - produces a null in a device produce function
20+
*/
21+
class TestAlpakaESProducerNull : public ESProducer {
22+
public:
23+
TestAlpakaESProducerNull(edm::ParameterSet const& iConfig) : ESProducer(iConfig) {
24+
setWhatProduced(this, &TestAlpakaESProducerNull::produceHost);
25+
setWhatProduced(this, &TestAlpakaESProducerNull::produceDevice);
26+
}
27+
28+
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
29+
edm::ParameterSetDescription desc;
30+
descriptions.addWithDefaultLabel(desc);
31+
}
32+
33+
std::optional<AlpakaESTestDataAHost> produceHost(AlpakaESTestRecordA const& iRecord) { return {}; }
34+
35+
std::unique_ptr<AlpakaESTestDataCDevice> produceDevice(device::Record<AlpakaESTestRecordD> const& iRecord) {
36+
return {};
37+
}
38+
};
39+
} // namespace ALPAKA_ACCELERATOR_NAMESPACE
40+
41+
DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(TestAlpakaESProducerNull);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
2+
#include "FWCore/ParameterSet/interface/ParameterSet.h"
3+
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
4+
#include "FWCore/Utilities/interface/InputTag.h"
5+
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/global/EDProducer.h"
6+
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h"
7+
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"
8+
#include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestRecords.h"
9+
#include "HeterogeneousCore/AlpakaTest/interface/alpaka/AlpakaESTestData.h"
10+
11+
namespace ALPAKA_ACCELERATOR_NAMESPACE {
12+
/**
13+
* This class tests various ways of a device ESProduct being missing
14+
*/
15+
class TestAlpakaGlobalProducerNullES : public global::EDProducer<> {
16+
public:
17+
TestAlpakaGlobalProducerNullES(edm::ParameterSet const& config)
18+
: esTokenA_(esConsumes(config.getParameter<edm::ESInputTag>("eventSetupSource"))),
19+
esTokenC_(esConsumes(config.getParameter<edm::ESInputTag>("eventSetupSource"))),
20+
esTokenCNotExist_(esConsumes(edm::ESInputTag("", "doesNotExist"))) {}
21+
22+
void produce(edm::StreamID, device::Event& iEvent, device::EventSetup const& iSetup) const override {
23+
bool threw = false;
24+
try {
25+
[[maybe_unused]] auto handleA = iSetup.getHandle(esTokenA_);
26+
} catch (cms::Exception& e) {
27+
threw = true;
28+
}
29+
if (not threw) {
30+
throw cms::Exception("Assert") << "Getting AlpakaESTestDataADevice ESProduct did not throw";
31+
}
32+
33+
threw = false;
34+
try {
35+
[[maybe_unused]] auto const& prodC = iSetup.getData(esTokenC_);
36+
} catch (cms::Exception& e) {
37+
threw = true;
38+
}
39+
if (not threw) {
40+
throw cms::Exception("Assert") << "Getting AlpakaESTestDataCDevice ESProduct did not throw";
41+
}
42+
43+
auto handleC = iSetup.getHandle(esTokenCNotExist_);
44+
if (handleC.isValid()) {
45+
throw cms::Exception("Assert") << "Getting non-existing AlpakaESTestDataCDevice succeeded, should have failed";
46+
}
47+
threw = false;
48+
try {
49+
[[maybe_unused]] auto const& prodC = *handleC;
50+
} catch (cms::Exception& e) {
51+
threw = true;
52+
}
53+
if (not threw) {
54+
throw cms::Exception("Assert")
55+
<< "De-referencing ESHandle of non-existentAlpakaESTestDataADevice did not throw";
56+
}
57+
}
58+
59+
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
60+
edm::ParameterSetDescription desc;
61+
desc.add("eventSetupSource", edm::ESInputTag{});
62+
descriptions.addWithDefaultLabel(desc);
63+
}
64+
65+
private:
66+
const device::ESGetToken<AlpakaESTestDataADevice, AlpakaESTestRecordA> esTokenA_;
67+
const device::ESGetToken<AlpakaESTestDataCDevice, AlpakaESTestRecordA> esTokenC_;
68+
const device::ESGetToken<AlpakaESTestDataCDevice, AlpakaESTestRecordA> esTokenCNotExist_;
69+
};
70+
71+
} // namespace ALPAKA_ACCELERATOR_NAMESPACE
72+
73+
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
74+
DEFINE_FWK_ALPAKA_MODULE(TestAlpakaGlobalProducerNullES);

HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
srcA = cms.ESInputTag("", "appendedLabel"),
5555
srcB = cms.ESInputTag("", "explicitLabel"),
5656
)
57+
process.alpakaESProducerNull = cms.ESProducer("TestAlpakaESProducerNull@alpaka",
58+
appendToDataLabel = cms.string("null"),
59+
)
5760

5861
process.intProduct = cms.EDProducer("IntProducer", ivalue = cms.int32(42))
5962

@@ -111,12 +114,16 @@
111114
expectSize = cms.int32(10),
112115
expectBackend = cms.string("SerialSync")
113116
)
117+
process.alpakaNullESConsumer = cms.EDProducer("TestAlpakaGlobalProducerNullES@alpaka",
118+
eventSetupSource = cms.ESInputTag("", "null")
119+
)
114120

115121
if args.processAcceleratorBackend != "":
116122
process.ProcessAcceleratorAlpaka.setBackend(args.processAcceleratorBackend)
117123
if args.moduleBackend != "":
118-
for name in ["ESProducerA", "ESProducerB", "ESProducerC", "ESProducerD",
119-
"GlobalProducer", "StreamProducer", "StreamInstanceProducer", "StreamSynchronizingProducer"]:
124+
for name in ["ESProducerA", "ESProducerB", "ESProducerC", "ESProducerD", "ESProducerNull",
125+
"GlobalProducer", "StreamProducer", "StreamInstanceProducer", "StreamSynchronizingProducer",
126+
"NullESConsumer"]:
120127
mod = getattr(process, "alpaka"+name)
121128
mod.alpaka = cms.untracked.PSet(backend = cms.untracked.string(args.moduleBackend))
122129
if args.expectBackend == "cuda_async":
@@ -157,7 +164,8 @@ def setExpect(m, size):
157164
process.alpakaGlobalConsumer+
158165
process.alpakaStreamConsumer+
159166
process.alpakaStreamInstanceConsumer+
160-
process.alpakaStreamSynchronizingConsumer,
167+
process.alpakaStreamSynchronizingConsumer+
168+
process.alpakaNullESConsumer,
161169
process.t
162170
)
163171
process.ep = cms.EndPath(process.output)

0 commit comments

Comments
 (0)