From 6954845d8d39aa424bc4325f897bc7b70b29a88c Mon Sep 17 00:00:00 2001 From: gxw Date: Mon, 20 Jan 2025 15:58:15 +0800 Subject: [PATCH] utest: Add utest for {c/z}scal and {c/z}gemv --- utest/test_gemv.c | 474 +++++++++++++++++++++++++++++++++++++++++++++ utest/test_zscal.c | 54 ++++++ 2 files changed, 528 insertions(+) diff --git a/utest/test_gemv.c b/utest/test_gemv.c index dab6d2f11..66fc30995 100644 --- a/utest/test_gemv.c +++ b/utest/test_gemv.c @@ -128,3 +128,477 @@ CTEST(dgemv, 0_nan_inf_incy_2) } #endif + +#ifdef BUILD_COMPLEX + +CTEST(cgemv, 0_nan_inf) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 1; + float alpha[2] = {0.0, 0.0}; + float beta[2] = {0.0, 0.0}; + char trans = 'N'; + float A[17 * 17 * 4]; + float X[17 * 2]; + float Y[17 * 2]; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + for (i = 0; i < (2 * N - 2); i += 4) + { + Y[i] = NAN; + Y[i + 1] = NAN; + + Y[i + 2] = INFINITY; + Y[i + 3] = INFINITY; + } + Y[2 * N - 1] = NAN; + Y[2 * N - 2] = NAN; + BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 2 * N; i ++) + ASSERT_TRUE(Y[i] == 0.0); +} + +CTEST(cgemv, 0_nan_inf_incy_2) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 2; + float alpha[2] = {0.0, 0.0}; + float beta[2] = {0.0, 0.0}; + char trans = 'N'; + float A[17 * 17 * 4]; + float X[17]; + float Y[17 * 2 * 2]; + float *ay = Y; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + memset(Y, 0, sizeof(Y)); + for (i = 0; i < (2 * N - 2); i += 4) + { + ay[0] = NAN; + ay[1] = NAN; + ay += 4; + ay[0] = INFINITY; + ay[1] = INFINITY; + ay += 4; + } + Y[4 * N - 4] = NAN; + Y[4 * N - 3] = NAN; + BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 4 * N; i ++) + ASSERT_TRUE(Y[i] == 0.0); +} + +CTEST(cgemv, 0_2_nan_1_inf_1) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 1; + float alpha[2] = {0.0, 0.0}; + float beta[2] = {0.0, 2.0}; + char trans = 'N'; + float A[17 * 17 * 4]; + float X[17 * 2]; + float Y[17 * 2]; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + for (i = 0; i < (2 * N - 2); i += 4) + { + Y[i] = NAN; + Y[i + 1] = 1.0; + + Y[i + 2] = INFINITY; + Y[i + 3] = 1.0; + } + Y[2 * N - 2] = NAN; + Y[2 * N - 1] = 1.0; + BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 2 * N; i += 2) { + if ((i >> 1) % 2){ + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isinf(Y[i + 1])); + } + else { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + } +} + +CTEST(cgemv, 0_2_nan_1_inf_1_incy_2) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 2; + float alpha[2] = {0.0, 0.0}; + float beta[2] = {0.0, 2.0}; + char trans = 'N'; + float A[17 * 17 * 4]; + float X[17]; + float Y[17 * 2 * 2]; + float *ay = Y; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + memset(Y, 0, sizeof(Y)); + for (i = 0; i < (2 * N - 2); i += 4) + { + ay[0] = NAN; + ay[1] = 1.0; + ay += 4; + ay[0] = INFINITY; + ay[1] = 1.0; + ay += 4; + } + Y[4 * N - 4] = NAN; + Y[4 * N - 3] = 1.0; + BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 4 * N; i += 2) { + if ((i >> 1) % 2) { + ASSERT_TRUE(Y[i] == 0.0); + ASSERT_TRUE(Y[i + 1] == 0.0); + } + else { + if ((i >> 2) % 2) { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isinf(Y[i + 1])); + } + else { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + } + } +} + +CTEST(cgemv, 2_0_nan_1_inf_1) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 1; + float alpha[2] = {0.0, 0.0}; + float beta[2] = {2.0, 0.0}; + char trans = 'N'; + float A[17 * 17 * 4]; + float X[17 * 2]; + float Y[17 * 2]; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + for (i = 0; i < (2 * N - 2); i += 4) + { + Y[i] = NAN; + Y[i + 1] = 1.0; + + Y[i + 2] = INFINITY; + Y[i + 3] = 1.0; + } + Y[2 * N - 2] = NAN; + Y[2 * N - 1] = 1.0; + BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 2 * N; i += 2) { + if ((i >> 1) % 2){ + ASSERT_TRUE(isinf(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + else { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + } +} + +CTEST(cgemv, 2_0_nan_1_inf_1_incy_2) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 2; + float alpha[2] = {0.0, 0.0}; + float beta[2] = {2.0, 0.0}; + char trans = 'N'; + float A[17 * 17 * 4]; + float X[17]; + float Y[17 * 2 * 2]; + float *ay = Y; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + memset(Y, 0, sizeof(Y)); + for (i = 0; i < (2 * N - 2); i += 4) + { + ay[0] = NAN; + ay[1] = 1.0; + ay += 4; + ay[0] = INFINITY; + ay[1] = 1.0; + ay += 4; + } + Y[4 * N - 4] = NAN; + Y[4 * N - 3] = 1.0; + BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 4 * N; i += 2) { + if ((i >> 1) % 2) { + ASSERT_TRUE(Y[i] == 0.0); + ASSERT_TRUE(Y[i + 1] == 0.0); + } + else { + if ((i >> 2) % 2) { + ASSERT_TRUE(isinf(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + else { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + } + } +} + +#endif + +#ifdef BUILD_COMPLEX16 + +CTEST(zgemv, 0_nan_inf) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 1; + double alpha[2] = {0.0, 0.0}; + double beta[2] = {0.0, 0.0}; + char trans = 'N'; + double A[17 * 17 * 4]; + double X[17 * 2]; + double Y[17 * 2]; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + for (i = 0; i < (2 * N - 2); i += 4) + { + Y[i] = NAN; + Y[i + 1] = NAN; + + Y[i + 2] = INFINITY; + Y[i + 3] = INFINITY; + } + Y[2 * N - 1] = NAN; + Y[2 * N - 2] = NAN; + BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 2 * N; i ++) + ASSERT_TRUE(Y[i] == 0.0); +} + +CTEST(zgemv, 0_nan_inf_incy_2) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 2; + double alpha[2] = {0.0, 0.0}; + double beta[2] = {0.0, 0.0}; + char trans = 'N'; + double A[17 * 17 * 4]; + double X[17]; + double Y[17 * 2 * 2]; + double *ay = Y; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + memset(Y, 0, sizeof(Y)); + for (i = 0; i < (2 * N - 2); i += 4) + { + ay[0] = NAN; + ay[1] = NAN; + ay += 4; + ay[0] = INFINITY; + ay[1] = INFINITY; + ay += 4; + } + Y[4 * N - 4] = NAN; + Y[4 * N - 3] = NAN; + BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 4 * N; i ++) + ASSERT_TRUE(Y[i] == 0.0); +} + +CTEST(zgemv, 0_2_nan_1_inf_1) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 1; + double alpha[2] = {0.0, 0.0}; + double beta[2] = {0.0, 2.0}; + char trans = 'N'; + double A[17 * 17 * 4]; + double X[17 * 2]; + double Y[17 * 2]; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + for (i = 0; i < (2 * N - 2); i += 4) + { + Y[i] = NAN; + Y[i + 1] = 1.0; + + Y[i + 2] = INFINITY; + Y[i + 3] = 1.0; + } + Y[2 * N - 2] = NAN; + Y[2 * N - 1] = 1.0; + BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 2 * N; i += 2) { + if ((i >> 1) % 2){ + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isinf(Y[i + 1])); + } + else { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + } +} + +CTEST(zgemv, 0_2_nan_1_inf_1_incy_2) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 2; + double alpha[2] = {0.0, 0.0}; + double beta[2] = {0.0, 2.0}; + char trans = 'N'; + double A[17 * 17 * 4]; + double X[17]; + double Y[17 * 2 * 2]; + double *ay = Y; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + memset(Y, 0, sizeof(Y)); + for (i = 0; i < (2 * N - 2); i += 4) + { + ay[0] = NAN; + ay[1] = 1.0; + ay += 4; + ay[0] = INFINITY; + ay[1] = 1.0; + ay += 4; + } + Y[4 * N - 4] = NAN; + Y[4 * N - 3] = 1.0; + BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 4 * N; i += 2) { + if ((i >> 1) % 2) { + ASSERT_TRUE(Y[i] == 0.0); + ASSERT_TRUE(Y[i + 1] == 0.0); + } + else { + if ((i >> 2) % 2) { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isinf(Y[i + 1])); + } + else { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + } + } +} + +CTEST(zgemv, 2_0_nan_1_inf_1) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 1; + double alpha[2] = {0.0, 0.0}; + double beta[2] = {2.0, 0.0}; + char trans = 'N'; + double A[17 * 17 * 4]; + double X[17 * 2]; + double Y[17 * 2]; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + for (i = 0; i < (2 * N - 2); i += 4) + { + Y[i] = NAN; + Y[i + 1] = 1.0; + + Y[i + 2] = INFINITY; + Y[i + 3] = 1.0; + } + Y[2 * N - 2] = NAN; + Y[2 * N - 1] = 1.0; + BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 2 * N; i += 2) { + if ((i >> 1) % 2){ + ASSERT_TRUE(isinf(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + else { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + } +} + +CTEST(zgemv, 2_0_nan_1_inf_1_incy_2) +{ + int i; + blasint N = 17; + blasint incX = 1; + blasint incY = 2; + double alpha[2] = {0.0, 0.0}; + double beta[2] = {2.0, 0.0}; + char trans = 'N'; + double A[17 * 17 * 4]; + double X[17]; + double Y[17 * 2 * 2]; + double *ay = Y; + + memset(A, 0, sizeof(A)); + memset(X, 0, sizeof(X)); + memset(Y, 0, sizeof(Y)); + for (i = 0; i < (2 * N - 2); i += 4) + { + ay[0] = NAN; + ay[1] = 1.0; + ay += 4; + ay[0] = INFINITY; + ay[1] = 1.0; + ay += 4; + } + Y[4 * N - 4] = NAN; + Y[4 * N - 3] = 1.0; + BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY); + for (i = 0; i < 4 * N; i += 2) { + if ((i >> 1) % 2) { + ASSERT_TRUE(Y[i] == 0.0); + ASSERT_TRUE(Y[i + 1] == 0.0); + } + else { + if ((i >> 2) % 2) { + ASSERT_TRUE(isinf(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + else { + ASSERT_TRUE(isnan(Y[i])); + ASSERT_TRUE(isnan(Y[i + 1])); + } + } + } +} + +#endif diff --git a/utest/test_zscal.c b/utest/test_zscal.c index 09e63752c..57d78b690 100644 --- a/utest/test_zscal.c +++ b/utest/test_zscal.c @@ -442,6 +442,33 @@ CTEST(cscal, i_0inf_inc_2) ASSERT_TRUE(isnan(inf[17])); } +CTEST(cscal, i00_NAN) +{ + blasint N=9; + blasint incX=1; + float i[] = {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; + float nan[] = {NAN, 0, NAN,0, NAN,0, NAN,0, NAN,0, NAN,0, NAN,0, NAN,0, NAN,0}; + BLASFUNC(cscal)(&N, i, nan, &incX); + ASSERT_TRUE(isnan(nan[0])); + ASSERT_TRUE(isnan(nan[1])); + ASSERT_TRUE(isnan(nan[16])); + ASSERT_TRUE(isnan(nan[17])); +} + +CTEST(cscal, i00_NAN_incx_2) +{ + blasint N=9; + blasint incX=2; + float i[] = {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; + float nan[] = {0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, + 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN}; + BLASFUNC(cscal)(&N, i, nan, &incX); + ASSERT_TRUE(isnan(nan[0])); + ASSERT_TRUE(isnan(nan[1])); + ASSERT_TRUE(isnan(nan[16])); + ASSERT_TRUE(isnan(nan[17])); +} + #endif #ifdef BUILD_COMPLEX16 @@ -588,4 +615,31 @@ CTEST(zscal, i_0inf_inc_2) ASSERT_TRUE(isnan(inf[17])); } +CTEST(zscal, i00_NAN) +{ + blasint N=9; + blasint incX=1; + double i[] = {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; + double nan[] = {NAN, 0, NAN,0, NAN,0, NAN,0, NAN,0, NAN,0, NAN,0, NAN,0, NAN,0}; + BLASFUNC(zscal)(&N, i, nan, &incX); + ASSERT_TRUE(isnan(nan[0])); + ASSERT_TRUE(isnan(nan[1])); + ASSERT_TRUE(isnan(nan[16])); + ASSERT_TRUE(isnan(nan[17])); +} + +CTEST(zscal, i00_NAN_incx_2) +{ + blasint N=9; + blasint incX=2; + double i[] = {0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; + double nan[] = {0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, + 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN, 0,NAN}; + BLASFUNC(zscal)(&N, i, nan, &incX); + ASSERT_TRUE(isnan(nan[0])); + ASSERT_TRUE(isnan(nan[1])); + ASSERT_TRUE(isnan(nan[16])); + ASSERT_TRUE(isnan(nan[17])); +} + #endif