12
12
using namespace sycl ;
13
13
using namespace sycl ::intel;
14
14
15
- template <typename T>
15
+ template <typename T, typename Difference = T >
16
16
void add_fetch_test (queue q, size_t N) {
17
17
T sum = 0 ;
18
18
std::vector<T> output (N);
19
- std::fill (output.begin (), output.end (), 0 );
19
+ std::fill (output.begin (), output.end (), T ( 0 ) );
20
20
{
21
21
buffer<T> sum_buf (&sum, 1 );
22
22
buffer<T> output_buf (output.data (), output.size ());
@@ -27,29 +27,29 @@ void add_fetch_test(queue q, size_t N) {
27
27
cgh.parallel_for (range<1 >(N), [=](item<1 > it) {
28
28
int gid = it.get_id (0 );
29
29
auto atm = atomic_ref<T, intel::memory_order::relaxed, intel::memory_scope::device, access::address_space::global_space>(sum[0 ]);
30
- out[gid] = atm.fetch_add (T (1 ));
30
+ out[gid] = atm.fetch_add (Difference (1 ));
31
31
});
32
32
});
33
33
}
34
34
35
35
// All work-items increment by 1, so final value should be equal to N
36
- assert (sum == N );
36
+ assert (sum == T (N) );
37
37
38
38
// Fetch returns original value: will be in [0, N-1]
39
39
auto min_e = std::min_element (output.begin (), output.end ());
40
40
auto max_e = std::max_element (output.begin (), output.end ());
41
- assert (*min_e == 0 && *max_e == N - 1 );
41
+ assert (*min_e == T ( 0 ) && *max_e == T ( N - 1 ) );
42
42
43
43
// Intermediate values should be unique
44
44
std::sort (output.begin (), output.end ());
45
45
assert (std::unique (output.begin (), output.end ()) == output.end ());
46
46
}
47
47
48
- template <typename T>
48
+ template <typename T, typename Difference = T >
49
49
void add_plus_equal_test (queue q, size_t N) {
50
50
T sum = 0 ;
51
51
std::vector<T> output (N);
52
- std::fill (output.begin (), output.end (), 0 );
52
+ std::fill (output.begin (), output.end (), T ( 0 ) );
53
53
{
54
54
buffer<T> sum_buf (&sum, 1 );
55
55
buffer<T> output_buf (output.data (), output.size ());
@@ -60,29 +60,29 @@ void add_plus_equal_test(queue q, size_t N) {
60
60
cgh.parallel_for (range<1 >(N), [=](item<1 > it) {
61
61
int gid = it.get_id (0 );
62
62
auto atm = atomic_ref<T, intel::memory_order::relaxed, intel::memory_scope::device, access::address_space::global_space>(sum[0 ]);
63
- out[gid] = atm += T (1 );
63
+ out[gid] = atm += Difference (1 );
64
64
});
65
65
});
66
66
}
67
67
68
68
// All work-items increment by 1, so final value should be equal to N
69
- assert (sum == N );
69
+ assert (sum == T (N) );
70
70
71
71
// += returns updated value: will be in [1, N]
72
72
auto min_e = std::min_element (output.begin (), output.end ());
73
73
auto max_e = std::max_element (output.begin (), output.end ());
74
- assert (*min_e == 1 && *max_e == N );
74
+ assert (*min_e == T ( 1 ) && *max_e == T (N) );
75
75
76
76
// Intermediate values should be unique
77
77
std::sort (output.begin (), output.end ());
78
78
assert (std::unique (output.begin (), output.end ()) == output.end ());
79
79
}
80
80
81
- template <typename T>
81
+ template <typename T, typename Difference = T >
82
82
void add_pre_inc_test (queue q, size_t N) {
83
83
T sum = 0 ;
84
84
std::vector<T> output (N);
85
- std::fill (output.begin (), output.end (), 0 );
85
+ std::fill (output.begin (), output.end (), T ( 0 ) );
86
86
{
87
87
buffer<T> sum_buf (&sum, 1 );
88
88
buffer<T> output_buf (output.data (), output.size ());
@@ -99,23 +99,23 @@ void add_pre_inc_test(queue q, size_t N) {
99
99
}
100
100
101
101
// All work-items increment by 1, so final value should be equal to N
102
- assert (sum == N );
102
+ assert (sum == T (N) );
103
103
104
104
// Pre-increment returns updated value: will be in [1, N]
105
105
auto min_e = std::min_element (output.begin (), output.end ());
106
106
auto max_e = std::max_element (output.begin (), output.end ());
107
- assert (*min_e == 1 && *max_e == N );
107
+ assert (*min_e == T ( 1 ) && *max_e == T (N) );
108
108
109
109
// Intermediate values should be unique
110
110
std::sort (output.begin (), output.end ());
111
111
assert (std::unique (output.begin (), output.end ()) == output.end ());
112
112
}
113
113
114
- template <typename T>
114
+ template <typename T, typename Difference = T >
115
115
void add_post_inc_test (queue q, size_t N) {
116
116
T sum = 0 ;
117
117
std::vector<T> output (N);
118
- std::fill (output.begin (), output.end (), 0 );
118
+ std::fill (output.begin (), output.end (), T ( 0 ) );
119
119
{
120
120
buffer<T> sum_buf (&sum, 1 );
121
121
buffer<T> output_buf (output.data (), output.size ());
@@ -132,24 +132,24 @@ void add_post_inc_test(queue q, size_t N) {
132
132
}
133
133
134
134
// All work-items increment by 1, so final value should be equal to N
135
- assert (sum == N );
135
+ assert (sum == T (N) );
136
136
137
137
// Post-increment returns original value: will be in [0, N-1]
138
138
auto min_e = std::min_element (output.begin (), output.end ());
139
139
auto max_e = std::max_element (output.begin (), output.end ());
140
- assert (*min_e == 0 && *max_e == N - 1 );
140
+ assert (*min_e == T ( 0 ) && *max_e == T ( N - 1 ) );
141
141
142
142
// Intermediate values should be unique
143
143
std::sort (output.begin (), output.end ());
144
144
assert (std::unique (output.begin (), output.end ()) == output.end ());
145
145
}
146
146
147
- template <typename T>
147
+ template <typename T, typename Difference = T >
148
148
void add_test (queue q, size_t N) {
149
- add_fetch_test<T>(q, N);
150
- add_plus_equal_test<T>(q, N);
151
- add_pre_inc_test<T>(q, N);
152
- add_post_inc_test<T>(q, N);
149
+ add_fetch_test<T, Difference >(q, N);
150
+ add_plus_equal_test<T, Difference >(q, N);
151
+ add_pre_inc_test<T, Difference >(q, N);
152
+ add_post_inc_test<T, Difference >(q, N);
153
153
}
154
154
155
155
// Floating-point types do not support pre- or post-increment
@@ -173,8 +173,6 @@ int main() {
173
173
}
174
174
175
175
constexpr int N = 32 ;
176
-
177
- // TODO: Enable missing tests when supported
178
176
add_test<int >(q, N);
179
177
add_test<unsigned int >(q, N);
180
178
add_test<long >(q, N);
@@ -183,7 +181,7 @@ int main() {
183
181
add_test<unsigned long long >(q, N);
184
182
add_test<float >(q, N);
185
183
add_test<double >(q, N);
186
- // add_test<char* >(q, N);
184
+ add_test<char *, ptrdiff_t >(q, N);
187
185
188
186
std::cout << " Test passed." << std::endl;
189
187
}
0 commit comments