Skip to content

Commit 41a20ca

Browse files
[SYCL] Limit allocation size in atomic_memory_order_seq_cst test (#9986)
The atomic_memory_order_seq_cst.cpp test does not currently check for buffer allocation limitations. This commit makes it consider `info::device::max_mem_alloc_size` when selecting the number of iterations. Signed-off-by: Larsen, Steffen <[email protected]>
1 parent 3ac4362 commit 41a20ca

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

sycl/test-e2e/AtomicRef/atomic_memory_order_seq_cst.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,17 @@
99
#include <numeric>
1010
using namespace sycl;
1111

12-
void check(queue &q, buffer<int, 2> &res_buf) {
13-
range<2> size = res_buf.get_range();
14-
const size_t N_items = 2 * size[0];
15-
const size_t N_iters = size[1];
12+
constexpr size_t N_items = 128;
1613

14+
size_t CalculateIterations(device &device, size_t iter_cap) {
15+
uint64_t max_chars_alloc =
16+
device.get_info<info::device::max_mem_alloc_size>() / sizeof(char);
17+
size_t max_iter =
18+
(sycl::sqrt(static_cast<double>(max_chars_alloc)) - 1) / (N_items / 2);
19+
return sycl::min(max_iter, iter_cap);
20+
}
21+
22+
void check(queue &q, buffer<int, 2> &res_buf, size_t N_iters) {
1723
// checking the results is computationally expensive so we do it on the device
1824
buffer<char, 2> checked_buf(
1925
{N_items / 2 * N_iters + 1, N_items / 2 * N_iters + 1});
@@ -68,9 +74,7 @@ void check(queue &q, buffer<int, 2> &res_buf) {
6874
assert(err_acc[0] == 0);
6975
}
7076

71-
template <memory_order order> void test_global() {
72-
const size_t N_items = 128;
73-
const size_t N_iters = 1000;
77+
template <memory_order order> void test_global(size_t N_iters) {
7478

7579
int val = 0;
7680

@@ -100,13 +104,10 @@ template <memory_order order> void test_global() {
100104
}
101105
});
102106
}).wait_and_throw();
103-
check(q, res_buf);
107+
check(q, res_buf, N_iters);
104108
}
105109

106-
template <memory_order order> void test_local() {
107-
const size_t N_items = 128;
108-
const size_t N_iters = 1000;
109-
110+
template <memory_order order> void test_local(size_t N_iters) {
110111
int val = 0;
111112

112113
queue q;
@@ -133,22 +134,27 @@ template <memory_order order> void test_local() {
133134
}
134135
});
135136
}).wait_and_throw();
136-
check(q, res_buf);
137+
check(q, res_buf, N_iters);
137138
}
138139

139140
int main() {
140141
queue q;
142+
device d = q.get_device();
141143
std::vector<memory_order> supported_memory_orders =
142-
q.get_device().get_info<info::device::atomic_memory_order_capabilities>();
144+
d.get_info<info::device::atomic_memory_order_capabilities>();
143145

144146
if (!is_supported(supported_memory_orders, memory_order::seq_cst)) {
145147
std::cout
146148
<< "seq_cst memory order is not supported by the device. Skipping test."
147149
<< std::endl;
148150
return 0;
149151
}
150-
test_global<memory_order::seq_cst>();
151-
test_local<memory_order::seq_cst>();
152+
153+
const size_t N_iters = CalculateIterations(d, 1000);
154+
std::cout << "Using N_iters " << N_iters << std::endl;
155+
156+
test_global<memory_order::seq_cst>(N_iters);
157+
test_local<memory_order::seq_cst>(N_iters);
152158

153159
std::cout << "Test passed." << std::endl;
154160
}

0 commit comments

Comments
 (0)