[Beignet] [PATCH] GBE: fix error in the rootn fastpath function for some special input.

Zhigang Gong zhigang.gong at linux.intel.com
Mon Sep 1 21:37:24 PDT 2014


Ping for review.

On Fri, Aug 29, 2014 at 10:13:57AM +0800, Zhigang Gong wrote:
> The fastpath is to lose some accuracy but get fast speed. It is not
> to generate error result. The rootn has many special input and need
> to be taken care before we call the native pow directly.
> This patch fix all the pow related failures at the OpenCV 3.0 test
> suite.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
>  backend/src/ocl_stdlib.tmpl.h | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/backend/src/ocl_stdlib.tmpl.h b/backend/src/ocl_stdlib.tmpl.h
> index 01bcbef..2e37513 100755
> --- a/backend/src/ocl_stdlib.tmpl.h
> +++ b/backend/src/ocl_stdlib.tmpl.h
> @@ -3731,7 +3731,9 @@ INLINE_OVERLOADABLE float pown(float x, int n) {
>      return 1;
>    return powr(x, n);
>  }
> -INLINE_OVERLOADABLE float rootn(float x, int n) {
> +
> +INLINE_OVERLOADABLE float internal_rootn(float x, int n, const bool isFastpath)
> +{
>    float ax,re;
>    int sign = 0;
>    if( n == 0 )return NAN;
> @@ -3758,12 +3760,19 @@ INLINE_OVERLOADABLE float rootn(float x, int n) {
>    ax = __gen_ocl_fabs(x);
>    if(x <0.0f && (n&1))
>      sign = 1;
> -  re = __gen_ocl_internal_pow(ax,1.f/n);
> +  if (isFastpath)
> +    re = __gen_ocl_pow(ax,1.f/n);
> +  else
> +    re = __gen_ocl_internal_pow(ax,1.f/n);
>    if(sign)
>      re = -re;
>    return re;
>  }
>  
> +INLINE_OVERLOADABLE float rootn(float x, int n) {
> +  return internal_rootn(x, n, 0);
> +}
> +
>  /////////////////////////////////////////////////////////////////////////////
>  // Geometric functions (see 6.11.5 of OCL 1.1 spec)
>  /////////////////////////////////////////////////////////////////////////////
> @@ -5082,7 +5091,7 @@ INLINE_OVERLOADABLE float __gen_ocl_internal_fastpath_remainder (float x, float
>  
>  INLINE_OVERLOADABLE float __gen_ocl_internal_fastpath_rootn(float x, int n)
>  {
> -    return __gen_ocl_pow(x, 1.f / n);
> +  return internal_rootn(x, n, 1);
>  }
>  
>  INLINE_OVERLOADABLE float __gen_ocl_internal_fastpath_sin (float x)
> -- 
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list