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

[SYCL] Add local_accessor iterator tests #1225

Merged
merged 6 commits into from
Oct 13, 2022
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
287 changes: 287 additions & 0 deletions SYCL/Basic/accessor/accessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -787,5 +787,292 @@ int main() {
}
}

// Accessor begin/end member functions
{
// 0-dim accessor iteration
{
int data = 8;
try {
sycl::buffer<int> buf(&data, 1);

sycl::queue q;
q.submit([&](sycl::handler &cgh) {
auto acc = buf.get_access<sycl::access::mode::read_write>(cgh);
cgh.single_task([=]() {
for (auto It = acc.begin(); It != acc.end(); It++)
*It *= 2;
for (auto &It : acc)
It *= 2;
});
});
q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

assert(data == 32);
}

// Simple iteration through the accessor
{
constexpr int N = 32;
std::vector<int> vec(N, 0);
try {
sycl::buffer<int> buf(vec.data(), vec.size());
sycl::queue q;

q.submit([&](sycl::handler &cgh) {
auto acc = buf.get_access<sycl::access::mode::read_write>(cgh);

cgh.single_task([=]() {
for (auto It = acc.begin(); It != acc.end(); It++) {
(*It)++;
}
for (auto &It : acc)
It++;
});
});
q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

for (const auto &i : vec)
assert(i == 2);
}

// Const iterator
{
constexpr int N = 32;
std::vector<int> vecProd(N, 1), vecCons(N, 0);
try {
sycl::buffer<int> bufProd(vecProd.data(), vecProd.size());
sycl::buffer<int> bufCons(vecCons.data(), vecCons.size());
sycl::queue q;

q.submit([&](sycl::handler &cgh) {
auto accProd = bufProd.get_access<sycl::access::mode::read>(cgh);
auto accCons = bufCons.get_access<sycl::access::mode::write>(cgh);

cgh.single_task([=]() {
auto ItCons = accCons.begin();
for (auto ItProd = accProd.cbegin(); ItProd != accProd.cend();
ItProd++)
*(ItCons++) += *ItProd;
ItCons = accCons.begin();
for (auto &It : accProd)
*(ItCons++) += It;
});
});
q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

for (const auto &i : vecCons)
assert(i == 2);
}

// Reverse iterator
{
constexpr int N = 32;
std::vector<int> vec(N);
try {
sycl::buffer<int> buf(vec.data(), vec.size());
sycl::queue q;

q.submit([&](sycl::handler &cgh) {
auto acc1 = buf.get_access<sycl::access::mode::write>(cgh);

cgh.single_task([=]() {
size_t count = N;
for (auto It = acc1.rbegin(); It != acc1.rend(); It++) {
*It = N - count;
count--;
}
});
});
q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

int count = N - 1;
for (const auto &i : vec) {
assert(i == count);
count--;
}
}

// Const reverse iterator
{
constexpr int N = 32;
std::vector<int> vecProd(N), vecCons(N);

int count = N;
for (auto &i : vecProd) {
i = N - count;
count--;
}

try {
sycl::buffer<int> bufProd(vecProd.data(), vecProd.size());
sycl::buffer<int> bufCons(vecCons.data(), vecCons.size());
sycl::queue q;

q.submit([&](sycl::handler &cgh) {
auto accProd = bufProd.get_access<sycl::access::mode::read>(cgh);
auto accCons = bufCons.get_access<sycl::access::mode::write>(cgh);

cgh.single_task([=]() {
auto ItCons = accCons.begin();
for (auto ItProd = accProd.crbegin(); ItProd != accProd.crend();
ItProd++) {
*(ItCons++) = N - *ItProd - 1;
}
});
});

q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

count = 0;
for (const auto &i : vecCons)
assert(i == count++);
}

// 3-dim accessor simple iteration
{
constexpr int N = 24;
std::vector<int> vec(N, 0);
try {
sycl::buffer<int, 3> buf(vec.data(), sycl::range<3>(2, 3, 4));
sycl::queue q;

q.submit([&](sycl::handler &cgh) {
auto acc = buf.get_access<sycl::access::mode::read_write>(cgh);

cgh.single_task([=]() {
for (auto It = acc.begin(); It != acc.end(); It++) {
(*It)++;
}
for (auto &It : acc)
It++;
});
});
q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

for (const auto &i : vec)
assert(i == 2);
}

// 3-dim accessor const iterator
{
constexpr int N = 24;
std::vector<int> vecProd(N, 1), vecCons(N, 0);
try {
sycl::buffer<int, 3> bufProd(vecProd.data(), sycl::range<3>(2, 3, 4));
sycl::buffer<int, 3> bufCons(vecCons.data(), sycl::range<3>(2, 3, 4));
sycl::queue q;

q.submit([&](sycl::handler &cgh) {
auto accProd = bufProd.get_access<sycl::access::mode::read>(cgh);
auto accCons = bufCons.get_access<sycl::access::mode::write>(cgh);

cgh.single_task([=]() {
auto ItCons = accCons.begin();
for (auto ItProd = accProd.cbegin(); ItProd != accProd.cend();
ItProd++)
*(ItCons++) += *ItProd;
ItCons = accCons.begin();
for (auto &It : accProd)
*(ItCons++) += It;
});
});
q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

for (const auto &i : vecCons)
assert(i == 2);
}

// 3-dim accessor reverse iterator
{
constexpr int N = 24;
std::vector<int> vec(N);
try {
sycl::buffer<int, 3> buf(vec.data(), sycl::range<3>(2, 3, 4));
sycl::queue q;

q.submit([&](sycl::handler &cgh) {
auto acc1 = buf.get_access<sycl::access::mode::write>(cgh);

cgh.single_task([=]() {
size_t count = N;
for (auto It = acc1.rbegin(); It != acc1.rend(); It++) {
*It = N - count;
count--;
}
});
});
q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

int count = N - 1;
for (const auto &i : vec) {
assert(i == count);
count--;
}
}

// 3-dim accessor const reverse iterator
{
constexpr int N = 24;
std::vector<int> vecProd(N), vecCons(N);

int count = N;
for (auto &i : vecProd) {
i = N - count;
count--;
}

try {
sycl::buffer<int, 3> bufProd(vecProd.data(), sycl::range<3>(2, 3, 4));
sycl::buffer<int, 3> bufCons(vecCons.data(), sycl::range<3>(2, 3, 4));
sycl::queue q;

q.submit([&](sycl::handler &cgh) {
auto accProd = bufProd.get_access<sycl::access::mode::read>(cgh);
auto accCons = bufCons.get_access<sycl::access::mode::write>(cgh);

cgh.single_task([=]() {
auto ItCons = accCons.begin();
for (auto ItProd = accProd.crbegin(); ItProd != accProd.crend();
ItProd++) {
*(ItCons++) = N - *ItProd - 1;
}
});
});

q.wait();
} catch (sycl::exception &e) {
std::cout << e.what() << std::endl;
}

count = 0;
for (const auto &i : vecCons)
assert(i == count++);
}
}

std::cout << "Test passed" << std::endl;
}