Loading...
Searching...
No Matches
latrd: Partial factorization; used by hetrd
Dense LA » Eigenvalues » Symmetric/Hermitian eigenvalues » Auxiliary routines

## Functions

magma_int_t | magma_clatrd (magma_uplo_t uplo, magma_int_t n, magma_int_t nb, magmaFloatComplex *A, magma_int_t lda, float *e, magmaFloatComplex *tau, magmaFloatComplex *W, magma_int_t ldw, magmaFloatComplex *work, magma_int_t lwork, magmaFloatComplex_ptr dA, magma_int_t ldda, magmaFloatComplex_ptr dW, magma_int_t lddw, magma_queue_t queue)
| CLATRD reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.
magma_int_t | magma_clatrd2 (magma_uplo_t uplo, magma_int_t n, magma_int_t nb, magmaFloatComplex *A, magma_int_t lda, float *e, magmaFloatComplex *tau, magmaFloatComplex *W, magma_int_t ldw, magmaFloatComplex *work, magma_int_t lwork, magmaFloatComplex_ptr dA, magma_int_t ldda, magmaFloatComplex_ptr dW, magma_int_t lddw, magmaFloatComplex_ptr dwork, magma_int_t ldwork, magma_queue_t queue)
| CLATRD2 reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

magma_int_t

magma_clatrd_mgpu (magma_int_t ngpu, magma_uplo_t uplo, magma_int_t n, magma_int_t nb, magma_int_t nb0, magmaFloatComplex *A, magma_int_t lda, float *e, magmaFloatComplex *tau, magmaFloatComplex *W, magma_int_t ldw, magmaFloatComplex_ptr dA[], magma_int_t ldda, magma_int_t offset, magmaFloatComplex_ptr dW[], magma_int_t lddw, magmaFloatComplex *hwork, magma_int_t lhwork, magmaFloatComplex_ptr dwork[], magma_int_t ldwork, magma_queue_t queues[])

| CLATRD reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.
magma_int_t | magma_dlatrd (magma_uplo_t uplo, magma_int_t n, magma_int_t nb, double *A, magma_int_t lda, double *e, double *tau, double *W, magma_int_t ldw, double *work, magma_int_t lwork, magmaDouble_ptr dA, magma_int_t ldda, magmaDouble_ptr dW, magma_int_t lddw, magma_queue_t queue)
| DLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.
magma_int_t | magma_dlatrd2 (magma_uplo_t uplo, magma_int_t n, magma_int_t nb, double *A, magma_int_t lda, double *e, double *tau, double *W, magma_int_t ldw, double *work, magma_int_t lwork, magmaDouble_ptr dA, magma_int_t ldda, magmaDouble_ptr dW, magma_int_t lddw, magmaDouble_ptr dwork, magma_int_t ldwork, magma_queue_t queue)
| DLATRD2 reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

magma_int_t

magma_dlatrd_mgpu (magma_int_t ngpu, magma_uplo_t uplo, magma_int_t n, magma_int_t nb, magma_int_t nb0, double *A, magma_int_t lda, double *e, double *tau, double *W, magma_int_t ldw, magmaDouble_ptr dA[], magma_int_t ldda, magma_int_t offset, magmaDouble_ptr dW[], magma_int_t lddw, double *hwork, magma_int_t lhwork, magmaDouble_ptr dwork[], magma_int_t ldwork, magma_queue_t queues[])

| DLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.
magma_int_t | magma_slatrd (magma_uplo_t uplo, magma_int_t n, magma_int_t nb, float *A, magma_int_t lda, float *e, float *tau, float *W, magma_int_t ldw, float *work, magma_int_t lwork, magmaFloat_ptr dA, magma_int_t ldda, magmaFloat_ptr dW, magma_int_t lddw, magma_queue_t queue)
| SLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.
magma_int_t | magma_slatrd2 (magma_uplo_t uplo, magma_int_t n, magma_int_t nb, float *A, magma_int_t lda, float *e, float *tau, float *W, magma_int_t ldw, float *work, magma_int_t lwork, magmaFloat_ptr dA, magma_int_t ldda, magmaFloat_ptr dW, magma_int_t lddw, magmaFloat_ptr dwork, magma_int_t ldwork, magma_queue_t queue)
| SLATRD2 reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.
magma_int_t | magma_slatrd_mgpu (magma_int_t ngpu, magma_uplo_t uplo, magma_int_t n, magma_int_t nb, magma_int_t nb0, float *A, magma_int_t lda, float *e, float *tau, float *W, magma_int_t ldw, magmaFloat_ptr dA[], magma_int_t ldda, magma_int_t offset, magmaFloat_ptr dW[], magma_int_t lddw, float *hwork, magma_int_t lhwork, magmaFloat_ptr dwork[], magma_int_t ldwork, magma_queue_t queues[])
| SLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.
magma_int_t | magma_zlatrd (magma_uplo_t uplo, magma_int_t n, magma_int_t nb, magmaDoubleComplex *A, magma_int_t lda, double *e, magmaDoubleComplex *tau, magmaDoubleComplex *W, magma_int_t ldw, magmaDoubleComplex *work, magma_int_t lwork, magmaDoubleComplex_ptr dA, magma_int_t ldda, magmaDoubleComplex_ptr dW, magma_int_t lddw, magma_queue_t queue)
| ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.
magma_int_t | magma_zlatrd2 (magma_uplo_t uplo, magma_int_t n, magma_int_t nb, magmaDoubleComplex *A, magma_int_t lda, double *e, magmaDoubleComplex *tau, magmaDoubleComplex *W, magma_int_t ldw, magmaDoubleComplex *work, magma_int_t lwork, magmaDoubleComplex_ptr dA, magma_int_t ldda, magmaDoubleComplex_ptr dW, magma_int_t lddw, magmaDoubleComplex_ptr dwork, magma_int_t ldwork, magma_queue_t queue)
| ZLATRD2 reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

magma_int_t

magma_zlatrd_mgpu (magma_int_t ngpu, magma_uplo_t uplo, magma_int_t n, magma_int_t nb, magma_int_t nb0, magmaDoubleComplex *A, magma_int_t lda, double *e, magmaDoubleComplex *tau, magmaDoubleComplex *W, magma_int_t ldw, magmaDoubleComplex_ptr dA[], magma_int_t ldda, magma_int_t offset, magmaDoubleComplex_ptr dW[], magma_int_t lddw, magmaDoubleComplex *hwork, magma_int_t lhwork, magmaDoubleComplex_ptr dwork[], magma_int_t ldwork, magma_queue_t queues[])

| ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

## Detailed Description

## Function Documentation

## magma_clatrd()

magma_int_t magma_clatrd | ( | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | magmaFloatComplex * | A,
|  | magma_int_t | lda,
|  | float * | e,
|  | magmaFloatComplex * | tau,
|  | magmaFloatComplex * | W,
|  | magma_int_t | ldw,
|  | magmaFloatComplex * | work,
|  | magma_int_t | lwork,
|  | magmaFloatComplex_ptr | dA,
|  | magma_int_t | ldda,
|  | magmaFloatComplex_ptr | dW,
|  | magma_int_t | lddw,
|  | magma_queue_t | queue )

CLATRD reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, CLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, CLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by CHETRD.

Parameters

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the Hermitian matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.

  [in,out]

  A

  COMPLEX array, dimension (LDA,N) On entry, the Hermitian matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | COMPLEX array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | COMPLEX array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | COMPLEX array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).
  | work | TODO: dimension (lwork)?
  | lwork | TODO: size??
  | dA | TODO: dimension (ldda, n)?
  | ldda | TODO: ldda >= n?
  | dW | TODO: dimension (lddw, ??)
  | lddw | TODO: lddw >= n ??
  [in] | queue | magma_queue_t Queue to execute in.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

    Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

    Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a Hermitian rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

    (  a   a   a   v4  v5 )              (  d                  )
    (      a   a   v4  v5 )              (  1   d              )
    (          a   1   v5 )              (  v1  1   a          )
    (              d   1  )              (  v1  v2  a   a      )
    (                  d  )              (  v1  v2  a   a   a  )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_clatrd2()

magma_int_t magma_clatrd2 | ( | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | magmaFloatComplex * | A,
|  | magma_int_t | lda,
|  | float * | e,
|  | magmaFloatComplex * | tau,
|  | magmaFloatComplex * | W,
|  | magma_int_t | ldw,
|  | magmaFloatComplex * | work,
|  | magma_int_t | lwork,
|  | magmaFloatComplex_ptr | dA,
|  | magma_int_t | ldda,
|  | magmaFloatComplex_ptr | dW,
|  | magma_int_t | lddw,
|  | magmaFloatComplex_ptr | dwork,
|  | magma_int_t | ldwork,
|  | magma_queue_t | queue )

CLATRD2 reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, CLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, CLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by CHETRD2_GPU. It uses an accelerated HEMV that needs extra memory.

Parameters

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the Hermitian matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.

  [in,out]

  A

  COMPLEX array, dimension (LDA,N) On entry, the Hermitian matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | COMPLEX array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | COMPLEX array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | COMPLEX array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).
  | work | TODO: dimension (lwork)?
  | lwork | TODO: size??
  | dA | TODO: dimension (ldda, n) ??
  | ldda | TODO: ldda >= n ??
  | dW | TODO: dimension (lddw, 2*nb) ??
  | lddw | TODO: lddw >= n ??
  | dwork | TODO: dimension (ldwork) ??
  | ldwork | TODO: ldwork >= ceil(n/64)*ldda ??
  [in] | queue | magma_queue_t Queue to execute in.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

    Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

    Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a Hermitian rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

    (  a   a   a   v4  v5 )              (  d                  )
    (      a   a   v4  v5 )              (  1   d              )
    (          a   1   v5 )              (  v1  1   a          )
    (              d   1  )              (  v1  v2  a   a      )
    (                  d  )              (  v1  v2  a   a   a  )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_clatrd_mgpu()

magma_int_t magma_clatrd_mgpu | ( | magma_int_t | ngpu,
|  | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | magma_int_t | nb0,
|  | magmaFloatComplex * | A,
|  | magma_int_t | lda,
|  | float * | e,
|  | magmaFloatComplex * | tau,
|  | magmaFloatComplex * | W,
|  | magma_int_t | ldw,
|  | magmaFloatComplex_ptr | dA[],
|  | magma_int_t | ldda,
|  | magma_int_t | offset,
|  | magmaFloatComplex_ptr | dW[],
|  | magma_int_t | lddw,
|  | magmaFloatComplex * | hwork,
|  | magma_int_t | lhwork,
|  | magmaFloatComplex_ptr | dwork[],
|  | magma_int_t | ldwork,
|  | magma_queue_t | queues[] )

CLATRD reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, CLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, CLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by CHETRD.

Parameters

  [in] | ngpu | INTEGER Number of GPUs to use. ngpu > 0.

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the Hermitian matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.
  [in] | nb0 | INTEGER The block size used for the matrix distribution. nb and nb0 can be different for the final step of chetrd.

  [in,out]

  A

  COMPLEX array, dimension (LDA,N) On entry, the Hermitian matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | COMPLEX array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | COMPLEX array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | COMPLEX array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).

  dA

  COMPLEX array of pointers on the GPU, dimension (ngpu) On entry, the Hermitian matrix dA distributed over GPUs (d_lA[d] points to the local matrix on the d-th GPU). It is distributed in 1D block column or row cyclic (with the block size of nb) if UPLO = MagmaUpper or MagmaLower, respectively. If UPLO = MagmaUpper, the leading N-by-N upper triangular part of dA contains the upper triangular part of the matrix dA, and the strictly lower triangular part of dA is not referenced. If UPLO = MagmaLower, the leading N-by-N lower triangular part of dA contains the lower triangular part of the matrix dA, and the strictly upper triangular part of dA is not referenced.
  On exit, the current panel is factorized.

  [in] | ldda | INTEGER The leading dimension of the array dA[d]. LDDA >= max(1,M).
  [in] | offset | INTEGER The offset to the current panel.
  | dW | COMPLEX array on the GPU, dimension (ngpu*lddw*(3*nb)). On exit, it stores two block columns/rows needed for the trailing submatrix update, V and W.
  [in] | lddw | INTEGER The leading dimension of the array dW[d]. LDDW >= max(1,M).
  | hwork | (workspace) COMPLEX array on the CPU, dimension (lhwork)
  [in] | lhwork | INTEGER The dimension of the array HWORK.
  | dwork | (workspace) COMPLEX array on the GPU, dimension (ldwork)
  [in] | ldwork | INTEGER The dimension of the array DORK.
  [in] | queues | magma_queue_t array of dimension (ngpu). queues[dev] is an execution queue on GPU dev.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a Hermitian rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

( a a a v4 v5 ) ( d ) ( a a v4 v5 ) ( 1 d ) ( a 1 v5 ) ( v1 1 a ) ( d 1 ) ( v1 v2 a a ) ( d ) ( v1 v2 a a a )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_dlatrd()

magma_int_t magma_dlatrd | ( | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | double * | A,
|  | magma_int_t | lda,
|  | double * | e,
|  | double * | tau,
|  | double * | W,
|  | magma_int_t | ldw,
|  | double * | work,
|  | magma_int_t | lwork,
|  | magmaDouble_ptr | dA,
|  | magma_int_t | ldda,
|  | magmaDouble_ptr | dW,
|  | magma_int_t | lddw,
|  | magma_queue_t | queue )

DLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, DLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, DLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by DSYTRD.

Parameters

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the symmetric matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.

  [in,out]

  A

  DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | DOUBLE PRECISION array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | DOUBLE PRECISION array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | DOUBLE PRECISION array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).
  | work | TODO: dimension (lwork)?
  | lwork | TODO: size??
  | dA | TODO: dimension (ldda, n)?
  | ldda | TODO: ldda >= n?
  | dW | TODO: dimension (lddw, ??)
  | lddw | TODO: lddw >= n ??
  [in] | queue | magma_queue_t Queue to execute in.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

    Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

    Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a symmetric rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

    (  a   a   a   v4  v5 )              (  d                  )
    (      a   a   v4  v5 )              (  1   d              )
    (          a   1   v5 )              (  v1  1   a          )
    (              d   1  )              (  v1  v2  a   a      )
    (                  d  )              (  v1  v2  a   a   a  )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_dlatrd2()

magma_int_t magma_dlatrd2 | ( | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | double * | A,
|  | magma_int_t | lda,
|  | double * | e,
|  | double * | tau,
|  | double * | W,
|  | magma_int_t | ldw,
|  | double * | work,
|  | magma_int_t | lwork,
|  | magmaDouble_ptr | dA,
|  | magma_int_t | ldda,
|  | magmaDouble_ptr | dW,
|  | magma_int_t | lddw,
|  | magmaDouble_ptr | dwork,
|  | magma_int_t | ldwork,
|  | magma_queue_t | queue )

DLATRD2 reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, DLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, DLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by DSYTRD2_GPU. It uses an accelerated HEMV that needs extra memory.

Parameters

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the symmetric matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.

  [in,out]

  A

  DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | DOUBLE PRECISION array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | DOUBLE PRECISION array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | DOUBLE PRECISION array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).
  | work | TODO: dimension (lwork)?
  | lwork | TODO: size??
  | dA | TODO: dimension (ldda, n) ??
  | ldda | TODO: ldda >= n ??
  | dW | TODO: dimension (lddw, 2*nb) ??
  | lddw | TODO: lddw >= n ??
  | dwork | TODO: dimension (ldwork) ??
  | ldwork | TODO: ldwork >= ceil(n/64)*ldda ??
  [in] | queue | magma_queue_t Queue to execute in.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

    Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

    Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a symmetric rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

    (  a   a   a   v4  v5 )              (  d                  )
    (      a   a   v4  v5 )              (  1   d              )
    (          a   1   v5 )              (  v1  1   a          )
    (              d   1  )              (  v1  v2  a   a      )
    (                  d  )              (  v1  v2  a   a   a  )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_dlatrd_mgpu()

magma_int_t magma_dlatrd_mgpu | ( | magma_int_t | ngpu,
|  | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | magma_int_t | nb0,
|  | double * | A,
|  | magma_int_t | lda,
|  | double * | e,
|  | double * | tau,
|  | double * | W,
|  | magma_int_t | ldw,
|  | magmaDouble_ptr | dA[],
|  | magma_int_t | ldda,
|  | magma_int_t | offset,
|  | magmaDouble_ptr | dW[],
|  | magma_int_t | lddw,
|  | double * | hwork,
|  | magma_int_t | lhwork,
|  | magmaDouble_ptr | dwork[],
|  | magma_int_t | ldwork,
|  | magma_queue_t | queues[] )

DLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, DLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, DLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by DSYTRD.

Parameters

  [in] | ngpu | INTEGER Number of GPUs to use. ngpu > 0.

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the symmetric matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.
  [in] | nb0 | INTEGER The block size used for the matrix distribution. nb and nb0 can be different for the final step of dsytrd.

  [in,out]

  A

  DOUBLE PRECISION array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | DOUBLE PRECISION array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | DOUBLE PRECISION array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | DOUBLE PRECISION array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).

  dA

  DOUBLE PRECISION array of pointers on the GPU, dimension (ngpu) On entry, the symmetric matrix dA distributed over GPUs (d_lA[d] points to the local matrix on the d-th GPU). It is distributed in 1D block column or row cyclic (with the block size of nb) if UPLO = MagmaUpper or MagmaLower, respectively. If UPLO = MagmaUpper, the leading N-by-N upper triangular part of dA contains the upper triangular part of the matrix dA, and the strictly lower triangular part of dA is not referenced. If UPLO = MagmaLower, the leading N-by-N lower triangular part of dA contains the lower triangular part of the matrix dA, and the strictly upper triangular part of dA is not referenced.
  On exit, the current panel is factorized.

  [in] | ldda | INTEGER The leading dimension of the array dA[d]. LDDA >= max(1,M).
  [in] | offset | INTEGER The offset to the current panel.
  | dW | DOUBLE PRECISION array on the GPU, dimension (ngpu*lddw*(3*nb)). On exit, it stores two block columns/rows needed for the trailing submatrix update, V and W.
  [in] | lddw | INTEGER The leading dimension of the array dW[d]. LDDW >= max(1,M).
  | hwork | (workspace) DOUBLE PRECISION array on the CPU, dimension (lhwork)
  [in] | lhwork | INTEGER The dimension of the array HWORK.
  | dwork | (workspace) DOUBLE PRECISION array on the GPU, dimension (ldwork)
  [in] | ldwork | INTEGER The dimension of the array DORK.
  [in] | queues | magma_queue_t array of dimension (ngpu). queues[dev] is an execution queue on GPU dev.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a symmetric rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

( a a a v4 v5 ) ( d ) ( a a v4 v5 ) ( 1 d ) ( a 1 v5 ) ( v1 1 a ) ( d 1 ) ( v1 v2 a a ) ( d ) ( v1 v2 a a a )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_slatrd()

magma_int_t magma_slatrd | ( | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | float * | A,
|  | magma_int_t | lda,
|  | float * | e,
|  | float * | tau,
|  | float * | W,
|  | magma_int_t | ldw,
|  | float * | work,
|  | magma_int_t | lwork,
|  | magmaFloat_ptr | dA,
|  | magma_int_t | ldda,
|  | magmaFloat_ptr | dW,
|  | magma_int_t | lddw,
|  | magma_queue_t | queue )

SLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, SLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, SLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by SSYTRD.

Parameters

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the symmetric matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.

  [in,out]

  A

  REAL array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | REAL array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | REAL array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | REAL array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).
  | work | TODO: dimension (lwork)?
  | lwork | TODO: size??
  | dA | TODO: dimension (ldda, n)?
  | ldda | TODO: ldda >= n?
  | dW | TODO: dimension (lddw, ??)
  | lddw | TODO: lddw >= n ??
  [in] | queue | magma_queue_t Queue to execute in.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

    Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

    Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a symmetric rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

    (  a   a   a   v4  v5 )              (  d                  )
    (      a   a   v4  v5 )              (  1   d              )
    (          a   1   v5 )              (  v1  1   a          )
    (              d   1  )              (  v1  v2  a   a      )
    (                  d  )              (  v1  v2  a   a   a  )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_slatrd2()

magma_int_t magma_slatrd2 | ( | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | float * | A,
|  | magma_int_t | lda,
|  | float * | e,
|  | float * | tau,
|  | float * | W,
|  | magma_int_t | ldw,
|  | float * | work,
|  | magma_int_t | lwork,
|  | magmaFloat_ptr | dA,
|  | magma_int_t | ldda,
|  | magmaFloat_ptr | dW,
|  | magma_int_t | lddw,
|  | magmaFloat_ptr | dwork,
|  | magma_int_t | ldwork,
|  | magma_queue_t | queue )

SLATRD2 reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, SLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, SLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by SSYTRD2_GPU. It uses an accelerated HEMV that needs extra memory.

Parameters

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the symmetric matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.

  [in,out]

  A

  REAL array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | REAL array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | REAL array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | REAL array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).
  | work | TODO: dimension (lwork)?
  | lwork | TODO: size??
  | dA | TODO: dimension (ldda, n) ??
  | ldda | TODO: ldda >= n ??
  | dW | TODO: dimension (lddw, 2*nb) ??
  | lddw | TODO: lddw >= n ??
  | dwork | TODO: dimension (ldwork) ??
  | ldwork | TODO: ldwork >= ceil(n/64)*ldda ??
  [in] | queue | magma_queue_t Queue to execute in.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

    Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

    Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a symmetric rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

    (  a   a   a   v4  v5 )              (  d                  )
    (      a   a   v4  v5 )              (  1   d              )
    (          a   1   v5 )              (  v1  1   a          )
    (              d   1  )              (  v1  v2  a   a      )
    (                  d  )              (  v1  v2  a   a   a  )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_slatrd_mgpu()

magma_int_t magma_slatrd_mgpu | ( | magma_int_t | ngpu,
|  | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | magma_int_t | nb0,
|  | float * | A,
|  | magma_int_t | lda,
|  | float * | e,
|  | float * | tau,
|  | float * | W,
|  | magma_int_t | ldw,
|  | magmaFloat_ptr | dA[],
|  | magma_int_t | ldda,
|  | magma_int_t | offset,
|  | magmaFloat_ptr | dW[],
|  | magma_int_t | lddw,
|  | float * | hwork,
|  | magma_int_t | lhwork,
|  | magmaFloat_ptr | dwork[],
|  | magma_int_t | ldwork,
|  | magma_queue_t | queues[] )

SLATRD reduces NB rows and columns of a real symmetric matrix A to symmetric tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, SLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, SLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by SSYTRD.

Parameters

  [in] | ngpu | INTEGER Number of GPUs to use. ngpu > 0.

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the symmetric matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.
  [in] | nb0 | INTEGER The block size used for the matrix distribution. nb and nb0 can be different for the final step of ssytrd.

  [in,out]

  A

  REAL array, dimension (LDA,N) On entry, the symmetric matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | REAL array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | REAL array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | REAL array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).

  dA

  REAL array of pointers on the GPU, dimension (ngpu) On entry, the symmetric matrix dA distributed over GPUs (d_lA[d] points to the local matrix on the d-th GPU). It is distributed in 1D block column or row cyclic (with the block size of nb) if UPLO = MagmaUpper or MagmaLower, respectively. If UPLO = MagmaUpper, the leading N-by-N upper triangular part of dA contains the upper triangular part of the matrix dA, and the strictly lower triangular part of dA is not referenced. If UPLO = MagmaLower, the leading N-by-N lower triangular part of dA contains the lower triangular part of the matrix dA, and the strictly upper triangular part of dA is not referenced.
  On exit, the current panel is factorized.

  [in] | ldda | INTEGER The leading dimension of the array dA[d]. LDDA >= max(1,M).
  [in] | offset | INTEGER The offset to the current panel.
  | dW | REAL array on the GPU, dimension (ngpu*lddw*(3*nb)). On exit, it stores two block columns/rows needed for the trailing submatrix update, V and W.
  [in] | lddw | INTEGER The leading dimension of the array dW[d]. LDDW >= max(1,M).
  | hwork | (workspace) REAL array on the CPU, dimension (lhwork)
  [in] | lhwork | INTEGER The dimension of the array HWORK.
  | dwork | (workspace) REAL array on the GPU, dimension (ldwork)
  [in] | ldwork | INTEGER The dimension of the array DORK.
  [in] | queues | magma_queue_t array of dimension (ngpu). queues[dev] is an execution queue on GPU dev.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

H(i) = I - tau * v * v'

where tau is a real scalar, and v is a real vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a symmetric rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

( a a a v4 v5 ) ( d ) ( a a v4 v5 ) ( 1 d ) ( a 1 v5 ) ( v1 1 a ) ( d 1 ) ( v1 v2 a a ) ( d ) ( v1 v2 a a a )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_zlatrd()

magma_int_t magma_zlatrd | ( | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | magmaDoubleComplex * | A,
|  | magma_int_t | lda,
|  | double * | e,
|  | magmaDoubleComplex * | tau,
|  | magmaDoubleComplex * | W,
|  | magma_int_t | ldw,
|  | magmaDoubleComplex * | work,
|  | magma_int_t | lwork,
|  | magmaDoubleComplex_ptr | dA,
|  | magma_int_t | ldda,
|  | magmaDoubleComplex_ptr | dW,
|  | magma_int_t | lddw,
|  | magma_queue_t | queue )

ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, ZLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, ZLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by ZHETRD.

Parameters

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the Hermitian matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.

  [in,out]

  A

  COMPLEX_16 array, dimension (LDA,N) On entry, the Hermitian matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | COMPLEX_16 array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | COMPLEX_16 array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | COMPLEX_16 array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).
  | work | TODO: dimension (lwork)?
  | lwork | TODO: size??
  | dA | TODO: dimension (ldda, n)?
  | ldda | TODO: ldda >= n?
  | dW | TODO: dimension (lddw, ??)
  | lddw | TODO: lddw >= n ??
  [in] | queue | magma_queue_t Queue to execute in.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

    Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

    Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a Hermitian rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

    (  a   a   a   v4  v5 )              (  d                  )
    (      a   a   v4  v5 )              (  1   d              )
    (          a   1   v5 )              (  v1  1   a          )
    (              d   1  )              (  v1  v2  a   a      )
    (                  d  )              (  v1  v2  a   a   a  )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_zlatrd2()

magma_int_t magma_zlatrd2 | ( | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | magmaDoubleComplex * | A,
|  | magma_int_t | lda,
|  | double * | e,
|  | magmaDoubleComplex * | tau,
|  | magmaDoubleComplex * | W,
|  | magma_int_t | ldw,
|  | magmaDoubleComplex * | work,
|  | magma_int_t | lwork,
|  | magmaDoubleComplex_ptr | dA,
|  | magma_int_t | ldda,
|  | magmaDoubleComplex_ptr | dW,
|  | magma_int_t | lddw,
|  | magmaDoubleComplex_ptr | dwork,
|  | magma_int_t | ldwork,
|  | magma_queue_t | queue )

ZLATRD2 reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, ZLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, ZLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by ZHETRD2_GPU. It uses an accelerated HEMV that needs extra memory.

Parameters

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the Hermitian matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.

  [in,out]

  A

  COMPLEX_16 array, dimension (LDA,N) On entry, the Hermitian matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | COMPLEX_16 array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | COMPLEX_16 array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | COMPLEX_16 array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).
  | work | TODO: dimension (lwork)?
  | lwork | TODO: size??
  | dA | TODO: dimension (ldda, n) ??
  | ldda | TODO: ldda >= n ??
  | dW | TODO: dimension (lddw, 2*nb) ??
  | lddw | TODO: lddw >= n ??
  | dwork | TODO: dimension (ldwork) ??
  | ldwork | TODO: ldwork >= ceil(n/64)*ldda ??
  [in] | queue | magma_queue_t Queue to execute in.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

    Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

    Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

    H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a Hermitian rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

    (  a   a   a   v4  v5 )              (  d                  )
    (      a   a   v4  v5 )              (  1   d              )
    (          a   1   v5 )              (  v1  1   a          )
    (              d   1  )              (  v1  v2  a   a      )
    (                  d  )              (  v1  v2  a   a   a  )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).

## magma_zlatrd_mgpu()

magma_int_t magma_zlatrd_mgpu | ( | magma_int_t | ngpu,
|  | magma_uplo_t | uplo,
|  | magma_int_t | n,
|  | magma_int_t | nb,
|  | magma_int_t | nb0,
|  | magmaDoubleComplex * | A,
|  | magma_int_t | lda,
|  | double * | e,
|  | magmaDoubleComplex * | tau,
|  | magmaDoubleComplex * | W,
|  | magma_int_t | ldw,
|  | magmaDoubleComplex_ptr | dA[],
|  | magma_int_t | ldda,
|  | magma_int_t | offset,
|  | magmaDoubleComplex_ptr | dW[],
|  | magma_int_t | lddw,
|  | magmaDoubleComplex * | hwork,
|  | magma_int_t | lhwork,
|  | magmaDoubleComplex_ptr | dwork[],
|  | magma_int_t | ldwork,
|  | magma_queue_t | queues[] )

ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to Hermitian tridiagonal form by an orthogonal similarity transformation Q' * A * Q, and returns the matrices V and W which are needed to apply the transformation to the unreduced part of A.

If UPLO = MagmaUpper, ZLATRD reduces the last NB rows and columns of a matrix, of which the upper triangle is supplied; if UPLO = MagmaLower, ZLATRD reduces the first NB rows and columns of a matrix, of which the lower triangle is supplied.

This is an auxiliary routine called by ZHETRD.

Parameters

  [in] | ngpu | INTEGER Number of GPUs to use. ngpu > 0.

  [in]

  uplo

  magma_uplo_t Specifies whether the upper or lower triangular part of the Hermitian matrix A is stored:
  - = MagmaUpper: Upper triangular
  - = MagmaLower: Lower triangular

  [in] | n | INTEGER The order of the matrix A.
  [in] | nb | INTEGER The number of rows and columns to be reduced.
  [in] | nb0 | INTEGER The block size used for the matrix distribution. nb and nb0 can be different for the final step of zhetrd.

  [in,out]

  A

  COMPLEX_16 array, dimension (LDA,N) On entry, the Hermitian matrix A. If UPLO = MagmaUpper, the leading n-by-n upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = MagmaLower, the leading n-by-n lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. On exit:
  - if UPLO = MagmaUpper, the last NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements above the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors;
  - if UPLO = MagmaLower, the first NB columns have been reduced to tridiagonal form, with the diagonal elements overwriting the diagonal elements of A; the elements below the diagonal with the array TAU, represent the orthogonal matrix Q as a product of elementary reflectors. See Further Details.

  [in] | lda | INTEGER The leading dimension of the array A. LDA >= (1,N).
  [out] | e | COMPLEX_16 array, dimension (N-1) If UPLO = MagmaUpper, E(n-nb:n-1) contains the superdiagonal elements of the last NB columns of the reduced matrix; if UPLO = MagmaLower, E(1:nb) contains the subdiagonal elements of the first NB columns of the reduced matrix.
  [out] | tau | COMPLEX_16 array, dimension (N-1) The scalar factors of the elementary reflectors, stored in TAU(n-nb:n-1) if UPLO = MagmaUpper, and in TAU(1:nb) if UPLO = MagmaLower. See Further Details.
  [out] | W | COMPLEX_16 array, dimension (LDW,NB) The n-by-nb matrix W required to update the unreduced part of A.
  [in] | ldw | INTEGER The leading dimension of the array W. LDW >= max(1,N).

  dA

  COMPLEX_16 array of pointers on the GPU, dimension (ngpu) On entry, the Hermitian matrix dA distributed over GPUs (d_lA[d] points to the local matrix on the d-th GPU). It is distributed in 1D block column or row cyclic (with the block size of nb) if UPLO = MagmaUpper or MagmaLower, respectively. If UPLO = MagmaUpper, the leading N-by-N upper triangular part of dA contains the upper triangular part of the matrix dA, and the strictly lower triangular part of dA is not referenced. If UPLO = MagmaLower, the leading N-by-N lower triangular part of dA contains the lower triangular part of the matrix dA, and the strictly upper triangular part of dA is not referenced.
  On exit, the current panel is factorized.

  [in] | ldda | INTEGER The leading dimension of the array dA[d]. LDDA >= max(1,M).
  [in] | offset | INTEGER The offset to the current panel.
  | dW | COMPLEX_16 array on the GPU, dimension (ngpu*lddw*(3*nb)). On exit, it stores two block columns/rows needed for the trailing submatrix update, V and W.
  [in] | lddw | INTEGER The leading dimension of the array dW[d]. LDDW >= max(1,M).
  | hwork | (workspace) COMPLEX_16 array on the CPU, dimension (lhwork)
  [in] | lhwork | INTEGER The dimension of the array HWORK.
  | dwork | (workspace) COMPLEX_16 array on the GPU, dimension (ldwork)
  [in] | ldwork | INTEGER The dimension of the array DORK.
  [in] | queues | magma_queue_t array of dimension (ngpu). queues[dev] is an execution queue on GPU dev.

## Further Details

If UPLO = MagmaUpper, the matrix Q is represented as a product of elementary reflectors

Q = H(n) H(n-1) . . . H(n-nb+1).

Each H(i) has the form

H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), and tau in TAU(i-1).

If UPLO = MagmaLower, the matrix Q is represented as a product of elementary reflectors

Q = H(1) H(2) . . . H(nb).

Each H(i) has the form

H(i) = I - tau * v * v'

where tau is a complex scalar, and v is a complex vector with v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), and tau in TAU(i).

The elements of the vectors v together form the n-by-nb matrix V which is needed, with W, to apply the transformation to the unreduced part of the matrix, using a Hermitian rank-2k update of the form: A := A - V*W' - W*V'.

The contents of A on exit are illustrated by the following examples with n = 5 and nb = 2:

if UPLO = MagmaUpper: if UPLO = MagmaLower:

( a a a v4 v5 ) ( d ) ( a a v4 v5 ) ( 1 d ) ( a 1 v5 ) ( v1 1 a ) ( d 1 ) ( v1 v2 a a ) ( d ) ( v1 v2 a a a )

where d denotes a diagonal element of the reduced matrix, a denotes an element of the original matrix that is unchanged, and vi denotes an element of the vector defining H(i).