[Piglit] [PATCH 1/2] builtin_function*py: Corrected single to double conversions

Eduardo Lima Mitev elima at igalia.com
Mon May 23 10:08:46 UTC 2016


Both patches are:

Reviewed-by: Eduardo Lima Mitev <elima at igalia.com>

Thanks!

On 05/04/2016 07:02 PM, Andres Gomez wrote:
> Calculation of the tolerance in single precision with very high
> numbers was giving "inf" results while it was possible to calculate in
> double precision and round back to single precision afterwards. In
> addition, since the vector values are already calculated in single
> precision, there is no need for additional conversions.
> 
> For the double precision module, we don't really need to do any
> conversion since the calculations are already done in double
> precision. Additionally, we removed custom functions that are not used
> any more.
> 
> Signed-off-by: Andres Gomez <agomez at igalia.com>
> ---
>  generated_tests/builtin_function.py      | 27 ++++++++++++-----------
>  generated_tests/builtin_function_fp64.py | 37 ++++----------------------------
>  2 files changed, 19 insertions(+), 45 deletions(-)
> 
> diff --git a/generated_tests/builtin_function.py b/generated_tests/builtin_function.py
> index 7cbd237..9677a3a 100644
> --- a/generated_tests/builtin_function.py
> +++ b/generated_tests/builtin_function.py
> @@ -605,26 +605,28 @@ def _simulate_function(test_inputs, python_equivalent, tolerance_function):
>      Input sequences for which python_equivalent returns None are
>      ignored.
>  
> -    The function is simulated using 64 bit floats for maximum possible
> -    accuracy, but the output is rounded to 32 bits since that is the
> -    data type that we expect to get back form OpenGL.
> -
>      tolerance_function is the function to call to compute the
>      tolerance.  It should take the set of arguments and the expected
>      result as its parameters.  It is only used for functions that
>      return floating point values.
> +
> +    python_equivalent and tolerance_function are simulated using 64
> +    bit floats for maximum possible accuracy. The vector, however, is
> +    built with rounded to 32 bits values since that is the data type
> +    that we expect to get back from OpenGL.
>      """
>      test_vectors = []
>      for inputs in test_inputs:
> -        expected_output = round_to_32_bits(
> -            python_equivalent(*[extend_to_64_bits(x) for x in inputs]))
> +        expected_output = python_equivalent(
> +            *[extend_to_64_bits(x) for x in inputs])
>          if expected_output is not None:
>              if glsl_type_of(expected_output).base_type != glsl_float:
> -                tolerance = np.float32(0.0)
> +                tolerance = 0.0
>              else:
> -                tolerance = np.float32(
> -                    tolerance_function(inputs, expected_output))
> -            test_vectors.append(TestVector(inputs, expected_output, tolerance))
> +                tolerance = tolerance_function(inputs, expected_output)
> +            test_vectors.append(TestVector(inputs,
> +                                           round_to_32_bits(expected_output),
> +                                           round_to_32_bits(tolerance)))
>      return test_vectors
>  
>  
> @@ -686,9 +688,10 @@ def _vectorize_test_vectors(test_vectors, scalar_arg_indices, vector_length):
>                  arguments.append(
>                      np.array([tv.arguments[j] for tv in test_vectors]))
>          result = np.array([tv.result for tv in test_vectors])
> -        tolerance = np.float32(
> -            np.linalg.norm([tv.tolerance for tv in test_vectors]))
> +        tolerance = np.linalg.norm(
> +            [tv.tolerance for tv in test_vectors])
>          return TestVector(arguments, result, tolerance)
> +
>      vectorized_test_vectors = []
>      groups = make_groups(test_vectors)
>      for key in sorted(groups.keys()):
> diff --git a/generated_tests/builtin_function_fp64.py b/generated_tests/builtin_function_fp64.py
> index af3599b..d10d946 100644
> --- a/generated_tests/builtin_function_fp64.py
> +++ b/generated_tests/builtin_function_fp64.py
> @@ -273,30 +273,6 @@ def glsl_constant(value):
>          return '{0}({1})'.format(glsl_type_of(value), ', '.join(values))
>  
>  
> -def round_to_32_bits(value):
> -    """If value is a floating point type, round it down to 32 bits.
> -    Otherwise return it unchanged.
> -    """
> -    if isinstance(value, float):
> -        return np.float32(value)
> -    elif isinstance(value, np.ndarray) and value.dtype == np.float64:
> -        return np.array(value, dtype=np.float32)
> -    else:
> -        return value
> -
> -
> -def extend_to_64_bits(value):
> -    """If value is a floating point type, extend it to 64 bits.
> -    Otherwise return it unchanged.
> -    """
> -    if isinstance(value, np.float32):
> -        return np.float64(value)
> -    elif isinstance(value, np.ndarray) and value.dtype == np.float32:
> -        return np.array(value, dtype=np.float64)
> -    else:
> -        return value
> -
> -
>  # Dictionary containing the test vectors.  Each entry in the
>  # dictionary represents a single overload of a single built-in
>  # function.  Its key is a Signature tuple, and its value is a list of
> @@ -550,10 +526,6 @@ def _simulate_function(test_inputs, python_equivalent, tolerance_function):
>      Input sequences for which python_equivalent returns None are
>      ignored.
>  
> -    The function is simulated using 64 bit floats for maximum possible
> -    accuracy, but the output is rounded to 32 bits since that is the
> -    data type that we expect to get back form OpenGL.
> -
>      tolerance_function is the function to call to compute the
>      tolerance.  It should take the set of arguments and the expected
>      result as its parameters.  It is only used for functions that
> @@ -561,10 +533,9 @@ def _simulate_function(test_inputs, python_equivalent, tolerance_function):
>      """
>      test_vectors = []
>      for inputs in test_inputs:
> -        expected_output = python_equivalent(*[extend_to_64_bits(x) for x in inputs])
> +        expected_output = python_equivalent(*inputs)
>          if expected_output is not None:
> -            tolerance = np.float64(
> -                tolerance_function(inputs, expected_output))
> +            tolerance = tolerance_function(inputs, expected_output)
>              test_vectors.append(TestVector(inputs, expected_output, tolerance))
>      return test_vectors
>  
> @@ -627,9 +598,9 @@ def _vectorize_test_vectors(test_vectors, scalar_arg_indices, vector_length):
>                  arguments.append(
>                      np.array([tv.arguments[j] for tv in test_vectors]))
>          result = np.array([tv.result for tv in test_vectors])
> -        tolerance = np.float64(
> -            np.linalg.norm([tv.tolerance for tv in test_vectors]))
> +        tolerance = np.linalg.norm([tv.tolerance for tv in test_vectors])
>          return TestVector(arguments, result, tolerance)
> +
>      vectorized_test_vectors = []
>      groups = make_groups(test_vectors)
>      for key in sorted(groups.keys()):
> 



More information about the Piglit mailing list