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

Commit 8a7bbc2

Browse files
committed
Remove accessor & add local_accessor
1 parent 2a0f4b6 commit 8a7bbc2

File tree

1 file changed

+46
-157
lines changed

1 file changed

+46
-157
lines changed

SYCL/Basic/accessor/accessor.cpp

Lines changed: 46 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -61,103 +61,44 @@ template <typename Acc> struct Wrapper2 {
6161

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

64-
void fillVec(std::vector<int> &vec) {
65-
for (size_t i = 0; i < vec.size(); ++i) {
66-
vec[i] = i;
67-
}
68-
}
69-
70-
template <typename T> void modifyAccBuf(const T &acc, bool useReverse) {
71-
if (!useReverse) {
72-
for (auto It = acc.begin(); It != acc.end(); It++)
73-
*It *= 2;
74-
for (auto &It : acc)
75-
It += 1;
76-
} else {
77-
for (auto It = acc.rbegin(); It != acc.rend(); It++) {
78-
*It *= 2;
79-
(*It)++;
80-
}
81-
}
82-
}
83-
84-
template <typename T1, typename T2>
85-
void copyAccBuf(const T1 &accProd, T2 &accCons, bool useReverse) {
86-
if (!useReverse) {
87-
auto ItCons = accCons.begin();
88-
for (auto ItProd = accProd.cbegin(); ItProd != accProd.cend(); ++ItProd)
89-
*(ItCons++) = *ItProd;
90-
} else {
91-
auto ItCons = accCons.rbegin();
92-
for (auto ItProd = accProd.crbegin(); ItProd != accProd.crend(); ++ItProd)
93-
*(ItCons++) = *ItProd;
94-
}
95-
}
96-
97-
template <typename T> void testAccModImpl(T &buf, bool useReverse) {
98-
sycl::queue q;
99-
q.submit([&](sycl::handler &cgh) {
100-
auto devAcc = buf.template get_access<sycl::access::mode::read_write>(cgh);
101-
cgh.single_task([=]() { modifyAccBuf(devAcc, useReverse); });
102-
});
103-
q.wait();
104-
105-
auto hostAcc = buf.template get_access<sycl::access::mode::read_write>();
106-
modifyAccBuf(hostAcc, useReverse);
107-
}
108-
109-
void testAccMod(std::vector<int> &vec, bool useReverse = false, int Dim = 1) {
64+
void testLocalAccIters(std::vector<int> &vec, bool testConstIter = false) {
11065
try {
111-
if (Dim == 1) {
112-
sycl::buffer<int> buf(vec.data(), vec.size());
113-
testAccModImpl(buf, useReverse);
114-
} else if (Dim == 3) {
115-
sycl::buffer<int, 3> buf(vec.data(), sycl::range<3>(2, 3, 4));
116-
testAccModImpl(buf, useReverse);
117-
}
118-
} catch (sycl::exception &e) {
119-
std::cout << e.what() << std::endl;
120-
}
121-
122-
for (size_t i = 0; i < vec.size(); ++i)
123-
assert(vec[i] == (i * 2 + 1) * 2 + 1);
124-
}
125-
126-
template <typename T>
127-
void testAccCopyImpl(T &buf1, T &buf2, T &buf3, bool useReverse) {
128-
sycl::queue q;
129-
q.submit([&](sycl::handler &cgh) {
130-
auto accProd = buf1.template get_access<sycl::access::mode::read>(cgh);
131-
auto accCons = buf2.template get_access<sycl::access::mode::write>(cgh);
132-
cgh.single_task([=]() { copyAccBuf(accProd, accCons, useReverse); });
133-
});
134-
q.wait();
135-
136-
auto accProd = buf2.template get_access<sycl::access::mode::read>();
137-
auto accCons = buf3.template get_access<sycl::access::mode::write>();
138-
copyAccBuf(accProd, accCons, useReverse);
139-
}
140-
141-
void testAccCopy(std::vector<int> &vec1, std::vector<int> &vec2,
142-
std::vector<int> &vec3, bool useReverse = false, int Dim = 1) {
143-
try {
144-
if (Dim == 1) {
145-
sycl::buffer<int> bufProd(vec1.data(), vec1.size());
146-
sycl::buffer<int> bufCons1(vec2.data(), vec2.size());
147-
sycl::buffer<int> bufCons2(vec3.data(), vec3.size());
148-
testAccCopyImpl(bufProd, bufCons1, bufCons2, useReverse);
149-
} else if (Dim == 3) {
150-
sycl::buffer<int, 3> bufProd(vec1.data(), sycl::range<3>(2, 3, 4));
151-
sycl::buffer<int, 3> bufCons1(vec2.data(), sycl::range<3>(2, 3, 4));
152-
sycl::buffer<int, 3> bufCons2(vec3.data(), sycl::range<3>(2, 3, 4));
153-
testAccCopyImpl(bufProd, bufCons1, bufCons2, useReverse);
154-
}
66+
sycl::queue queue;
67+
sycl::buffer<int, 1> buf(vec.data(), vec.size());
68+
queue.submit([&](sycl::handler &cgh) {
69+
sycl::local_accessor<int, 1> locAcc(32, cgh);
70+
auto globAcc = buf.get_access<sycl::access::mode::read_write>(cgh);
71+
if (testConstIter) {
72+
cgh.single_task([=]() {
73+
for (int i = 0; i < locAcc.size(); ++i)
74+
locAcc[i] = globAcc[i];
75+
size_t Idx = 0;
76+
for (auto ItLoc = locAcc.cbegin(); ItLoc != locAcc.cend(); ItLoc++)
77+
globAcc[Idx++] = *ItLoc * 2 + 1;
78+
Idx = locAcc.size() - 1;
79+
for (auto ItLoc = locAcc.crbegin(); ItLoc != locAcc.crend(); ItLoc++)
80+
globAcc[Idx--] += *ItLoc;
81+
});
82+
} else {
83+
cgh.single_task([=]() {
84+
size_t Idx = 0;
85+
for (auto ItLoc = locAcc.begin(); ItLoc != locAcc.end(); ItLoc++)
86+
*ItLoc = globAcc[Idx++] * 2;
87+
for (auto &ItLoc : locAcc)
88+
ItLoc++;
89+
for (auto ItLoc = locAcc.rbegin(); ItLoc != locAcc.rend(); ItLoc++) {
90+
*ItLoc *= 2;
91+
*ItLoc += 1;
92+
}
93+
Idx = 0;
94+
for (auto &ItLoc : locAcc)
95+
globAcc[Idx++] = ItLoc;
96+
});
97+
}
98+
});
15599
} catch (sycl::exception &e) {
156100
std::cout << e.what() << std::endl;
157101
}
158-
159-
for (const auto &i : vec3)
160-
assert(i == 1);
161102
}
162103

163104
int main() {
@@ -886,71 +827,19 @@ int main() {
886827
}
887828
}
888829

889-
// Accessor begin/end member function
830+
// Test local_accessor begin(), end(), range_based loop, rbegin() & rend()
890831
{
891-
// 0-dim accessor iteration
892-
{
893-
std::vector<int> vec(1, 0);
894-
testAccMod(vec);
895-
}
896-
897-
// Simple iteration through the accessor
898-
{
899-
std::vector<int> vec(32);
900-
fillVec(vec);
901-
testAccMod(vec);
902-
}
903-
904-
// Const iterator
905-
{
906-
constexpr int N = 32;
907-
std::vector<int> vecProd(N, 1), vecCons1(N, 0), vecCons2(N, 0);
908-
testAccCopy(vecProd, vecCons1, vecCons2);
909-
}
910-
911-
// Reverse iterator
912-
{
913-
std::vector<int> vec(32);
914-
fillVec(vec);
915-
testAccMod(vec, true);
916-
}
917-
918-
// Const reverse iterator
919-
{
920-
constexpr int N = 32;
921-
std::vector<int> vecProd(N, 1), vecCons1(N, 0), vecCons2(N, 0);
922-
testAccCopy(vecProd, vecCons1, vecCons2, true);
923-
}
924-
925-
// 3-dim accessor simple iteration
926-
{
927-
constexpr int N = 24;
928-
std::vector<int> vec(N);
929-
fillVec(vec);
930-
testAccMod(vec, false, 3);
931-
}
932-
933-
// 3-dim accessor const iterator
934-
{
935-
constexpr int N = 24;
936-
std::vector<int> vecProd(N, 1), vecCons1(N, 0), vecCons2(N, 0);
937-
testAccCopy(vecProd, vecCons1, vecCons2, false, 3);
938-
}
939-
940-
// 3-dim accessor reverse iterator
941-
{
942-
constexpr int N = 24;
943-
std::vector<int> vec(N);
944-
fillVec(vec);
945-
testAccMod(vec, true, 3);
946-
}
947-
948-
// 3-dim accessor const reverse iterator
949-
{
950-
constexpr int N = 24;
951-
std::vector<int> vecProd(N, 1), vecCons1(N, 0), vecCons2(N, 0);
952-
testAccCopy(vecProd, vecCons1, vecCons2, true, 3);
953-
}
832+
std::vector<int> v(32);
833+
for (int i = 0; i < v.size(); ++i) { v[i] = i; }
834+
testLocalAccIters(v);
835+
for (int i = 0; i < v.size(); ++i) { assert(v[i] == (i * 2 + 1) * 2 + 1); }
836+
}
837+
// Test local_accessor cbegin(), cend(), crbegin(), crend()
838+
{
839+
std::vector<int> v(32);
840+
for (int i = 0; i < v.size(); ++i) { v[i] = i; }
841+
testLocalAccIters(v, true);
842+
for (int i = 0; i < v.size(); ++i) { assert(v[i] == (i * 2 + 1) + i); }
954843
}
955844

956845
std::cout << "Test passed" << std::endl;

0 commit comments

Comments
 (0)