Skip to content

Commit 4b74313

Browse files
committed
Fix CopyToDevice for PortableMultiHost + New tests
1 parent aca061d commit 4b74313

File tree

8 files changed

+84
-5
lines changed

8 files changed

+84
-5
lines changed

DataFormats/Portable/interface/PortableCollection.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ namespace cms::alpakatools {
7777
}
7878
};
7979

80-
template <typename TDev, typename T0, typename... Args>
81-
struct CopyToDevice<PortableHostMultiCollection<TDev, T0, Args...>> {
80+
template <typename T0, typename... Args>
81+
struct CopyToDevice<PortableHostMultiCollection<T0, Args...>> {
8282
template <typename TQueue>
83-
static auto copyAsync(TQueue& queue, PortableHostMultiCollection<TDev, T0, Args...> const& srcData) {
83+
static auto copyAsync(TQueue& queue, PortableHostMultiCollection<T0, Args...> const& srcData) {
8484
using TDevice = typename alpaka::trait::DevType<TQueue>::type;
85-
PortableDeviceMultiCollection<TDev, T0, Args...> dstData(srcData.sizes(), queue);
85+
PortableDeviceMultiCollection<TDevice, T0, Args...> dstData(srcData.sizes(), queue);
8686
alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
8787
return dstData;
8888
}

HeterogeneousCore/AlpakaTest/interface/AlpakaESTestData.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ namespace cms::alpakatest {
1414
using AlpakaESTestDataCHost = PortableHostCollection<AlpakaESTestSoAC>;
1515
using AlpakaESTestDataDHost = PortableHostCollection<AlpakaESTestSoAD>;
1616

17+
using AlpakaESTestDataACMultiHost = PortableHostMultiCollection<AlpakaESTestSoAA, AlpakaESTestSoAC>;
18+
1719
// Template-over-device model
1820
template <typename TDev>
1921
class AlpakaESTestDataB {

HeterogeneousCore/AlpakaTest/interface/alpaka/AlpakaESTestData.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
2020

2121
using AlpakaESTestDataEHost = cms::alpakatest::AlpakaESTestDataEHost;
2222
using AlpakaESTestDataEDevice = cms::alpakatest::AlpakaESTestDataE<Device>;
23+
24+
using AlpakaESTestDataACMultiHost = cms::alpakatest::AlpakaESTestDataACMultiHost;
25+
using AlpakaESTestDataACMultiDevice =
26+
PortableMultiCollection<Device, cms::alpakatest::AlpakaESTestSoAA, cms::alpakatest::AlpakaESTestSoAC>;
27+
2328
} // namespace ALPAKA_ACCELERATOR_NAMESPACE
2429

2530
// check that the portable device collections for the host device are the same as the portable host collections
2631
ASSERT_DEVICE_MATCHES_HOST_COLLECTION(AlpakaESTestDataADevice, cms::alpakatest::AlpakaESTestDataAHost);
2732
ASSERT_DEVICE_MATCHES_HOST_COLLECTION(AlpakaESTestDataCDevice, cms::alpakatest::AlpakaESTestDataCHost);
2833
ASSERT_DEVICE_MATCHES_HOST_COLLECTION(AlpakaESTestDataDDevice, cms::alpakatest::AlpakaESTestDataDHost);
2934
ASSERT_DEVICE_MATCHES_HOST_COLLECTION(AlpakaESTestDataEDevice, cms::alpakatest::AlpakaESTestDataEHost);
35+
ASSERT_DEVICE_MATCHES_HOST_COLLECTION(AlpakaESTestDataACMultiDevice, ::cms::alpakatest::AlpakaESTestDataACMultiHost);
3036

3137
#endif // HeterogeneousCore_AlpakaTest_interface_alpaka_AlpakaESTestData_h
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include "FWCore/ParameterSet/interface/ParameterSet.h"
2+
#include "FWCore/Utilities/interface/ESGetToken.h"
3+
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h"
4+
#include "HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h"
5+
#include "HeterogeneousCore/AlpakaInterface/interface/config.h"
6+
#include "HeterogeneousCore/AlpakaInterface/interface/host.h"
7+
#include "HeterogeneousCore/AlpakaInterface/interface/memory.h"
8+
#include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestRecords.h"
9+
#include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestSoA.h"
10+
#include "HeterogeneousCore/AlpakaTest/interface/ESTestData.h"
11+
#include "HeterogeneousCore/AlpakaTest/interface/alpaka/AlpakaESTestData.h"
12+
13+
namespace ALPAKA_ACCELERATOR_NAMESPACE {
14+
/**
15+
* This class is the equivalent of TesAlpakaESProducerA.cc
16+
* for PortableHostMultiCollection. It consumes a standard
17+
* host ESProduct and converts the data into PortableHostMultiCollection, and
18+
* implicitly transfers the data product to device
19+
*/
20+
class TestAlpakaESProducerAMulti : public ESProducer {
21+
public:
22+
TestAlpakaESProducerAMulti(edm::ParameterSet const& iConfig) : ESProducer(iConfig) {
23+
auto cc = setWhatProduced(this);
24+
token_ = cc.consumes();
25+
}
26+
27+
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
28+
edm::ParameterSetDescription desc;
29+
descriptions.addWithDefaultLabel(desc);
30+
}
31+
32+
std::optional<AlpakaESTestDataACMultiHost> produce(AlpakaESTestRecordA const& iRecord) {
33+
auto const& input = iRecord.get(token_);
34+
35+
int const sizeA = 10;
36+
int const sizeC = 100;
37+
// TODO: pinned allocation?
38+
// TODO: cached allocation?
39+
AlpakaESTestDataACMultiHost product({{sizeA, sizeC}}, cms::alpakatools::host());
40+
auto viewA = product.view<
41+
cms::alpakatest::AlpakaESTestSoAA>(); // this template is not really needed as this is fhe first layout
42+
auto viewC = product.view<cms::alpakatest::AlpakaESTestSoAC>();
43+
44+
for (int i = 0; i < sizeA; ++i) {
45+
viewA[i].z() = input.value() - i;
46+
}
47+
48+
for (int i = 0; i < sizeC; ++i) {
49+
viewC[i].x() = input.value() + i;
50+
}
51+
52+
return product;
53+
}
54+
55+
private:
56+
edm::ESGetToken<cms::alpakatest::ESTestDataA, AlpakaESTestRecordA> token_;
57+
};
58+
} // namespace ALPAKA_ACCELERATOR_NAMESPACE
59+
60+
DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(TestAlpakaESProducerAMulti);

HeterogeneousCore/AlpakaTest/plugins/alpaka/TestAlpakaGlobalProducer.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
2222
public:
2323
TestAlpakaGlobalProducer(edm::ParameterSet const& config)
2424
: esToken_(esConsumes(config.getParameter<edm::ESInputTag>("eventSetupSource"))),
25+
esMultiToken_(esConsumes(config.getParameter<edm::ESInputTag>("eventSetupSourceMulti"))),
2526
deviceToken_{produces()},
2627
deviceTokenMulti2_{produces()},
2728
deviceTokenMulti3_{produces()},
@@ -34,6 +35,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
3435

3536
void produce(edm::StreamID, device::Event& iEvent, device::EventSetup const& iSetup) const override {
3637
[[maybe_unused]] auto const& esData = iSetup.getData(esToken_);
38+
[[maybe_unused]] auto const& esMultiData = iSetup.getData(esMultiToken_);
3739

3840
portabletest::TestDeviceCollection deviceProduct{size_, iEvent.queue()};
3941
portabletest::TestDeviceMultiCollection2 deviceProductMulti2{{{size_, size2_}}, iEvent.queue()};
@@ -52,6 +54,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
5254
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
5355
edm::ParameterSetDescription desc;
5456
desc.add("eventSetupSource", edm::ESInputTag{});
57+
desc.add("eventSetupSourceMulti", edm::ESInputTag{});
5558

5659
edm::ParameterSetDescription psetSize;
5760
psetSize.add<int32_t>("alpaka_serial_sync");
@@ -64,6 +67,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
6467

6568
private:
6669
const device::ESGetToken<AlpakaESTestDataADevice, AlpakaESTestRecordA> esToken_;
70+
const device::ESGetToken<AlpakaESTestDataACMultiDevice, AlpakaESTestRecordA> esMultiToken_;
6771
const device::EDPutToken<portabletest::TestDeviceCollection> deviceToken_;
6872
const device::EDPutToken<portabletest::TestDeviceMultiCollection2> deviceTokenMulti2_;
6973
const device::EDPutToken<portabletest::TestDeviceMultiCollection3> deviceTokenMulti3_;

HeterogeneousCore/AlpakaTest/src/ES_AlpakaESTestData.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
TYPELOOKUP_DATA_REG(cms::alpakatest::AlpakaESTestDataAHost);
66
TYPELOOKUP_DATA_REG(cms::alpakatest::AlpakaESTestDataCHost);
77
TYPELOOKUP_DATA_REG(cms::alpakatest::AlpakaESTestDataDHost);
8+
TYPELOOKUP_DATA_REG(cms::alpakatest::AlpakaESTestDataACMultiHost);
89

910
// Template-over-device model
1011
TYPELOOKUP_DATA_REG(cms::alpakatest::AlpakaESTestDataB<alpaka_common::DevHost>);

HeterogeneousCore/AlpakaTest/src/alpaka/ES_AlpakaESTestData.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
TYPELOOKUP_ALPAKA_DATA_REG(AlpakaESTestDataADevice);
66
TYPELOOKUP_ALPAKA_DATA_REG(AlpakaESTestDataCDevice);
77
TYPELOOKUP_ALPAKA_DATA_REG(AlpakaESTestDataDDevice);
8+
TYPELOOKUP_ALPAKA_DATA_REG(AlpakaESTestDataACMultiDevice);
89

910
// Template-over-device model
1011
#include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestData.h"

HeterogeneousCore/AlpakaTest/test/testAlpakaModules_cfg.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,16 @@
5959
appendToDataLabel = cms.string("null"),
6060
)
6161

62+
# PortableMultiCollection
63+
from HeterogeneousCore.AlpakaTest.testAlpakaESProducerAMulti_cfi import testAlpakaESProducerAMulti
64+
6265
process.intProduct = cms.EDProducer("IntProducer", ivalue = cms.int32(42))
66+
process.alpakaESProducerAMulti = testAlpakaESProducerAMulti.clone(appendToDataLabel = cms.string("appendedLabel"))
6367

6468
from HeterogeneousCore.AlpakaTest.testAlpakaGlobalProducer_cfi import testAlpakaGlobalProducer
6569
process.alpakaGlobalProducer = testAlpakaGlobalProducer.clone(
6670
eventSetupSource = cms.ESInputTag("alpakaESProducerA", "appendedLabel"),
71+
eventSetupSourceMulti = cms.ESInputTag("alpakaESProducerAMulti", "appendedLabel"),
6772
size = dict(
6873
alpaka_serial_sync = 10,
6974
alpaka_cuda_async = 20,
@@ -146,7 +151,7 @@
146151
if args.processAcceleratorBackend != "":
147152
process.ProcessAcceleratorAlpaka.setBackend(args.processAcceleratorBackend)
148153
if args.moduleBackend != "":
149-
for name in ["ESProducerA", "ESProducerB", "ESProducerC", "ESProducerD", "ESProducerE",
154+
for name in ["ESProducerA", "ESProducerB", "ESProducerC", "ESProducerD", "ESProducerE", "ESProducerAMulti",
150155
"ESProducerNull",
151156
"GlobalProducer", "GlobalProducerE",
152157
"StreamProducer", "StreamInstanceProducer",

0 commit comments

Comments
 (0)