inline static void magma_slarfxsym_v2( magma_int_t n, float *A, magma_int_t lda, float *V, float *TAU, float *work) { /* WORK (workspace) float real array, dimension N */ magma_int_t ione = 1; float dtmp; float c_zero = MAGMA_S_ZERO; float c_neg_one= MAGMA_S_NEG_ONE; float c_half = MAGMA_S_HALF; /* X = AVtau */ blasf77_ssymv("L",&n, TAU, A, &lda, V, &ione, &c_zero, work, &ione); /* compute dtmp= X'*V */ dtmp = magma_cblas_sdot(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_saxpy(&n, &dtmp, V, &ione, work, &ione); /* performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A */ blasf77_ssyr2("L", &n, &c_neg_one, work, &ione, V, &ione, A, &lda); }
extern "C" void magma_slarfxsym( magma_int_t N, float *A, magma_int_t LDA, float *V, float *TAU) { magma_int_t IONE=1; float dtmp; float Z_ZERO = MAGMA_S_ZERO; //float Z_ONE = MAGMA_S_ONE; float Z_MONE = MAGMA_S_NEG_ONE; float Z_HALF = MAGMA_S_HALF; //float WORK[N]; float *WORK; magma_smalloc_cpu( &WORK, N ); /* apply left and right on A(st:ed,st:ed)*/ //magma_slarfxsym(len,A(st,st),LDX,V(st),TAU(st)); /* X = AVtau */ blasf77_ssymv("L",&N, TAU, A, &LDA, V, &IONE, &Z_ZERO, WORK, &IONE); /* je calcul dtmp= X'*V */ dtmp = magma_cblas_sdot(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_saxpy(&N, &dtmp, V, &IONE, WORK, &IONE); /* performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A */ blasf77_ssyr2("L",&N,&Z_MONE,WORK,&IONE,V,&IONE,A,&LDA); magma_free_cpu(WORK); }
inline static void magma_slarfxsym_v2(magma_int_t n, float *A, magma_int_t lda, float *V, float *TAU, float *work) { /* WORK (workspace) float real array, dimension N */ magma_int_t ione = 1; float dtmp; float c_zero = MAGMA_S_ZERO; float c_neg_one= MAGMA_S_NEG_ONE; float c_half = MAGMA_S_HALF; /* X = AVtau */ blasf77_ssymv("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_S_CNJG(work[j]) * V[j]; //cblas_sdot_sub(n, work, ione, V, ione, &dtmp); #else dtmp = cblas_sdot(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_saxpy(&n, &dtmp, V, &ione, work, &ione); /* performs the symmetric rank 2 operation A := alpha*x*y' + alpha*y*x' + A */ blasf77_ssyr2("L", &n, &c_neg_one, work, &ione, V, &ione, A, &lda); }