|
LMMC
Lamina Mathematic core
|
稠密矩阵乘法与向量内积实现(GEMM / GEMV / dot / axpy)。 更多...
#include <math.h>#include <string.h>#include "memory_bridge.h"#include "internal.h"#include "lmmc/config.h"#include "lmmc/dense.h"#include "lmmc/linear_algebra.h"函数 | |
| lmmc_status_t | lmmc_mat_gemm (lmmc_real_t alpha, const lmmc_mat_t *A, int transA, const lmmc_mat_t *B, int transB, lmmc_real_t beta, lmmc_mat_t *C) |
| 通用矩阵-矩阵乘法(GEMM): \(C \leftarrow \alpha \cdot \mathrm{op}(A) \cdot \mathrm{op}(B) + \beta \cdot C\)。 | |
| lmmc_status_t | lmmc_mat_mul (const lmmc_mat_t *a, const lmmc_mat_t *b, lmmc_mat_t *c) |
| 计算矩阵乘积:c = a * b。 | |
| lmmc_status_t | lmmc_vec_dot (const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_real_t *out_dot) |
| 计算两个等长向量的内积: \(\text{out\_dot} = \sum_i a_i \cdot b_i\)。 | |
| lmmc_status_t | lmmc_mat_gemv (lmmc_real_t alpha, const lmmc_mat_t *A, int transA, const lmmc_vec_t *x, lmmc_real_t beta, lmmc_vec_t *y) |
| 通用矩阵-向量乘法(GEMV): \(y \leftarrow \alpha \cdot \mathrm{op}(A) \cdot x + \beta \cdot y\)。 | |
| lmmc_status_t | lmmc_mat_vec_mul (const lmmc_mat_t *a, const lmmc_vec_t *x, lmmc_vec_t *y) |
| 计算矩阵与向量的乘积:y = A * x。 | |
| lmmc_status_t | lmmc_vec_axpy (lmmc_real_t alpha, const lmmc_vec_t *x, lmmc_vec_t *y) |
| 向量 AXPY 运算: \(y \leftarrow \alpha \cdot x + y\)。 | |
稠密矩阵乘法与向量内积实现(GEMM / GEMV / dot / axpy)。
在文件 dense_products.c 中定义.
| lmmc_status_t lmmc_mat_gemm | ( | lmmc_real_t | alpha, |
| const lmmc_mat_t * | A, | ||
| int | transA, | ||
| const lmmc_mat_t * | B, | ||
| int | transB, | ||
| lmmc_real_t | beta, | ||
| lmmc_mat_t * | C ) |
通用矩阵-矩阵乘法(GEMM): \(C \leftarrow \alpha \cdot \mathrm{op}(A) \cdot \mathrm{op}(B) + \beta \cdot C\)。
op(X) = X(transX==0)或 X^T(transX!=0)。 设 op(A) 为 MxK,op(B) 为 KxN,则 C 必须为 MxN。 使用内置分块三重循环实现,块大小为 64。
| [in] | alpha | 标量乘子 alpha。 |
| [in] | A | 输入矩阵 A(不被修改)。 |
| [in] | transA | 非零表示对 A 取转置。 |
| [in] | B | 输入矩阵 B(不被修改)。 |
| [in] | transB | 非零表示对 B 取转置。 |
| [in] | beta | 标量乘子 beta.beta==0 时 C 的旧值被忽略(可含 NaN)。 |
| [in,out] | C | 输出矩阵,维度须为 MxN.C 不可与 A 或 B 别名。 |
在文件 dense_products.c 第 185 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_gemm(), LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK , 以及 lmmc_mat_t::rows.
被这些函数引用 lmmc_mat_gemm() , 以及 lmmc_mat_mul().
| lmmc_status_t lmmc_mat_mul | ( | const lmmc_mat_t * | a, |
| const lmmc_mat_t * | b, | ||
| lmmc_mat_t * | c ) |
计算矩阵乘积:c = a * b。
等价于 lmmc_mat_gemm(1.0, a, 0, b, 0, 0.0, c)。 a 为 mxk,b 为 kxn,c 必须已创建为 mxn.c 不可与 a 或 b 别名。
| [in] | a | 左矩阵(不被修改)。 |
| [in] | b | 右矩阵(不被修改)。 |
| [out] | c | 结果矩阵,旧内容被完全覆写。 |
在文件 dense_products.c 第 224 行定义.
引用了 lmmc_mat_gemm() , 以及 lmmc_mat_mul().
被这些函数引用 lmmc_mat_mul() , 以及 lmmc_std_linalg_matmul().
| lmmc_status_t lmmc_vec_dot | ( | const lmmc_vec_t * | a, |
| const lmmc_vec_t * | b, | ||
| lmmc_real_t * | out_dot ) |
计算两个等长向量的内积: \(\text{out\_dot} = \sum_i a_i \cdot b_i\)。
| [in] | a | 第一个向量(不被修改)。 |
| [in] | b | 第二个向量(不被修改),长度须与 a 相同。 |
| [out] | out_dot | 输出内积值。 |
在文件 dense_products.c 第 228 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_REAL_SET_D, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_dot() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_std_linalg_dot(), lmmc_vec_dot() , 以及 lmmc_vec_dot_checked().
| lmmc_status_t lmmc_mat_gemv | ( | lmmc_real_t | alpha, |
| const lmmc_mat_t * | A, | ||
| int | transA, | ||
| const lmmc_vec_t * | x, | ||
| lmmc_real_t | beta, | ||
| lmmc_vec_t * | y ) |
通用矩阵-向量乘法(GEMV): \(y \leftarrow \alpha \cdot \mathrm{op}(A) \cdot x + \beta \cdot y\)。
op(A) 为 MxN 时,要求 x->size==N,y->size==M。 y 的半开存储包络不得与 A 或 x 的存储包络重叠。
| [in] | alpha | 标量乘子 alpha。 |
| [in] | A | 输入矩阵 A(不被修改)。 |
| [in] | transA | 非零表示对 A 取转置。 |
| [in] | x | 输入向量 x(不被修改)。 |
| [in] | beta | 标量乘子 beta.beta==0 时 y 的旧值被忽略。 |
| [in,out] | y | 输出向量,长度须为 op(A) 的行数,且不得与 A 或 x 重叠。 |
在文件 dense_products.c 第 256 行定义.
引用了 lmmc_mat_t::cols, lmmc_mat_gemv(), LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_mat_t::rows , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_mat_gemv() , 以及 lmmc_mat_vec_mul().
| lmmc_status_t lmmc_mat_vec_mul | ( | const lmmc_mat_t * | a, |
| const lmmc_vec_t * | x, | ||
| lmmc_vec_t * | y ) |
计算矩阵与向量的乘积:y = A * x。
等价于 lmmc_mat_gemv(1.0, a, 0, x, 0.0, y)。 a 为 mxn,x->size==n,y->size==m.y 的旧内容被完全覆写,且 y 不得与 a 或 x 重叠。
| [in] | a | 输入矩阵(不被修改)。 |
| [in] | x | 输入向量(不被修改)。 |
| [out] | y | 输出向量,旧内容被覆写。 |
在文件 dense_products.c 第 283 行定义.
引用了 lmmc_mat_gemv() , 以及 lmmc_mat_vec_mul().
被这些函数引用 lmmc_mat_vec_mul() , 以及 lmmc_std_linalg_matvec().
| lmmc_status_t lmmc_vec_axpy | ( | lmmc_real_t | alpha, |
| const lmmc_vec_t * | x, | ||
| lmmc_vec_t * | y ) |
向量 AXPY 运算: \(y \leftarrow \alpha \cdot x + y\)。
x 与 y 长度须相同。
| [in] | alpha | 缩放因子。 |
| [in] | x | 输入向量(不被修改)。 |
| [in,out] | y | 累加目标向量,就地修改。 |
在文件 dense_products.c 第 287 行定义.
引用了 lmmc_vec_t::data, LMMC_REAL_ADD, LMMC_REAL_CLEAR, LMMC_REAL_INIT, LMMC_REAL_MUL, LMMC_REAL_SET, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_vec_axpy() , 以及 lmmc_vec_t::size.
被这些函数引用 lmmc_gmres_arnoldi(), lmmc_std_linalg_vec_add(), lmmc_std_linalg_vec_sub() , 以及 lmmc_vec_axpy().