| 10 | |
| 11 | namespace { |
| 12 | std::pair<TensorLayoutArray, MatrixMulForward::Param> sub_opr_config( |
| 13 | const ConvolutionBackwardDataImpl::CanonizedFilterMeta& fm, |
| 14 | const TensorLayout& filter_layout, const TensorLayout& diff_layout, |
| 15 | const TensorLayout& grad_layout, const ConvolutionBackwardDataImpl* opr) { |
| 16 | size_t N = grad_layout.shape[0], IC = fm.icpg, OC = fm.ocpg, |
| 17 | OH = diff_layout.shape[2], OW = diff_layout.shape[3], FH = fm.spatial[0], |
| 18 | FW = fm.spatial[1]; |
| 19 | |
| 20 | megdnn_assert(filter_layout.dtype.enumv() == diff_layout.dtype.enumv()); |
| 21 | TensorLayout Al({OC, IC * FH * FW}, filter_layout.dtype), |
| 22 | Bl({IC * FH * FW, OH * OW * N}, filter_layout.dtype), |
| 23 | Cl({OC, OH * OW * N}, filter_layout.dtype); |
| 24 | MatrixMulForward::Param param; |
| 25 | if (opr->param().compute_mode == param::Convolution::ComputeMode::FLOAT32) { |
| 26 | param.compute_mode = param::MatrixMul::ComputeMode::FLOAT32; |
| 27 | } |
| 28 | |
| 29 | param.transposeA = true; |
| 30 | return {{Al, Cl, Bl}, param}; |
| 31 | } |
| 32 | |
| 33 | std::pair<TensorLayoutArray, std::unique_ptr<MatrixMulForward>> prepare_sub_opr( |
| 34 | const ConvolutionBackwardDataImpl::AlgoBase::SizeArgs& args) { |
no test coverage detected