Skip to content

Commit d96e507

Browse files
authored
[SYCL][libdevice] Add fast_* in imf libdevice (intel#10004)
Signed-off-by: jinge90 <[email protected]>
1 parent 2ddb42c commit d96e507

File tree

5 files changed

+153
-0
lines changed

5 files changed

+153
-0
lines changed

libdevice/device_imf.hpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,77 @@ static inline double __trunc(double x) {
488488
#endif
489489
}
490490

491+
static inline float __fast_exp10f(float x) {
492+
#if defined(__LIBDEVICE_HOST_IMPL__)
493+
return __builtin_expf(0x1.26bb1cp1f * x);
494+
#elif defined(__SPIR__)
495+
return __spirv_ocl_native_exp(0x1.26bb1cp1f * x);
496+
#endif
497+
}
498+
499+
static inline float __fast_expf(float x) {
500+
#if defined(__LIBDEVICE_HOST_IMPL__)
501+
return __builtin_expf(x);
502+
#elif defined(__SPIR__)
503+
return __spirv_ocl_native_exp(x);
504+
#endif
505+
}
506+
507+
static inline float __fast_logf(float x) {
508+
#if defined(__LIBDEVICE_HOST_IMPL__)
509+
return __builtin_logf(x);
510+
#elif defined(__SPIR__)
511+
return __spirv_ocl_native_log(x);
512+
#endif
513+
}
514+
515+
static inline float __fast_log2f(float x) {
516+
#if defined(__LIBDEVICE_HOST_IMPL__)
517+
return __builtin_log2f(x);
518+
#elif defined(__SPIR__)
519+
return __spirv_ocl_native_log(x) / 0x1.62e43p-1f;
520+
#endif
521+
}
522+
523+
static inline float __fast_log10f(float x) {
524+
#if defined(__LIBDEVICE_HOST_IMPL__)
525+
return __builtin_log10f(x);
526+
#elif defined(__SPIR__)
527+
return __spirv_ocl_native_log(x) / 0x1.26bb1cp1f;
528+
#endif
529+
}
530+
531+
static inline float __fast_powf(float x, float y) {
532+
#if defined(__LIBDEVICE_HOST_IMPL__)
533+
return __builtin_powf(x, y);
534+
#elif defined(__SPIR__)
535+
return __spirv_ocl_native_powr(x, y);
536+
#endif
537+
}
538+
539+
static inline float __fast_fdividef(float x, float y) {
540+
unsigned ybits = __builtin_bit_cast(unsigned, y);
541+
unsigned xbits = __builtin_bit_cast(unsigned, x);
542+
ybits &= 0x7FFF'FFFF;
543+
xbits &= 0x7FFF'FFFF;
544+
unsigned yexp_bits = (ybits >> 23) & 0xFF;
545+
unsigned xexp_bits = (xbits >> 23) & 0xFF;
546+
unsigned yman_bits = ybits & 0x7F'FFFF;
547+
unsigned xman_bits = xbits & 0x7F'FFFF;
548+
if (ybits > 0x7E80'0000) {
549+
if ((xexp_bits = 0xFF) && (xman_bits == 0))
550+
return __builtin_bit_cast(float, 0x7FC00000);
551+
else
552+
return 0;
553+
}
554+
555+
#if defined(__LIBDEVICE_HOST_IMPL__)
556+
return x / y;
557+
#elif defined(__SPIR__)
558+
return __spirv_ocl_native_divide(x, y);
559+
#endif
560+
}
561+
491562
static inline _iml_half __trunc(_iml_half x) {
492563
_iml_half_internal x_i = x.get_internal();
493564
#if defined(__LIBDEVICE_HOST_IMPL__)

libdevice/imf/imf_fp32_dl.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,26 @@ DEVICE_EXTERN_C_INLINE float __devicelib_imf_fabsf(float x) {
2525
DEVICE_EXTERN_C_INLINE
2626
int64_t __devicelib_imf_llabs(int64_t x) { return x >= 0 ? x : -x; }
2727

28+
DEVICE_EXTERN_C_INLINE
29+
float __devicelib_imf_fast_exp10f(float x) { return __fast_exp10f(x); }
30+
31+
DEVICE_EXTERN_C_INLINE
32+
float __devicelib_imf_fast_expf(float x) { return __fast_expf(x); }
33+
34+
DEVICE_EXTERN_C_INLINE
35+
float __devicelib_imf_fast_fdividef(float x, float y) {
36+
return __fast_fdividef(x, y);
37+
}
38+
39+
DEVICE_EXTERN_C_INLINE
40+
float __devicelib_imf_fast_logf(float x) { return __fast_logf(x); }
41+
42+
DEVICE_EXTERN_C_INLINE
43+
float __devicelib_imf_fast_log2f(float x) { return __fast_log2f(x); }
44+
45+
DEVICE_EXTERN_C_INLINE
46+
float __devicelib_imf_fast_log10f(float x) { return __fast_log10f(x); }
47+
48+
DEVICE_EXTERN_C_INLINE
49+
float __devicelib_imf_fast_powf(float x, float y) { return __fast_powf(x, y); }
2850
#endif /*__LIBDEVICE_IMF_ENABLED__*/

libdevice/imf_wrapper.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,4 +1788,50 @@ DEVICE_EXTERN_C_INLINE
17881788
_iml_half_internal __imf_ushort_as_half(unsigned short x) {
17891789
return __devicelib_imf_ushort_as_half(x);
17901790
}
1791+
1792+
DEVICE_EXTERN_C_INLINE
1793+
float __devicelib_imf_fast_exp10f(float);
1794+
1795+
DEVICE_EXTERN_C_INLINE
1796+
float __imf_fast_exp10f(float x) { return __devicelib_imf_fast_exp10f(x); }
1797+
1798+
DEVICE_EXTERN_C_INLINE
1799+
float __devicelib_imf_fast_expf(float);
1800+
1801+
DEVICE_EXTERN_C_INLINE
1802+
float __imf_fast_expf(float x) { return __devicelib_imf_fast_expf(x); }
1803+
1804+
DEVICE_EXTERN_C_INLINE
1805+
float __devicelib_imf_fast_fdividef(float, float);
1806+
1807+
DEVICE_EXTERN_C_INLINE
1808+
float __imf_fast_fdividef(float x, float y) {
1809+
return __devicelib_imf_fast_fdividef(x, y);
1810+
}
1811+
1812+
DEVICE_EXTERN_C_INLINE
1813+
float __devicelib_imf_fast_logf(float);
1814+
1815+
DEVICE_EXTERN_C_INLINE
1816+
float __imf_fast_logf(float x) { return __devicelib_imf_fast_logf(x); }
1817+
1818+
DEVICE_EXTERN_C_INLINE
1819+
float __devicelib_imf_fast_log2f(float);
1820+
1821+
DEVICE_EXTERN_C_INLINE
1822+
float __imf_fast_log2f(float x) { return __devicelib_imf_fast_log2f(x); }
1823+
1824+
DEVICE_EXTERN_C_INLINE
1825+
float __devicelib_imf_fast_log10f(float);
1826+
1827+
DEVICE_EXTERN_C_INLINE
1828+
float __imf_fast_log10f(float x) { return __devicelib_imf_fast_log10f(x); }
1829+
1830+
DEVICE_EXTERN_C_INLINE
1831+
float __devicelib_imf_fast_powf(float, float);
1832+
1833+
DEVICE_EXTERN_C_INLINE
1834+
float __imf_fast_powf(float x, float y) {
1835+
return __devicelib_imf_fast_powf(x, y);
1836+
}
17911837
#endif // __LIBDEVICE_IMF_ENABLED__

llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,13 @@ SYCLDeviceLibFuncMap SDLMap = {
213213
{"__devicelib_imf_fmaxf", DeviceLibExt::cl_intel_devicelib_imf},
214214
{"__devicelib_imf_fminf", DeviceLibExt::cl_intel_devicelib_imf},
215215
{"__devicelib_imf_copysignf", DeviceLibExt::cl_intel_devicelib_imf},
216+
{"__devicelib_imf_fast_exp10f", DeviceLibExt::cl_intel_devicelib_imf},
217+
{"__devicelib_imf_fast_expf", DeviceLibExt::cl_intel_devicelib_imf},
218+
{"__devicelib_imf_fast_logf", DeviceLibExt::cl_intel_devicelib_imf},
219+
{"__devicelib_imf_fast_log2f", DeviceLibExt::cl_intel_devicelib_imf},
220+
{"__devicelib_imf_fast_log10f", DeviceLibExt::cl_intel_devicelib_imf},
221+
{"__devicelib_imf_fast_powf", DeviceLibExt::cl_intel_devicelib_imf},
222+
{"__devicelib_imf_fast_fdividef", DeviceLibExt::cl_intel_devicelib_imf},
216223
{"__devicelib_imf_float2int_rd", DeviceLibExt::cl_intel_devicelib_imf},
217224
{"__devicelib_imf_float2int_rn", DeviceLibExt::cl_intel_devicelib_imf},
218225
{"__devicelib_imf_float2int_ru", DeviceLibExt::cl_intel_devicelib_imf},

sycl/include/sycl/builtins.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3124,6 +3124,13 @@ extern __DPCPP_SYCL_EXTERNAL float __imf_invf(float x);
31243124
extern __DPCPP_SYCL_EXTERNAL float __imf_fmaxf(float x, float y);
31253125
extern __DPCPP_SYCL_EXTERNAL float __imf_fminf(float x, float y);
31263126
extern __DPCPP_SYCL_EXTERNAL float __imf_copysignf(float x, float y);
3127+
extern __DPCPP_SYCL_EXTERNAL float __imf_fast_exp10f(float x);
3128+
extern __DPCPP_SYCL_EXTERNAL float __imf_fast_expf(float x);
3129+
extern __DPCPP_SYCL_EXTERNAL float __imf_fast_logf(float x);
3130+
extern __DPCPP_SYCL_EXTERNAL float __imf_fast_log2f(float x);
3131+
extern __DPCPP_SYCL_EXTERNAL float __imf_fast_log10f(float x);
3132+
extern __DPCPP_SYCL_EXTERNAL float __imf_fast_powf(float x, float y);
3133+
extern __DPCPP_SYCL_EXTERNAL float __imf_fast_fdividef(float x, float y);
31273134
extern __DPCPP_SYCL_EXTERNAL int __imf_float2int_rd(float x);
31283135
extern __DPCPP_SYCL_EXTERNAL int __imf_float2int_rn(float x);
31293136
extern __DPCPP_SYCL_EXTERNAL int __imf_float2int_ru(float x);

0 commit comments

Comments
 (0)