Skip to content
This repository was archived by the owner on Mar 28, 2023. It is now read-only.

Commit 309ca0d

Browse files
committed
[SYCL] Add accessor iterator tests
1 parent 483fb75 commit 309ca0d

File tree

1 file changed

+287
-0
lines changed

1 file changed

+287
-0
lines changed

SYCL/Basic/accessor/accessor.cpp

Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,5 +787,292 @@ int main() {
787787
}
788788
}
789789

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+
7901077
std::cout << "Test passed" << std::endl;
7911078
}

0 commit comments

Comments
 (0)