#include #include #include namespace torch::nativert { std::vector SerialGraphExecutor::execute( ExecutionFrame& executionFrame, std::vector inputs) { fillUserInputs(executionFrame, std::move(inputs)); return executeWithPrefilledFrame(executionFrame); } std::vector SerialGraphExecutor::executeWithPrefilledFrame( ExecutionFrame& executionFrame) { executionFrame.withMemoryPlanner([&]() { // Execute kernels for all nodes except prim.Input and prim.Output for (NodeIndex nodeIdx = 1; nodeIdx < nodeKernels_.size() - 1; ++nodeIdx) { nodeKernels_[nodeIdx]->compute(executionFrame); // don't free intermediate values when static memory planning is enabled if (executorConfig_.tryFreeUnmanagedValuesAfterUse) { // Free the intermediate values that are no used anymore for (const auto& valueKey : execPlan_->valuesToFree[nodeIdx]) { executionFrame.releaseValueIfNeeded(valueKey); } } } }); return executionFrame.tryMoveUserOutputs(); } } // namespace torch::nativert