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

Zhigang Gong zhigang.gong at intel.com
Thu Aug 28 19:13:57 PDT 2014


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



More information about the Beignet mailing list