@@ -61,103 +61,44 @@ template <typename Acc> struct Wrapper2 {
6161
6262template <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
163104int 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