blob: 96ad3d51e36ae22efb2a10d892bee23b1eccc4e7 [file] [log] [blame]
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <executorch/runtime/core/error.h>
#include <executorch/runtime/core/event_tracer_hooks.h>
#include <executorch/runtime/core/memory_allocator.h>
#include <executorch/runtime/core/result.h>
#include <executorch/runtime/platform/compiler.h>
namespace executorch {
namespace runtime {
/**
* Runtime state and functionality for kernel implementations.
*
* NOTE: Will not be passed to operators if running in ATen mode as those
* operators do not expect to receive a KernelRuntimeContext argument.
*/
class KernelRuntimeContext {
public:
/**
* Construct a new kernel runtime context.
*
* KernelRuntimeContext does not take ownership
* of these pointers, so they must outlive the context instance.
*
* @param[in] event_tracer The optional EventTracer to use for
* profiling/debugging
* @param[in] temp_allocator The optional MemoryAllocator used to allocate
* temporary memory for the kernel. If not provided, an error will be
* returned when calling allocate_temp.
*/
KernelRuntimeContext(
EventTracer* event_tracer = nullptr,
MemoryAllocator* temp_allocator = nullptr)
: event_tracer_(event_tracer), temp_allocator_(temp_allocator) {}
/**
* Tells the runtime that the kernel call has failed. Prefer this over
* ET_CHECK_*(), which fatally panics the process/system.
*
* If this is not called, the runtime will treat the kernel call as
* successful.
*
* This unusual error-propagation path is required because kernel signatures
* do not have a natural way to return errors directly. They are generally
* compatible with core PyTorch ATen kernel signatures, which use exceptions
* to report errors. But, ExecuTorch does not use exceptions.
*/
void fail(Error error) {
failure_state_ = error;
}
/// Returns the current failure state.
ET_NODISCARD Error failure_state() const {
return failure_state_;
}
/**
* INTERNAL ONLY
*
* Returns a pointer to an instance of EventTracer to do profiling/debugging
* logging inside the codegen layer. This is only for internal usage inside
* the codegen layer and users should not be accessing this.
*/
EventTracer* internal_event_tracer() {
return event_tracer_;
}
/**
* Allocates temporary memory that will be freed when the kernel returns. This
* returns a pointer to the allocated memory or an error if the allocation
* fails.
*
* @param[in] size Number of bytes to allocate.
* @param[in] alignment Minimum alignment for the returned pointer. Must be a
* power of 2.
*
* @returns A result object containing either a pointer to the allocated
* memory or an error to indicate failure
*/
Result<void*> allocate_temp(
size_t size,
size_t alignment = MemoryAllocator::kDefaultAlignment) {
ET_CHECK_OR_RETURN_ERROR(
temp_allocator_ != nullptr, NotFound, "No temp allocator provided");
void* temp_memory = temp_allocator_->allocate(size, alignment);
ET_CHECK_OR_RETURN_ERROR(
temp_memory != nullptr,
MemoryAllocationFailed,
"Failed to allocate temp memory. Bytes requested: %zu",
size);
return temp_memory;
}
// TODO(T147221312): Add a way to resize a tensor.
private:
EventTracer* event_tracer_ = nullptr;
MemoryAllocator* temp_allocator_ = nullptr;
Error failure_state_ = Error::Ok;
};
} // namespace runtime
} // namespace executorch
// TODO(T197294990): Remove these deprecated aliases once all users have moved
// to the new `::executorch` namespaces.
namespace torch {
namespace executor {
/// DEPRECATED: Use ::executorch::runtime::KernelRuntimeContext instead.
using ::executorch::runtime::KernelRuntimeContext;
/// DEPRECATED: Use ::executorch::runtime::KernelRuntimeContext instead.
using RuntimeContext = ::executorch::runtime::KernelRuntimeContext;
} // namespace executor
} // namespace torch
namespace executorch {
namespace aten {
/// DEPRECATED: Use ::executorch::runtime::KernelRuntimeContext instead.
using RuntimeContext = ::executorch::runtime::KernelRuntimeContext;
} // namespace aten
} // namespace executorch
// DEPRECATED: The exec_aten:: namespace is deprecated. Use executorch::aten::
// instead.
namespace exec_aten = ::executorch::aten;