From 71c236be7dbe35f60ea0984878f855e1c4d9f436 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Fri, 9 Sep 2022 22:36:48 +0200 Subject: [PATCH 1/5] Add ProcessAcceleratorAlpaka and AlpakaModuleTypeResolver --- .../AlpakaCore/interface/alpaka/ESProducer.h | 7 ++ .../interface/alpaka/ProducerBase.h | 7 ++ .../interface/module_backend_config.h | 10 +++ .../AlpakaCore/plugins/BuildFile.xml | 7 ++ .../plugins/ModuleTypeResolverAlpaka.cc | 66 +++++++++++++++++ .../python/ProcessAcceleratorAlpaka.py | 70 +++++++++++++++++++ .../python/ProcessAcceleratorAlpaka_cfi.py | 3 + .../AlpakaCore/src/module_backend_config.cc | 33 +++++++++ .../AlpakaTest/test/testAlpakaModules.sh | 31 ++++++-- .../AlpakaTest/test/testAlpakaModules_cfg.py | 46 ++++++------ 10 files changed, 248 insertions(+), 32 deletions(-) create mode 100644 HeterogeneousCore/AlpakaCore/interface/module_backend_config.h create mode 100644 HeterogeneousCore/AlpakaCore/plugins/BuildFile.xml create mode 100644 HeterogeneousCore/AlpakaCore/plugins/ModuleTypeResolverAlpaka.cc create mode 100644 HeterogeneousCore/AlpakaCore/python/ProcessAcceleratorAlpaka.py create mode 100644 HeterogeneousCore/AlpakaCore/python/ProcessAcceleratorAlpaka_cfi.py create mode 100644 HeterogeneousCore/AlpakaCore/src/module_backend_config.cc diff --git a/HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h b/HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h index 3b08a96b58322..d11c5adad5999 100644 --- a/HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h +++ b/HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h @@ -3,6 +3,7 @@ #include "FWCore/Framework/interface/ESProducer.h" #include "FWCore/Framework/interface/produce_helpers.h" +#include "HeterogeneousCore/AlpakaCore/interface/module_backend_config.h" #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESDeviceProduct.h" #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Record.h" #include "HeterogeneousCore/AlpakaInterface/interface/devices.h" @@ -23,6 +24,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { class ESProducer : public edm::ESProducer { using Base = edm::ESProducer; + public: + static void prevalidate(edm::ConfigurationDescriptions& descriptions) { + Base::prevalidate(descriptions); + cms::alpakatools::module_backend_config(descriptions); + } + protected: template auto setWhatProduced(T* iThis, edm::es::Label const& label = {}) { diff --git a/HeterogeneousCore/AlpakaCore/interface/alpaka/ProducerBase.h b/HeterogeneousCore/AlpakaCore/interface/alpaka/ProducerBase.h index 8d3272c69ea5c..5ad84c3edba0e 100644 --- a/HeterogeneousCore/AlpakaCore/interface/alpaka/ProducerBase.h +++ b/HeterogeneousCore/AlpakaCore/interface/alpaka/ProducerBase.h @@ -2,12 +2,14 @@ #define HeterogeneousCore_AlpakaCore_interface_ProducerBase_h #include "DataFormats/Common/interface/DeviceProduct.h" +#include "FWCore/Framework/interface/FrameworkfwdMostUsed.h" #include "FWCore/Framework/interface/moduleAbilities.h" #include "FWCore/Utilities/interface/EDPutToken.h" #include "FWCore/Utilities/interface/Transition.h" #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDMetadataAcquireSentry.h" #include "HeterogeneousCore/AlpakaCore/interface/EventCache.h" #include "HeterogeneousCore/AlpakaCore/interface/QueueCache.h" +#include "HeterogeneousCore/AlpakaCore/interface/module_backend_config.h" #include "HeterogeneousCore/AlpakaInterface/interface/TransferToHost.h" #include @@ -51,6 +53,11 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { return ProducerBaseAdaptor(*this, std::move(instanceName)); } + static void prevalidate(edm::ConfigurationDescriptions& descriptions) { + Base::prevalidate(descriptions); + cms::alpakatools::module_backend_config(descriptions); + } + private: template friend class ProducerBaseAdaptor; diff --git a/HeterogeneousCore/AlpakaCore/interface/module_backend_config.h b/HeterogeneousCore/AlpakaCore/interface/module_backend_config.h new file mode 100644 index 0000000000000..5fc9afb8b60b1 --- /dev/null +++ b/HeterogeneousCore/AlpakaCore/interface/module_backend_config.h @@ -0,0 +1,10 @@ +#ifndef HeterogeneousCore_AlpakaCore_interface_module_backend_config_h +#define HeterogeneousCore_AlpakaCore_interface_module_backend_config_h + +#include "FWCore/Framework/interface/FrameworkfwdMostUsed.h" + +namespace cms::alpakatools { + void module_backend_config(edm::ConfigurationDescriptions& iDesc); +} + +#endif diff --git a/HeterogeneousCore/AlpakaCore/plugins/BuildFile.xml b/HeterogeneousCore/AlpakaCore/plugins/BuildFile.xml new file mode 100644 index 0000000000000..80f1acb621283 --- /dev/null +++ b/HeterogeneousCore/AlpakaCore/plugins/BuildFile.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/HeterogeneousCore/AlpakaCore/plugins/ModuleTypeResolverAlpaka.cc b/HeterogeneousCore/AlpakaCore/plugins/ModuleTypeResolverAlpaka.cc new file mode 100644 index 0000000000000..e343e7b77b6b5 --- /dev/null +++ b/HeterogeneousCore/AlpakaCore/plugins/ModuleTypeResolverAlpaka.cc @@ -0,0 +1,66 @@ +#include "FWCore/Framework/interface/ModuleTypeResolverMaker.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/EDMException.h" +#include "FWCore/Utilities/interface/thread_safety_macros.h" + +#include +#include +#include +#include + +class ModuleTypeResolverAlpaka : public edm::ModuleTypeResolverBase { +public: + ModuleTypeResolverAlpaka(std::string backendPrefix) : backendPrefix_(std::move(backendPrefix)) {} + + std::pair resolveType(std::string basename, int index) const final { + assert(index == kInitialIndex); + constexpr auto kAlpaka = "@alpaka"; + auto found = basename.find(kAlpaka); + if (found != std::string::npos) { + if (backendPrefix_.empty()) { + throw edm::Exception(edm::errors::LogicError) + << "AlpakaModuleTypeResolver encountered a module with type name " << basename + << " but the backend prefix was empty. This should not happen. Please contact framework developers."; + } + basename.replace(found, std::strlen(kAlpaka), ""); + basename = backendPrefix_ + basename; + } + return {basename, kLastIndex}; + } + +private: + std::string const backendPrefix_; +}; + +class ModuleTypeResolverMakerAlpaka : public edm::ModuleTypeResolverMaker { +public: + ModuleTypeResolverMakerAlpaka() {} + + std::shared_ptr makeResolver(edm::ParameterSet const& modulePSet) const final { + std::string prefix = ""; + if (modulePSet.existsAs("alpaka", false)) { + auto const& backend = + modulePSet.getUntrackedParameter("alpaka").getUntrackedParameter("backend"); + prefix = fmt::format("alpaka_{}::", backend); + + LogDebug("AlpakaModuleTypeResolver") + .format("AlpakaModuleTypeResolver: module {} backend prefix {}", + modulePSet.getParameter("@module_label"), + prefix); + } + auto found = cache_.find(prefix); + if (found == cache_.end()) { + bool inserted; + std::tie(found, inserted) = cache_.emplace(prefix, std::make_shared(prefix)); + } + return found->second; + } + +private: + // no protection needed because this object is used only in single-thread context + CMS_SA_ALLOW mutable std::unordered_map> cache_; +}; + +#include "FWCore/Framework/interface/ModuleTypeResolverMakerFactory.h" +DEFINE_EDM_PLUGIN(edm::ModuleTypeResolverMakerFactory, ModuleTypeResolverMakerAlpaka, "ModuleTypeResolverAlpaka"); diff --git a/HeterogeneousCore/AlpakaCore/python/ProcessAcceleratorAlpaka.py b/HeterogeneousCore/AlpakaCore/python/ProcessAcceleratorAlpaka.py new file mode 100644 index 0000000000000..8ee21c2d055d3 --- /dev/null +++ b/HeterogeneousCore/AlpakaCore/python/ProcessAcceleratorAlpaka.py @@ -0,0 +1,70 @@ +import FWCore.ParameterSet.Config as cms + +class ModuleTypeResolverAlpaka: + def __init__(self, accelerators, backend): + # first element is used as the default is nothing is set + self._valid_backends = [] + if "gpu-nvidia" in accelerators: + self._valid_backends.append("cuda_async") + if "cpu" in accelerators: + self._valid_backends.append("serial_sync") + if len(self._valid_backends) == 0: + raise cms.EDMException(cms.edm.errors.UnavailableAccelerator, "ModuleTypeResolverAlpaka had no backends available because of the combination of the job configuration and accelerator availability of on the machine. The job sees {} accelerators.".format(", ".join(accelerators))) + if backend is not None: + if not backend in self._valid_backends: + raise cms.EDMException(cms.edm.errors.UnavailableAccelerator, "The ProcessAcceleratorAlpaka was configured to use {} backend, but that backend is not available because of the combination of the job configuration and accelerator availability on the machine. The job was configured to use {} accelerators, which translates to {} Alpaka backends.".format( + backend, ", ".join(accelerators), ", ".join(self._valid_backends))) + if backend != self._valid_backends[0]: + self._valid_backends.remove(backend) + self._valid_backends.insert(0, backend) + + def plugin(self): + return "ModuleTypeResolverAlpaka" + + def setModuleVariant(self, module): + if module.type_().endswith("@alpaka"): + defaultBackend = self._valid_backends[0] + if hasattr(module, "alpaka"): + if hasattr(module.alpaka, "backend"): + if module.alpaka.backend == "": + module.alpaka.backend = defaultBackend + elif module.alpaka.backend.value() not in self._valid_backends: + raise cms.EDMException(cms.edm.errors.UnavailableAccelerator, "Module {} has the Alpaka backend set explicitly, but its accelerator is not available for the job because of the combination of the job configuration and accelerator availability on the machine. The following Alpaka backends are available for the job {}.".format(module.label_(), ", ".join(self._valid_backends))) + else: + module.alpaka.backend = cms.untracked.string(defaultBackend) + else: + module.alpaka = cms.untracked.PSet( + backend = cms.untracked.string(defaultBackend) + ) + +class ProcessAcceleratorAlpaka(cms.ProcessAccelerator): + """ProcessAcceleratorAlpaka itself does not define or inspect + availability of any accelerator devices. It merely sets up + necessary Alpaka infrastructure based on the availability of + accelerators that the concrete ProcessAccelerators (like + ProcessAcceleratorCUDA) define. + """ + def __init__(self): + super(ProcessAcceleratorAlpaka,self).__init__() + self._backend = None + # User-facing interface + def setBackend(self, backend): + self._backend = backend + # Framework-facing interface + def moduleTypeResolver(self, accelerators): + return ModuleTypeResolverAlpaka(accelerators, self._backend) + def apply(self, process, accelerators): + if not hasattr(process, "AlpakaServiceSerialSync"): + from HeterogeneousCore.AlpakaServices.AlpakaServiceSerialSync_cfi import AlpakaServiceSerialSync + process.add_(AlpakaServiceSerialSync) + if not hasattr(process, "AlpakaServiceCudaAsync"): + from HeterogeneousCore.AlpakaServices.AlpakaServiceCudaAsync_cfi import AlpakaServiceCudaAsync + process.add_(AlpakaServiceCudaAsync) + + if not hasattr(process.MessageLogger, "AlpakaService"): + process.MessageLogger.AlpakaService = cms.untracked.PSet() + + process.AlpakaServiceSerialSync.enabled = "cpu" in accelerators + process.AlpakaServiceCudaAsync.enabled = "gpu-nvidia" in accelerators + +cms.specialImportRegistry.registerSpecialImportForType(ProcessAcceleratorAlpaka, "from HeterogeneousCore.AlpakaCore.ProcessAcceleratorAlpaka import ProcessAcceleratorAlpaka") diff --git a/HeterogeneousCore/AlpakaCore/python/ProcessAcceleratorAlpaka_cfi.py b/HeterogeneousCore/AlpakaCore/python/ProcessAcceleratorAlpaka_cfi.py new file mode 100644 index 0000000000000..d946a278360b5 --- /dev/null +++ b/HeterogeneousCore/AlpakaCore/python/ProcessAcceleratorAlpaka_cfi.py @@ -0,0 +1,3 @@ +from HeterogeneousCore.AlpakaCore.ProcessAcceleratorAlpaka import ProcessAcceleratorAlpaka as _ProcessAcceleratorAlpaka + +ProcessAcceleratorAlpaka = _ProcessAcceleratorAlpaka() diff --git a/HeterogeneousCore/AlpakaCore/src/module_backend_config.cc b/HeterogeneousCore/AlpakaCore/src/module_backend_config.cc new file mode 100644 index 0000000000000..ffd52594683ed --- /dev/null +++ b/HeterogeneousCore/AlpakaCore/src/module_backend_config.cc @@ -0,0 +1,33 @@ +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "HeterogeneousCore/AlpakaCore/interface/module_backend_config.h" + +namespace { + const std::string kPSetName("alpaka"); + const char* const kComment = "PSet allows to override the Alpaka backend per module instance"; +} // namespace + +namespace cms::alpakatools { + void module_backend_config(edm::ConfigurationDescriptions& iDesc) { + // the code below leads to 'alpaka = untracked.PSet(backend = untracked.string)' to be added to the generated cfi files + // TODO: I don't know if this is a desired behavior for HLT + edm::ParameterSetDescription descAlpaka; + descAlpaka.addUntracked("backend", "") + ->setComment( + "Alpaka backend for this module. Can be empty string (for the global default), 'serial_sync', or " + "'cuda_async'"); + + if (iDesc.defaultDescription()) { + if (iDesc.defaultDescription()->isLabelUnused(kPSetName)) { + iDesc.defaultDescription() + ->addUntracked(kPSetName, descAlpaka) + ->setComment(kComment); + } + } + for (auto& v : iDesc) { + if (v.second.isLabelUnused(kPSetName)) { + v.second.addUntracked(kPSetName, descAlpaka)->setComment(kComment); + } + } + } +} // namespace cms::alpakatools diff --git a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules.sh b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules.sh index 12780e2e98691..17b707ef24af4 100755 --- a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules.sh +++ b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules.sh @@ -19,13 +19,32 @@ elif [ "$1" = "cpu" ]; then TARGET=cpu fi else - die "Argument needs to be 'cpu' or 'cpu', got $1" 1 + die "Argument needs to be 'cpu' or 'cuda', got $1" 1 fi -echo "cmsRun testAlpakaModules_cfg.py" -cmsRun ${TEST_DIR}/testAlpakaModules_cfg.py || die "cmsRun testAlpakaModules_cfg.py" $? +function runSuccess { + echo "cmsRun testAlpakaModules_cfg.py $1" + cmsRun ${TEST_DIR}/testAlpakaModules_cfg.py $1 || die "cmsRun testAlpakaModules_cfg.py $1" $? + echo +} +function runFailure { + echo "cmsRun testAlpakaModules_cfg.py $1 (job itself is expected to fail)" + cmsRun -j testAlpakaModules_jobreport.xml ${TEST_DIR}/testAlpakaModules_cfg.py $1 && die "cmsRun testAlpakaModules_cfg.py $1 did not fail" 1 + EXIT_CODE=$(edmFjrDump --exitCode testAlpakaModules_jobreport.xml) + if [ "x${EXIT_CODE}" != "x8035" ]; then + echo "Alpaka module test for unavailable accelerator reported exit code ${EXIT_CODE} which is different from the expected 8035" + exit 1 + fi + echo +} + +runSuccess "" +runSuccess "-- --accelerators=cpu" +runSuccess "-- --moduleBackend=serial_sync" + +if [ "${TARGET}" == "cpu" ]; then + runFailure "-- --moduleBackend=cuda_async" -if [ "x${TARGET}" == "xcuda" ]; then - echo "cmsRun testAlpakaModules_cfg.py --cuda" - cmsRun ${TEST_DIR}/testAlpakaModules_cfg.py -- --cuda || die "cmsRun testAlpakaModules_cfg.py --cuda" $? +elif [ "${TARGET}" == "cuda" ]; then + runSuccess "-- --moduleBackend=cuda_async" fi diff --git a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py index 50fc3c4e11429..9c6825ada54ce 100644 --- a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py +++ b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py @@ -4,7 +4,8 @@ parser = argparse.ArgumentParser(prog=sys.argv[0], description='Test various Alpaka module types') -parser.add_argument("--cuda", help="Use CUDA backend", action="store_true") +parser.add_argument("--accelerators", type=str, help="Set process.options.accelerators (comma-separated string, default is to use default)", default="") +parser.add_argument("--moduleBackend", type=str, help="Set Alpaka backend for module instances", default="") parser.add_argument("--run", type=int, help="Run number (default: 1)", default=1) argv = sys.argv[:] @@ -12,11 +13,6 @@ argv.remove("--") args, unknown = parser.parse_known_args(argv) -# TODO: just a temporary mechanism until we get something better that -# works also for ES modules. Absolutely NOT for wider use. -def setToCUDA(m): - m._TypedParameterizable__type = m._TypedParameterizable__type.replace("alpaka_serial_sync", "alpaka_cuda_async") - process = cms.Process('TEST') process.source = cms.Source('EmptySource', @@ -25,11 +21,12 @@ def setToCUDA(m): process.maxEvents.input = 10 +if len(args.accelerators) != 0: + process.options.accelerators = args.accelerators.split(",") + process.load('Configuration.StandardSequences.Accelerators_cff') -process.AlpakaServiceSerialSync = cms.Service('AlpakaServiceSerialSync') -if args.cuda: - process.AlpakaServiceSerialSync.enabled = cms.untracked.bool(False) - process.AlpakaServiceCudaAsync = cms.Service('AlpakaServiceCudaAsync') +process.load("HeterogeneousCore.CUDACore.ProcessAcceleratorCUDA_cfi") +process.load("HeterogeneousCore.AlpakaCore.ProcessAcceleratorAlpaka_cfi") process.alpakaESRecordASource = cms.ESSource("EmptyESSource", recordName = cms.string('AlpakaESTestRecordA'), @@ -51,32 +48,23 @@ def setToCUDA(m): process.esProducerB = cms.ESProducer("cms::alpakatest::TestESProducerB", value = cms.int32(314159)) process.esProducerC = cms.ESProducer("cms::alpakatest::TestESProducerC", value = cms.int32(27)) -process.alpakaESProducerA = cms.ESProducer("alpaka_serial_sync::TestAlpakaESProducerA") -process.alpakaESProducerB = cms.ESProducer("alpaka_serial_sync::TestAlpakaESProducerB") -process.alpakaESProducerC = cms.ESProducer("alpaka_serial_sync::TestAlpakaESProducerC") -process.alpakaESProducerD = cms.ESProducer("alpaka_serial_sync::TestAlpakaESProducerD") -if args.cuda: - setToCUDA(process.alpakaESProducerA) - setToCUDA(process.alpakaESProducerB) - setToCUDA(process.alpakaESProducerC) - setToCUDA(process.alpakaESProducerD) +process.alpakaESProducerA = cms.ESProducer("TestAlpakaESProducerA@alpaka") +process.alpakaESProducerB = cms.ESProducer("TestAlpakaESProducerB@alpaka") +process.alpakaESProducerC = cms.ESProducer("TestAlpakaESProducerC@alpaka") +process.alpakaESProducerD = cms.ESProducer("TestAlpakaESProducerD@alpaka") process.intProduct = cms.EDProducer("IntProducer", ivalue = cms.int32(42)) -process.alpakaGlobalProducer = cms.EDProducer("alpaka_serial_sync::TestAlpakaGlobalProducer", +process.alpakaGlobalProducer = cms.EDProducer("TestAlpakaGlobalProducer@alpaka", size = cms.int32(10) ) -process.alpakaStreamProducer = cms.EDProducer("alpaka_serial_sync::TestAlpakaStreamProducer", +process.alpakaStreamProducer = cms.EDProducer("TestAlpakaStreamProducer@alpaka", source = cms.InputTag("intProduct"), size = cms.int32(5) ) -process.alpakaStreamSynchronizingProducer = cms.EDProducer("alpaka_serial_sync::TestAlpakaStreamSynchronizingProducer", +process.alpakaStreamSynchronizingProducer = cms.EDProducer("TestAlpakaStreamSynchronizingProducer@alpaka", source = cms.InputTag("alpakaGlobalProducer") ) -if args.cuda: - setToCUDA(process.alpakaGlobalProducer) - setToCUDA(process.alpakaStreamProducer) - setToCUDA(process.alpakaStreamSynchronizingProducer) process.alpakaGlobalConsumer = cms.EDAnalyzer("TestAlpakaAnalyzer", source = cms.InputTag("alpakaGlobalProducer") @@ -88,6 +76,12 @@ def setToCUDA(m): source = cms.InputTag("alpakaStreamSynchronizingProducer") ) +if args.moduleBackend != "": + for name in ["ESProducerA", "ESProducerB", "ESProducerC", "ESProducerD", + "GlobalProducer", "StreamProducer", "StreamSynchronizingProducer"]: + mod = getattr(process, "alpaka"+name) + mod.alpaka = cms.untracked.PSet(backend = cms.untracked.string(args.moduleBackend)) + process.output = cms.OutputModule('PoolOutputModule', fileName = cms.untracked.string('testAlpaka.root'), outputCommands = cms.untracked.vstring( From 54d48f292571ebdcdc9942ba2b6e684acb663d18 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Thu, 27 Oct 2022 18:35:40 +0200 Subject: [PATCH 2/5] Use collection size to ensure the expected backend is run --- .../AlpakaTest/plugins/TestAlpakaAnalyzer.cc | 12 +++++++++- .../alpaka/TestAlpakaGlobalProducer.cc | 12 ++++++++-- .../alpaka/TestAlpakaStreamProducer.cc | 11 +++++++-- .../AlpakaTest/test/testAlpakaModules.sh | 17 +++++++++---- .../AlpakaTest/test/testAlpakaModules_cfg.py | 24 +++++++++++++++---- 5 files changed, 61 insertions(+), 15 deletions(-) diff --git a/HeterogeneousCore/AlpakaTest/plugins/TestAlpakaAnalyzer.cc b/HeterogeneousCore/AlpakaTest/plugins/TestAlpakaAnalyzer.cc index 2c6ed46c5d282..b52dfde7fa848 100644 --- a/HeterogeneousCore/AlpakaTest/plugins/TestAlpakaAnalyzer.cc +++ b/HeterogeneousCore/AlpakaTest/plugins/TestAlpakaAnalyzer.cc @@ -76,7 +76,9 @@ namespace { class TestAlpakaAnalyzer : public edm::stream::EDAnalyzer<> { public: TestAlpakaAnalyzer(edm::ParameterSet const& config) - : source_{config.getParameter("source")}, token_{consumes(source_)} {} + : source_{config.getParameter("source")}, + token_{consumes(source_)}, + expectSize_(config.getParameter("expectSize")) {} void analyze(edm::Event const& event, edm::EventSetup const&) override { portabletest::TestHostCollection const& product = event.get(token_); @@ -84,6 +86,11 @@ class TestAlpakaAnalyzer : public edm::stream::EDAnalyzer<> { auto& mview = product.view(); auto const& cmview = product.view(); + if (expectSize_ >= 0 and expectSize_ != view.metadata().size()) { + throw cms::Exception("Assert") << "Expected input collection size " << expectSize_ << ", got " + << view.metadata().size(); + } + { edm::LogInfo msg("TestAlpakaAnalyzer"); msg << source_.encode() << ".size() = " << view.metadata().size() << '\n'; @@ -132,12 +139,15 @@ class TestAlpakaAnalyzer : public edm::stream::EDAnalyzer<> { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; desc.add("source"); + desc.add("expectSize", -1) + ->setComment("Expected size of the input collection. Values < 0 mean the check is not performed. Default: -1"); descriptions.addWithDefaultLabel(desc); } private: const edm::InputTag source_; const edm::EDGetTokenT token_; + const int expectSize_; }; #include "FWCore/Framework/interface/MakerMacros.h" diff --git a/HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaGlobalProducer.cc b/HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaGlobalProducer.cc index 57e48157f9b84..9364f79c9e57c 100644 --- a/HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaGlobalProducer.cc +++ b/HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaGlobalProducer.cc @@ -21,7 +21,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { class TestAlpakaGlobalProducer : public global::EDProducer<> { public: TestAlpakaGlobalProducer(edm::ParameterSet const& config) - : esToken_(esConsumes()), deviceToken_{produces()}, size_{config.getParameter("size")} {} + : esToken_(esConsumes()), + deviceToken_{produces()}, + size_{config.getParameter("size").getParameter( + EDM_STRINGIZE(ALPAKA_ACCELERATOR_NAMESPACE))} {} void produce(edm::StreamID, device::Event& iEvent, device::EventSetup const& iSetup) const override { [[maybe_unused]] auto const& esData = iSetup.getData(esToken_); @@ -36,7 +39,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("size"); + + edm::ParameterSetDescription psetSize; + psetSize.add("alpaka_serial_sync"); + psetSize.add("alpaka_cuda_async"); + desc.add("size", psetSize); + descriptions.addWithDefaultLabel(desc); } diff --git a/HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaStreamProducer.cc b/HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaStreamProducer.cc index 74d47d4878efa..4ec1a8d9b0f90 100644 --- a/HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaStreamProducer.cc +++ b/HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaStreamProducer.cc @@ -22,7 +22,9 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { */ class TestAlpakaStreamProducer : public stream::EDProducer<> { public: - TestAlpakaStreamProducer(edm::ParameterSet const& config) : size_{config.getParameter("size")} { + TestAlpakaStreamProducer(edm::ParameterSet const& config) + : size_{config.getParameter("size").getParameter( + EDM_STRINGIZE(ALPAKA_ACCELERATOR_NAMESPACE))} { getToken_ = consumes(config.getParameter("source")); esToken_ = esConsumes(); devicePutToken_ = produces(); @@ -43,7 +45,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; desc.add("source"); - desc.add("size"); + + edm::ParameterSetDescription psetSize; + psetSize.add("alpaka_serial_sync"); + psetSize.add("alpaka_cuda_async"); + desc.add("size", psetSize); + descriptions.addWithDefaultLabel(desc); } diff --git a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules.sh b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules.sh index 17b707ef24af4..a14544a05e415 100755 --- a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules.sh +++ b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules.sh @@ -38,13 +38,20 @@ function runFailure { echo } -runSuccess "" -runSuccess "-- --accelerators=cpu" -runSuccess "-- --moduleBackend=serial_sync" +runSuccess "-- --accelerators=cpu --expectBackend=serial_sync" +runSuccess "-- --moduleBackend=serial_sync --expectBackend=serial_sync" if [ "${TARGET}" == "cpu" ]; then - runFailure "-- --moduleBackend=cuda_async" + runSuccess "-- --expectBackend=serial_sync" + + runFailure "-- --accelerators=gpu-nvidia --expectBackend=cuda_async" + runFailure "-- --moduleBackend=cuda_async --expectBackend=cuda_async" elif [ "${TARGET}" == "cuda" ]; then - runSuccess "-- --moduleBackend=cuda_async" + runSuccess "-- --expectBackend=cuda_async" + runSuccess "-- --accelerators=gpu-nvidia --expectBackend=cuda_async" + runSuccess "-- --moduleBackend=cuda_async --expectBackend=cuda_async" + + runFailure "-- --accelerators=gpu-nvidia --moduleBackend=serial_sync --expectBackend=serial_sync" + runFailure "-- --accelerators=cpu --moduleBackend=cuda_async --expectBackend=cuda_async" fi diff --git a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py index 9c6825ada54ce..f23377626a256 100644 --- a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py +++ b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py @@ -6,6 +6,7 @@ parser.add_argument("--accelerators", type=str, help="Set process.options.accelerators (comma-separated string, default is to use default)", default="") parser.add_argument("--moduleBackend", type=str, help="Set Alpaka backend for module instances", default="") +parser.add_argument("--expectBackend", type=str, help="Expect this backend to run") parser.add_argument("--run", type=int, help="Run number (default: 1)", default=1) argv = sys.argv[:] @@ -56,24 +57,33 @@ process.intProduct = cms.EDProducer("IntProducer", ivalue = cms.int32(42)) process.alpakaGlobalProducer = cms.EDProducer("TestAlpakaGlobalProducer@alpaka", - size = cms.int32(10) + size = cms.PSet( + alpaka_serial_sync = cms.int32(10), + alpaka_cuda_async = cms.int32(20) + ) ) process.alpakaStreamProducer = cms.EDProducer("TestAlpakaStreamProducer@alpaka", source = cms.InputTag("intProduct"), - size = cms.int32(5) + size = cms.PSet( + alpaka_serial_sync = cms.int32(5), + alpaka_cuda_async = cms.int32(25) + ) ) process.alpakaStreamSynchronizingProducer = cms.EDProducer("TestAlpakaStreamSynchronizingProducer@alpaka", source = cms.InputTag("alpakaGlobalProducer") ) process.alpakaGlobalConsumer = cms.EDAnalyzer("TestAlpakaAnalyzer", - source = cms.InputTag("alpakaGlobalProducer") + source = cms.InputTag("alpakaGlobalProducer"), + expectSize = cms.int32(10) ) process.alpakaStreamConsumer = cms.EDAnalyzer("TestAlpakaAnalyzer", - source = cms.InputTag("alpakaStreamProducer") + source = cms.InputTag("alpakaStreamProducer"), + expectSize = cms.int32(5) ) process.alpakaStreamSynchronizingConsumer = cms.EDAnalyzer("TestAlpakaAnalyzer", - source = cms.InputTag("alpakaStreamSynchronizingProducer") + source = cms.InputTag("alpakaStreamSynchronizingProducer"), + expectSize = cms.int32(10) ) if args.moduleBackend != "": @@ -81,6 +91,10 @@ "GlobalProducer", "StreamProducer", "StreamSynchronizingProducer"]: mod = getattr(process, "alpaka"+name) mod.alpaka = cms.untracked.PSet(backend = cms.untracked.string(args.moduleBackend)) +if args.expectBackend == "cuda_async": + process.alpakaGlobalConsumer.expectSize = 20 + process.alpakaStreamConsumer.expectSize = 25 + process.alpakaStreamSynchronizingConsumer.expectSize = 20 process.output = cms.OutputModule('PoolOutputModule', fileName = cms.untracked.string('testAlpaka.root'), From 48ef682809158a0557f0b1aa09afe094e35df99e Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Thu, 27 Oct 2022 22:59:06 +0200 Subject: [PATCH 3/5] Generate only one cfi file for each Alpaka module Instead of generating a cfi file for each Alpaka backend for each module --- .../ParameterSetDescriptionFillerPluginFactory.h | 16 ++++++++++------ FWCore/ParameterSet/src/defaultModuleLabel.cc | 3 +++ .../AlpakaCore/interface/MakerMacros.h | 15 +++++++++++++-- .../AlpakaCore/interface/alpaka/ModuleFactory.h | 16 ++++++++++++++-- .../AlpakaTest/test/testAlpakaModules_cfg.py | 12 +++++++----- 5 files changed, 47 insertions(+), 15 deletions(-) diff --git a/FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h b/FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h index e7448ac8c84b5..5e0d5ea88040e 100644 --- a/FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h +++ b/FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h @@ -30,25 +30,29 @@ namespace edm { typedef edmplugin::PluginFactory ParameterSetDescriptionFillerPluginFactory; } -#define DEFINE_FWK_PSET_DESC_FILLER(type) \ +#define DEFINE_FWK_PSET_DESC_FILLER_IMPL(type, name) \ static const edm::ParameterSetDescriptionFillerPluginFactory::PMaker > \ - EDM_PLUGIN_SYM(s_filler, __LINE__)(#type) + EDM_PLUGIN_SYM(s_filler, __LINE__)(name) //NOTE: Can't do the below since this appears on the same line as another factory and w'ed have two variables with the same name //DEFINE_EDM_PLUGIN (edm::ParameterSetDescriptionFillerPluginFactory,type,#type) +#define DEFINE_FWK_PSET_DESC_FILLER(type) DEFINE_FWK_PSET_DESC_FILLER_IMPL(type, #type) + // Define another analogous macro to handle the special case of services. #define DEFINE_DESC_FILLER_FOR_SERVICES(pluginName, serviceType) \ static const edm::ParameterSetDescriptionFillerPluginFactory::PMaker > \ EDM_PLUGIN_SYM(s_filler, __LINE__)(#pluginName) -#define DEFINE_DESC_FILLER_FOR_ESSOURCES(type) \ +#define DEFINE_DESC_FILLER_FOR_ESSOURCES_IMPL(type, name) \ static const edm::ParameterSetDescriptionFillerPluginFactory::PMaker > \ - EDM_PLUGIN_SYM(s_filler, __LINE__)(#type) + EDM_PLUGIN_SYM(s_filler, __LINE__)(name) +#define DEFINE_DESC_FILLER_FOR_ESSOURCES(type) DEFINE_DESC_FILLER_FOR_ESSOURCES_IMPL(type, #type) -#define DEFINE_DESC_FILLER_FOR_ESPRODUCERS(type) \ +#define DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type, name) \ static const edm::ParameterSetDescriptionFillerPluginFactory::PMaker > \ - EDM_PLUGIN_SYM(s_filler, __LINE__)(#type) + EDM_PLUGIN_SYM(s_filler, __LINE__)(name) +#define DEFINE_DESC_FILLER_FOR_ESPRODUCERS(type) DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type, #type) #define DEFINE_DESC_FILLER_FOR_EDLOOPERS(type) \ static const edm::ParameterSetDescriptionFillerPluginFactory::PMaker > \ diff --git a/FWCore/ParameterSet/src/defaultModuleLabel.cc b/FWCore/ParameterSet/src/defaultModuleLabel.cc index 047a7df43be42..24f02ee6eee0d 100644 --- a/FWCore/ParameterSet/src/defaultModuleLabel.cc +++ b/FWCore/ParameterSet/src/defaultModuleLabel.cc @@ -7,6 +7,9 @@ namespace edm { // remove all colons (module type may contain namespace) label.erase(std::remove(label.begin(), label.end(), ':'), label.end()); + // remove everything after first '@' (used for module alternatives) + label.erase(std::find(label.begin(), label.end(), '@'), label.end()); + // the following code originates from HLTrigger/HLTcore/interface/defaultModuleLabel.h // if the label is all uppercase, change it to all lowercase // if the label starts with more than one uppercase letter, change n-1 to lowercase diff --git a/HeterogeneousCore/AlpakaCore/interface/MakerMacros.h b/HeterogeneousCore/AlpakaCore/interface/MakerMacros.h index 71fece04e7e38..443ad5c04aa50 100644 --- a/HeterogeneousCore/AlpakaCore/interface/MakerMacros.h +++ b/HeterogeneousCore/AlpakaCore/interface/MakerMacros.h @@ -4,8 +4,19 @@ #include "FWCore/Framework/interface/MakerMacros.h" #include "HeterogeneousCore/AlpakaInterface/interface/config.h" -// force expanding ALPAKA_ACCELERATOR_NAMESPACE before stringification inside DEFINE_FWK_MODULE -#define DEFINE_FWK_ALPAKA_MODULE2(name) DEFINE_FWK_MODULE(name) +// force expanding ALPAKA_ACCELERATOR_NAMESPACE before stringification +// use the serial_sync variant for cfi file generation with the type@alpaka C++ type +#ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED +#define DEFINE_FWK_ALPAKA_MODULE3(name_ns, name) \ + DEFINE_EDM_PLUGIN(edm::MakerPluginFactory, edm::WorkerMaker, #name_ns); \ + DEFINE_FWK_PSET_DESC_FILLER_IMPL(name_ns, #name "@alpaka") +#define DEFINE_FWK_ALPAKA_MODULE2(name_ns, name) DEFINE_FWK_ALPAKA_MODULE3(name_ns, name) +#define DEFINE_FWK_ALPAKA_MODULE(name) DEFINE_FWK_ALPAKA_MODULE2(ALPAKA_ACCELERATOR_NAMESPACE::name, name) +#else +#define DEFINE_FWK_ALPAKA_MODULE3(name_ns) \ + DEFINE_EDM_PLUGIN(edm::MakerPluginFactory, edm::WorkerMaker, #name_ns) +#define DEFINE_FWK_ALPAKA_MODULE2(name_ns) DEFINE_FWK_ALPAKA_MODULE3(name_ns) #define DEFINE_FWK_ALPAKA_MODULE(name) DEFINE_FWK_ALPAKA_MODULE2(ALPAKA_ACCELERATOR_NAMESPACE::name) +#endif #endif // HeterogeneousCore_AlpakaCore_interface_MakerMacros_h diff --git a/HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h b/HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h index 8cd6277f7d61d..b372be6ce06fa 100644 --- a/HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h +++ b/HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h @@ -4,9 +4,21 @@ #include "FWCore/Framework/interface/ModuleFactory.h" #include "HeterogeneousCore/AlpakaInterface/interface/config.h" -// force expanding ALPAKA_ACCELERATOR_NAMESPACE before stringification inside DEFINE_FWK_EVENTSETUP_MODULE -#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(type) DEFINE_FWK_EVENTSETUP_MODULE(type) +// force expanding ALPAKA_ACCELERATOR_NAMESPACE before stringification +// use the serial_sync variant for cfi file generation with the type@alpaka C++ type +#ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED +#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE3(type_ns, type) \ + DEFINE_EDM_PLUGIN(edm::eventsetup::ModulePluginFactory, edm::eventsetup::ModuleMaker, #type_ns); \ + DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type_ns, #type "@alpaka") +#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(type_ns, type) DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE3(type_ns, type) +#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(type) \ + DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(ALPAKA_ACCELERATOR_NAMESPACE::type, type) +#else +#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE3(type_ns) \ + DEFINE_EDM_PLUGIN(edm::eventsetup::ModulePluginFactory, edm::eventsetup::ModuleMaker, #type_ns); +#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(type_ns) DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE3(type_ns) #define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(type) \ DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(ALPAKA_ACCELERATOR_NAMESPACE::type) +#endif #endif diff --git a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py index f23377626a256..f0ac99500d2b7 100644 --- a/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py +++ b/HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py @@ -49,17 +49,19 @@ process.esProducerB = cms.ESProducer("cms::alpakatest::TestESProducerB", value = cms.int32(314159)) process.esProducerC = cms.ESProducer("cms::alpakatest::TestESProducerC", value = cms.int32(27)) -process.alpakaESProducerA = cms.ESProducer("TestAlpakaESProducerA@alpaka") +from HeterogeneousCore.AlpakaTest.testAlpakaESProducerA_cfi import testAlpakaESProducerA +process.alpakaESProducerA = testAlpakaESProducerA.clone() process.alpakaESProducerB = cms.ESProducer("TestAlpakaESProducerB@alpaka") process.alpakaESProducerC = cms.ESProducer("TestAlpakaESProducerC@alpaka") process.alpakaESProducerD = cms.ESProducer("TestAlpakaESProducerD@alpaka") process.intProduct = cms.EDProducer("IntProducer", ivalue = cms.int32(42)) -process.alpakaGlobalProducer = cms.EDProducer("TestAlpakaGlobalProducer@alpaka", - size = cms.PSet( - alpaka_serial_sync = cms.int32(10), - alpaka_cuda_async = cms.int32(20) +from HeterogeneousCore.AlpakaTest.testAlpakaGlobalProducer_cfi import testAlpakaGlobalProducer +process.alpakaGlobalProducer = testAlpakaGlobalProducer.clone( + size = dict( + alpaka_serial_sync = 10, + alpaka_cuda_async = 20 ) ) process.alpakaStreamProducer = cms.EDProducer("TestAlpakaStreamProducer@alpaka", From 9e62d3df769e2f13727e2bab2f7138483156bd24 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Wed, 25 Jan 2023 16:32:03 +0100 Subject: [PATCH 4/5] Allow multiple PSet description filler registration variables to be used for EDModules and ESProducers --- .../ParameterSetDescriptionFillerPluginFactory.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h b/FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h index 5e0d5ea88040e..5bb713cf255b0 100644 --- a/FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h +++ b/FWCore/ParameterSet/interface/ParameterSetDescriptionFillerPluginFactory.h @@ -30,13 +30,13 @@ namespace edm { typedef edmplugin::PluginFactory ParameterSetDescriptionFillerPluginFactory; } -#define DEFINE_FWK_PSET_DESC_FILLER_IMPL(type, name) \ +#define DEFINE_FWK_PSET_DESC_FILLER_IMPL(type, name, postfix) \ static const edm::ParameterSetDescriptionFillerPluginFactory::PMaker > \ - EDM_PLUGIN_SYM(s_filler, __LINE__)(name) + EDM_PLUGIN_SYM(s_filler##postfix, __LINE__)(name) //NOTE: Can't do the below since this appears on the same line as another factory and w'ed have two variables with the same name //DEFINE_EDM_PLUGIN (edm::ParameterSetDescriptionFillerPluginFactory,type,#type) -#define DEFINE_FWK_PSET_DESC_FILLER(type) DEFINE_FWK_PSET_DESC_FILLER_IMPL(type, #type) +#define DEFINE_FWK_PSET_DESC_FILLER(type) DEFINE_FWK_PSET_DESC_FILLER_IMPL(type, #type, _0) // Define another analogous macro to handle the special case of services. @@ -49,10 +49,10 @@ namespace edm { EDM_PLUGIN_SYM(s_filler, __LINE__)(name) #define DEFINE_DESC_FILLER_FOR_ESSOURCES(type) DEFINE_DESC_FILLER_FOR_ESSOURCES_IMPL(type, #type) -#define DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type, name) \ +#define DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type, name, postfix) \ static const edm::ParameterSetDescriptionFillerPluginFactory::PMaker > \ - EDM_PLUGIN_SYM(s_filler, __LINE__)(name) -#define DEFINE_DESC_FILLER_FOR_ESPRODUCERS(type) DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type, #type) + EDM_PLUGIN_SYM(s_filler##postfix, __LINE__)(name) +#define DEFINE_DESC_FILLER_FOR_ESPRODUCERS(type) DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type, #type, _0) #define DEFINE_DESC_FILLER_FOR_EDLOOPERS(type) \ static const edm::ParameterSetDescriptionFillerPluginFactory::PMaker > \ From f93cd75690612ac8215d5073cd8ec764ed0687c5 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Wed, 25 Jan 2023 16:32:14 +0100 Subject: [PATCH 5/5] Enable back the cfi generation for module definitions with explicit backend namespace --- HeterogeneousCore/AlpakaCore/interface/MakerMacros.h | 11 ++++------- .../AlpakaCore/interface/alpaka/ModuleFactory.h | 11 ++++------- .../AlpakaCore/src/module_backend_config.cc | 4 +++- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/HeterogeneousCore/AlpakaCore/interface/MakerMacros.h b/HeterogeneousCore/AlpakaCore/interface/MakerMacros.h index 443ad5c04aa50..f4ba860450497 100644 --- a/HeterogeneousCore/AlpakaCore/interface/MakerMacros.h +++ b/HeterogeneousCore/AlpakaCore/interface/MakerMacros.h @@ -7,15 +7,12 @@ // force expanding ALPAKA_ACCELERATOR_NAMESPACE before stringification // use the serial_sync variant for cfi file generation with the type@alpaka C++ type #ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED -#define DEFINE_FWK_ALPAKA_MODULE3(name_ns, name) \ - DEFINE_EDM_PLUGIN(edm::MakerPluginFactory, edm::WorkerMaker, #name_ns); \ - DEFINE_FWK_PSET_DESC_FILLER_IMPL(name_ns, #name "@alpaka") -#define DEFINE_FWK_ALPAKA_MODULE2(name_ns, name) DEFINE_FWK_ALPAKA_MODULE3(name_ns, name) +#define DEFINE_FWK_ALPAKA_MODULE2(name_ns, name) \ + DEFINE_FWK_MODULE(name_ns); \ + DEFINE_FWK_PSET_DESC_FILLER_IMPL(name_ns, #name "@alpaka", _1) #define DEFINE_FWK_ALPAKA_MODULE(name) DEFINE_FWK_ALPAKA_MODULE2(ALPAKA_ACCELERATOR_NAMESPACE::name, name) #else -#define DEFINE_FWK_ALPAKA_MODULE3(name_ns) \ - DEFINE_EDM_PLUGIN(edm::MakerPluginFactory, edm::WorkerMaker, #name_ns) -#define DEFINE_FWK_ALPAKA_MODULE2(name_ns) DEFINE_FWK_ALPAKA_MODULE3(name_ns) +#define DEFINE_FWK_ALPAKA_MODULE2(name_ns) DEFINE_FWK_MODULE(name_ns) #define DEFINE_FWK_ALPAKA_MODULE(name) DEFINE_FWK_ALPAKA_MODULE2(ALPAKA_ACCELERATOR_NAMESPACE::name) #endif diff --git a/HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h b/HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h index b372be6ce06fa..cc91dea49da72 100644 --- a/HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h +++ b/HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h @@ -7,16 +7,13 @@ // force expanding ALPAKA_ACCELERATOR_NAMESPACE before stringification // use the serial_sync variant for cfi file generation with the type@alpaka C++ type #ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED -#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE3(type_ns, type) \ - DEFINE_EDM_PLUGIN(edm::eventsetup::ModulePluginFactory, edm::eventsetup::ModuleMaker, #type_ns); \ - DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type_ns, #type "@alpaka") -#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(type_ns, type) DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE3(type_ns, type) +#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(type_ns, type) \ + DEFINE_FWK_EVENTSETUP_MODULE(type_ns); \ + DEFINE_DESC_FILLER_FOR_ESPRODUCERS_IMPL(type_ns, #type "@alpaka", _1) #define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(type) \ DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(ALPAKA_ACCELERATOR_NAMESPACE::type, type) #else -#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE3(type_ns) \ - DEFINE_EDM_PLUGIN(edm::eventsetup::ModulePluginFactory, edm::eventsetup::ModuleMaker, #type_ns); -#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(type_ns) DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE3(type_ns) +#define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(type_ns) DEFINE_FWK_EVENTSETUP_MODULE(type_ns) #define DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(type) \ DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE2(ALPAKA_ACCELERATOR_NAMESPACE::type) #endif diff --git a/HeterogeneousCore/AlpakaCore/src/module_backend_config.cc b/HeterogeneousCore/AlpakaCore/src/module_backend_config.cc index ffd52594683ed..995e954dd67fb 100644 --- a/HeterogeneousCore/AlpakaCore/src/module_backend_config.cc +++ b/HeterogeneousCore/AlpakaCore/src/module_backend_config.cc @@ -4,7 +4,9 @@ namespace { const std::string kPSetName("alpaka"); - const char* const kComment = "PSet allows to override the Alpaka backend per module instance"; + const char* const kComment = + "PSet allows to override the Alpaka backend per module instance. Has an effect only when the module class name " + "has '@alpaka' suffix, i.e. has no effect when the Alpaka backend namespace is used explicitly."; } // namespace namespace cms::alpakatools {