[Beignet] [PATCH] backend: refine math log function
Yang, Rong R
rong.r.yang at intel.com
Tue Jul 4 00:34:45 UTC 2017
LGTM, pushed, thanks.
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> rander.wang
> Sent: Monday, June 19, 2017 13:21
> To: beignet at freedesktop.org
> Cc: Wang, Rander <rander.wang at intel.com>
> Subject: [Beignet] [PATCH] backend: refine math log function
>
> remove a few unnecessary codes , and get 20% improvement
> at worse case. If X is a NAN, there are some if-return
> codes to return NAN. Now change it to add(x - x) which
> get the same NAN
>
> pass the conformance tests and utests
>
> Signed-off-by: rander.wang <rander.wang at intel.com>
> ---
> backend/src/libocl/tmpl/ocl_math_common.tmpl.cl | 50 +++++----------------
> ----
> 1 file changed, 10 insertions(+), 40 deletions(-)
>
> diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
> b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
> index b4764ee..2c0a702 100644
> --- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
> +++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
> @@ -201,38 +201,19 @@ OVERLOADABLE float inline
> __gen_ocl_internal_log_valid(float x) {
> k += (i>>23);
> f = x - 1.0f;
> fsq = f * f;
> -
> - if((0x007fffff & (15 + ix)) < 16) { /* |f| < 2**-20 */
> - R = fsq * (0.5f - 0.33333333333333333f * f);
> - return k * ln2_hi + k * ln2_lo + f - R;
> - }
> -
> - s = f / (2.0f + f);
> + s = mad(-2.0f, 1.0f / (2.0f + f), 1.0f);
> z = s * s;
> - i = ix - (0x6147a << 3);
> w = z * z;
> - j = (0x6b851 << 3) - ix;
> - t1= w * mad(w, Lg4, Lg2);
> - t2= z * mad(w, Lg3, Lg1);
> - i |= j;
> - R = t2 + t1;
> - partial = (i > 0) ? -mad(s, 0.5f * fsq, -0.5f * fsq) : (s * f);
> -
> - return mad(s, R, f) - partial + k * ln2_hi + k * ln2_lo;;
> + t1 = w * mad(w, Lg4, Lg2);
> + R = mad(z, mad(w, Lg3, Lg1), t1);
> + w = 0.5f * fsq;
> + partial = -mad(s, w, -w);
> + return mad(k, ln2_lo, mad(k, ln2_hi, mad(s, R, f) - partial));
> }
>
> OVERLOADABLE float __gen_ocl_internal_log(float x) {
> - union { unsigned int i; float f; } u;
> - u.f = x;
> - int ix = u.i;
> -
> - if (ix < 0 )
> - return NAN; /* log(-#) = NaN */
> - if (ix >= 0x7f800000)
> - return NAN;
> -
> - return __gen_ocl_internal_log_valid(x);
> + return __gen_ocl_internal_log_valid(x) + (x - x);
> }
>
> OVERLOADABLE float __gen_ocl_internal_log10(float x) @@ -244,12 +225,10
> @@ OVERLOADABLE float __gen_ocl_internal_log10(float x)
> log10_2lo = 7.9034151668e-07; /* 0x355427db */
>
> float y, z;
> - int i, k, hx;
> + int i, k;
> + unsigned int hx;
>
> u.f = x; hx = u.i;
> -
> - if (hx<0)
> - return NAN; /* log(-#) = NaN */
> if (hx >= 0x7f800000)
> return NAN;
>
> @@ -267,17 +246,8 @@ OVERLOADABLE float __gen_ocl_internal_log2(float
> x) {
> const float zero = 0.0,
> invln2 = 0x1.715476p+0f;
> - int ix;
> -
> - union { float f; int i; } u;
> - u.f = x; ix = u.i;
> -
> - if (ix < 0)
> - return NAN; /** log(-#) = NaN */
> - if (ix >= 0x7f800000)
> - return NAN;
>
> - return invln2 * __gen_ocl_internal_log_valid(x);
> + return invln2 * __gen_ocl_internal_log_valid(x) + (x - x);
> }
>
>
> --
> 2.7.4
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list