Skip to content

Commit d16e4a0

Browse files
committed
Constrain PortableCollection and PortableObject CopyToDevice copies
In order to use requires expressions to check the existence of the CopyToDevice specializations (because PortableDevice* types are intended only for non-CPU device types).
1 parent 6eea5fa commit d16e4a0

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

DataFormats/Portable/interface/PortableCollection.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "DataFormats/Portable/interface/PortableHostCollection.h"
77
#include "DataFormats/Portable/interface/PortableDeviceCollection.h"
8+
#include "HeterogeneousCore/AlpakaInterface/interface/concepts.h"
89
#include "HeterogeneousCore/AlpakaInterface/interface/CopyToDevice.h"
910
#include "HeterogeneousCore/AlpakaInterface/interface/CopyToHost.h"
1011

@@ -47,8 +48,10 @@ using PortableMultiCollection = typename traits::PortableMultiCollectionTrait<TD
4748
// define how to copy PortableCollection between host and device
4849
namespace cms::alpakatools {
4950
template <typename TLayout, typename TDevice>
51+
requires alpaka::isDevice<TDevice>
5052
struct CopyToHost<PortableDeviceCollection<TLayout, TDevice>> {
5153
template <typename TQueue>
54+
requires alpaka::isQueue<TQueue>
5255
static auto copyAsync(TQueue& queue, PortableDeviceCollection<TLayout, TDevice> const& srcData) {
5356
PortableHostCollection<TLayout> dstData(srcData->metadata().size(), queue);
5457
alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
@@ -57,8 +60,10 @@ namespace cms::alpakatools {
5760
};
5861

5962
template <typename TDev, typename T0, typename... Args>
63+
requires alpaka::isDevice<TDev>
6064
struct CopyToHost<PortableDeviceMultiCollection<TDev, T0, Args...>> {
6165
template <typename TQueue>
66+
requires alpaka::isQueue<TQueue>
6267
static auto copyAsync(TQueue& queue, PortableDeviceMultiCollection<TDev, T0, Args...> const& srcData) {
6368
PortableHostMultiCollection<T0, Args...> dstData(srcData.sizes(), queue);
6469
alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
@@ -68,7 +73,7 @@ namespace cms::alpakatools {
6873

6974
template <typename TLayout>
7075
struct CopyToDevice<PortableHostCollection<TLayout>> {
71-
template <typename TQueue>
76+
template <cms::alpakatools::NonCPUQueue TQueue>
7277
static auto copyAsync(TQueue& queue, PortableHostCollection<TLayout> const& srcData) {
7378
using TDevice = typename alpaka::trait::DevType<TQueue>::type;
7479
PortableDeviceCollection<TLayout, TDevice> dstData(srcData->metadata().size(), queue);
@@ -79,7 +84,7 @@ namespace cms::alpakatools {
7984

8085
template <typename T0, typename... Args>
8186
struct CopyToDevice<PortableHostMultiCollection<T0, Args...>> {
82-
template <typename TQueue>
87+
template <cms::alpakatools::NonCPUQueue TQueue>
8388
static auto copyAsync(TQueue& queue, PortableHostMultiCollection<T0, Args...> const& srcData) {
8489
using TDevice = typename alpaka::trait::DevType<TQueue>::type;
8590
PortableDeviceMultiCollection<TDevice, T0, Args...> dstData(srcData.sizes(), queue);

DataFormats/Portable/interface/PortableObject.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "DataFormats/Portable/interface/PortableHostObject.h"
99
#include "DataFormats/Portable/interface/PortableDeviceObject.h"
10+
#include "HeterogeneousCore/AlpakaInterface/interface/concepts.h"
1011
#include "HeterogeneousCore/AlpakaInterface/interface/CopyToDevice.h"
1112
#include "HeterogeneousCore/AlpakaInterface/interface/CopyToHost.h"
1213

@@ -33,8 +34,10 @@ using PortableObject = typename traits::PortableObjectTrait<T, TDev>::ProductTyp
3334
// define how to copy PortableObject between host and device
3435
namespace cms::alpakatools {
3536
template <typename TProduct, typename TDevice>
37+
requires alpaka::isDevice<TDevice>
3638
struct CopyToHost<PortableDeviceObject<TProduct, TDevice>> {
3739
template <typename TQueue>
40+
requires alpaka::isQueue<TQueue>
3841
static auto copyAsync(TQueue& queue, PortableDeviceObject<TProduct, TDevice> const& srcData) {
3942
PortableHostObject<TProduct> dstData(queue);
4043
alpaka::memcpy(queue, dstData.buffer(), srcData.buffer());
@@ -44,7 +47,7 @@ namespace cms::alpakatools {
4447

4548
template <typename TProduct>
4649
struct CopyToDevice<PortableHostObject<TProduct>> {
47-
template <typename TQueue>
50+
template <cms::alpakatools::NonCPUQueue TQueue>
4851
static auto copyAsync(TQueue& queue, PortableHostObject<TProduct> const& srcData) {
4952
using TDevice = typename alpaka::trait::DevType<TQueue>::type;
5053
PortableDeviceObject<TProduct, TDevice> dstData(queue);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef HeterogeneousCore_AlpakaInterface_interface_concepts_h
2+
#define HeterogeneousCore_AlpakaInterface_interface_concepts_h
3+
4+
#include <type_traits>
5+
6+
#include <alpaka/alpaka.hpp>
7+
8+
namespace cms::alpakatools {
9+
template <typename T>
10+
concept NonCPUQueue = alpaka::isQueue<T> and not std::is_same_v<alpaka::Dev<T>, alpaka::DevCpu>;
11+
} // namespace cms::alpakatools
12+
13+
#endif

0 commit comments

Comments
 (0)