TensorFlow,自定义 C++ 操作,使用现有的 MatMul

Alb*_*ert 5 c++ blas tensorflow

我想为 CPU 和 GPU(在 CUDA 中)编写一个自定义操作(在 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,ctx->op_device_context()->stream()->ThenBlasGemm()在 GPU 情况下则使用 E​​igen。

ThenBlasGemm如果API 也可用于 CPU 就好了,但它似乎仅适用于 GPU。(也许我应该为此提出一个功能请求?)

但是对于 CPU 情况使用 Eigen(或者一般情况下使用 gemm)似乎并不是在所有情况下都是最好的选择。我正在查看MatMul操作(matmul_op.h,matmul_op.cc,mkl_matmul_op.cc,gemm_functors.h),似乎有很多特殊情况(例如使用 gemm 或 gemv,使用 MKL 如果可用等)。我认为尝试复制所有这些(主要是复制和粘贴代码)不是一个好主意。

是否有任何易于使用的 APImatmul可以在我的自定义操作中使用?(也许我应该为此提出一个功能请求?)

或者也许,有没有办法调用MatMulOp::Compute我自己的操作中现有的?