@@ -67,7 +67,7 @@ void fillVec(std::vector<int> &vec) {
67
67
}
68
68
}
69
69
70
- template <typename T> void modifyAccBuf (const T &acc, bool useReverse = false ) {
70
+ template <typename T> void modifyAccBuf (const T &acc, bool useReverse) {
71
71
if (!useReverse) {
72
72
for (auto It = acc.begin (); It != acc.end (); It++)
73
73
*It *= 2 ;
@@ -82,7 +82,7 @@ template <typename T> void modifyAccBuf(const T &acc, bool useReverse = false) {
82
82
}
83
83
84
84
template <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) {
86
86
if (!useReverse) {
87
87
auto ItCons = accCons.begin ();
88
88
for (auto ItProd = accProd.cbegin (); ItProd != accProd.cend (); ++ItProd)
@@ -94,6 +94,72 @@ void copyAccBuf(const T1 &accProd, T2 &accCons, bool useReverse = false) {
94
94
}
95
95
}
96
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 ) {
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
+
97
163
int main () {
98
164
// Host accessor.
99
165
{
@@ -820,247 +886,70 @@ int main() {
820
886
}
821
887
}
822
888
823
- // Accessor begin/end member functions
889
+ // Accessor begin/end member function
824
890
{
825
891
// 0-dim accessor iteration
826
892
{
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);
845
895
}
846
896
847
897
// Simple iteration through the accessor
848
898
{
849
- constexpr int N = 32 ;
850
- std::vector<int > vec (N);
899
+ std::vector<int > vec (32 );
851
900
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);
871
902
}
872
903
873
904
// Const iterator
874
905
{
875
906
constexpr int N = 32 ;
876
907
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);
899
909
}
900
910
901
911
// Reverse iterator
902
912
{
903
- constexpr int N = 32 ;
904
- std::vector<int > vec (N);
913
+ std::vector<int > vec (32 );
905
914
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 );
925
916
}
926
917
927
918
// Const reverse iterator
928
919
{
929
920
constexpr int N = 32 ;
930
921
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 );
954
923
}
955
924
956
925
// 3-dim accessor simple iteration
957
926
{
958
927
constexpr int N = 24 ;
959
928
std::vector<int > vec (N);
960
929
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 );
980
931
}
981
932
982
933
// 3-dim accessor const iterator
983
934
{
984
935
constexpr int N = 24 ;
985
936
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 );
1009
938
}
1010
939
1011
940
// 3-dim accessor reverse iterator
1012
941
{
1013
942
constexpr int N = 24 ;
1014
943
std::vector<int > vec (N);
1015
944
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 );
1035
946
}
1036
947
1037
948
// 3-dim accessor const reverse iterator
1038
949
{
1039
950
constexpr int N = 24 ;
1040
951
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 );
1064
953
}
1065
954
}
1066
955
0 commit comments