Skip to content

Commit 64a9deb

Browse files
authored
[SYCL] Inline trivial util functions for half/half2 in intel math header (#15518)
Missing "inline" will lead to multiple definition linker error for these trivial functions. The scenario can be described as following: a.cpp #include <sycl/sycl.hpp> #include <sycl/ext/intel/math.hpp> b.cpp #include <sycl/sycl.hpp> #include <sycl/ext/intel/math.hpp> int main() { return 0; } clang++ -fsycl a.cpp b.cpp --------- Signed-off-by: jinge90 <ge.jin@intel.com>
1 parent 97b11a7 commit 64a9deb

File tree

2 files changed

+85
-74
lines changed

2 files changed

+85
-74
lines changed

sycl/include/sycl/ext/intel/math/imf_half_trivial.hpp

Lines changed: 72 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -16,280 +16,280 @@
1616
namespace sycl {
1717
inline namespace _V1 {
1818
namespace ext::intel::math {
19-
sycl::half hadd(sycl::half x, sycl::half y) { return x + y; }
19+
inline sycl::half hadd(sycl::half x, sycl::half y) { return x + y; }
2020

21-
sycl::half hadd_sat(sycl::half x, sycl::half y) {
21+
inline sycl::half hadd_sat(sycl::half x, sycl::half y) {
2222
return sycl::clamp((x + y), sycl::half(0.f), sycl::half(1.0f));
2323
}
2424

25-
sycl::half hfma(sycl::half x, sycl::half y, sycl::half z) {
25+
inline sycl::half hfma(sycl::half x, sycl::half y, sycl::half z) {
2626
return sycl::fma(x, y, z);
2727
}
2828

29-
sycl::half hfma_sat(sycl::half x, sycl::half y, sycl::half z) {
29+
inline sycl::half hfma_sat(sycl::half x, sycl::half y, sycl::half z) {
3030
return sycl::clamp(sycl::fma(x, y, z), sycl::half(0.f), sycl::half(1.0f));
3131
}
3232

33-
sycl::half hmul(sycl::half x, sycl::half y) { return x * y; }
33+
inline sycl::half hmul(sycl::half x, sycl::half y) { return x * y; }
3434

35-
sycl::half hmul_sat(sycl::half x, sycl::half y) {
35+
inline sycl::half hmul_sat(sycl::half x, sycl::half y) {
3636
return sycl::clamp((x * y), sycl::half(0.f), sycl::half(1.0f));
3737
}
3838

39-
sycl::half hneg(sycl::half x) { return -x; }
39+
inline sycl::half hneg(sycl::half x) { return -x; }
4040

41-
sycl::half hsub(sycl::half x, sycl::half y) { return x - y; }
41+
inline sycl::half hsub(sycl::half x, sycl::half y) { return x - y; }
4242

43-
sycl::half hsub_sat(sycl::half x, sycl::half y) {
43+
inline sycl::half hsub_sat(sycl::half x, sycl::half y) {
4444
return sycl::clamp((x - y), sycl::half(0.f), sycl::half(1.0f));
4545
}
4646

47-
sycl::half hdiv(sycl::half x, sycl::half y) { return x / y; }
47+
inline sycl::half hdiv(sycl::half x, sycl::half y) { return x / y; }
4848

49-
bool heq(sycl::half x, sycl::half y) { return x == y; }
49+
inline bool heq(sycl::half x, sycl::half y) { return x == y; }
5050

51-
bool hequ(sycl::half x, sycl::half y) {
51+
inline bool hequ(sycl::half x, sycl::half y) {
5252
if (sycl::isnan(x) || sycl::isnan(y))
5353
return true;
5454
else
5555
return x == y;
5656
}
5757

58-
bool hge(sycl::half x, sycl::half y) { return x >= y; }
58+
inline bool hge(sycl::half x, sycl::half y) { return x >= y; }
5959

60-
bool hgeu(sycl::half x, sycl::half y) {
60+
inline bool hgeu(sycl::half x, sycl::half y) {
6161
if (sycl::isnan(x) || sycl::isnan(y))
6262
return true;
6363
else
6464
return x >= y;
6565
}
6666

67-
bool hgt(sycl::half x, sycl::half y) { return x > y; }
67+
inline bool hgt(sycl::half x, sycl::half y) { return x > y; }
6868

69-
bool hgtu(sycl::half x, sycl::half y) {
69+
inline bool hgtu(sycl::half x, sycl::half y) {
7070
if (sycl::isnan(x) || sycl::isnan(y))
7171
return true;
7272
else
7373
return x > y;
7474
}
7575

76-
bool hle(sycl::half x, sycl::half y) { return x <= y; }
76+
inline bool hle(sycl::half x, sycl::half y) { return x <= y; }
7777

78-
bool hleu(sycl::half x, sycl::half y) {
78+
inline bool hleu(sycl::half x, sycl::half y) {
7979
if (sycl::isnan(x) || sycl::isnan(y))
8080
return true;
8181
else
8282
return x <= y;
8383
}
8484

85-
bool hlt(sycl::half x, sycl::half y) { return x < y; }
85+
inline bool hlt(sycl::half x, sycl::half y) { return x < y; }
8686

87-
bool hltu(sycl::half x, sycl::half y) {
87+
inline bool hltu(sycl::half x, sycl::half y) {
8888
if (sycl::isnan(x) || sycl::isnan(y))
8989
return true;
9090
return x < y;
9191
}
9292

93-
bool hne(sycl::half x, sycl::half y) {
93+
inline bool hne(sycl::half x, sycl::half y) {
9494
if (sycl::isnan(x) || sycl::isnan(y))
9595
return false;
9696
return x != y;
9797
}
9898

99-
bool hneu(sycl::half x, sycl::half y) {
99+
inline bool hneu(sycl::half x, sycl::half y) {
100100
if (sycl::isnan(x) || sycl::isnan(y))
101101
return true;
102102
else
103103
return x != y;
104104
}
105105

106-
bool hisinf(sycl::half x) { return sycl::isinf(x); }
107-
bool hisnan(sycl::half y) { return sycl::isnan(y); }
106+
inline bool hisinf(sycl::half x) { return sycl::isinf(x); }
107+
inline bool hisnan(sycl::half y) { return sycl::isnan(y); }
108108

109-
sycl::half2 hadd2(sycl::half2 x, sycl::half2 y) { return x + y; }
109+
inline sycl::half2 hadd2(sycl::half2 x, sycl::half2 y) { return x + y; }
110110

111-
sycl::half2 hadd2_sat(sycl::half2 x, sycl::half2 y) {
111+
inline sycl::half2 hadd2_sat(sycl::half2 x, sycl::half2 y) {
112112
return sycl::clamp((x + y), sycl::half2{0.f, 0.f}, sycl::half2{1.f, 1.f});
113113
}
114114

115-
sycl::half2 hfma2(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
115+
inline sycl::half2 hfma2(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
116116
return sycl::fma(x, y, z);
117117
}
118118

119-
sycl::half2 hfma2_sat(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
119+
inline sycl::half2 hfma2_sat(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
120120
return sycl::clamp(sycl::fma(x, y, z), sycl::half2{0.f, 0.f},
121121
sycl::half2{1.f, 1.f});
122122
}
123123

124-
sycl::half2 hmul2(sycl::half2 x, sycl::half2 y) { return x * y; }
124+
inline sycl::half2 hmul2(sycl::half2 x, sycl::half2 y) { return x * y; }
125125

126-
sycl::half2 hmul2_sat(sycl::half2 x, sycl::half2 y) {
126+
inline sycl::half2 hmul2_sat(sycl::half2 x, sycl::half2 y) {
127127
return sycl::clamp((x * y), sycl::half2{0.f, 0.f}, sycl::half2{1.f, 1.f});
128128
}
129129

130-
sycl::half2 h2div(sycl::half2 x, sycl::half2 y) { return x / y; }
130+
inline sycl::half2 h2div(sycl::half2 x, sycl::half2 y) { return x / y; }
131131

132-
sycl::half2 hneg2(sycl::half2 x) { return -x; }
132+
inline sycl::half2 hneg2(sycl::half2 x) { return -x; }
133133

134-
sycl::half2 hsub2(sycl::half2 x, sycl::half2 y) { return x - y; }
134+
inline sycl::half2 hsub2(sycl::half2 x, sycl::half2 y) { return x - y; }
135135

136-
sycl::half2 hsub2_sat(sycl::half2 x, sycl::half2 y) {
136+
inline sycl::half2 hsub2_sat(sycl::half2 x, sycl::half2 y) {
137137
return sycl::clamp((x - y), sycl::half2{0.f, 0.f}, sycl::half2{1.f, 1.f});
138138
}
139139

140-
bool hbeq2(sycl::half2 x, sycl::half2 y) {
140+
inline bool hbeq2(sycl::half2 x, sycl::half2 y) {
141141
return heq(x.s0(), y.s0()) && heq(x.s1(), y.s1());
142142
}
143143

144-
bool hbequ2(sycl::half2 x, sycl::half2 y) {
144+
inline bool hbequ2(sycl::half2 x, sycl::half2 y) {
145145
return hequ(x.s0(), y.s0()) && hequ(x.s1(), y.s1());
146146
}
147147

148-
bool hbge2(sycl::half2 x, sycl::half2 y) {
148+
inline bool hbge2(sycl::half2 x, sycl::half2 y) {
149149
return hge(x.s0(), y.s0()) && hge(x.s1(), y.s1());
150150
}
151151

152-
bool hbgeu2(sycl::half2 x, sycl::half2 y) {
152+
inline bool hbgeu2(sycl::half2 x, sycl::half2 y) {
153153
return hgeu(x.s0(), y.s0()) && hgeu(x.s1(), y.s1());
154154
}
155155

156-
bool hbgt2(sycl::half2 x, sycl::half2 y) {
156+
inline bool hbgt2(sycl::half2 x, sycl::half2 y) {
157157
return hgt(x.s0(), y.s0()) && hgt(x.s1(), y.s1());
158158
}
159159

160-
bool hbgtu2(sycl::half2 x, sycl::half2 y) {
160+
inline bool hbgtu2(sycl::half2 x, sycl::half2 y) {
161161
return hgtu(x.s0(), y.s0()) && hgtu(x.s1(), y.s1());
162162
}
163163

164-
bool hble2(sycl::half2 x, sycl::half2 y) {
164+
inline bool hble2(sycl::half2 x, sycl::half2 y) {
165165
return hle(x.s0(), y.s0()) && hle(x.s1(), y.s1());
166166
}
167167

168-
bool hbleu2(sycl::half2 x, sycl::half2 y) {
168+
inline bool hbleu2(sycl::half2 x, sycl::half2 y) {
169169
return hleu(x.s0(), y.s0()) && hleu(x.s1(), y.s1());
170170
}
171171

172-
bool hblt2(sycl::half2 x, sycl::half2 y) {
172+
inline bool hblt2(sycl::half2 x, sycl::half2 y) {
173173
return hlt(x.s0(), y.s0()) && hlt(x.s1(), y.s1());
174174
}
175175

176-
bool hbltu2(sycl::half2 x, sycl::half2 y) {
176+
inline bool hbltu2(sycl::half2 x, sycl::half2 y) {
177177
return hltu(x.s0(), y.s0()) && hltu(x.s1(), y.s1());
178178
}
179179

180-
bool hbne2(sycl::half2 x, sycl::half2 y) {
180+
inline bool hbne2(sycl::half2 x, sycl::half2 y) {
181181
return hne(x.s0(), y.s0()) && hne(x.s1(), y.s1());
182182
}
183183

184-
bool hbneu2(sycl::half2 x, sycl::half2 y) {
184+
inline bool hbneu2(sycl::half2 x, sycl::half2 y) {
185185
return hneu(x.s0(), y.s0()) && hneu(x.s1(), y.s1());
186186
}
187187

188-
sycl::half2 heq2(sycl::half2 x, sycl::half2 y) {
188+
inline sycl::half2 heq2(sycl::half2 x, sycl::half2 y) {
189189
return sycl::half2{(heq(x.s0(), y.s0()) ? 1.0f : 0.f),
190190
(heq(x.s1(), y.s1()) ? 1.0f : 0.f)};
191191
}
192192

193-
sycl::half2 hequ2(sycl::half2 x, sycl::half2 y) {
193+
inline sycl::half2 hequ2(sycl::half2 x, sycl::half2 y) {
194194
return sycl::half2{(hequ(x.s0(), y.s0()) ? 1.0f : 0.f),
195195
(hequ(x.s1(), y.s1()) ? 1.0f : 0.f)};
196196
}
197197

198-
sycl::half2 hge2(sycl::half2 x, sycl::half2 y) {
198+
inline sycl::half2 hge2(sycl::half2 x, sycl::half2 y) {
199199
return sycl::half2{(hge(x.s0(), y.s0()) ? 1.0f : 0.f),
200200
(hge(x.s1(), y.s1()) ? 1.0f : 0.f)};
201201
}
202202

203-
sycl::half2 hgeu2(sycl::half2 x, sycl::half2 y) {
203+
inline sycl::half2 hgeu2(sycl::half2 x, sycl::half2 y) {
204204
return sycl::half2{(hgeu(x.s0(), y.s0()) ? 1.0f : 0.f),
205205
(hgeu(x.s1(), y.s1()) ? 1.0f : 0.f)};
206206
}
207207

208-
sycl::half2 hgt2(sycl::half2 x, sycl::half2 y) {
208+
inline sycl::half2 hgt2(sycl::half2 x, sycl::half2 y) {
209209
return sycl::half2{(hgt(x.s0(), y.s0()) ? 1.0f : 0.f),
210210
(hgt(x.s1(), y.s1()) ? 1.0f : 0.f)};
211211
}
212212

213-
sycl::half2 hgtu2(sycl::half2 x, sycl::half2 y) {
213+
inline sycl::half2 hgtu2(sycl::half2 x, sycl::half2 y) {
214214
return sycl::half2{(hgtu(x.s0(), y.s0()) ? 1.0f : 0.f),
215215
(hgtu(x.s1(), y.s1()) ? 1.0f : 0.f)};
216216
}
217217

218-
sycl::half2 hle2(sycl::half2 x, sycl::half2 y) {
218+
inline sycl::half2 hle2(sycl::half2 x, sycl::half2 y) {
219219
return sycl::half2{(hle(x.s0(), y.s0()) ? 1.0f : 0.f),
220220
(hle(x.s1(), y.s1()) ? 1.0f : 0.f)};
221221
}
222222

223-
sycl::half2 hleu2(sycl::half2 x, sycl::half2 y) {
223+
inline sycl::half2 hleu2(sycl::half2 x, sycl::half2 y) {
224224
return sycl::half2{(hleu(x.s0(), y.s0()) ? 1.0f : 0.f),
225225
(hleu(x.s1(), y.s1()) ? 1.0f : 0.f)};
226226
}
227227

228-
sycl::half2 hlt2(sycl::half2 x, sycl::half2 y) {
228+
inline sycl::half2 hlt2(sycl::half2 x, sycl::half2 y) {
229229
return sycl::half2{(hlt(x.s0(), y.s0()) ? 1.0f : 0.f),
230230
(hlt(x.s1(), y.s1()) ? 1.0f : 0.f)};
231231
}
232232

233-
sycl::half2 hltu2(sycl::half2 x, sycl::half2 y) {
233+
inline sycl::half2 hltu2(sycl::half2 x, sycl::half2 y) {
234234
return sycl::half2{(hltu(x.s0(), y.s0()) ? 1.0f : 0.f),
235235
(hltu(x.s1(), y.s1()) ? 1.0f : 0.f)};
236236
}
237237

238-
sycl::half2 hisnan2(sycl::half2 x) {
238+
inline sycl::half2 hisnan2(sycl::half2 x) {
239239
return sycl::half2{(hisnan(x.s0()) ? 1.0f : 0.f),
240240
(hisnan(x.s1()) ? 1.0f : 0.f)};
241241
}
242242

243-
sycl::half2 hne2(sycl::half2 x, sycl::half2 y) {
243+
inline sycl::half2 hne2(sycl::half2 x, sycl::half2 y) {
244244
return sycl::half2{(hne(x.s0(), y.s0()) ? 1.0f : 0.f),
245245
(hne(x.s1(), y.s1()) ? 1.0f : 0.f)};
246246
}
247247

248-
sycl::half2 hneu2(sycl::half2 x, sycl::half2 y) {
248+
inline sycl::half2 hneu2(sycl::half2 x, sycl::half2 y) {
249249
return sycl::half2{(hneu(x.s0(), y.s0()) ? 1.0f : 0.f),
250250
(hneu(x.s1(), y.s1()) ? 1.0f : 0.f)};
251251
}
252252

253-
sycl::half hmax(sycl::half x, sycl::half y) { return sycl::fmax(x, y); }
253+
inline sycl::half hmax(sycl::half x, sycl::half y) { return sycl::fmax(x, y); }
254254

255-
sycl::half hmax_nan(sycl::half x, sycl::half y) {
255+
inline sycl::half hmax_nan(sycl::half x, sycl::half y) {
256256
if (hisnan(x) || hisnan(y))
257257
return sycl::half(std::numeric_limits<float>::quiet_NaN());
258258
else
259259
return sycl::fmax(x, y);
260260
}
261261

262-
sycl::half2 hmax2(sycl::half2 x, sycl::half2 y) {
262+
inline sycl::half2 hmax2(sycl::half2 x, sycl::half2 y) {
263263
return sycl::half2{hmax(x.s0(), y.s0()), hmax(x.s1(), y.s1())};
264264
}
265265

266-
sycl::half2 hmax2_nan(sycl::half2 x, sycl::half2 y) {
266+
inline sycl::half2 hmax2_nan(sycl::half2 x, sycl::half2 y) {
267267
return sycl::half2{hmax_nan(x.s0(), y.s0()), hmax_nan(x.s1(), y.s1())};
268268
}
269269

270-
sycl::half hmin(sycl::half x, sycl::half y) { return sycl::fmin(x, y); }
270+
inline sycl::half hmin(sycl::half x, sycl::half y) { return sycl::fmin(x, y); }
271271

272-
sycl::half hmin_nan(sycl::half x, sycl::half y) {
272+
inline sycl::half hmin_nan(sycl::half x, sycl::half y) {
273273
if (hisnan(x) || hisnan(y))
274274
return sycl::half(std::numeric_limits<float>::quiet_NaN());
275275
else
276276
return sycl::fmin(x, y);
277277
}
278278

279-
sycl::half2 hmin2(sycl::half2 x, sycl::half2 y) {
279+
inline sycl::half2 hmin2(sycl::half2 x, sycl::half2 y) {
280280
return sycl::half2{hmin(x.s0(), y.s0()), hmin(x.s1(), y.s1())};
281281
}
282282

283-
sycl::half2 hmin2_nan(sycl::half2 x, sycl::half2 y) {
283+
inline sycl::half2 hmin2_nan(sycl::half2 x, sycl::half2 y) {
284284
return sycl::half2{hmin_nan(x.s0(), y.s0()), hmin_nan(x.s1(), y.s1())};
285285
}
286286

287-
sycl::half2 hcmadd(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
287+
inline sycl::half2 hcmadd(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
288288
return sycl::half2{x.s0() * y.s0() - x.s1() * y.s1() + z.s0(),
289289
x.s0() * y.s1() + x.s1() * y.s0() + z.s1()};
290290
}
291291

292-
sycl::half hfma_relu(sycl::half x, sycl::half y, sycl::half z) {
292+
inline sycl::half hfma_relu(sycl::half x, sycl::half y, sycl::half z) {
293293
sycl::half r = sycl::fma(x, y, z);
294294
if (!hisnan(r)) {
295295
if (r < 0.f)
@@ -300,7 +300,7 @@ sycl::half hfma_relu(sycl::half x, sycl::half y, sycl::half z) {
300300
return r;
301301
}
302302

303-
sycl::half2 hfma2_relu(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
303+
inline sycl::half2 hfma2_relu(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
304304
sycl::half2 r = sycl::fma(x, y, z);
305305
if (!hisnan(r.s0()) && r.s0() < 0.f)
306306
r.s0() = 0.f;
@@ -309,9 +309,9 @@ sycl::half2 hfma2_relu(sycl::half2 x, sycl::half2 y, sycl::half2 z) {
309309
return r;
310310
}
311311

312-
sycl::half habs(sycl::half x) { return sycl::fabs(x); }
312+
inline sycl::half habs(sycl::half x) { return sycl::fabs(x); }
313313

314-
sycl::half2 habs2(sycl::half2 x) { return sycl::fabs(x); }
314+
inline sycl::half2 habs2(sycl::half2 x) { return sycl::fabs(x); }
315315
} // namespace ext::intel::math
316316
} // namespace _V1
317317
} // namespace sycl

0 commit comments

Comments
 (0)