const auto &operand = lowered_graph.graph().operands().at(ind);
auto tensor = std::make_shared<backend::controlflow::UserTensor>(
operand.info(),
- ir::Layout::NHWC /* FIXME find op_seq for this operand and use frontend_layout */);
+ ir::Layout::NHWC, /* FIXME find op_seq for this operand and use frontend_layout */
+ cf_tensor_builder->dynamicTensorManager());
// Add tensor to controlflow TensorRegistry.
cf_tensor_builder->setUserTensor(ind, tensor);
ret.push_back(tensor);
-
- // Set other tensors as external tensors
- for (auto &tensor_builder : tensor_builders)
- {
- // FIXME This is a workaround registering all user tensors to all backends
- // FIXME Handle when it is failed
- tensor_builder->setExternalTensor(ind, tensor);
- }
}
return ret;
}
+void ExecutorFactory::prepareExternalTensors(ir::LoweredGraph &lowered_graph,
+ TensorBuilders &tensor_builders)
+{
+ lowered_graph.op_seqs().iterate(
+ [&](const ir::OpSequenceIndex &op_seq_index, const ir::OpSequence &op_seq) {
+ auto lower_info = lowered_graph.getLowerInfo(op_seq_index);
+ auto &backend_ctx = lowered_graph.backend_contexts().at(lower_info->backend());
+ for (auto ind : (op_seq.getInputs() + op_seq.getOutputs()) | ir::Remove::DUPLICATED |
+ ir::Remove::UNDEFINED)
+ {
+ // If an OpSequence input/output tensor does not have a own tensor object,
+ // it must be using external tensors, so find the tensor from other tensor builders and
+ // set the tensor to this tensor builder if portable
+ if (!backend_ctx->tensor_builder->tensorAt(ind))
+ {
+ auto tensor = tensor_builders.getITensor(ind);
+ assert(tensor); // The tensor must have been created in one of TensorBuilders
+ auto ptensor = std::dynamic_pointer_cast<backend::IPortableTensor>(tensor);
+ if (ptensor)
+ backend_ctx->tensor_builder->setMigrantTensor(ind, ptensor);
+ }
+ }
+ });
+}
+
exec::IExecutor *
ExecutorFactory::createLinearExecutor(std::unique_ptr<ir::LoweredGraph> lowered_graph,
const compiler::CompilerOptions &options,
tensor_builder->prepare();
}
+ prepareExternalTensors(*lowered_graph, tensor_builders);
+
ExecutionBuilder builder;
// Generate kernels
tensor_builder->prepare();
}
+ prepareExternalTensors(*lowered_graph, tensor_builders);
+
ExecutionBuilder builder;
// Generate kernels