inline static void magma_clarfxsym_v2( magma_int_t n, magmaFloatComplex *A, magma_int_t lda, magmaFloatComplex *V, magmaFloatComplex *TAU, magmaFloatComplex *work) { /* WORK (workspace) float complex array, dimension N */ magma_int_t ione = 1; magmaFloatComplex dtmp; magmaFloatComplex c_zero = MAGMA_C_ZERO; magmaFloatComplex c_neg_one= MAGMA_C_NEG_ONE; magmaFloatComplex c_half = MAGMA_C_HALF; /* X = AVtau */ blasf77_chemv("L",&n, TAU, A, &lda, V, &ione, &c_zero, work, &ione); /* compute dtmp= X'*V */ dtmp = magma_cblas_cdotc(n, work, ione, V, ione); /* compute 1/2 X'*V*t = 1/2*dtmp*tau */ dtmp = -dtmp * c_half * (*TAU); /* compute W=X-1/2VX'Vt = X - dtmp*V */ blasf77_caxpy(&n, &dtmp, V, &ione, work, &ione); /* performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A */ blasf77_cher2("L", &n, &c_neg_one, work, &ione, V, &ione, A, &lda); }
extern "C" void magma_clarfxsym( magma_int_t N, magmaFloatComplex *A, magma_int_t LDA, magmaFloatComplex *V, magmaFloatComplex *TAU) { magma_int_t IONE=1; magmaFloatComplex dtmp; magmaFloatComplex Z_ZERO = MAGMA_C_ZERO; //magmaFloatComplex Z_ONE = MAGMA_C_ONE; magmaFloatComplex Z_MONE = MAGMA_C_NEG_ONE; magmaFloatComplex Z_HALF = MAGMA_C_HALF; //magmaFloatComplex WORK[N]; magmaFloatComplex *WORK; magma_cmalloc_cpu( &WORK, N ); /* apply left and right on A(st:ed,st:ed)*/ //magma_clarfxsym(len,A(st,st),LDX,V(st),TAU(st)); /* X = AVtau */ blasf77_chemv("L",&N, TAU, A, &LDA, V, &IONE, &Z_ZERO, WORK, &IONE); /* je calcul dtmp= X'*V */ dtmp = magma_cblas_cdotc(N, WORK, IONE, V, IONE); /* je calcul 1/2 X'*V*t = 1/2*dtmp*tau */ dtmp = -dtmp * Z_HALF * (*TAU); /* je calcul W=X-1/2VX'Vt = X - dtmp*V */ /* for (j = 0; j < N; j++) WORK[j] = WORK[j] + (dtmp*V[j]); */ blasf77_caxpy(&N, &dtmp, V, &IONE, WORK, &IONE); /* performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A */ blasf77_cher2("L",&N,&Z_MONE,WORK,&IONE,V,&IONE,A,&LDA); magma_free_cpu(WORK); }
inline static void magma_clarfxsym_v2(magma_int_t n, magmaFloatComplex *A, magma_int_t lda, magmaFloatComplex *V, magmaFloatComplex *TAU, magmaFloatComplex *work) { /* WORK (workspace) float complex array, dimension N */ magma_int_t ione = 1; magmaFloatComplex dtmp; magmaFloatComplex c_zero = MAGMA_C_ZERO; magmaFloatComplex c_neg_one= MAGMA_C_NEG_ONE; magmaFloatComplex c_half = MAGMA_C_HALF; /* X = AVtau */ blasf77_chemv("L",&n, TAU, A, &lda, V, &ione, &c_zero, work, &ione); /* compute dtmp= X'*V */ #if defined(PRECISION_z) || defined(PRECISION_c) dtmp = c_zero; for (magma_int_t j = 0; j < n; j++) dtmp = dtmp + MAGMA_C_CNJG(work[j]) * V[j]; //cblas_cdotc_sub(n, work, ione, V, ione, &dtmp); #else dtmp = cblas_cdotc(n, work, ione, V, ione); #endif /* compute 1/2 X'*V*t = 1/2*dtmp*tau */ dtmp = -dtmp * c_half * (*TAU); /* compute W=X-1/2VX'Vt = X - dtmp*V */ blasf77_caxpy(&n, &dtmp, V, &ione, work, &ione); /* performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A */ blasf77_cher2("L", &n, &c_neg_one, work, &ione, V, &ione, A, &lda); }