kaldi通用底層矩陣運算庫 CUDA

2022-09-06 15:39:11 字數 4492 閱讀 4312

該標頭檔案對cublas的介面進行了簡單的封裝(函式名的簡化和部分kaldi函式的封裝)。

比如cublassgemm_v2封裝為cublas_gemm

cublas_copy_kaldi_fd和cublas_copy_kaldi_df封裝為cublas_copy

cudamatrix/cu-kernels.

以cuda_add_col_sum_mat函式為例

對kaldi cuda kernel或cublas進行了簡單的封裝(針對不同精度浮點型)

cudamatrix/cu-kernels.h

namespace kaldi

inline void cuda_add_col_sum_mat(int gr, int bl, float* result,

const float* mat, const matrixdim d,

const float alpha, const float beta)

//...

}kernel的定義

cudamatrix/cu-kernels.cu

// reduce a matrix 'mat' to a column vector 'result'

template

__global__

static void _transform_reduce_mat_cols(

real *result, const real *mat, const matrixdim d,

const transreduceopop)

sdata[tid] = tdata;

__syncthreads();

// tree reduce

# pragma unroll

for (int shift = cu1dblock / 2; shift > warpsize; shift >>= 1)

// reduce last warp. threads implicitly synchronized within a warp.

if (tid < warpsize)

// output to vector result.

if (tid == 0)

}void cudad_add_col_sum_mat(int gr, int bl, double* result, const double* mat,

const matrixdim d, const double alpha,

const double beta)

cudamatrix/cu-vector.h

與matrix/kaldi-vector.h類似的,該標頭檔案宣告了幾個向量類。與之不同的是,但其運算的實現基於cuda或cblas。

class cuvectorbase

cuda向量抽象類。該類對基礎運算與記憶體優化進行了封裝,只提供向量運算不涉及尺寸縮放和建構函式。

尺寸縮放和建構函式由派生類cuvector和cusubvector負責。

向量初始化

void setzero();

向量資訊

matrixindext dim() const

向量的讀取與轉換

inline real* data()

inline real operator() (matrixindext i) const

cusubvectorrange(const matrixindext o, const matrixindext l)

向量的拷貝函式

void copyfromvec(const cuvectorbase&v);

向量的運算

過載賦值運算子

cuvector&operator = (const cuvectorbase&other)

cuvector&operator = (const cuvector&other)

cuvector&operator = (const vectorbase&other)

utils

void swap(cuvector*vec);

void swap(vector*vec);

void resize(matrixindext length, matrixresizetype resize_type = ksetzero);

class cusubvector: public cuvectorbase

該類表示乙個不占有實際資料的泛化向量或向量索引,可以表示高階向量的子向量或矩陣的行。實現多種用於索引的建構函式

多種建構函式

cusubvector(const cuvectorbase&t, const matrixindext origin,

const matrixindext length) : cuvectorbase()

/// copy constructor

/// this constructor needed for range() to work in base class.

cusubvector(const cusubvector &other) : cuvectorbase()

cusubvector(const real* data, matrixindext length) : cuvectorbase()

cudamatrix/cu-matrix.h

與matrix/kaldi-matrixr.h類似的,該標頭檔案宣告了幾個矩陣類。與之不同的是,但其運算的實現基於cuda或cblas。當kaldi基於cuda環境編譯且gpu可用(cudevice::instantiate().enabled() == true)則使用cuda卡進行計算,否則使用cpu進行計算(cblas)。

class cumatrixbase

cuda矩陣抽象類。該類對基礎運算與記憶體優化進行了封裝,只提供矩陣運算不涉及尺寸縮放和建構函式。

尺寸縮放和建構函式由派生類cumatrix和cusubmatrix負責。

class cumatrix

該類表示普通cuda矩陣,並實現尺寸縮放一般的建構函式

class cusubmatrix

該類表示乙個不占有實際資料的泛化矩陣或矩陣索引,可以表示其他矩陣的矩陣。實現多種用於索引的建構函式

繼承於cumatrixbase,用於對矩陣的子矩陣(塊矩陣)進行運算。

C 矩陣運算庫推薦

最近在幾個地方都看到有人問c 下用什麼矩陣運算庫比較好,順便做了個調查,做一些相關的推薦吧。主要針對稠密矩陣,有時間會再寫乙個稀疏矩陣的推薦。許可證 mpl 2.0 目前使用比較廣的c 矩陣運算庫之一,是在c 下使用matlab方式操作矩陣很好的選擇,許多matlab的矩陣操作函式都可以找到對應,這...

C 矩陣運算庫推薦

矩陣運算再很多數學演算法中經常用到,不懂矩陣,就不算真正理解現代數學。大量現代高階演算法都需要用到矩陣運算,根據之前的工作,順便做了個調查,做一些相關的推薦吧。許可證 mpl 2.0 目前使用比較廣的c 矩陣運算庫之一,是在c 下使用matlab方式操作矩陣很好的選擇,許多matlab的矩陣操作函式...

C 矩陣運算庫推薦

最近在幾個地方都看到有人問c 下用什麼矩陣運算庫比較好,順便做了個調查,做一些相關的推薦吧。主要針對稠密矩陣,有時間會再寫乙個稀疏矩陣的推薦。許可證 mpl 2.0 目前使用比較廣的c 矩陣運算庫之一,是在c 下使用matlab方式操作矩陣很好的選擇,許多matlab的矩陣操作函式都可以找到對應,這...