# trmm¶

Computes a matrix-matrix product where one input matrix is triangular and one input matrix is general.

Syntax

void `trmm`(queue &exec_queue, uplo upper_lower, transpose transa, diag unit_diag, std::int64_t m, std::int64_t n, T alpha, buffer<T, 1> &a, std::int64_t lda, buffer<T, 1> &b, std::int64_t ldb)

trmm supports the following precisions and devices:

T

Devices Supported

`float`

Host, CPU, and GPU

`double`

Host, CPU, and GPU

`std::complex<float>`

Host, CPU, and GPU

`std::complex<double>`

Host, CPU, and GPU

Description

The trmm routines compute a scalar-matrix-matrix product where one of the matrices in the multiplication is triangular. The argument `left_right` determines if the triangular matrix, `A`, is on the left of the multiplication (`left_right` = `side::left`) or on the right (`left_right` = `side::right`). Depending on `left_right`. The operation is defined as

```B <- alpha*op(A)*B
```

or

```B <- alpha*B*op(A)
```

where:

op(`A`) is one of op(`A`) = A, or op(`A`) = `A`T, or op(`A`) = `A`H,

`alpha` is a scalar,

`A` is a triangular matrix, and `B` is a general matrix.

Here `B` is `m` x `n` and `A` is either `m` x `m` or `n` x `n`, depending on `left_right`.

Input Parameters

exec_queue

The queue where the routine should be executed.

left_right

Specifies whether `A` is on the left side of the multiplication (`side::left`) or on the right side (`side::right`). See Data Types for more details.

uplo

Specifies whether the matrix `A` is upper or lower triangular. See Data Types for more details.

trans

Specifies op(`A`), the transposition operation applied to `A`. See Data Types for more details.

unit_diag

Specifies whether `A` is assumed to be unit triangular (all diagonal elements are 1). See Data Types for more details.

m

Specifies the number of rows of `B`. The value of `m` must be at least zero.

n

Specifies the number of columns of `B`. The value of `n` must be at least zero.

alpha

Scaling factor for the matrix-matrix product.

a

Buffer holding input matrix `A`. Must have size at least `lda`*`m` if `left_right` = `side::left`, or `lda`*`n` if `left_right` = `side::right`. See Matrix and Vector Storage for more details.

lda

Leading dimension of `A`. Must be at least `m` if `left_right` = `side::left`, and at least `n` if `left_right` = `side::right`. Must be positive.

b

Buffer holding input/output matrix `B`. It must have size at least `ldb`*`n` if column major layout is used to store matrices or at least `ldb`*`m` if row major layout is used to store matrices. See Matrix and Vector Storage for more details.

ldb

Leading dimension of `B`. It must be positive and at least `m` if column major layout is used to store matrices or at least `n` if column major layout is used to store matrices.

Output Parameters

b

Output buffer, overwritten by `alpha`*op(`A`)*`B` or `alpha`*`B`*op(`A`).

Notes

If `alpha` = 0, matrix `B` is set to zero, and `A` and `B` do not need to be initialized at entry.