blob: a7d7f612d50843d200f06c85c3413f004b5d2236 [file] [log] [blame]
// Copyright 2021 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef IREE_HAL_BUFFER_VIEW_UTIL_H_
#define IREE_HAL_BUFFER_VIEW_UTIL_H_
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "iree/base/api.h"
#include "iree/hal/allocator.h"
#include "iree/hal/buffer_view.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
//===----------------------------------------------------------------------===//
// Buffer view math
//===----------------------------------------------------------------------===//
// Calculates the allocation size of a buffer view.
IREE_API_EXPORT iree_status_t iree_hal_buffer_compute_view_size(
const iree_hal_dim_t* shape, iree_host_size_t shape_rank,
iree_hal_element_type_t element_type,
iree_hal_encoding_type_t encoding_type,
iree_device_size_t* out_allocation_size);
// Calculates a byte offset into a buffer at the given indices.
// Only works with densely-packed representations.
IREE_API_EXPORT iree_status_t iree_hal_buffer_compute_view_offset(
const iree_hal_dim_t* shape, iree_host_size_t shape_rank,
iree_hal_element_type_t element_type,
iree_hal_encoding_type_t encoding_type, const iree_hal_dim_t* indices,
size_t indices_count, iree_device_size_t* out_offset);
// Calculates a byte range into a buffer of the given contiguous range.
// Only works with densely-packed representations.
IREE_API_EXPORT iree_status_t iree_hal_buffer_compute_view_range(
const iree_hal_dim_t* shape, iree_host_size_t shape_rank,
iree_hal_element_type_t element_type,
iree_hal_encoding_type_t encoding_type, const iree_hal_dim_t* start_indices,
iree_host_size_t indices_count, const iree_hal_dim_t* lengths,
iree_host_size_t lengths_count, iree_device_size_t* out_start_offset,
iree_device_size_t* out_length);
//===----------------------------------------------------------------------===//
// Buffer view allocation and generation
//===----------------------------------------------------------------------===//
// Allocates a buffer from |allocator| and wraps it in a buffer view.
//
// This is equivalent to:
// 1. iree_hal_buffer_compute_view_size
// 2. iree_hal_allocator_allocate_buffer
// 3. iree_hal_buffer_view_create
IREE_API_EXPORT iree_status_t iree_hal_buffer_view_allocate_buffer(
iree_hal_allocator_t* allocator, const iree_hal_dim_t* shape,
iree_host_size_t shape_rank, iree_hal_element_type_t element_type,
iree_hal_encoding_type_t encoding_type,
iree_hal_buffer_params_t buffer_params, iree_const_byte_span_t initial_data,
iree_hal_buffer_view_t** out_buffer_view);
typedef iree_status_t(IREE_API_PTR* iree_hal_buffer_view_generator_callback_t)(
iree_hal_buffer_mapping_t* mapping, void* user_data);
// Generates a buffer view with its initial contents produced by a callback.
// When host and device memory are shared this allows direct generation into the
// target device buffer. If not shared this can avoid expensive transfer mapping
// operations at the cost of a transient host memory allocation. The mapped host
// pointer passed to the callback is only valid within the callback.
//
// Buffers allocated like this do not need the IREE_HAL_BUFFER_USAGE_MAPPING bit
// set; it will be added automatically if the allocator needs it and otherwise
// the memory can remain unmappable (and thus fully device isolated).
//
// As this _may_ require allocation of the entire buffer content in host memory
// it is always preferable to stage and issue copy commands via the device
// queue. Even better is to do all generation on-device via dispatches without
// the need to ever transfer. Usage of this method should be limited to times
// where device-side generation isn't possible or memory consumption is not a
// concern.
//
// This is equivalent to:
// 1. iree_hal_buffer_compute_view_size
// 2. iree_hal_allocator_allocate_buffer
// 3. iree_hal_buffer_map_range + callback + iree_hal_buffer_unmap_range
// 4. iree_hal_buffer_view_create
IREE_API_EXPORT iree_status_t iree_hal_buffer_view_generate_buffer(
iree_hal_allocator_t* allocator, const iree_hal_dim_t* shape,
iree_host_size_t shape_rank, iree_hal_element_type_t element_type,
iree_hal_encoding_type_t encoding_type,
iree_hal_buffer_params_t buffer_params,
iree_hal_buffer_view_generator_callback_t callback, void* user_data,
iree_hal_buffer_view_t** out_buffer_view);
//===----------------------------------------------------------------------===//
// Buffer view parsing and printing
//===----------------------------------------------------------------------===//
// Parses a serialized set of buffer elements in the canonical tensor format
// (the same as produced by iree_hal_buffer_view_format). The underlying buffer
// will be allocated with |buffer_allocator| as a host-local/device-visible
// buffer.
IREE_API_EXPORT iree_status_t iree_hal_buffer_view_parse(
iree_string_view_t value, iree_hal_allocator_t* buffer_allocator,
iree_hal_buffer_view_t** out_buffer_view);
// TODO(#5413): enum for printing mode (include shape, precision).
// Converts buffer view elements into a fully-specified string-form format like
// `2x4xi16=[[1 2][3 4]]`.
//
// |max_element_count| can be used to limit the total number of elements printed
// when the count may be large. Elided elements will be replaced with `...`.
//
// |buffer_capacity| defines the size of |buffer| in bytes and
// |out_buffer_length| will return the string length in characters. Returns
// IREE_STATUS_OUT_OF_RANGE if the buffer capacity is insufficient to hold the
// formatted elements and |out_buffer_length| will contain the required size.
//
// Follows the standard API string formatting rules. See iree/base/api.h.
IREE_API_EXPORT iree_status_t iree_hal_buffer_view_format(
const iree_hal_buffer_view_t* buffer_view,
iree_host_size_t max_element_count, iree_host_size_t buffer_capacity,
char* buffer, iree_host_size_t* out_buffer_length);
// Prints buffer view elements into a fully-specified string-form format like
// `2x4xi16=[[1 2][3 4]]`.
//
// |max_element_count| can be used to limit the total number of elements printed
// when the count may be large. Elided elements will be replaced with `...`.
//
// |host_allocator| will be used for any transient allocations required while
// printing.
IREE_API_EXPORT iree_status_t iree_hal_buffer_view_fprint(
FILE* file, const iree_hal_buffer_view_t* buffer_view,
iree_host_size_t max_element_count, iree_allocator_t host_allocator);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_HAL_BUFFER_VIEW_UTIL_H_