FP16で行列計算

とある行列計算をFBGEMMおよびQNNPACKで行った [1,2]。


- qnnpack (変数名は、コードに準拠)
transposeの有無は指定できない。shapeはA_{mc, kc} x k_{nc, kc} + b_{nc} -> C_{mc, nc}のみを想定。vectorのtemplateの第2引数は、allocator。中国語!の解説記事[3]。
ptr = new std::vector<float, AlignedAllocator<float, 32> >(ncStride_ * kcStride_ + ncStride_);
pack_sgemm_w(nc, kc, nr, kr, linear_param_ptr, bias_param_ptr, ptr->data());

 

- fbgemm
C <- alpha AxB + beta Cを行う。いわゆるGEMM。
ptr = new fbgemm::PackedGemmMatrixFP16(fbgemm::matrix_op_t::Transpose /* or NoTranspose */, num_cols, num_rows, beta, linear_param_ptr);
でpackし、cblas_gemm_computeで行列計算。ただし、strideはない。kaldiの場合はstride sizeを要確認。

 

- その他:C++版LPCNetを読み、SIMDプログラミングのすごさを知った。使えそうな簡単な部分だけでもパパっと学習したい。

 

 

[1]

github.com

[2]

github.com

[3]

jackwish.net

 [4]

github.com