MPLAPACK 笔记

                     

贡献者: addis

  • 本文处于草稿阶段。
预备知识 Lapack 笔记

1. __float128

// 包含 mplapack_utils__Float128.h
#include <mplapack/mpblas__Float128.h>
// 包含 mplapack__config.h 和 quadmath.h
#include <mplapack/mplapack__Float128.h>

typedef int64_t mplapackint;
typedef mplapackint mplapacklogical;

// 普通矩阵相乘
// cblas (mkl)
void cblas_zgemm(const CBLAS_LAYOUT Layout,
    const CBLAS_TRANSPOSE transa, const CBLAS_TRANSPOSE transb,
    const MKL_INT m, const MKL_INT n, const MKL_INT k,
    const void *alpha, const void *a,
    const MKL_INT lda, const void *b,
    const MKL_INT ldb, const void *beta,
    void *c, const MKL_INT ldc);
// mplapack
// transa="N" 表示不转置, "T" 表示转置
// 注意 alpha, beta 不是 pointer
void Cgemm(const char *transa, const char *transb,
    mplapackint const m, mplapackint const n,
    mplapackint const k, complex<_Float128> const alpha,
    complex<_Float128> *a, mplapackint const lda,
    complex<_Float128> *b, mplapackint const ldb,
    complex<_Float128> const beta, complex<_Float128> *c,
    mplapackint const ldc);

// 带对角矩阵乘以矢量
void Cgbmv(const char *trans, mplapackint const m,
    mplapackint const n, mplapackint const kl,
    mplapackint const ku, complex<_Float128> const alpha,
    complex<_Float128> *a, mplapackint const lda,
    complex<_Float128> *x, mplapackint const incx,
    complex<_Float128> const beta, complex<_Float128> *y,
    mplapackint const incy);


// 从 LU 分解计算逆矩阵
// 所以 mplapack 中的参数和 LAPACKE 并不完全一致, 需要手动查看。
    // lapacke 的版本
lapack_int LAPACKE_zgetri
    (int matrix_layout , lapack_int n , lapack_complex_double *a,
    lapack_int lda , const lapack_int *ipiv);
    // mplapack 的版本
void Cgetri(mplapackint const n, complex<_Float128> *a,
    mplapackint const lda, mplapackint *ipiv,
    complex<_Float128> *work, mplapackint const lwork,
    mplapackint &info);

// 解带对角矩阵
    // lapacke 的版本
lapack_int LAPACKE_zgbsv(int matrix_layout, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_double *ab, lapack_int ldab, lapack_int *ipiv,
    lapack_complex_double *b, lapack_int ldb);
    // mplapack 的版本
void Cgbsv(mplapackint const n, mplapackint const kl,
    mplapackint const ku, mplapackint const nrhs,
    complex<_Float128> *ab, mplapackint const ldab,
    mplapackint *ipiv, complex<_Float128> *b,
    mplapackint const ldb, mplapackint &info);

                     

© 小时科技 保留一切权利