extern "C" void magma_dlarfxsym( magma_int_t N, double *A, magma_int_t LDA, double *V, double *TAU) { magma_int_t IONE=1; double dtmp; double Z_ZERO = MAGMA_D_ZERO; //double Z_ONE = MAGMA_D_ONE; double Z_MONE = MAGMA_D_NEG_ONE; double Z_HALF = MAGMA_D_HALF; //double WORK[N]; double *WORK; magma_dmalloc_cpu( &WORK, N ); /* apply left and right on A(st:ed,st:ed)*/ //magma_dlarfxsym(len,A(st,st),LDX,V(st),TAU(st)); /* X = AVtau */ blasf77_dsymv("L",&N, TAU, A, &LDA, V, &IONE, &Z_ZERO, WORK, &IONE); /* je calcul dtmp= X'*V */ dtmp = magma_cblas_ddot(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_daxpy(&N, &dtmp, V, &IONE, WORK, &IONE); /* performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A */ blasf77_dsyr2("L",&N,&Z_MONE,WORK,&IONE,V,&IONE,A,&LDA); magma_free_cpu(WORK); }
inline static void magma_dlarfxsym_v2(magma_int_t n, double *A, magma_int_t lda, double *V, double *TAU, double *work) { /* WORK (workspace) double real array, dimension N */ magma_int_t ione = 1; double dtmp; double c_zero = MAGMA_D_ZERO; double c_neg_one= MAGMA_D_NEG_ONE; double c_half = MAGMA_D_HALF; /* X = AVtau */ blasf77_dsymv("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_D_CNJG(work[j]) * V[j]; //cblas_ddot_sub(n, work, ione, V, ione, &dtmp); #else dtmp = cblas_ddot(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_daxpy(&n, &dtmp, V, &ione, work, &ione); /* performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A */ blasf77_dsyr2("L", &n, &c_neg_one, work, &ione, V, &ione, A, &lda); }