1
+ // RUN: %clangxx -fsycl -fsycl-targets=%sycl_triple -fsycl-device-code-split=per_kernel %s -o %t.out
2
+ // RUN: %HOST_RUN_PLACEHOLDER %t.out
3
+ // RUN: %CPU_RUN_PLACEHOLDER %t.out
4
+ // RUN: %GPU_RUN_PLACEHOLDER %t.out
5
+ // RUN: %ACC_RUN_PLACEHOLDER %t.out
6
+
7
+ // OpenCL CPU driver does not support cl_khr_fp16 extension for this reason this
8
+ // test is compiled with the -fsycl-device-code-split flag
9
+
10
+ #include < CL/sycl.hpp>
11
+ #include < cassert>
12
+
13
+ template <typename T, size_t N>
14
+ void assert_out_of_bound (sycl::marray<T, N> val, sycl::marray<T, N> lower,
15
+ sycl::marray<T, N> upper) {
16
+ for (int i = 0 ; i < N; i++) {
17
+ assert (lower[i] < val[i] && val[i] < upper[i]);
18
+ }
19
+ }
20
+
21
+ template <typename T> void assert_out_of_bound (T val, T lower, T upper) {
22
+ assert (sycl::all (lower < val && val < upper));
23
+ }
24
+
25
+ template <>
26
+ void assert_out_of_bound<float >(float val, float lower, float upper) {
27
+ assert (lower < val && val < upper);
28
+ }
29
+
30
+ template <>
31
+ void assert_out_of_bound<sycl::half>(sycl::half val, sycl::half lower,
32
+ sycl::half upper) {
33
+ assert (lower < val && val < upper);
34
+ }
35
+
36
+ template <typename T>
37
+ void native_tanh_tester (sycl::queue q, T val, T up, T lo) {
38
+ T r = val;
39
+
40
+ #ifdef SYCL_EXT_ONEAPI_NATIVE_MATH
41
+ {
42
+ sycl::buffer<T, 1 > BufR (&r, sycl::range<1 >(1 ));
43
+ q.submit ([&](sycl::handler &cgh) {
44
+ auto AccR = BufR.template get_access <sycl::access::mode::read_write>(cgh);
45
+ cgh.single_task ([=]() {
46
+ AccR[0 ] = sycl::ext::oneapi::experimental::native::tanh (AccR[0 ]);
47
+ });
48
+ });
49
+ }
50
+
51
+ assert_out_of_bound (r, up, lo);
52
+ #else
53
+ assert (!" SYCL_EXT_ONEAPI_NATIVE_MATH not supported" );
54
+ #endif
55
+ }
56
+
57
+ template <typename T>
58
+ void native_exp2_tester (sycl::queue q, T val, T up, T lo) {
59
+ T r = val;
60
+
61
+ #ifdef SYCL_EXT_ONEAPI_NATIVE_MATH
62
+ {
63
+ sycl::buffer<T, 1 > BufR (&r, sycl::range<1 >(1 ));
64
+ q.submit ([&](sycl::handler &cgh) {
65
+ auto AccR = BufR.template get_access <sycl::access::mode::read_write>(cgh);
66
+ cgh.single_task ([=]() {
67
+ AccR[0 ] = sycl::ext::oneapi::experimental::native::exp2 (AccR[0 ]);
68
+ });
69
+ });
70
+ }
71
+
72
+ assert_out_of_bound (r, up, lo);
73
+ #else
74
+ assert (!" SYCL_EXT_ONEAPI_NATIVE_MATH not supported" );
75
+ #endif
76
+ }
77
+
78
+ int main () {
79
+
80
+ sycl::queue q;
81
+
82
+ const double tv[16 ] = {-2.0 , -1.5 , -1.0 , 0.0 , 2.0 , 1.5 , 1.0 , 0.0 ,
83
+ -1.7 , 1.7 , -1.2 , 1.2 , -3.0 , 3.0 , -10.0 , 10.0 };
84
+ const double tl[16 ] = {-0.97 , -0.91 , -0.77 , -0.1 , 0.95 , 0.89 , 0.75 , -0.1 ,
85
+ -0.94 , 0.92 , -0.84 , 0.82 , -1.0 , 0.98 , -1.10 , 0.98 };
86
+ const double tu[16 ] = {-0.95 , -0.89 , -0.75 , 0.1 , 0.97 , 0.91 , 0.77 , 0.1 ,
87
+ -0.92 , 0.94 , -0.82 , 0.84 , -0.98 , 1.00 , -0.98 , 1.10 };
88
+
89
+ native_tanh_tester<float >(q, tv[0 ], tl[0 ], tu[0 ]);
90
+ native_tanh_tester<sycl::float2>(q, {tv[0 ], tv[1 ]}, {tl[0 ], tl[1 ]},
91
+ {tu[0 ], tu[1 ]});
92
+ native_tanh_tester<sycl::float3>(
93
+ q, {tv[0 ], tv[1 ], tv[2 ]}, {tl[0 ], tl[1 ], tl[2 ]}, {tu[0 ], tu[1 ], tu[2 ]});
94
+
95
+ native_tanh_tester<sycl::float4>(q, {tv[0 ], tv[1 ], tv[2 ], tv[3 ]},
96
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ]},
97
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ]});
98
+ native_tanh_tester<sycl::marray<float , 3 >>(q, {tv[0 ], tv[1 ], tv[2 ]},
99
+ {tl[0 ], tl[1 ], tl[2 ]},
100
+ {tu[0 ], tu[1 ], tu[2 ]});
101
+ native_tanh_tester<sycl::marray<float , 4 >>(q, {tv[0 ], tv[1 ], tv[2 ], tv[3 ]},
102
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ]},
103
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ]});
104
+ native_tanh_tester<sycl::marray<float , 4 >>(q, {tv[0 ], tv[1 ], tv[2 ], tv[3 ]},
105
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ]},
106
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ]});
107
+ native_tanh_tester<sycl::float8>(
108
+ q, {tv[0 ], tv[1 ], tv[2 ], tv[3 ], tv[4 ], tv[5 ], tv[6 ], tv[7 ]},
109
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ], tl[4 ], tl[5 ], tl[6 ], tl[7 ]},
110
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ], tu[4 ], tu[5 ], tu[6 ], tu[7 ]});
111
+ native_tanh_tester<sycl::float16>(
112
+ q,
113
+ {tv[0 ], tv[1 ], tv[2 ], tv[3 ], tv[4 ], tv[5 ], tv[6 ], tv[7 ], tv[8 ], tv[9 ],
114
+ tv[10 ], tv[11 ], tv[12 ], tv[13 ], tv[14 ], tv[15 ]},
115
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ], tl[4 ], tl[5 ], tl[6 ], tl[7 ], tl[8 ], tl[9 ],
116
+ tl[10 ], tl[11 ], tl[12 ], tl[13 ], tl[14 ], tl[15 ]},
117
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ], tu[4 ], tu[5 ], tu[6 ], tu[7 ], tu[8 ], tu[9 ],
118
+ tu[10 ], tu[11 ], tu[12 ], tu[13 ], tu[14 ], tu[15 ]});
119
+
120
+ if (q.get_device ().has (sycl::aspect::fp16)) {
121
+
122
+ native_tanh_tester<sycl::half>(q, tv[0 ], tl[0 ], tu[0 ]);
123
+ native_tanh_tester<sycl::half2>(q, {tv[0 ], tv[1 ]}, {tl[0 ], tl[1 ]},
124
+ {tu[0 ], tu[1 ]});
125
+ native_tanh_tester<sycl::half3>(
126
+ q, {tv[0 ], tv[1 ], tv[2 ]}, {tl[0 ], tl[1 ], tl[2 ]}, {tu[0 ], tu[1 ], tu[2 ]});
127
+ native_tanh_tester<sycl::marray<sycl::half, 3 >>(
128
+ q, {tv[0 ], tv[1 ], tv[2 ]}, {tl[0 ], tl[1 ], tl[2 ]}, {tu[0 ], tu[1 ], tu[2 ]});
129
+ native_tanh_tester<sycl::half4>(q, {tv[0 ], tv[1 ], tv[2 ], tv[3 ]},
130
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ]},
131
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ]});
132
+ native_tanh_tester<sycl::marray<sycl::half, 4 >>(q, {tv[0 ], tv[1 ], tv[2 ], tv[3 ]},
133
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ]},
134
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ]});
135
+ native_tanh_tester<sycl::half8>(
136
+ q, {tv[0 ], tv[1 ], tv[2 ], tv[3 ], tv[4 ], tv[5 ], tv[6 ], tv[7 ]},
137
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ], tl[4 ], tl[5 ], tl[6 ], tl[7 ]},
138
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ], tu[4 ], tu[5 ], tu[6 ], tu[7 ]});
139
+ native_tanh_tester<sycl::half16>(
140
+ q,
141
+ {tv[0 ], tv[1 ], tv[2 ], tv[3 ], tv[4 ], tv[5 ], tv[6 ], tv[7 ], tv[8 ], tv[9 ],
142
+ tv[10 ], tv[11 ], tv[12 ], tv[13 ], tv[14 ], tv[15 ]},
143
+ {tl[0 ], tl[1 ], tl[2 ], tl[3 ], tl[4 ], tl[5 ], tl[6 ], tl[7 ], tl[8 ], tl[9 ],
144
+ tl[10 ], tl[11 ], tl[12 ], tl[13 ], tl[14 ], tl[15 ]},
145
+ {tu[0 ], tu[1 ], tu[2 ], tu[3 ], tu[4 ], tu[5 ], tu[6 ], tu[7 ], tu[8 ], tu[9 ],
146
+ tu[10 ], tu[11 ], tu[12 ], tu[13 ], tu[14 ], tu[15 ]});
147
+
148
+ const double ev[16 ] = {-2.0 , -1.5 , -1.0 , 0.0 , 2.0 , 1.5 , 1.0 , 0.0 ,
149
+ -2.0 , -1.5 , -1.0 , 0.0 , 2.0 , 1.5 , 1.0 , 0.0 };
150
+ const double el[16 ] = {0.1 , 0.34 , 0.4 , -0.9 , 3.9 , 2.7 , 1.9 , -0.9 ,
151
+ 0.1 , 0.34 , 0.4 , -0.9 , 3.9 , 2.7 , 1.9 , -0.9 };
152
+ const double eu[16 ] = {0.3 , 0.36 , 0.6 , 1.1 , 4.1 , 2.9 , 2.1 , 1.1 ,
153
+ 0.3 , 0.36 , 0.6 , 1.1 , 4.1 , 2.9 , 2.1 , 1.1 };
154
+
155
+ native_exp2_tester<sycl::half>(q, ev[0 ], el[0 ], eu[0 ]);
156
+ native_exp2_tester<sycl::half2>(q, {ev[0 ], ev[1 ]}, {el[0 ], el[1 ]},
157
+ {eu[0 ], eu[1 ]});
158
+ native_exp2_tester<sycl::half3>(
159
+ q, {ev[0 ], ev[1 ], ev[2 ]}, {el[0 ], el[1 ], el[2 ]}, {eu[0 ], eu[1 ], eu[2 ]});
160
+ native_exp2_tester<sycl::half4>(q, {ev[0 ], ev[1 ], ev[2 ], ev[3 ]},
161
+ {el[0 ], el[1 ], el[2 ], el[3 ]},
162
+ {eu[0 ], eu[1 ], eu[2 ], eu[3 ]});
163
+ native_exp2_tester<sycl::marray<sycl::half, 3 >>(q, {ev[0 ], ev[1 ], ev[2 ]},
164
+ {el[0 ], el[1 ], el[2 ]},
165
+ {eu[0 ], eu[1 ], eu[2 ]});
166
+ native_exp2_tester<sycl::marray<sycl::half, 4 >>(q, {ev[0 ], ev[1 ], ev[2 ], ev[3 ]},
167
+ {el[0 ], el[1 ], el[2 ], el[3 ]},
168
+ {eu[0 ], eu[1 ], eu[2 ], eu[3 ]});
169
+ native_exp2_tester<sycl::half8>(
170
+ q, {ev[0 ], ev[1 ], ev[2 ], ev[3 ], ev[4 ], ev[5 ], ev[6 ], ev[7 ]},
171
+ {el[0 ], el[1 ], el[2 ], el[3 ], el[4 ], el[5 ], el[6 ], el[7 ]},
172
+ {eu[0 ], eu[1 ], eu[2 ], eu[3 ], eu[4 ], eu[5 ], eu[6 ], eu[7 ]});
173
+ native_exp2_tester<sycl::half16>(
174
+ q,
175
+ {ev[0 ], ev[1 ], ev[2 ], ev[3 ], ev[4 ], ev[5 ], ev[6 ], ev[7 ], ev[8 ], ev[9 ],
176
+ ev[10 ], ev[11 ], ev[12 ], ev[13 ], ev[14 ], ev[15 ]},
177
+ {el[0 ], el[1 ], el[2 ], el[3 ], el[4 ], el[5 ], el[6 ], el[7 ], el[8 ], el[9 ],
178
+ el[10 ], el[11 ], el[12 ], el[13 ], el[14 ], el[15 ]},
179
+ {eu[0 ], eu[1 ], eu[2 ], eu[3 ], eu[4 ], eu[5 ], eu[6 ], eu[7 ], eu[8 ], eu[9 ],
180
+ eu[10 ], eu[11 ], eu[12 ], eu[13 ], eu[14 ], eu[15 ]});
181
+ }
182
+
183
+ return 0 ;
184
+ }
0 commit comments