auto base_owner = local_graph_task->owner_;
      if (worker_device != base_owner) {
        std::atomic_thread_fence(std::memory_order_release);
        ready_queue_by_index(local_graph_task->cpu_ready_queue_, base_owner)
            ->push(NodeTask(local_graph_task, nullptr, InputBuffer(0)));
      }
    }
```
Calling the Function and Unlocking New Tasks
evaluate_function serves three purposes:
Run the function.
Accumulate its results in the next node InputBuffers.
Decrease the dependencies counter of the next nodes and enqueues the tasks reaching 0 to be executed.
```c++
void Engine::evaluate_function(
    std::shared_ptr& graph_task,
    Node* func,
    InputBuffer& inputs,
    const std::shared_ptr& cpu_ready_queue) {
// If exec_info_ is not empty, we have to instrument the execution
  auto& exec_info_ = graph_task->exec_info_;