| 465 | } |
| 466 | |
| 467 | SmallVector<ConvBiasImpl::NCBKern> ConvBiasImpl::AlgoIm2col::dispatch_preprocess_kerns( |
| 468 | const NCBKernSizeParam& param) const { |
| 469 | MIDOUT_BEGIN(megdnn_fallback_im2col, 0, 3) { |
| 470 | size_t OC = param.filter_meta.ocpg; |
| 471 | size_t oc_tile_size = 0, ohw_tile_size = 0; |
| 472 | size_t GROUP = param.filter_meta.group; |
| 473 | fallback::MatrixMulImpl::AlgoBase::MatmulDescription matmul_desc = |
| 474 | m_matmul_algo->matmul_description(); |
| 475 | choice_ohw_oc_block( |
| 476 | param, oc_tile_size, ohw_tile_size, matmul_desc.innerblocksize.m, |
| 477 | matmul_desc.innerblocksize.n, m_ohw_tile_size, matmul_desc.packmode); |
| 478 | WorkspaceBundle bundle = |
| 479 | get_bundle(param, m_matmul_algo, oc_tile_size, ohw_tile_size); |
| 480 | |
| 481 | Pack_Mode packmode = matmul_desc.packmode; |
| 482 | bool default_pack = packmode == Pack_Mode::DEFAULT; |
| 483 | bool only_packA = packmode == Pack_Mode::ONLY_PACKA; |
| 484 | size_t packa_parallel_times = 0; |
| 485 | |
| 486 | if (only_packA) { |
| 487 | packa_parallel_times = div_ceil<size_t>(OC, oc_tile_size); |
| 488 | } else if (default_pack) { |
| 489 | packa_parallel_times = div_ceil<size_t>(OC, matmul_desc.innerblocksize.m); |
| 490 | } else { |
| 491 | return {}; |
| 492 | } |
| 493 | auto matmul_param = get_matmul_kern_param( |
| 494 | param, ohw_tile_size, default_pack ? OC : oc_tile_size); |
| 495 | |
| 496 | StrategyParam strategyparam; |
| 497 | strategyparam.enable_filter_preprocess = is_enable_filter_preprocess(param); |
| 498 | strategyparam.packA_group_size = packA_group_size( |
| 499 | m_matmul_algo, matmul_param, matmul_desc, packa_parallel_times); |
| 500 | SmallVector<ConvBiasImpl::NCBKern> ret_kern; |
| 501 | StrategyBase* im2colstrategy = |
| 502 | Factory::get_im2col_strategy(param, m_matmul_algo); |
| 503 | |
| 504 | auto kern_packA = [bundle, matmul_algo = m_matmul_algo, matmul_param, |
| 505 | im2colstrategy, strategyparam = strategyparam, |
| 506 | matmul_desc = matmul_desc]( |
| 507 | const NCBKernParam& param, |
| 508 | const NCBKernIndex& ncb_index) mutable { |
| 509 | bundle.set(param.workspace_ptr); |
| 510 | im2colstrategy->packA_kern( |
| 511 | bundle, param, matmul_param, matmul_algo, ncb_index, matmul_desc, |
| 512 | strategyparam); |
| 513 | }; |
| 514 | ret_kern.push_back({kern_packA, {GROUP, packa_parallel_times}}); |
| 515 | return ret_kern; |
| 516 | } |
| 517 | MIDOUT_END(); |
| 518 | return {}; |
| 519 | } |
| 520 | |
| 521 | // vim: syntax=cpp.doxygen |
no test coverage detected