[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