Skip to content
This repository was archived by the owner on Mar 28, 2023. It is now read-only.

Commit 0bcef07

Browse files
authored
[SYCL] Tests for missing accessor functions (#1265)
sycl patch: intel/llvm#6781
1 parent 7f2a22e commit 0bcef07

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed

SYCL/Basic/accessor/accessor.cpp

100644100755
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,58 @@ template <typename Acc> struct Wrapper2 {
6060

6161
template <typename Acc> struct Wrapper3 { Wrapper2<Acc> w2; };
6262

63+
template <typename T> void TestAccSizeFuncs(const std::vector<T> &vec) {
64+
auto test = [=](auto &Res, const auto &Acc) {
65+
Res[0] = Acc.byte_size();
66+
Res[1] = Acc.size();
67+
Res[2] = Acc.max_size();
68+
Res[3] = size_t(Acc.empty());
69+
};
70+
auto checkResult = [=](const std::vector<size_t> &Res, size_t MaxSize) {
71+
assert(Res[0] == vec.size() * sizeof(T));
72+
assert(Res[1] == vec.size());
73+
assert(Res[2] == MaxSize);
74+
assert(Res[3] == vec.empty());
75+
};
76+
std::vector<size_t> res(4); // for 4 functions results
77+
78+
sycl::buffer<T> bufInput(vec.data(), vec.size());
79+
sycl::host_accessor accInput(bufInput);
80+
test(res, accInput);
81+
checkResult(res,
82+
std::numeric_limits<
83+
typename sycl::host_accessor<T>::difference_type>::max());
84+
85+
sycl::queue q;
86+
{
87+
sycl::buffer<T> bufInput(vec.data(), vec.size());
88+
sycl::buffer<size_t> bufRes(res.data(), res.size());
89+
90+
q.submit([&](sycl::handler &cgh) {
91+
sycl::accessor accInput(bufInput, cgh);
92+
sycl::accessor accRes(bufRes, cgh);
93+
cgh.single_task([=]() { test(accRes, accInput); });
94+
});
95+
q.wait();
96+
}
97+
checkResult(
98+
res,
99+
std::numeric_limits<typename sycl::accessor<T>::difference_type>::max());
100+
101+
{
102+
sycl::buffer<size_t> bufRes(res.data(), res.size());
103+
q.submit([&](sycl::handler &cgh) {
104+
sycl::accessor accRes(bufRes, cgh);
105+
sycl::local_accessor<T, 1> locAcc(vec.size(), cgh);
106+
cgh.single_task([=]() { test(accRes, locAcc); });
107+
});
108+
q.wait();
109+
}
110+
checkResult(res,
111+
std::numeric_limits<
112+
typename sycl::local_accessor<T>::difference_type>::max());
113+
}
114+
63115
template <typename GlobAcc, typename LocAcc>
64116
void testLocalAccItersImpl(sycl::handler &cgh, GlobAcc &globAcc, LocAcc &locAcc,
65117
bool testConstIter) {
@@ -827,6 +879,71 @@ int main() {
827879
}
828880
}
829881

882+
// Test byte_size(), size(), max_size(), empty()
883+
{
884+
std::vector<char> vecChar(64, 'a');
885+
std::vector<int> vecInt(32, 1);
886+
std::vector<float> vecFloat(16, 1.0);
887+
std::vector<IdxID3> vecCustom(8, {0, 0, 0});
888+
TestAccSizeFuncs(vecChar);
889+
TestAccSizeFuncs(vecInt);
890+
TestAccSizeFuncs(vecFloat);
891+
TestAccSizeFuncs(vecCustom);
892+
}
893+
// Test swap() on host_accessor
894+
{
895+
std::vector<int> vec1(8), vec2(16);
896+
{
897+
sycl::buffer<int> buf1(vec1.data(), vec1.size());
898+
sycl::buffer<int> buf2(vec2.data(), vec2.size());
899+
sycl::host_accessor acc1(buf1);
900+
sycl::host_accessor acc2(buf2);
901+
acc1.swap(acc2);
902+
acc1[15] = 4;
903+
acc2[7] = 4;
904+
}
905+
assert(vec1[7] == 4 && vec2[15] == 4);
906+
}
907+
// Test swap() on basic accessor
908+
{
909+
std::vector<int> vec1(8), vec2(16);
910+
{
911+
sycl::buffer<int> buf1(vec1.data(), vec1.size());
912+
sycl::buffer<int> buf2(vec2.data(), vec2.size());
913+
sycl::queue q;
914+
q.submit([&](sycl::handler &cgh) {
915+
sycl::accessor acc1(buf1, cgh);
916+
sycl::accessor acc2(buf2, cgh);
917+
acc1.swap(acc2);
918+
cgh.single_task([=]() {
919+
acc1[15] = 4;
920+
acc2[7] = 4;
921+
});
922+
});
923+
}
924+
assert(vec1[7] == 4 && vec2[15] == 4);
925+
}
926+
// Test swap on local_accessor
927+
{
928+
size_t size1 = 0, size2 = 0;
929+
{
930+
sycl::buffer<size_t> buf1(&size1, 1);
931+
sycl::buffer<size_t> buf2(&size2, 1);
932+
933+
sycl::queue q;
934+
q.submit([&](sycl::handler &cgh) {
935+
sycl::accessor acc1(buf1, cgh);
936+
sycl::accessor acc2(buf2, cgh);
937+
sycl::local_accessor<int, 1> locAcc1(8, cgh), locAcc2(16, cgh);
938+
locAcc1.swap(locAcc2);
939+
cgh.single_task([=]() {
940+
acc1[0] = locAcc1.size();
941+
acc2[0] = locAcc2.size();
942+
});
943+
});
944+
}
945+
assert(size1 == 16 && size2 == 8);
946+
}
830947
// Test iterator methods with 1D local_accessor
831948
{
832949
std::vector<int> v(32);

0 commit comments

Comments
 (0)