Logical Tensor

Overview

Logical tensor describes the meta-data of the input or output tensor, like elements data type, number of dimensions, size for each dimension (shape), layout, and the property of the tensor. More…

// enums

enum dnnl_graph_layout_type_t;
enum dnnl_graph_tensor_property_t;

// structs

struct dnnl_graph_logical_tensor_t;

// classes

class dnnl::graph::logical_tensor;

// global functions

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_init(
    dnnl_graph_logical_tensor_t* logical_tensor,
    size_t tid,
    dnnl_data_type_t dtype,
    int32_t ndims,
    dnnl_graph_layout_type_t ltype,
    dnnl_graph_tensor_property_t ptype
    );

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_init_with_dims(
    dnnl_graph_logical_tensor_t* logical_tensor,
    size_t tid,
    dnnl_data_type_t dtype,
    int32_t ndims,
    const dnnl_dims_t dims,
    dnnl_graph_layout_type_t ltype,
    dnnl_graph_tensor_property_t ptype
    );

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_init_with_strides(
    dnnl_graph_logical_tensor_t* logical_tensor,
    size_t tid,
    dnnl_data_type_t dtype,
    int32_t ndims,
    const dnnl_dims_t dims,
    const dnnl_dims_t strides,
    dnnl_graph_tensor_property_t ptype
    );

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_get_mem_size(
    const dnnl_graph_logical_tensor_t* logical_tensor,
    size_t* size
    );

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_is_equal(
    const dnnl_graph_logical_tensor_t* lt1,
    const dnnl_graph_logical_tensor_t* lt2,
    uint8_t* is_equal
    );

// macros

#define DNNL_GRAPH_UNKNOWN_DIM
#define DNNL_GRAPH_UNKNOWN_NDIMS

Detailed Documentation

Logical tensor describes the meta-data of the input or output tensor, like elements data type, number of dimensions, size for each dimension (shape), layout, and the property of the tensor.

Each logical tensor has an unique ID. The library uses logical tensor IDs to build up the connections between operations if the output of one operation has the same ID as the input of another operation. The meta-data in a logical tensor may be enriched in the framework graph as it progresses toward final execution. For example, the library doesn’t require detailed shape information at the operation and graph creation stage. But shape information of input logical tensor will be required at partition compilation stage. Logical tensor is not mutable. Users must create a new logical tensor with the same ID to pass any new additional information to oneDNN Graph API. Please note that the library also has unique IDs for operations. The ID should be unique among different logical tensors, but it can have the same value between a logical tensor and an operation.

Global Functions

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_init(
    dnnl_graph_logical_tensor_t* logical_tensor,
    size_t tid,
    dnnl_data_type_t dtype,
    int32_t ndims,
    dnnl_graph_layout_type_t ltype,
    dnnl_graph_tensor_property_t ptype
    )

Initializes a logical tensor with id, data type, number of dimensions, layout type, and property.

The logical tensor’s dims are unknown with this interface.

Parameters:

logical_tensor

Output logical tensor.

tid

The unique id of the output logical tensor.

dtype

Elements data type.

ndims

Number of dimensions.

ltype

Layout type of the underlying tensor buffer.

ptype

Tensor property type.

Returns:

dnnl_success on success or a status describing the error otherwise.

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_init_with_dims(
    dnnl_graph_logical_tensor_t* logical_tensor,
    size_t tid,
    dnnl_data_type_t dtype,
    int32_t ndims,
    const dnnl_dims_t dims,
    dnnl_graph_layout_type_t ltype,
    dnnl_graph_tensor_property_t ptype
    )

Initializes a logical tensor with basic information and dims.

The logical tensor’s dimensions and layout will be initialized according to the input arguments.

Note

If dims contains all valid values and layout type is dnnl_graph_layout_type_strided. The strides field in dnnl_graph_logical_tensor_t will be calculated in a row major and contiguous way. Otherwise, Accessing the strides field is an undefined behavior.

Eg. dims (2, 3, 4, 5) will get strides (60, 20, 5, 1)

Parameters:

logical_tensor

Output logical tensor.

tid

The unique id of output logical tensor.

dtype

Elements data type.

ndims

Number of dimensions.

dims

Array of dimensions.

ltype

Layout type of the underlying tensor memory.

ptype

Tensor property type.

Returns:

dnnl_success on success or a status describing the error otherwise.

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_init_with_strides(
    dnnl_graph_logical_tensor_t* logical_tensor,
    size_t tid,
    dnnl_data_type_t dtype,
    int32_t ndims,
    const dnnl_dims_t dims,
    const dnnl_dims_t strides,
    dnnl_graph_tensor_property_t ptype
    )

Initializes a logical tensor with dimensions and strides provided by user.

Note

Once strides are explicitly provided through the API, the layout_type in dnnl_graph_logical_tensor_t can only be dnnl_graph_layout_type_strided or dnnl_graph_layout_type_any.

Parameters:

logical_tensor

Output logical tensor.

tid

The unique id of output logical tensor.

dtype

Elements data type.

ndims

Number of dimensions.

dims

Array of dimensions.

strides

Array of strides.

ptype

Tensor property type.

Returns:

dnnl_success on success or a status describing the error otherwise.

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_get_mem_size(
    const dnnl_graph_logical_tensor_t* logical_tensor,
    size_t* size
    )

Returns the memory size described by the logical tensor.

If it’s a strided layout, the size will be calculated by dims and strides. If it’s an opaque layout, the size will be decided by layout_id.

Parameters:

logical_tensor

Logical tensor.

size

Output memory size in bytes.

Returns:

dnnl_success on success or a status describing the error otherwise.

dnnl_status_t DNNL_API dnnl_graph_logical_tensor_is_equal(
    const dnnl_graph_logical_tensor_t* lt1,
    const dnnl_graph_logical_tensor_t* lt2,
    uint8_t* is_equal
    )

Compares if two logical tenors are equal.

Users can decide accordingly if layout reordering is needed for two logical tensors. The method will return true for below two circumstances:

  1. the two logical tensors are equal regarding each field in the struct, eg. id, ndims, dims, layout type, property, etc.

  2. If all other fields are equal but the layout types in two logical tensors are different, the method will return true when the underlying memory layout is the same. For example, one logical tensor has strided layout type while the other one has opaque layout type, but underneath, both layouts are NHWC, the method will still return true for this case.

Parameters:

lt1

The handle of first logical tensor.

lt2

The handle of second logical tensor.

is_equal

1 if these two logical tensors are equal, 0 otherwise.

Returns:

dnnl_success on success or a status describing the error otherwise.

Macros

#define DNNL_GRAPH_UNKNOWN_DIM

A wildcard value for dimensions that are unknown at a tensor or operation creation time.

#define DNNL_GRAPH_UNKNOWN_NDIMS

A wildcard value for number of dimensions which is unknown at a tensor or operation creation time.