我想为CPU和GPU(在CUDA中)编写一个自定义op(在C ++中)。 这很简单,除了:我怎么称呼BLAS(s)gemm(在两种情况下,对于CPU和GPU)?
我通过LSTMBlock
操作(lstm_ops.h,lstm_ops.cc,lstm_ops_gpu.cu.cc,blas_gemm.h,blas_gemm.cc)看了一下,似乎在CPU情况下使用Eigen,在GPU情况下使用ctx->op_device_context()->stream()->ThenBlasGemm()
。
如果ThenBlasGemm
API也可用于CPU,那就太好了,但它似乎仅是GPU。 (也许我应该为此请求功能吗?)
但是在所有情况下,将Eigen用于CPU情况(或通常也称为gemm)似乎并不是最好的选择。我在浏览MatMul
操作(matmul_op.h,matmul_op.cc,mkl_matmul_op.cc,gemm_functors.h)时,似乎有很多特殊情况(例如,使用gemm或gemv ,使用MKL(如果有)等)。我认为尝试复制所有这些(最好是复制并粘贴代码)不是一个好主意。
我可以在自定义操作中使用matmul
的任何易于使用的API吗? (也许我应该为此请求功能吗?)
也许,有没有办法在我自己的操作中调用现有的MatMulOp::Compute
?