| 521 | } |
| 522 | |
| 523 | void CpuGemm::prepare(ITensorPack &tensors) |
| 524 | { |
| 525 | if (!_is_prepared) |
| 526 | { |
| 527 | if (_asm_glue && _asm_glue->is_configured()) |
| 528 | { |
| 529 | _asm_glue->prepare(tensors); |
| 530 | } |
| 531 | else if (_reshape_b_only_on_first_run) |
| 532 | { |
| 533 | const ITensor *b = tensors.get_const_tensor(ACL_SRC_1); |
| 534 | const ITensor *b_to_use = b; |
| 535 | CpuAuxTensorHandler pretransposed_b( |
| 536 | offset_int_vec(PreTransposedRHS), _pretransposed_b, tensors, |
| 537 | false /*pack_inject: no need to inject into tensors*/, |
| 538 | _pretranspose_b_func == |
| 539 | nullptr /*bypass_alloc: no need to allocate if _pretranspose_b_func is not run*/); |
| 540 | CpuAuxTensorHandler transposed1xw_b(offset_int_vec(Transposed1xWRHS), _tmp_b, tensors, |
| 541 | false /*pack_inject*/, !_run_interleave_transpose /*bypass_alloc*/); |
| 542 | |
| 543 | if (_pretranspose_b_func) |
| 544 | { |
| 545 | // Run pretranspose kernel |
| 546 | ITensorPack pretranspose_pack{{ACL_SRC, b_to_use}, {ACL_DST, pretransposed_b.get()}}; |
| 547 | _pretranspose_b_func->run(pretranspose_pack); |
| 548 | b_to_use = pretransposed_b.get(); |
| 549 | } |
| 550 | if (_run_interleave_transpose) |
| 551 | { |
| 552 | // Run transpose kernel |
| 553 | ITensorPack transpose_pack{{ACL_SRC, b_to_use}, {ACL_DST, transposed1xw_b.get()}}; |
| 554 | NEScheduler::get().schedule_op(_transpose1xW_b_kernel.get(), Window::DimY, |
| 555 | _transpose1xW_b_kernel->window(), transpose_pack); |
| 556 | } |
| 557 | } |
| 558 | _is_prepared = true; |
| 559 | } |
| 560 | } |
| 561 | |
| 562 | experimental::MemoryRequirements CpuGemm::workspace() const |
| 563 | { |
no test coverage detected