From e114880dc4e6d3413303fe045dee19b6c389e979 Mon Sep 17 00:00:00 2001 From: gxw Date: Fri, 17 Jan 2025 16:01:50 +0800 Subject: [PATCH] kernel/generic: Fixed cscal and zscal --- interface/zscal.c | 4 +-- kernel/arm/zscal.c | 89 +++++++++++++++++++++------------------------- 2 files changed, 42 insertions(+), 51 deletions(-) diff --git a/interface/zscal.c b/interface/zscal.c index 498377343..0e52d113b 100644 --- a/interface/zscal.c +++ b/interface/zscal.c @@ -98,7 +98,7 @@ void CNAME(blasint n, FLOAT alpha_r, void *vx, blasint incx){ if (nthreads == 1) { #endif - SCAL_K(n, 0, 0, alpha[0], alpha[1], x, incx, NULL, 0, NULL, 0); + SCAL_K(n, 0, 0, alpha[0], alpha[1], x, incx, NULL, 0, NULL, 1); #ifdef SMP } else { @@ -108,7 +108,7 @@ void CNAME(blasint n, FLOAT alpha_r, void *vx, blasint incx){ mode = BLAS_SINGLE | BLAS_COMPLEX; #endif - blas_level1_thread(mode, n, 0, 0, alpha, x, incx, NULL, 0, NULL, 0, (int (*)(void))SCAL_K, nthreads); + blas_level1_thread(mode, n, 0, 0, alpha, x, incx, NULL, 0, NULL, 1, (int (*)(void))SCAL_K, nthreads); } #endif diff --git a/kernel/arm/zscal.c b/kernel/arm/zscal.c index c4855f73e..b210f9af3 100644 --- a/kernel/arm/zscal.c +++ b/kernel/arm/zscal.c @@ -27,65 +27,56 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /************************************************************************************** * 2013/09/14 Saar -* BLASTEST float : OK -* BLASTEST double : OK -* CTEST : OK -* TEST : OK +* BLASTEST float : OK +* BLASTEST double : OK +* CTEST : OK +* TEST : OK * **************************************************************************************/ #include "common.h" +// The c/zscal_k function is called not only by cblas_c/zscal but also by other upper-level interfaces. +// In certain cases, the expected return values for cblas_s/zscal differ from those of other upper-level interfaces. +// To handle this, we use the dummy2 parameter to differentiate between them. int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r,FLOAT da_i, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y, FLOAT *dummy, BLASLONG dummy2) { - BLASLONG i=0; - BLASLONG inc_x2; - BLASLONG ip = 0; - FLOAT temp; + BLASLONG i = 0; + BLASLONG inc_x2; + BLASLONG ip = 0; + FLOAT temp; - if ( (n <= 0) || (inc_x <= 0)) - return(0); + if ((n <= 0) || (inc_x <= 0)) + return(0); + inc_x2 = 2 * inc_x; + if (dummy2 == 0) { + for (i = 0; i < n; i++) + { + if (da_r == 0.0 && da_i == 0.0) + { + x[ip] = 0.0; + x[ip+1] = 0.0; + } + else + { + temp = da_r * x[ip] - da_i * x[ip+1]; + x[ip+1] = da_r * x[ip+1] + da_i * x[ip] ; + x[ip] = temp; + } - inc_x2 = 2 * inc_x; - for ( i=0; i