9
9
#include < numeric>
10
10
using namespace sycl ;
11
11
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 ;
16
13
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) {
17
23
// checking the results is computationally expensive so we do it on the device
18
24
buffer<char , 2 > checked_buf (
19
25
{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) {
68
74
assert (err_acc[0 ] == 0 );
69
75
}
70
76
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) {
74
78
75
79
int val = 0 ;
76
80
@@ -100,13 +104,10 @@ template <memory_order order> void test_global() {
100
104
}
101
105
});
102
106
}).wait_and_throw ();
103
- check (q, res_buf);
107
+ check (q, res_buf, N_iters );
104
108
}
105
109
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) {
110
111
int val = 0 ;
111
112
112
113
queue q;
@@ -133,22 +134,27 @@ template <memory_order order> void test_local() {
133
134
}
134
135
});
135
136
}).wait_and_throw ();
136
- check (q, res_buf);
137
+ check (q, res_buf, N_iters );
137
138
}
138
139
139
140
int main () {
140
141
queue q;
142
+ device d = q.get_device ();
141
143
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>();
143
145
144
146
if (!is_supported (supported_memory_orders, memory_order::seq_cst)) {
145
147
std::cout
146
148
<< " seq_cst memory order is not supported by the device. Skipping test."
147
149
<< std::endl;
148
150
return 0 ;
149
151
}
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);
152
158
153
159
std::cout << " Test passed." << std::endl;
154
160
}
0 commit comments