@@ -61,103 +61,44 @@ template <typename Acc> struct Wrapper2 {
61
61
62
62
template <typename Acc> struct Wrapper3 { Wrapper2<Acc> w2; };
63
63
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 ) {
110
65
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
+ });
155
99
} catch (sycl::exception &e) {
156
100
std::cout << e.what () << std::endl;
157
101
}
158
-
159
- for (const auto &i : vec3)
160
- assert (i == 1 );
161
102
}
162
103
163
104
int main () {
@@ -886,71 +827,19 @@ int main() {
886
827
}
887
828
}
888
829
889
- // Accessor begin/ end member function
830
+ // Test local_accessor begin(), end(), range_based loop, rbegin() & rend()
890
831
{
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); }
954
843
}
955
844
956
845
std::cout << " Test passed" << std::endl;
0 commit comments