@@ -67,7 +67,7 @@ void fillVec(std::vector<int> &vec) {
6767 }
6868}
6969
70- template <typename T> void modifyAccBuf (const T &acc, bool useReverse = false ) {
70+ template <typename T> void modifyAccBuf (const T &acc, bool useReverse) {
7171 if (!useReverse) {
7272 for (auto It = acc.begin (); It != acc.end (); It++)
7373 *It *= 2 ;
@@ -82,7 +82,7 @@ template <typename T> void modifyAccBuf(const T &acc, bool useReverse = false) {
8282}
8383
8484template <typename T1, typename T2>
85- void copyAccBuf (const T1 &accProd, T2 &accCons, bool useReverse = false ) {
85+ void copyAccBuf (const T1 &accProd, T2 &accCons, bool useReverse) {
8686 if (!useReverse) {
8787 auto ItCons = accCons.begin ();
8888 for (auto ItProd = accProd.cbegin (); ItProd != accProd.cend (); ++ItProd)
@@ -94,6 +94,72 @@ void copyAccBuf(const T1 &accProd, T2 &accCons, bool useReverse = false) {
9494 }
9595}
9696
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 ) {
110+ 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+ }
155+ } catch (sycl::exception &e) {
156+ std::cout << e.what () << std::endl;
157+ }
158+
159+ for (const auto &i : vec3)
160+ assert (i == 1 );
161+ }
162+
97163int main () {
98164 // Host accessor.
99165 {
@@ -820,247 +886,70 @@ int main() {
820886 }
821887 }
822888
823- // Accessor begin/end member functions
889+ // Accessor begin/end member function
824890 {
825891 // 0-dim accessor iteration
826892 {
827- int data = 8 ;
828- try {
829- sycl::buffer<int > buf (&data, 1 );
830- sycl::queue q;
831-
832- q.submit ([&](sycl::handler &cgh) {
833- auto devAcc = buf.get_access <sycl::access::mode::read_write>(cgh);
834- cgh.single_task ([=]() { modifyAccBuf (devAcc); });
835- });
836- q.wait ();
837-
838- auto hostAcc = buf.get_access <sycl::access::mode::read_write>();
839- modifyAccBuf (hostAcc);
840- } catch (sycl::exception &e) {
841- std::cout << e.what () << std::endl;
842- }
843-
844- assert (data == (8 * 2 + 1 ) * 2 + 1 );
893+ std::vector<int > vec (1 , 0 );
894+ testAccMod (vec);
845895 }
846896
847897 // Simple iteration through the accessor
848898 {
849- constexpr int N = 32 ;
850- std::vector<int > vec (N);
899+ std::vector<int > vec (32 );
851900 fillVec (vec);
852-
853- try {
854- sycl::buffer<int > buf (vec.data (), vec.size ());
855- sycl::queue q;
856-
857- q.submit ([&](sycl::handler &cgh) {
858- auto devAcc = buf.get_access <sycl::access::mode::read_write>(cgh);
859- cgh.single_task ([=]() { modifyAccBuf (devAcc); });
860- });
861- q.wait ();
862-
863- auto hostAcc = buf.get_access <sycl::access::mode::read_write>();
864- modifyAccBuf (hostAcc);
865- } catch (sycl::exception &e) {
866- std::cout << e.what () << std::endl;
867- }
868-
869- for (size_t i = 0 ; i < vec.size (); ++i)
870- assert (vec[i] == (i * 2 + 1 ) * 2 + 1 );
901+ testAccMod (vec);
871902 }
872903
873904 // Const iterator
874905 {
875906 constexpr int N = 32 ;
876907 std::vector<int > vecProd (N, 1 ), vecCons1 (N, 0 ), vecCons2 (N, 0 );
877- try {
878- sycl::buffer<int > bufProd (vecProd.data (), vecProd.size ());
879- sycl::buffer<int > bufCons1 (vecCons1.data (), vecCons1.size ());
880- sycl::buffer<int > bufCons2 (vecCons2.data (), vecCons2.size ());
881- sycl::queue q;
882-
883- q.submit ([&](sycl::handler &cgh) {
884- auto accProd = bufProd.get_access <sycl::access::mode::read>(cgh);
885- auto accCons = bufCons1.get_access <sycl::access::mode::write>(cgh);
886- cgh.single_task ([=]() { copyAccBuf (accProd, accCons); });
887- });
888- q.wait ();
889-
890- auto accProd = bufCons1.get_access <sycl::access::mode::read>();
891- auto accCons = bufCons2.get_access <sycl::access::mode::write>();
892- copyAccBuf (accProd, accCons);
893- } catch (sycl::exception &e) {
894- std::cout << e.what () << std::endl;
895- }
896-
897- for (const auto &i : vecCons2)
898- assert (i == 1 );
908+ testAccCopy (vecProd, vecCons1, vecCons2);
899909 }
900910
901911 // Reverse iterator
902912 {
903- constexpr int N = 32 ;
904- std::vector<int > vec (N);
913+ std::vector<int > vec (32 );
905914 fillVec (vec);
906-
907- try {
908- sycl::buffer<int > buf (vec.data (), vec.size ());
909- sycl::queue q;
910-
911- q.submit ([&](sycl::handler &cgh) {
912- auto acc = buf.get_access <sycl::access::mode::read_write>(cgh);
913- cgh.single_task ([=]() { modifyAccBuf (acc, true ); });
914- });
915- q.wait ();
916-
917- auto acc = buf.get_access <sycl::access::mode::read_write>();
918- modifyAccBuf (acc, true );
919- } catch (sycl::exception &e) {
920- std::cout << e.what () << std::endl;
921- }
922-
923- for (size_t i = 0 ; i < vec.size (); ++i)
924- assert (vec[i] == (i * 2 + 1 ) * 2 + 1 );
915+ testAccMod (vec, true );
925916 }
926917
927918 // Const reverse iterator
928919 {
929920 constexpr int N = 32 ;
930921 std::vector<int > vecProd (N, 1 ), vecCons1 (N, 0 ), vecCons2 (N, 0 );
931-
932- try {
933- sycl::buffer<int > bufProd (vecProd.data (), vecProd.size ());
934- sycl::buffer<int > bufCons1 (vecCons1.data (), vecCons1.size ());
935- sycl::buffer<int > bufCons2 (vecCons2.data (), vecCons2.size ());
936- sycl::queue q;
937-
938- q.submit ([&](sycl::handler &cgh) {
939- auto accProd = bufProd.get_access <sycl::access::mode::read>(cgh);
940- auto accCons1 = bufCons1.get_access <sycl::access::mode::write>(cgh);
941- cgh.single_task ([=]() { copyAccBuf (accProd, accCons1, true ); });
942- });
943- q.wait ();
944-
945- auto accCons1 = bufCons1.get_access <sycl::access::mode::read>();
946- auto accCons2 = bufCons2.get_access <sycl::access::mode::write>();
947- copyAccBuf (accCons1, accCons2, true );
948- } catch (sycl::exception &e) {
949- std::cout << e.what () << std::endl;
950- }
951-
952- for (const auto &i : vecCons2)
953- assert (i == 1 );
922+ testAccCopy (vecProd, vecCons1, vecCons2, true );
954923 }
955924
956925 // 3-dim accessor simple iteration
957926 {
958927 constexpr int N = 24 ;
959928 std::vector<int > vec (N);
960929 fillVec (vec);
961-
962- try {
963- sycl::buffer<int , 3 > buf (vec.data (), sycl::range<3 >(2 , 3 , 4 ));
964- sycl::queue q;
965-
966- q.submit ([&](sycl::handler &cgh) {
967- auto acc = buf.get_access <sycl::access::mode::read_write>(cgh);
968- cgh.single_task ([=]() { modifyAccBuf (acc); });
969- });
970- q.wait ();
971-
972- auto acc = buf.get_access <sycl::access::mode::read_write>();
973- modifyAccBuf (acc);
974- } catch (sycl::exception &e) {
975- std::cout << e.what () << std::endl;
976- }
977-
978- for (size_t i = 0 ; i < vec.size (); ++i)
979- assert (vec[i] == (i * 2 + 1 ) * 2 + 1 );
930+ testAccMod (vec, false , 3 );
980931 }
981932
982933 // 3-dim accessor const iterator
983934 {
984935 constexpr int N = 24 ;
985936 std::vector<int > vecProd (N, 1 ), vecCons1 (N, 0 ), vecCons2 (N, 0 );
986-
987- try {
988- sycl::buffer<int , 3 > bufProd (vecProd.data (), sycl::range<3 >(2 , 3 , 4 ));
989- sycl::buffer<int , 3 > bufCons1 (vecCons1.data (), sycl::range<3 >(2 , 3 , 4 ));
990- sycl::buffer<int , 3 > bufCons2 (vecCons2.data (), sycl::range<3 >(2 , 3 , 4 ));
991- sycl::queue q;
992-
993- q.submit ([&](sycl::handler &cgh) {
994- auto accProd = bufProd.get_access <sycl::access::mode::read>(cgh);
995- auto accCons = bufCons1.get_access <sycl::access::mode::write>(cgh);
996- cgh.single_task ([=]() { copyAccBuf (accProd, accCons); });
997- });
998- q.wait ();
999-
1000- auto accProd = bufCons1.get_access <sycl::access::mode::read>();
1001- auto accCons = bufCons2.get_access <sycl::access::mode::write>();
1002- copyAccBuf (accProd, accCons);
1003- } catch (sycl::exception &e) {
1004- std::cout << e.what () << std::endl;
1005- }
1006-
1007- for (const auto &i : vecCons2)
1008- assert (i == 1 );
937+ testAccCopy (vecProd, vecCons1, vecCons2, false , 3 );
1009938 }
1010939
1011940 // 3-dim accessor reverse iterator
1012941 {
1013942 constexpr int N = 24 ;
1014943 std::vector<int > vec (N);
1015944 fillVec (vec);
1016-
1017- try {
1018- sycl::buffer<int , 3 > buf (vec.data (), sycl::range<3 >(2 , 3 , 4 ));
1019- sycl::queue q;
1020-
1021- q.submit ([&](sycl::handler &cgh) {
1022- auto acc = buf.get_access <sycl::access::mode::write>(cgh);
1023- cgh.single_task ([=]() { modifyAccBuf (acc, true ); });
1024- });
1025- q.wait ();
1026-
1027- auto acc = buf.get_access <sycl::access::mode::write>();
1028- modifyAccBuf (acc, true );
1029- } catch (sycl::exception &e) {
1030- std::cout << e.what () << std::endl;
1031- }
1032-
1033- for (size_t i = 0 ; i < vec.size (); ++i)
1034- assert (vec[i] == (i * 2 + 1 ) * 2 + 1 );
945+ testAccMod (vec, true , 3 );
1035946 }
1036947
1037948 // 3-dim accessor const reverse iterator
1038949 {
1039950 constexpr int N = 24 ;
1040951 std::vector<int > vecProd (N, 1 ), vecCons1 (N, 0 ), vecCons2 (N, 0 );
1041-
1042- try {
1043- sycl::buffer<int , 3 > bufProd (vecProd.data (), sycl::range<3 >(2 , 3 , 4 ));
1044- sycl::buffer<int , 3 > bufCons1 (vecCons1.data (), sycl::range<3 >(2 , 3 , 4 ));
1045- sycl::buffer<int , 3 > bufCons2 (vecCons2.data (), sycl::range<3 >(2 , 3 , 4 ));
1046- sycl::queue q;
1047-
1048- q.submit ([&](sycl::handler &cgh) {
1049- auto accProd = bufProd.get_access <sycl::access::mode::read>(cgh);
1050- auto accCons = bufCons1.get_access <sycl::access::mode::write>(cgh);
1051- cgh.single_task ([=]() { copyAccBuf (accProd, accCons, true ); });
1052- });
1053- q.wait ();
1054-
1055- auto accProd = bufCons1.get_access <sycl::access::mode::read>();
1056- auto accCons = bufCons2.get_access <sycl::access::mode::write>();
1057- copyAccBuf (accProd, accCons, true );
1058- } catch (sycl::exception &e) {
1059- std::cout << e.what () << std::endl;
1060- }
1061-
1062- for (const auto &i : vecCons2)
1063- assert (i == 1 );
952+ testAccCopy (vecProd, vecCons1, vecCons2, true , 3 );
1064953 }
1065954 }
1066955
0 commit comments