Skip to content

Commit 4bd76de

Browse files
Alexander Batashevromanovvlad
authored andcommitted
[SYCL] Make vec load store member functions templated (#920)
Signed-off-by: Alexander Batashev <[email protected]>
1 parent 0039ee0 commit 4bd76de

File tree

1 file changed

+37
-42
lines changed

1 file changed

+37
-42
lines changed

sycl/include/CL/sycl/types.hpp

Lines changed: 37 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -644,30 +644,38 @@ template <typename Type, int NumElements> class vec {
644644
#undef __SYCL_ACCESS_RETURN
645645
// End of hi/lo, even/odd, xyzw, and rgba swizzles.
646646

647-
// TODO: make templated address space to work.
648-
// Somehow, access<> to multi_ptr<> conversion doesn't work w/o making
649-
// address space explicitly specified.
650-
#ifdef __SYCL_LOADSTORE
651-
#error "Undefine __SYCL_LOADSTORE macro"
652-
#endif
653-
#define __SYCL_LOADSTORE(Space) \
654-
void load(size_t Offset, multi_ptr<const DataT, Space> Ptr) { \
655-
for (int I = 0; I < NumElements; I++) { \
656-
setValue( \
657-
I, *multi_ptr<const DataT, Space>(Ptr + Offset * NumElements + I)); \
658-
} \
659-
} \
660-
void store(size_t Offset, multi_ptr<DataT, Space> Ptr) const { \
661-
for (int I = 0; I < NumElements; I++) { \
662-
*multi_ptr<DataT, Space>(Ptr + Offset * NumElements + I) = getValue(I); \
663-
} \
647+
template <access::address_space Space>
648+
void load(size_t Offset, multi_ptr<const DataT, Space> Ptr) {
649+
for (int I = 0; I < NumElements; I++) {
650+
setValue(I,
651+
*multi_ptr<const DataT, Space>(Ptr + Offset * NumElements + I));
652+
}
653+
}
654+
template <access::address_space Space>
655+
void load(size_t Offset, multi_ptr<DataT, Space> Ptr) {
656+
multi_ptr<const DataT, Space> ConstPtr(Ptr);
657+
load(Offset, ConstPtr);
658+
}
659+
template <int Dimensions, access::mode Mode,
660+
access::placeholder IsPlaceholder, access::target Target>
661+
void load(size_t Offset,
662+
accessor<DataT, Dimensions, Mode, Target, IsPlaceholder> Acc) {
663+
multi_ptr<const DataT, detail::TargetToAS<Target>::AS> MultiPtr(Acc);
664+
load(Offset, MultiPtr);
665+
}
666+
template <access::address_space Space>
667+
void store(size_t Offset, multi_ptr<DataT, Space> Ptr) const {
668+
for (int I = 0; I < NumElements; I++) {
669+
*multi_ptr<DataT, Space>(Ptr + Offset * NumElements + I) = getValue(I);
670+
}
671+
}
672+
template <int Dimensions, access::mode Mode,
673+
access::placeholder IsPlaceholder, access::target Target>
674+
void store(size_t Offset,
675+
accessor<DataT, Dimensions, Mode, Target, IsPlaceholder> Acc) {
676+
multi_ptr<DataT, detail::TargetToAS<Target>::AS> MultiPtr(Acc);
677+
store(Offset, MultiPtr);
664678
}
665-
666-
__SYCL_LOADSTORE(access::address_space::global_space)
667-
__SYCL_LOADSTORE(access::address_space::local_space)
668-
__SYCL_LOADSTORE(access::address_space::constant_space)
669-
__SYCL_LOADSTORE(access::address_space::private_space)
670-
#undef __SYCL_LOADSTORE
671679

672680
#ifdef __SYCL_BINOP
673681
#error "Undefine __SYCL_BINOP macro"
@@ -1548,27 +1556,14 @@ class SwizzleOp {
15481556
#undef __SYCL_ACCESS_RETURN
15491557
// End of hi/lo, even/odd, xyzw, and rgba swizzles.
15501558

1551-
// TODO: make templated address space to work.
1552-
// Somehow, access<> to multi_ptr<> conversion doesn't work w/o making
1553-
// address space explicitly specified.
1554-
//
15551559
// Leave store() interface to automatic conversion to vec<>.
15561560
// Load to vec_t and then assign to swizzle.
1557-
#ifdef __SYCL_LOAD
1558-
#error "Undefine __SYCL_LOAD macro"
1559-
#endif
1560-
#define __SYCL_LOAD(Space) \
1561-
void load(size_t offset, multi_ptr<DataT, Space> ptr) { \
1562-
vec_t Tmp; \
1563-
Tmp.template load(offset, ptr); \
1564-
*this = Tmp; \
1565-
}
1566-
1567-
__SYCL_LOAD(access::address_space::global_space)
1568-
__SYCL_LOAD(access::address_space::local_space)
1569-
__SYCL_LOAD(access::address_space::constant_space)
1570-
__SYCL_LOAD(access::address_space::private_space)
1571-
#undef __SYCL_LOAD
1561+
template <access::address_space Space>
1562+
void load(size_t offset, multi_ptr<DataT, Space> ptr) {
1563+
vec_t Tmp;
1564+
Tmp.template load(offset, ptr);
1565+
*this = Tmp;
1566+
}
15721567

15731568
template <typename convertT, rounding_mode roundingMode>
15741569
vec<convertT, sizeof...(Indexes)> convert() const {

0 commit comments

Comments
 (0)