@@ -787,5 +787,292 @@ int main() {
787
787
}
788
788
}
789
789
790
+ // Accessor begin/end member functions
791
+ {
792
+ // 0-dim accessor iteration
793
+ {
794
+ int data = 8 ;
795
+ try {
796
+ sycl::buffer<int > buf (&data, 1 );
797
+
798
+ sycl::queue q;
799
+ q.submit ([&](sycl::handler &cgh) {
800
+ auto acc = buf.get_access <sycl::access::mode::read_write>(cgh);
801
+ cgh.single_task ([=]() {
802
+ for (auto It = acc.begin (); It != acc.end (); It++)
803
+ *It *= 2 ;
804
+ for (auto &It : acc)
805
+ It *= 2 ;
806
+ });
807
+ });
808
+ q.wait ();
809
+ } catch (sycl::exception &e) {
810
+ std::cout << e.what () << std::endl;
811
+ }
812
+
813
+ assert (data == 32 );
814
+ }
815
+
816
+ // Simple iteration through the accessor
817
+ {
818
+ constexpr int N = 32 ;
819
+ std::vector<int > vec (N, 0 );
820
+ try {
821
+ sycl::buffer<int > buf (vec.data (), vec.size ());
822
+ sycl::queue q;
823
+
824
+ q.submit ([&](sycl::handler &cgh) {
825
+ auto acc = buf.get_access <sycl::access::mode::read_write>(cgh);
826
+
827
+ cgh.single_task ([=]() {
828
+ for (auto It = acc.begin (); It != acc.end (); It++) {
829
+ (*It)++;
830
+ }
831
+ for (auto &It : acc)
832
+ It++;
833
+ });
834
+ });
835
+ q.wait ();
836
+ } catch (sycl::exception &e) {
837
+ std::cout << e.what () << std::endl;
838
+ }
839
+
840
+ for (const auto &i : vec)
841
+ assert (i == 2 );
842
+ }
843
+
844
+ // Const iterator
845
+ {
846
+ constexpr int N = 32 ;
847
+ std::vector<int > vecProd (N, 1 ), vecCons (N, 0 );
848
+ try {
849
+ sycl::buffer<int > bufProd (vecProd.data (), vecProd.size ());
850
+ sycl::buffer<int > bufCons (vecCons.data (), vecCons.size ());
851
+ sycl::queue q;
852
+
853
+ q.submit ([&](sycl::handler &cgh) {
854
+ auto accProd = bufProd.get_access <sycl::access::mode::read>(cgh);
855
+ auto accCons = bufCons.get_access <sycl::access::mode::write>(cgh);
856
+
857
+ cgh.single_task ([=]() {
858
+ auto ItCons = accCons.begin ();
859
+ for (auto ItProd = accProd.cbegin (); ItProd != accProd.cend ();
860
+ ItProd++)
861
+ *(ItCons++) += *ItProd;
862
+ ItCons = accCons.begin ();
863
+ for (auto &It : accProd)
864
+ *(ItCons++) += It;
865
+ });
866
+ });
867
+ q.wait ();
868
+ } catch (sycl::exception &e) {
869
+ std::cout << e.what () << std::endl;
870
+ }
871
+
872
+ for (const auto &i : vecCons)
873
+ assert (i == 2 );
874
+ }
875
+
876
+ // Reverse iterator
877
+ {
878
+ constexpr int N = 32 ;
879
+ std::vector<int > vec (N);
880
+ try {
881
+ sycl::buffer<int > buf (vec.data (), vec.size ());
882
+ sycl::queue q;
883
+
884
+ q.submit ([&](sycl::handler &cgh) {
885
+ auto acc1 = buf.get_access <sycl::access::mode::write>(cgh);
886
+
887
+ cgh.single_task ([=]() {
888
+ size_t count = N;
889
+ for (auto It = acc1.rbegin (); It != acc1.rend (); It++) {
890
+ *It = N - count;
891
+ count--;
892
+ }
893
+ });
894
+ });
895
+ q.wait ();
896
+ } catch (sycl::exception &e) {
897
+ std::cout << e.what () << std::endl;
898
+ }
899
+
900
+ int count = N - 1 ;
901
+ for (const auto &i : vec) {
902
+ assert (i == count);
903
+ count--;
904
+ }
905
+ }
906
+
907
+ // Const reverse iterator
908
+ {
909
+ constexpr int N = 32 ;
910
+ std::vector<int > vecProd (N), vecCons (N);
911
+
912
+ int count = N;
913
+ for (auto &i : vecProd) {
914
+ i = N - count;
915
+ count--;
916
+ }
917
+
918
+ try {
919
+ sycl::buffer<int > bufProd (vecProd.data (), vecProd.size ());
920
+ sycl::buffer<int > bufCons (vecCons.data (), vecCons.size ());
921
+ sycl::queue q;
922
+
923
+ q.submit ([&](sycl::handler &cgh) {
924
+ auto accProd = bufProd.get_access <sycl::access::mode::read>(cgh);
925
+ auto accCons = bufCons.get_access <sycl::access::mode::write>(cgh);
926
+
927
+ cgh.single_task ([=]() {
928
+ auto ItCons = accCons.begin ();
929
+ for (auto ItProd = accProd.crbegin (); ItProd != accProd.crend ();
930
+ ItProd++) {
931
+ *(ItCons++) = N - *ItProd - 1 ;
932
+ }
933
+ });
934
+ });
935
+
936
+ q.wait ();
937
+ } catch (sycl::exception &e) {
938
+ std::cout << e.what () << std::endl;
939
+ }
940
+
941
+ count = 0 ;
942
+ for (const auto &i : vecCons)
943
+ assert (i == count++);
944
+ }
945
+
946
+ // 3-dim accessor simple iteration
947
+ {
948
+ constexpr int N = 24 ;
949
+ std::vector<int > vec (N, 0 );
950
+ try {
951
+ sycl::buffer<int , 3 > buf (vec.data (), sycl::range<3 >(2 , 3 , 4 ));
952
+ sycl::queue q;
953
+
954
+ q.submit ([&](sycl::handler &cgh) {
955
+ auto acc = buf.get_access <sycl::access::mode::read_write>(cgh);
956
+
957
+ cgh.single_task ([=]() {
958
+ for (auto It = acc.begin (); It != acc.end (); It++) {
959
+ (*It)++;
960
+ }
961
+ for (auto &It : acc)
962
+ It++;
963
+ });
964
+ });
965
+ q.wait ();
966
+ } catch (sycl::exception &e) {
967
+ std::cout << e.what () << std::endl;
968
+ }
969
+
970
+ for (const auto &i : vec)
971
+ assert (i == 2 );
972
+ }
973
+
974
+ // 3-dim accessor const iterator
975
+ {
976
+ constexpr int N = 24 ;
977
+ std::vector<int > vecProd (N, 1 ), vecCons (N, 0 );
978
+ try {
979
+ sycl::buffer<int , 3 > bufProd (vecProd.data (), sycl::range<3 >(2 , 3 , 4 ));
980
+ sycl::buffer<int , 3 > bufCons (vecCons.data (), sycl::range<3 >(2 , 3 , 4 ));
981
+ sycl::queue q;
982
+
983
+ q.submit ([&](sycl::handler &cgh) {
984
+ auto accProd = bufProd.get_access <sycl::access::mode::read>(cgh);
985
+ auto accCons = bufCons.get_access <sycl::access::mode::write>(cgh);
986
+
987
+ cgh.single_task ([=]() {
988
+ auto ItCons = accCons.begin ();
989
+ for (auto ItProd = accProd.cbegin (); ItProd != accProd.cend ();
990
+ ItProd++)
991
+ *(ItCons++) += *ItProd;
992
+ ItCons = accCons.begin ();
993
+ for (auto &It : accProd)
994
+ *(ItCons++) += It;
995
+ });
996
+ });
997
+ q.wait ();
998
+ } catch (sycl::exception &e) {
999
+ std::cout << e.what () << std::endl;
1000
+ }
1001
+
1002
+ for (const auto &i : vecCons)
1003
+ assert (i == 2 );
1004
+ }
1005
+
1006
+ // 3-dim accessor reverse iterator
1007
+ {
1008
+ constexpr int N = 24 ;
1009
+ std::vector<int > vec (N);
1010
+ try {
1011
+ sycl::buffer<int , 3 > buf (vec.data (), sycl::range<3 >(2 , 3 , 4 ));
1012
+ sycl::queue q;
1013
+
1014
+ q.submit ([&](sycl::handler &cgh) {
1015
+ auto acc1 = buf.get_access <sycl::access::mode::write>(cgh);
1016
+
1017
+ cgh.single_task ([=]() {
1018
+ size_t count = N;
1019
+ for (auto It = acc1.rbegin (); It != acc1.rend (); It++) {
1020
+ *It = N - count;
1021
+ count--;
1022
+ }
1023
+ });
1024
+ });
1025
+ q.wait ();
1026
+ } catch (sycl::exception &e) {
1027
+ std::cout << e.what () << std::endl;
1028
+ }
1029
+
1030
+ int count = N - 1 ;
1031
+ for (const auto &i : vec) {
1032
+ assert (i == count);
1033
+ count--;
1034
+ }
1035
+ }
1036
+
1037
+ // 3-dim accessor const reverse iterator
1038
+ {
1039
+ constexpr int N = 24 ;
1040
+ std::vector<int > vecProd (N), vecCons (N);
1041
+
1042
+ int count = N;
1043
+ for (auto &i : vecProd) {
1044
+ i = N - count;
1045
+ count--;
1046
+ }
1047
+
1048
+ try {
1049
+ sycl::buffer<int , 3 > bufProd (vecProd.data (), sycl::range<3 >(2 , 3 , 4 ));
1050
+ sycl::buffer<int , 3 > bufCons (vecCons.data (), sycl::range<3 >(2 , 3 , 4 ));
1051
+ sycl::queue q;
1052
+
1053
+ q.submit ([&](sycl::handler &cgh) {
1054
+ auto accProd = bufProd.get_access <sycl::access::mode::read>(cgh);
1055
+ auto accCons = bufCons.get_access <sycl::access::mode::write>(cgh);
1056
+
1057
+ cgh.single_task ([=]() {
1058
+ auto ItCons = accCons.begin ();
1059
+ for (auto ItProd = accProd.crbegin (); ItProd != accProd.crend ();
1060
+ ItProd++) {
1061
+ *(ItCons++) = N - *ItProd - 1 ;
1062
+ }
1063
+ });
1064
+ });
1065
+
1066
+ q.wait ();
1067
+ } catch (sycl::exception &e) {
1068
+ std::cout << e.what () << std::endl;
1069
+ }
1070
+
1071
+ count = 0 ;
1072
+ for (const auto &i : vecCons)
1073
+ assert (i == count++);
1074
+ }
1075
+ }
1076
+
790
1077
std::cout << " Test passed" << std::endl;
791
1078
}
0 commit comments