zoukankan      html  css  js  c++  java
  • kaldi通用底层矩阵运算库——CBLAS

    matrix/cblas-wrappers.h

    该头文件对CBLASCLAPACK的接口进行了简单的封装(将不同数据类型的多个接口封装为一个)。

    比如

    cblas_scopycblas_dcopy封装为cblas_Xcopy

    clapack_sgetriclapack_dgetri封装为clapack_Xgetri

       

    上述接口的声明位于matrix/kaldi-blas.h

       

       

    tools/ATLAS_headers/include/clapack.h

    matrix/kaldi-blas.h

    该头文件根据不同的实现(ATLASCLAPACKMKLOPENBLAS)处理BLASLAPACK等的#include

    matrix/kaldi-vector.h

    该头文件声明了几个Kaldi向量类,其运算的实现基于CBLASCLAPACK,具体依赖的库可以是:

    • ATLAS
    • CLAPACK
    • MKL
    • OPENBLAS

       

    class VectorBase

    向量抽象类。该类对基础运算与内存优化进行了封装,只提供向量运算不涉及尺寸缩放和构造函数

       

    尺寸缩放和构造函数由派生类VectorSubVector负责

       

    向量初始化

    void SetZero();

    向量信息

    bool IsZero(Real cutoff = 1.0e-06) const;

    inline MatrixIndexT Dim() const { return dim_; }

    向量的读取与转换

    inline Real* Data() { return data_; }

    inline Real operator() (MatrixIndexT i) const

    SubVector<Real> Range(const MatrixIndexT o, const MatrixIndexT l)

    向量的拷贝函数

    void CopyFromVec(const VectorBase<Real> &v);

    void CopyFromPacked(const PackedMatrix<OtherReal> &M);

    向量的运算

    void ApplyLog();

    void AddVec(const Real alpha, const VectorBase<OtherReal> &v);

    IO

    void Read(std::istream & in, bool binary, bool add = false);

    void Write(std::ostream &Out, bool binary) const;

    class Vector

    该类表示普通Kaldi向量,并实现尺寸缩放一般的构造函数

       

    多种构造函数

    Vector(): VectorBase<Real>() {}

    explicit Vector(const MatrixIndexT s,

    MatrixResizeType resize_type = kSetZero)

    : VectorBase<Real>() { Resize(s, resize_type); }

    template<typename OtherReal>

    explicit Vector(const CuVectorBase<OtherReal> &cu);

    重载赋值运算符

    Vector<Real> &operator = (const Vector<Real> &other) {

    Resize(other.Dim(), kUndefined);

    this->CopyFromVec(other);

    return *this;

    }

       

    Vector<Real> &operator = (const VectorBase<Real> &other) {

    Resize(other.Dim(), kUndefined);

    this->CopyFromVec(other);

    return *this;

    }

    Utils

    void Swap(Vector<Real> *other);

    void Resize(MatrixIndexT length, MatrixResizeType resize_type = kSetZero);

    void RemoveElement(MatrixIndexT i);

    SubVector

    该类表示一个不占有实际数据的泛化向量或向量索引,可以表示高级向量的子向量或矩阵的行。实现多种用于索引的构造函数

       

    多种构造函数

    SubVector(const VectorBase<Real> &t, const MatrixIndexT origin,

    const MatrixIndexT length) : VectorBase<Real>()

    SubVector(const PackedMatrix<Real> &M)

    SubVector(const SubVector &other) : VectorBase<Real> ()

       

    matrix/kaldi-matrix.h

    该头文件声明了几个Kaldi矩阵类,其运算的实现基于CBLASCLAPACK,具体依赖的库可以是:

    • ATLAS
    • CLAPACK
    • MKL
    • OPENBLAS

       

    class MatrixBase

    矩阵抽象类。该类对基础运算与内存优化进行了封装,只提供矩阵运算不涉及尺寸缩放和构造函数

       

    尺寸缩放和构造函数由派生类MatrixSubMatrix负责

       

    矩阵信息

    inline MatrixIndexT NumRows() const { return num_rows_; }

    inline MatrixIndexT Stride() const { return stride_; }

    向量的读取与转换

    inline const Real* Data() const

    inline Real* Data() { return data_; }

    inline Real* RowData(MatrixIndexT i)

    矩阵的初始化

    void SetZero();

    void Set(Real);

    矩阵的拷贝函数

    void CopyFromMat(const MatrixBase<OtherReal> & M,

    MatrixTransposeType trans = kNoTrans);

    void CopyFromMat(const CompressedMatrix &M);

    矩阵运算

    若向量维数等于矩阵维数,则将其看作是对矩阵逐行拼接得到的向量

    若向量维数等于矩阵列数,则将*this的所有行都设定为v

    v.Dim() == NumRows() * NumCols(),

    void CopyRowsFromVec(const VectorBase<Real> &v);

       

    CopyRowsFromVec类似,只不过矩阵为列序

    void CopyColsFromVec(const VectorBase<Real> &v);

       

    *this矩阵为方阵,且维数等于v的维数;将*this的对角向量设定为v

    void CopyDiagFromVec(const VectorBase<Real> &v);

       

    矩阵所有元素之和

    Real Sum() const;

       

    矩阵的迹

    Real Trace(bool check_square = true) const;

       

    *thisA的元素级相乘

    void MulElements(const MatrixBase<Real> &A);

       

    *this/A,元素级相除

    void DivElements(const MatrixBase<Real> &A);

       

    alpha* *this,缩放*this的所有元素

    void Scale(Real alpha);

       

    (*this) = (*this) * diag(scale)

    *this为列序,for i: *this[i][j]*=scale[j]

    void MulColsVec(const VectorBase<Real> &scale);

       

    (*this) = diag(scale) * (*this)

    *this为行序,for j: *this[i][j]*=scale[i]

    void MulRowsVec(const VectorBase<Real> &scale);

       

    矩阵的逆

    void Invert(Real *log_det = NULL, Real *det_sign = NULL,

    bool inverse_needed = true);

       

    矩阵的转置,只适用于方阵,Matrix才支持普通矩阵

    void Transpose();

       

    对矩阵所有元素进行floor()运算

    void ApplyFloor(Real floor_val);

       

    对矩阵所有元素进行ceil()运算

    void ApplyCeiling(Real ceiling_val);

       

    对矩阵所有元素进行log()运算

    void ApplyLog();

       

    对矩阵所有元素进行exp()运算

    void ApplyExp();

       

    对矩阵所有元素进行pow()运算

    void ApplyPow(Real power);

       

    对矩阵所有元素进行sigmoid()运算

    void Sigmoid(const MatrixBase<Real> &src);

       

    对矩阵所有元素进行tanh()运算

    void Tanh(const MatrixBase<Real> &src);

       

    梯度从sigmoid激励传播到sigmoid激活

    *this = diff * value * (1.0 - value)

    void DiffSigmoid(const MatrixBase<Real> &value,

    const MatrixBase<Real> &diff);

       

    梯度从tanh激励传播到tanh激活

    *this = diff * (1.0 - value^2).

    void DiffTanh(const MatrixBase<Real> &value,

    const MatrixBase<Real> &diff);

       

    *this += alpha * M

    void AddMat(const Real alpha, const MatrixBase<Real> &M,

    MatrixTransposeType transA = kNoTrans);

    *this = alpha A B + beta * *this

    transA == kNoTrans,则

    *this的行数=A的行数

    transA == kTrans,则A=A^T

    *this的行数=A的列数

       

    transB == kNoTrans,则

    *this的列数=B的列数

    transB == kTrans,则B=B^T

    *this的列数=B的行数

       

       

    void AddMatMat(const Real alpha,

    const MatrixBase<Real>& A, MatrixTransposeType transA,

    const MatrixBase<Real>& B, MatrixTransposeType transB,

    const Real beta);

    *this = beta* *this + alpha*A*B*C.

    void AddMatMatMat(const Real alpha,

    const MatrixBase<Real>& A, MatrixTransposeType transA,

    const MatrixBase<Real>& B, MatrixTransposeType transB,

    const MatrixBase<Real>& C, MatrixTransposeType transC,

    const Real beta);

    class Matrix

    该类表示普通Kaldi矩阵,并实现尺寸缩放一般的构造函数

    多种构造函数

    Matrix(const MatrixIndexT r, const MatrixIndexT c,

    MatrixResizeType resize_type = kSetZero,

    MatrixStrideType stride_type = kDefaultStride):

    MatrixBase<Real>() { Resize(r, c, resize_type, stride_type); }

    explicit Matrix(const CuMatrixBase<OtherReal> &cu,

    MatrixTransposeType trans = kNoTrans);

    重载赋值运算符

    Matrix<Real> &operator = (const MatrixBase<Real> &other) {

    if (MatrixBase<Real>::NumRows() != other.NumRows() ||

    MatrixBase<Real>::NumCols() != other.NumCols())

    Resize(other.NumRows(), other.NumCols(), kUndefined);

    MatrixBase<Real>::CopyFromMat(other);

    return *this;

    }

       

    Matrix<Real> &operator = (const Matrix<Real> &other) {

    if (MatrixBase<Real>::NumRows() != other.NumRows() ||

    MatrixBase<Real>::NumCols() != other.NumCols())

    Resize(other.NumRows(), other.NumCols(), kUndefined);

    MatrixBase<Real>::CopyFromMat(other);

    return *this;

    Utils

    void Swap(Matrix<Real> *other);

    void RemoveRow(MatrixIndexT i);

    void Resize(const MatrixIndexT r,

    const MatrixIndexT c,

    MatrixResizeType resize_type = kSetZero,

    MatrixStrideType stride_type = kDefaultStride);

       

    class SubMatrix

    该类表示一个不占有实际数据的泛化矩阵或矩阵索引,可以表示其他矩阵的矩阵。实现多种用于索引的构造函数

    继承于MatrixBase,用于对矩阵的子矩阵(块矩阵)进行运算。

       

    template<typename Real>

    class SubMatrix : public MatrixBase<Real> {

    public:

    多种构造函数

    // 将矩阵的一部分初始化为一个SubMatrix,这都点类似于Matlab中的A(b:c, d:e)

    SubMatrix(const MatrixBase<Real>& T,

    const MatrixIndexT ro, // row offset, 0 < ro < NumRows()

    const MatrixIndexT r, // number of rows, r > 0

    const MatrixIndexT co, // column offset, 0 < co < NumCols()

    const MatrixIndexT c); // number of columns, c > 0

       

    // This initializer is mostly intended for use in CuMatrix and related

    // classes. Be careful!

    SubMatrix(Real *data,

    MatrixIndexT num_rows,

    MatrixIndexT num_cols,

    MatrixIndexT stride);

       

    ~SubMatrix<Real>() {}

       

    /// This type of constructor is needed for Range() to work [in Matrix base

    /// class]. Cannot make it explicit.

    SubMatrix<Real> (const SubMatrix &other):

    MatrixBase<Real> (other.data_, other.num_cols_, other.num_rows_,

    other.stride_) {}

       

    private:

    /// Disallow assignment.

    SubMatrix<Real> &operator = (const SubMatrix<Real> &other);

    };

       

  • 相关阅读:
    jdk8:垃圾收集器
    Young GC和Full GC分别在什么情况下会发生?
    GC之Minor/Young/Major GC的区别
    Java的JJWT实现JWT
    什么是 JWT -- JSON WEB TOKEN
    Spring的两种动态代理:Jdk和Cglib 的区别和实现
    java对象结构 对象头 Markword
    偏向锁跟可重入性有什么区别
    C# 加密算法[汇总]
    Java语言:JAVA8 十大新特性详解(zz)
  • 原文地址:https://www.cnblogs.com/JarvanWang/p/10280974.html
Copyright © 2011-2022 走看看