40 struct NEGEMMLowpMatrixMultiplyCore::Impl
42 const ITensor *
b{
nullptr};
43 std::unique_ptr<cpu::CpuGemmLowpMatrixMultiplyCore> op{
nullptr};
44 ITensorPack run_pack{};
45 ITensorPack prep_pack{};
46 MemoryGroup memory_group{};
47 IWeightsManager *weights_manager{
nullptr};
49 WorkspaceData<Tensor> workspace_tensors{};
50 bool is_prepared{
false};
55 : _impl(std::make_unique<Impl>())
57 _impl->weights_manager = weights_manager;
68 auto b_info_to_use =
b->info()->clone();
71 b_info_to_use->set_are_values_constant(
false);
75 _impl->op = std::make_unique<cpu::CpuGemmLowpMatrixMultiplyCore>();
76 _impl->op->configure(a->
info(), b_info_to_use.get(), (c !=
nullptr ? c->
info() :
nullptr), output->
info(),
83 _impl->aux_mem_req = _impl->op->workspace();
84 _impl->workspace_tensors =
85 manage_workspace<Tensor>(_impl->aux_mem_req, _impl->memory_group, _impl->run_pack, _impl->prep_pack);
95 auto b_info_to_use =
b->clone();
98 b_info_to_use->set_are_values_constant(
false);
108 _impl->op->run(_impl->run_pack);
113 if (!_impl->is_prepared)
115 _impl->op->prepare(_impl->prep_pack);
118 std::find_if(_impl->aux_mem_req.begin(), _impl->aux_mem_req.end(),
119 [](
const MemoryInfo &m) ->
bool { return m.lifetime == MemoryLifetime::Persistent; });
121 if (has_reshape !=
std::end(_impl->aux_mem_req))
123 _impl->b->mark_as_unused();
127 release_temporaries<Tensor>(_impl->aux_mem_req, _impl->workspace_tensors);
128 _impl->is_prepared =
true;