[Beignet] [PATCH V2] Utests: Fix the failure for half math tests.

Yang, Rong R rong.r.yang at intel.com
Tue Nov 24 18:52:22 PST 2015


LGTM, thanks, pushed.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> junyan.he at inbox.com
> Sent: Tuesday, November 24, 2015 18:15
> To: beignet at lists.freedesktop.org
> Subject: [Beignet] [PATCH V2] Utests: Fix the failure for half math tests.
> 
> From: Junyan He <junyan.he at linux.intel.com>
> 
> We do not have native half type support on X86 platforms.
> The half math functions on CPU side are just used in utests, so we do not
> want to import the soft imitation code or add dependency on some math libs
> for half. We just use float to to calculate the reference value. This causes the
> diff between CPU results and GPU results. We use random func to generate
> src value but when this src value is very close to pi or pi/2, the truncation diff
> imported by float -> half will be magnified a lot in the result of some math
> functions, e.g. sin, cos and tan.
> We now just use a float table as src to fix this.
> 
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>  utests/compiler_half.cpp |   41 ++++++++++++++++++++++++-----------------
>  1 file changed, 24 insertions(+), 17 deletions(-)
> 
> diff --git a/utests/compiler_half.cpp b/utests/compiler_half.cpp index
> 163573f..d486193 100644
> --- a/utests/compiler_half.cpp
> +++ b/utests/compiler_half.cpp
> @@ -172,7 +172,7 @@ void compiler_half_basic(void)
>    for (int32_t i = 0; i < (int32_t) n; ++i) {
>      tmp_f = __half_to_float(((uint16_t *)buf_data[1])[i]);
>      memcpy(&f, &tmp_f, sizeof(float));
> -    printf("%f %f\n", f, fdst[i]);
> +    //printf("%f %f\n", f, fdst[i]);
>      OCL_ASSERT(fabs(f - fdst[i]) <= 0.01 * fabs(fdst[i]) || (fdst[i] == 0.0 && f
> == 0.0));
>    }
>    OCL_UNMAP_BUFFER(1);
> @@ -180,11 +180,18 @@ void compiler_half_basic(void)
> 
>  MAKE_UTEST_FROM_FUNCTION(compiler_half_basic);
> 
> +static const int half_n = 16;
> +static float half_test_src[half_n] = {
> +  -0.23455f, 1.23413f, 2.3412, 8.234f,
> +  -122.31f, -14.233f, 0.0023f, 99.322f,
> +  0.0f, 0.332f, 123.12f, -0.003f,
> +  16.0f, 19.22f, 128.006f, 25.032f
> +};
> 
> -#define HALF_MATH_TEST_1ARG(NAME, CPPNAME, RANGE_L, RANGE_H)
> \
> +#define HALF_MATH_TEST_1ARG(NAME, CPPNAME)                              \
>    void compiler_half_math_##NAME(void)                                  \
>    {                                                                     \
> -    const size_t n = 16;                                                \
> +    const size_t n = half_n;                                            \
>      uint16_t hsrc[n];                                                   \
>      float fsrc[n], fdst[n];                                             \
>      uint32_t tmp_f;                                                     \
> @@ -202,7 +209,7 @@
> MAKE_UTEST_FROM_FUNCTION(compiler_half_basic);
>      locals[0] = 16;                                                     \
>                                                                          \
>      for (int32_t i = 0; i < (int32_t) n; ++i) {                         \
> -      fsrc[i] = RANGE_L + ((rand()%1000) / 1000.0f ) * ((RANGE_H) -
> (RANGE_L)); \
> +      fsrc[i] = half_test_src[i];                                       \
>        memcpy(&tmp_f, &fsrc[i], sizeof(float));                          \
>        hsrc[i] = __float_to_half(tmp_f);                                 \
>      }                                                                   \
> @@ -225,7 +232,7 @@
> MAKE_UTEST_FROM_FUNCTION(compiler_half_basic);
>        bool isInf, infSign;                                              \
>        tmp_f = __half_to_float(((uint16_t *)buf_data[1])[i], &isInf, &infSign); \
>        memcpy(&f, &tmp_f, sizeof(float));                                \
> -      /*printf("%.15f %.15f, diff is %%%f\n", f, fdst[i], (fabs(f -
> fdst[i])/fabs(fdst[i]))); */ \
> +      /* printf("%.15f %.15f, diff is %f\n", f, fdst[i], (fabs(f -
> + fdst[i])/fabs(fdst[i]))); */ \
>        OCL_ASSERT(((fabs(fdst[i]) < 6e-8f) && (fabs(f) < 6e-8f)) ||      \
>                   (fabs(f - fdst[i]) <= 0.03 * fabs(fdst[i])) ||         \
>                   (isInf && ((infSign && fdst[i] > 65504.0f) || (!infSign && fdst[i] < -
> 65504.0f))) || \ @@ -235,17 +242,17 @@
> MAKE_UTEST_FROM_FUNCTION(compiler_half_basic);
>    }                                                                     \
>    MAKE_UTEST_FROM_FUNCTION(compiler_half_math_##NAME);
> 
> -HALF_MATH_TEST_1ARG(sin, sinf, -10, 10); -HALF_MATH_TEST_1ARG(cos,
> cosf, -10, 10); -HALF_MATH_TEST_1ARG(sinh, sinh, -10, 10); -
> HALF_MATH_TEST_1ARG(cosh, cosh, -10, 10); -HALF_MATH_TEST_1ARG(tan,
> tanf, -3.14/2, 3.14/2); -HALF_MATH_TEST_1ARG(log10, log10f, 0.1, 100); -
> HALF_MATH_TEST_1ARG(log, logf, 0.01, 1000); -
> HALF_MATH_TEST_1ARG(trunc, truncf, -1000, 1000); -
> HALF_MATH_TEST_1ARG(exp, expf, -19.0, 20.0); -
> HALF_MATH_TEST_1ARG(sqrt, sqrtf, -19.0, 10.0); -
> HALF_MATH_TEST_1ARG(ceil, ceilf, -19.0, 20.0);
> +HALF_MATH_TEST_1ARG(sin, sinf);
> +HALF_MATH_TEST_1ARG(cos, cosf);
> +HALF_MATH_TEST_1ARG(sinh, sinh);
> +HALF_MATH_TEST_1ARG(cosh, cosh);
> +HALF_MATH_TEST_1ARG(tan, tanf);
> +HALF_MATH_TEST_1ARG(log10, log10f);
> +HALF_MATH_TEST_1ARG(log, logf);
> +HALF_MATH_TEST_1ARG(trunc, truncf);
> +HALF_MATH_TEST_1ARG(exp, expf);
> +HALF_MATH_TEST_1ARG(sqrt, sqrtf);
> +HALF_MATH_TEST_1ARG(ceil, ceilf);
> 
>  #define HALF_MATH_TEST_2ARG(NAME, CPPNAME, RANGE_L, RANGE_H)
> \
>    void compiler_half_math_##NAME(void)                                  \
> @@ -273,7 +280,7 @@ HALF_MATH_TEST_1ARG(ceil, ceilf, -19.0, 20.0);
>        fsrc0[i] = RANGE_L + (((RANGE_H) - (RANGE_L))/n) * i;            \
>        memcpy(&tmp_f, &fsrc0[i], sizeof(float));                         \
>        hsrc0[i] = __float_to_half(tmp_f);                                \
> -      fsrc1[i] = RANGE_L + ((rand()%1000) / 1000.0f ) * ((RANGE_H) -
> (RANGE_L));            \
> +      fsrc1[i] = RANGE_L + (half_test_src[i/4] + 63) * ((RANGE_H) -
> (RANGE_L));            \
>        memcpy(&tmp_f, &fsrc1[i], sizeof(float));                         \
>        hsrc1[i] = __float_to_half(tmp_f);                                \
>      }                                                                   \
> --
> 1.7.9.5
> 
> 
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list