| 428 | } |
| 429 | |
| 430 | void CpuGemm::run(ITensorPack &tensors) |
| 431 | { |
| 432 | ARM_COMPUTE_TRACE_EVENT(ARM_COMPUTE_PROF_CAT_CPU, ARM_COMPUTE_PROF_LVL_CPU, "CpuGemm::run"); |
| 433 | prepare(tensors); |
| 434 | |
| 435 | auto a = tensors.get_const_tensor(ACL_SRC_0); |
| 436 | auto b = tensors.get_const_tensor(ACL_SRC_1); |
| 437 | auto c = tensors.get_const_tensor(ACL_SRC_2); |
| 438 | auto d = tensors.get_tensor(ACL_DST); |
| 439 | |
| 440 | if (_asm_glue && _asm_glue->is_configured()) |
| 441 | { |
| 442 | // Pass c to asm dispatch only if it's the bias tensor |
| 443 | ITensorPack asm_pack = tensors; |
| 444 | asm_pack.add_const_tensor(ACL_SRC_2, _run_bias_addition ? c : nullptr); |
| 445 | _asm_glue->run(asm_pack); |
| 446 | if (_run_alpha_scale) |
| 447 | { |
| 448 | ITensorPack pack{{ACL_SRC, d}, {ACL_DST, d}}; |
| 449 | _alpha_scale_func->run(pack); |
| 450 | } |
| 451 | } |
| 452 | else |
| 453 | { |
| 454 | CpuAuxTensorHandler interleaved_a(offset_int_vec(InterleavedLHS), _tmp_a, tensors, true); |
| 455 | CpuAuxTensorHandler pretransposed_b(offset_int_vec(PreTransposedRHS), _pretransposed_b, tensors); |
| 456 | CpuAuxTensorHandler transposed1xw_b(offset_int_vec(Transposed1xWRHS), _tmp_b, tensors, true); |
| 457 | CpuAuxTensorHandler temp_d(offset_int_vec(TempResult), _tmp_d, tensors, true); |
| 458 | |
| 459 | ITensorPack mm_pack{{ACL_SRC_0, a}, {ACL_SRC_1, b}, {ACL_DST, (_run_bias_addition) ? temp_d.get() : d}}; |
| 460 | |
| 461 | if (_run_interleave_transpose) |
| 462 | { |
| 463 | // Run interleave kernel |
| 464 | ITensorPack interleave_pack{{ACL_SRC, a}, {ACL_DST, interleaved_a.get()}}; |
| 465 | NEScheduler::get().schedule_op(_interleave_kernel.get(), Window::DimY, _interleave_kernel->window(), |
| 466 | interleave_pack); |
| 467 | // Use reshaped matrices |
| 468 | mm_pack.add_const_tensor(ACL_SRC_0, interleaved_a.get()); |
| 469 | } |
| 470 | |
| 471 | const ITensor *b_to_use = b; |
| 472 | if (_pretranspose_b_func) |
| 473 | { |
| 474 | if (!_reshape_b_only_on_first_run) |
| 475 | { |
| 476 | // Run pretranspose kernel |
| 477 | ITensorPack pretranspose_pack{{ACL_SRC, b_to_use}, {ACL_DST, pretransposed_b.get()}}; |
| 478 | _pretranspose_b_func->run(pretranspose_pack); |
| 479 | } |
| 480 | b_to_use = pretransposed_b.get(); |
| 481 | } |
| 482 | if (_run_interleave_transpose) |
| 483 | { |
| 484 | if (!_reshape_b_only_on_first_run) |
| 485 | { |
| 486 | // Run transpose1xw kernel |
| 487 | ITensorPack transpose_pack{{ACL_SRC, b_to_use}, {ACL_DST, transposed1xw_b.get()}}; |
no test coverage detected