summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@linux.intel.com>2015-11-24 18:14:41 +0800
committerYang Rong <rong.r.yang@intel.com>2015-11-25 11:02:45 +0800
commitc2f83ca48e29a14de6d94215e7fc6dc50cd054c9 (patch)
treeaef58899c6667415622f31eddf33b0c69a5cb3aa
parentf801671e7c6243530448da49f3fb6104b7ae7cae (diff)
Utests: Fix the failure for half math tests.
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@linux.intel.com> Reviewed-by: Yang Rong <rong.r.yang@intel.com>
-rw-r--r--utests/compiler_half.cpp41
1 files changed, 24 insertions, 17 deletions
diff --git a/utests/compiler_half.cpp b/utests/compiler_half.cpp
index 163573f2..d486193f 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); \
} \