[Beignet] [PATCH] make utests maths ULP values consistent with specification

Meng Mengmeng mengmeng.meng at intel.com
Mon Dec 1 17:43:23 PST 2014


Signed-off-by: Meng Mengmeng <mengmeng.meng at intel.com>
---
 utests/builtin_pow.cpp    |   2 +-
 utests/builtin_tgamma.cpp |   2 +-
 utests/utest_generator.py | 100 +++++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 96 insertions(+), 8 deletions(-)

diff --git a/utests/builtin_pow.cpp b/utests/builtin_pow.cpp
index c0361e1..a18f31e 100644
--- a/utests/builtin_pow.cpp
+++ b/utests/builtin_pow.cpp
@@ -38,7 +38,7 @@ static void builtin_pow(void)
     }
 
   const char* env_strict = getenv("OCL_STRICT_CONFORMANCE");
-  float ULPSIZE_FACTOR = 1.0;
+  float ULPSIZE_FACTOR = 16.0;
   if (env_strict == NULL || strcmp(env_strict, "0") == 0)
     ULPSIZE_FACTOR = 10000.;
 
diff --git a/utests/builtin_tgamma.cpp b/utests/builtin_tgamma.cpp
index 16dac97..47cc5f4 100644
--- a/utests/builtin_tgamma.cpp
+++ b/utests/builtin_tgamma.cpp
@@ -16,7 +16,7 @@ void builtin_tgamma(void)
   globals[0] = n;
   locals[0] = 16;
   const char* env_strict = getenv("OCL_STRICT_CONFORMANCE");
-  float ULPSIZE_FACTOR = 1.0;
+  float ULPSIZE_FACTOR = 16.0;
   if (env_strict == NULL || strcmp(env_strict, "0") == 0)
     ULPSIZE_FACTOR = 10000.;
 
diff --git a/utests/utest_generator.py b/utests/utest_generator.py
index 5da2752..4aa0444 100644
--- a/utests/utest_generator.py
+++ b/utests/utest_generator.py
@@ -8,6 +8,91 @@ FLT_MAX_NEGA='-0x1.0p-126f'
 
 paraTypeList={'float':'%e','int':'%d','double':'%lf','uint':'%d','string':'%s'}
 
+Single_Precision_ULPs={'acos' : '4' ,
+                      'acospi' : '5' ,
+                      'asin' : '4' ,
+                      'asinpi' : '5' ,
+                      'atan' : '5' ,
+                      'atan2' : '6' ,
+                      'atanpi' : '5' ,
+                      'atan2pi' : '6' ,
+                      'acosh' : '4' ,
+                      'asinh' : '4' ,
+                      'atanh' : '5' ,
+                      'cbrt' : '2' ,
+                      'ceil' : '-1' ,
+                      'copysign' : '0' ,
+                      'cos' : '4' ,
+                      'cosh' : '4' ,
+                      'cospi' : '4' ,
+                      'erfc' : '16' ,
+                      'erf' : '16' ,
+                      'exp' : '3' ,
+                      'exp2' : '3' ,
+                      'exp10' : '3' ,
+                      'expm1' : '3' ,
+                      'fabs' : '0' ,
+                      'fdim' : '-1' ,
+                      'floor' : '-1' ,
+                      'fma' : '-1' ,
+                      'fmax' : '0' ,
+                      'fmin' : '0' ,
+                      'fmod' : '0' ,
+                      'fract' : '-1' ,
+                      'frexp' : '0' ,
+                      'hypot' : '4' ,
+                      'ilogb' : '0' ,
+                      'ldexp' : '-1' ,
+                      'log' : '3' ,
+                      'log2' : '3' ,
+                      'log10' : '3' ,
+                      'log1p' : '2' ,
+                      'logb' : '0' ,
+                      'maxmag' : '0' ,
+                      'minmag' : '0' ,
+                      'modf' : '0' ,
+                      'nan' : '0' ,
+                      'nextafter' : '0' ,
+                      'pow' : '16' ,
+                      'pown,' : '16' ,
+                      'powr,' : '16' ,
+                      'remainder' : '0' ,
+                      'remquo' : '0' ,
+                      'rint' : '-1' ,
+                      'rootn' : '16' ,
+                      'round' : '-1' ,
+                      'rsqrt' : '2' ,
+                      'sin' : '4' ,
+                      'sincos' : '4' ,
+                      'sinh' : '4' ,
+                      'sinpi' : '4' ,
+                      'sqrt' : '3' ,
+                      'tan' : '5' ,
+                      'tanh' : '5' ,
+                      'tanpi' : '6' ,
+                      'tgamma' : '16' ,
+                      'trunc' : '-1' ,
+                      'half_cos' : '8192' ,
+                      'half_divide' : '8192' ,
+                      'half_exp' : '8192' ,
+                      'half_exp2' : '8192' ,
+                      'half_exp10' : '8192' ,
+                      'half_log2' : '8192' ,
+                      'half_log10' : '8192' ,
+                      'half_powr' : '8192' ,
+                      'half_recip' : '8192' ,
+                      'half_rsqrt' : '8192' ,
+                      'half_sin' : '8192' ,
+                      'half_sqrt' : '8192' ,
+                      'half_tan' : '8192' }
+
+def Min_ulp(function):
+    if function in Single_Precision_ULPs.keys():
+         ulpValues = Single_Precision_ULPs[function]
+    else:
+         ulpValues = 1
+    return ulpValues
+
 
 def ulpUnit(ulpSize):
   return re.findall(r"([a-zA-Z_]+)",ulpSize)[0]
@@ -15,7 +100,7 @@ def ulpUnit(ulpSize):
 def ulpNum(ulpSize):
   return re.findall(r"([0-9]+)",ulpSize)[0]
 
-def udebug(ulpSize,returnType):
+def udebug(ulpSize,returnType,function):
   #ulpUnit=re.findall(r"([a-zA-Z_]+)",ulpSize)[0]
   #ulpNum=re.findall(r"([0-9]+)",ulpSize)[0]
   text='''
@@ -27,7 +112,7 @@ def udebug(ulpSize,returnType):
     if (env_strict == NULL || strcmp(env_strict, "0") == 0)
       ULPSIZE_FACTOR = 1000;
     else
-      ULPSIZE_FACTOR = 1;
+      ULPSIZE_FACTOR = %s;
     
     if (isinf(cpu_data[index])){
       INFORNAN="INF";
@@ -53,7 +138,7 @@ def udebug(ulpSize,returnType):
       else
         printf_c("%s expect:%s\\n", log, INFORNAN);
       }
-    else if (diff <= ULPSIZE){
+    else if ((ULPSIZE >= 0 && diff <= ULPSIZE) || (ULPSIZE < 0 && diff == 0)){
       printf("%s expect:%s\\n", log, ULPSIZE);
       }
     else
@@ -69,11 +154,14 @@ def udebug(ulpSize,returnType):
       }
     else{
       sprintf(log, "%s expect:%s\\n", log, ULPSIZE);
-      OCL_ASSERTM(fabs(gpu_data[index]-cpu_data[index]) <= ULPSIZE, log);
+      if (ULPSIZE < 0)
+            OCL_ASSERTM(gpu_data[index] == cpu_data[index], log);
+      else
+            OCL_ASSERTM(fabs(gpu_data[index]-cpu_data[index]) <= ULPSIZE, log);
       }
 #endif
   }
-}\n'''%(returnType,\
+}\n'''%(returnType,Min_ulp(function),\
         ulpUnit(ulpSize),ulpNum(ulpSize),\
         ulpNum(ulpSize), ulpNum(ulpSize),\
         paraTypeList['string'],paraTypeList['string'],\
@@ -317,7 +405,7 @@ static void %s_%s(void)
 
     self.cpplines += funcline
 
-    self.cpplines += [ udebug(self.ulp,self.retType(index)) ]
+    self.cpplines += [ udebug(self.ulp,self.retType(index),self.funcName) ]
     self.cpplines += [ "MAKE_UTEST_FROM_FUNCTION(%s_%s)"%(self.fileName,namesuffix) ]
 
   def genCL(self,index):
-- 
1.9.3



More information about the Beignet mailing list