該標頭檔案對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的矩陣操作函式都可以找到對應,這...