[Beignet] [PATCH] utests: Add a case generator for relational builtin functions.

Sun, Yi yi.sun at intel.com
Wed Mar 5 21:46:43 PST 2014


Ping for review or comments?

Thanks
  --Sun, Yi

> -----Original Message-----
> From: beignet-bounces at lists.freedesktop.org
> [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of Yi Sun
> Sent: Monday, February 17, 2014 3:28 PM
> To: beignet at lists.freedesktop.org
> Cc: Shui, YangweiX; Sun, Yi; Jin, Gordon
> Subject: [Beignet] [PATCH] utests: Add a case generator for relational builtin
> functions.
> 
> utests/utest_relational_gen.py can generate test cases automatically for 13
> out of 18 relational builtin functions.
> Now all these test cases are passed.
> 
> Signed-off-by: Yi Sun <yi.sun at intel.com>
> Signed-off-by: YangweiX Shui <yangweix.shui at intel.com>
> ---
>  utests/CMakeLists.txt          |  17 ++-
>  utests/utest_relational_gen.py | 263
> +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 277 insertions(+), 3 deletions(-)  create mode 100755
> utests/utest_relational_gen.py
> 
> diff --git a/utests/CMakeLists.txt b/utests/CMakeLists.txt index
> b7d6f71..40ae066 100644
> --- a/utests/CMakeLists.txt
> +++ b/utests/CMakeLists.txt
> @@ -6,12 +6,23 @@ EXEC_PROGRAM(mkdir
> ${CMAKE_CURRENT_SOURCE_DIR} ARGS generated -p)
> EXEC_PROGRAM(${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}
> ARGS utest_math_gen.py OUTPUT_VARIABLE GEN_MATH_STRING)
> string(REGEX REPLACE " " ";" ADDMATHFUNC ${GEN_MATH_STRING})
> string(REGEX REPLACE " " "\n" NAMEMATHLIST ${GEN_MATH_STRING})
> -MESSAGE(STATUS "Generated Builtin Math Functions:\n" ${NAMEMATHLIST})
> +#MESSAGE(STATUS "Generated Builtin Math Functions" ${NAMEMATHLIST})
> +MESSAGE(STATUS "Generated Builtin Math Functions")
> 
>  string(REGEX REPLACE "generated/([^\ ]*)\\.cpp"
> "${CMAKE_CURRENT_SOURCE_DIR}/../kernels/\\1.cl" KERNEL_MATH_LIST
> ${GEN_MATH_STRING})  string(REGEX REPLACE " " ";" KERNEL_MATH_LIST
> ${KERNEL_MATH_LIST})  string(REGEX REPLACE "generated/([^\ ]*)\\.cpp"
> "\\1.cl" KERNEL_GITIGNORE_LIST ${GEN_MATH_STRING})
> -set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
> "generated;${KERNEL_MATH_LIST}")
> +
> +##### Ralational Function Part:
> +EXEC_PROGRAM(${PYTHON_EXECUTABLE}
> ${CMAKE_CURRENT_SOURCE_DIR} ARGS
> +utest_relational_gen.py OUTPUT_VARIABLE GEN_RELATIONAL_STRING)
> +string(REGEX REPLACE " " ";" ADDRELATIONALFUNC
> +${GEN_RELATIONAL_STRING}) string(REGEX REPLACE " " "\n"
> +NAMERELATIONALLIST ${GEN_RELATIONAL_STRING})
> +
> +string(REGEX REPLACE "generated/([^\ ]*)\\.cpp"
> +"${CMAKE_CURRENT_SOURCE_DIR}/../kernels/\\1.cl"
> KERNEL_RELATIONAL_LIST
> +${GEN_RELATIONAL_STRING}) string(REGEX REPLACE " " ";"
> +KERNEL_RELATIONAL_LIST ${KERNEL_RELATIONAL_LIST}) MESSAGE(STATUS
> +"Generated Builtin Relational Functions")
> +
> +set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
> +"generated;${KERNEL_RELATIONAL_LIST};${KERNEL_MATH_LIST}")
> 
>  configure_file (
>    "setenv.sh.in"
> @@ -201,7 +212,7 @@ SET(CMAKE_CXX_FLAGS "-DHAS_EGL
> ${CMAKE_CXX_FLAGS} ${DEF_OCL_PCH_PCM_PATH}")  SET(CMAKE_C_FLAGS
> "-DHAS_EGL ${CMAKE_C_FLAGS} ${DEF_OCL_PCH_PCM_PATH}")  endif
> (EGL_FOUND AND MESA_SOURCE_FOUND)
> 
> -ADD_LIBRARY(utests SHARED ${ADDMATHFUNC} ${utests_sources})
> +ADD_LIBRARY(utests SHARED ${ADDRELATIONALFUNC} ${ADDMATHFUNC}
> +${utests_sources})
> 
>  TARGET_LINK_LIBRARIES(utests cl m ${OPENGL_LIBRARIES}
> ${CMAKE_THREAD_LIBS_INIT})
> 
> diff --git a/utests/utest_relational_gen.py b/utests/utest_relational_gen.py
> new file mode 100755 index 0000000..2debaa3
> --- /dev/null
> +++ b/utests/utest_relational_gen.py
> @@ -0,0 +1,263 @@
> +#!/usr/bin/python
> +from utest_generator import *
> +import os,sys
> +
> +#base_input_values = [80, -80, 3.14, -3.14, -0.5, 0.5, 1, -1,
> +0.0,6,-6,1500.24,-1500.24] #extend_input_values =
> +[FLT_MAX_POSI,FLT_MIN_NEGA,FLT_MIN_POSI,FLT_MAX_NEGA,80, -80,
> 3.14,
> +-3.14, -0.5, 0.5, 1, -1, 0.0,6,-6,1500.24,-1500.24] base_input_values = [ 0, 1,
> 3.14] def main():
> +  ##### intn isequal(floatn x,floatn y)
> +  isequal_base_values = base_input_values
> +  isequal_input_values1 = []
> +  isequal_input_values2 = []
> +
> +isequal_input_values1,isequal_input_values2=gene2ValuesLoop(isequal_inp
> +ut_values1,isequal_input_values2,isequal_base_values)
> +  isequal_input_type1 = ['float','float2','float4','float8','float16']
> +  isequal_input_type2 = ['float','float2','float4','float8','float16']
> +  isequal_output_type = ['int','int2','int4','int8','int16']
> +  isequal_cpu_func='''
> +static int isequal_v(float x, float y){
> +    if (x == y && vector == 1)
> +      return 1;
> +    else if (x == y && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isequalUtests =
> +func('isequal','isequal_v',[isequal_input_type1,isequal_input_type2],is
> +equal_output_type,[isequal_input_values1,isequal_input_values2],'0 *
> +INT_ULP',isequal_cpu_func)
> +
> +  ##### intn isnotequal(floatn x,floatn y)
> +  isnotequal_base_values = base_input_values
> +  isnotequal_input_values1 = []
> +  isnotequal_input_values2 = []
> +
> +isnotequal_input_values1,isnotequal_input_values2=gene2ValuesLoop(isnot
> +equal_input_values1,isnotequal_input_values2,isnotequal_base_values)
> +  isnotequal_input_type1 =
> +['float','float2','float4','float8','float16']
> +  isnotequal_input_type2 =
> +['float','float2','float4','float8','float16']
> +  isnotequal_output_type = ['int','int2','int4','int8','int16']
> +  isnotequal_cpu_func='''
> +static int isnotequal(float x, float y){
> +    if (x != y && vector == 1)
> +      return 1;
> +    else if (x != y && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isnotequalUtests =
> +func('isnotequal','isnotequal',[isnotequal_input_type1,isnotequal_input
> +_type2],isnotequal_output_type,[isnotequal_input_values1,isnotequal_inp
> +ut_values2],'0 * INT_ULP',isnotequal_cpu_func)
> +
> +  ##### intn isgreater(floatn x,floatn y)
> +  isgreater_base_values = base_input_values
> +  isgreater_input_values1 = []
> +  isgreater_input_values2 = []
> +
> +isgreater_input_values1,isgreater_input_values2=gene2ValuesLoop(isgreat
> +er_input_values1,isgreater_input_values2,isgreater_base_values)
> +  isgreater_input_type1 =
> +['float','float2','float4','float8','float16']
> +  isgreater_input_type2 =
> +['float','float2','float4','float8','float16']
> +  isgreater_output_type = ['int','int2','int4','int8','int16']
> +  isgreater_cpu_func='''
> +static int isgreater(float x, float y){
> +    if (x > y && vector == 1)
> +      return 1;
> +    else if (x > y && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isgreaterUtests =
> +func('isgreater','isgreater',[isgreater_input_type1,isgreater_input_typ
> +e2],isgreater_output_type,[isgreater_input_values1,isgreater_input_valu
> +es2],'0 * INT_ULP',isgreater_cpu_func)
> +
> +  ##### intn isgreaterequal(floatn x,floatn y)
> +  isgreaterequal_base_values = base_input_values
> +  isgreaterequal_input_values1 = []
> +  isgreaterequal_input_values2 = []
> +
> +isgreaterequal_input_values1,isgreaterequal_input_values2=gene2ValuesLo
> +op(isgreaterequal_input_values1,isgreaterequal_input_values2,isgreatere
> +qual_base_values)
> +  isgreaterequal_input_type1 =
> +['float','float2','float4','float8','float16']
> +  isgreaterequal_input_type2 =
> +['float','float2','float4','float8','float16']
> +  isgreaterequal_output_type = ['int','int2','int4','int8','int16']
> +  isgreaterequal_cpu_func='''
> +static int isgreaterequal(float x, float y){
> +    if (x >= y && vector == 1)
> +      return 1;
> +    else if (x >= y && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isgreaterequalUtests =
> +func('isgreaterequal','isgreaterequal',[isgreaterequal_input_type1,isgr
> +eaterequal_input_type2],isgreaterequal_output_type,[isgreaterequal_inpu
> +t_values1,isgreaterequal_input_values2],'0 *
> +INT_ULP',isgreaterequal_cpu_func)
> +
> +  ##### intn isless(floatn x,floatn y)
> +  isless_base_values = base_input_values
> +  isless_input_values1 = []
> +  isless_input_values2 = []
> +
> +isless_input_values1,isless_input_values2=gene2ValuesLoop(isless_input_
> +values1,isless_input_values2,isless_base_values)
> +  isless_input_type1 = ['float','float2','float4','float8','float16']
> +  isless_input_type2 = ['float','float2','float4','float8','float16']
> +  isless_output_type = ['int','int2','int4','int8','int16']
> +  isless_cpu_func='''
> +static int isless(float x, float y){
> +    if (x < y && vector == 1)
> +      return 1;
> +    else if (x < y && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  islessUtests =
> +func('isless','isless',[isless_input_type1,isless_input_type2],isless_o
> +utput_type,[isless_input_values1,isless_input_values2],'0 *
> +INT_ULP',isless_cpu_func)
> +
> +  ##### intn islessequal(floatn x,floatn y)
> +  islessequal_base_values = base_input_values
> +  islessequal_input_values1 = []
> +  islessequal_input_values2 = []
> +
> +islessequal_input_values1,islessequal_input_values2=gene2ValuesLoop(isl
> +essequal_input_values1,islessequal_input_values2,islessequal_base_value
> +s)
> +  islessequal_input_type1 =
> +['float','float2','float4','float8','float16']
> +  islessequal_input_type2 =
> +['float','float2','float4','float8','float16']
> +  islessequal_output_type = ['int','int2','int4','int8','int16']
> +  islessequal_cpu_func='''
> +static int islessequal(float x, float y){
> +    if (x <= y && vector == 1)
> +      return 1;
> +    else if (x <= y && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  islessequalUtests =
> +func('islessequal','islessequal',[islessequal_input_type1,islessequal_i
> +nput_type2],islessequal_output_type,[islessequal_input_values1,islesseq
> +ual_input_values2],'0 * INT_ULP',islessequal_cpu_func)
> +
> +  ##### intn islessgreater(floatn x,floatn y)
> +  islessgreater_base_values = base_input_values
> +  islessgreater_input_values1 = []
> +  islessgreater_input_values2 = []
> +
> +islessgreater_input_values1,islessgreater_input_values2=gene2ValuesLoop
> +(islessgreater_input_values1,islessgreater_input_values2,islessgreater_
> +base_values)
> +  islessgreater_input_type1 =
> +['float','float2','float4','float8','float16']
> +  islessgreater_input_type2 =
> +['float','float2','float4','float8','float16']
> +  islessgreater_output_type = ['int','int2','int4','int8','int16']
> +  islessgreater_cpu_func='''
> +static int islessgreater(float x, float y){
> +    if ((x < y || x > y) && vector == 1)
> +      return 1;
> +    else if ((x < y || x > y) && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  islessgreaterUtests =
> +func('islessgreater','islessgreater',[islessgreater_input_type1,islessg
> +reater_input_type2],islessgreater_output_type,[islessgreater_input_valu
> +es1,islessgreater_input_values2],'0 * INT_ULP',islessgreater_cpu_func)
> +
> +  ##### intn isinf(floatn x)
> +  isinf_input_values = [
> +'(float)0.0','(float)(1.0/0.0)','(float)(-1.0/0.0)','(float)sqrt(-1.0)'
> +]
> +  isinf_input_type = ['float','float2','float4','float8','float16']
> +  isinf_output_type = ['int','int2','int4','int8','int16']
> +  isinf_cpu_func='''
> +static int isinf_v(float x){
> +    if (isinf(x) == 1 && vector == 1)
> +      return 1;
> +    else if (isinf(x) == 1 && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isinfUtests =
> +func('isinf','isinf_v',[isinf_input_type],isinf_output_type,[isinf_inpu
> +t_values],'0 * INT_ULP',isinf_cpu_func)
> +
> +  ##### intn isnan(floatn x)
> +  isnan_input_values = [
> +'(float)0.0','(float)(1.0/0.0)','(float)(-1.0/0.0)','(float)sqrt(-1.0)'
> +]
> +  isnan_input_type = ['float','float2','float4','float8','float16']
> +  isnan_output_type = ['int','int2','int4','int8','int16']
> +  isnan_cpu_func='''
> +static int isnan_v(float x){
> +    if (isnan(x) == 1 && vector == 1)
> +      return 1;
> +    else if (isnan(x) == 1 && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isnanUtests =
> +func('isnan','isnan_v',[isnan_input_type],isnan_output_type,[isnan_inpu
> +t_values],'0 * INT_ULP',isnan_cpu_func)
> +
> +  ##### intn isnormal(floatn x)
> +  isnormal_input_values = [
> +'(float)0.0','(float)(1.0/0.0)','(float)(-1.0/0.0)','(float)sqrt(-1.0)'
> +,1,51222.00 ]
> +  isnormal_input_type = ['float','float2','float4','float8','float16']
> +  isnormal_output_type = ['int','int2','int4','int8','int16']
> +  isnormal_cpu_func='''
> +static int isnormal(float x)
> +{
> +  union { uint u; float f; } u;
> +  u.f=x;
> +  u.u &= 0x7FFFFFFF;
> +  return (u.u < 0x7F800000) && (u.u >=1); } static int isnormal_v(float
> +x){
> +    if (isnormal(x) == 1 && vector == 1)
> +      return 1;
> +    else if (isnormal(x) == 1 && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isnormalUtests =
> +func('isnormal','isnormal_v',[isnormal_input_type],isnormal_output_type
> +,[isnormal_input_values],'0 * INT_ULP',isnormal_cpu_func)
> +
> +  ##### intn isordered(floatn x,floatn y)
> +  isordered_base_values = base_input_values
> +  isordered_input_values1 = []
> +  isordered_input_values2 = []
> +
> +isordered_input_values1,isordered_input_values2=gene2ValuesLoop(isorder
> +ed_input_values1,isordered_input_values2,isordered_base_values)
> +  isordered_input_type1 =
> +['float','float2','float4','float8','float16']
> +  isordered_input_type2 =
> +['float','float2','float4','float8','float16']
> +  isordered_output_type = ['int','int2','int4','int8','int16']
> +  isordered_cpu_func='''
> +static int isequal(float x, float y) { return x == y; } static int
> +isordered(float x,float y) {
> +  return isequal(x, x) && isequal(y, y); } static int isordered_v(float
> +x, float y){
> +    if (isordered(x,y) == 1 && vector == 1)
> +      return 1;
> +    else if (isordered(x,y) == 1 && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isorderedUtests =
> +func('isordered','isordered_v',[isordered_input_type1,isordered_input_t
> +ype2],isordered_output_type,[isordered_input_values1,isordered_input_va
> +lues2],'0 * INT_ULP',isordered_cpu_func)
> +
> +  ##### intn isunordered(floatn x,floatn y)
> +  isunordered_base_values = base_input_values
> +  isunordered_input_values1 = []
> +  isunordered_input_values2 = []
> +
> +isunordered_input_values1,isunordered_input_values2=gene2ValuesLoop(isu
> +nordered_input_values1,isunordered_input_values2,isunordered_base_value
> +s)
> +  isunordered_input_type1 =
> +['float','float2','float4','float8','float16']
> +  isunordered_input_type2 =
> +['float','float2','float4','float8','float16']
> +  isunordered_output_type = ['int','int2','int4','int8','int16']
> +  isunordered_cpu_func='''
> +static int isunordered(float x,float y) {
> +  return isnan(x) && isnan(y);
> +}
> +static int isunordered_v(float x, float y){
> +    if (isunordered(x,y) == 1 && vector == 1)
> +      return 1;
> +    else if (isunordered(x,y) == 1 && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  isunorderedUtests =
> +func('isunordered','isunordered_v',[isunordered_input_type1,isunordered
> +_input_type2],isunordered_output_type,[isunordered_input_values1,isunor
> +dered_input_values2],'0 * INT_ULP',isunordered_cpu_func)
> +
> +  ##### intn signbit(floatn x)
> +  signbit_input_values = [
> +'(float)0.0','(float)(1.0/0.0)','(float)(-1.0/0.0)','(float)sqrt(-1.0)'
> +,1,51222.00 ]
> +  signbit_input_type = ['float','float2','float4','float8','float16']
> +  signbit_output_type = ['int','int2','int4','int8','int16']
> +  signbit_cpu_func='''
> +static int signbit(float x)
> +{
> +  union { uint u; float f; } u;
> +  u.f=x;
> +  return u.u >> 31;
> +}
> +static int signbit_v(float x){
> +    if (signbit(x) == 1 && vector == 1)
> +      return 1;
> +    else if (signbit(x) == 1 && vector != 1)
> +      return -1;
> +    else
> +      return 0;
> +} '''
> +  signbitUtests =
> +func('signbit','signbit_v',[signbit_input_type],signbit_output_type,[si
> +gnbit_input_values],'0 * INT_ULP',signbit_cpu_func)
> +
> +if __name__ == "__main__":
> +  main()
> --
> 1.8.5.3
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list