A descriptor class for host tensors that manages tensor dimensions, strides, and layout.
More...
|
template<typename Layout > |
| HostTensorDescriptor (std::vector< std::size_t > lens, std::vector< std::size_t > strides, const Layout &layout=DefaultLayout()) |
|
| HostTensorDescriptor () |
|
template<typename F , typename OrigLayout > |
void | DispatchChosenLayout (ChosenLayout tag, const OrigLayout &orig, F &&f) const |
|
template<typename Layout > |
ChosenLayout | HandleDefaultLayout (const Layout &) |
|
template<typename Layout > |
void | CalculateStrides (const Layout &layout) |
|
template<typename Layout > |
void | ValidateStrides (const Layout &layout) const |
|
template<typename X , typename Layout = DefaultLayout, typename = std::enable_if_t<std::is_convertible_v<X, std::size_t> && std::is_convertible_v<Layout, BaseTensorLayout>>> |
| HostTensorDescriptor (const std::initializer_list< X > &lens, const Layout &layout=Layout{}) |
|
template<typename Layout = DefaultLayout, typename = std::enable_if_t<std::is_convertible_v<Layout, BaseTensorLayout>>> |
| HostTensorDescriptor (const std::initializer_list< ck::long_index_t > &lens, const Layout &layout=Layout{}) |
|
template<typename Lengths , typename Layout = DefaultLayout, typename = std::enable_if_t< (std::is_convertible_v<ck::ranges::range_value_t<Lengths>, std::size_t> || std::is_convertible_v<ck::ranges::range_value_t<Lengths>, ck::long_index_t>) && std::is_convertible_v<Layout, BaseTensorLayout>>> |
| HostTensorDescriptor (const Lengths &lens, const Layout &layout=Layout{}) |
|
template<typename X , typename Y , typename = std::enable_if_t<std::is_convertible_v<X, std::size_t> && std::is_convertible_v<Y, std::size_t>>, typename Layout = DefaultLayout> |
| HostTensorDescriptor (const std::initializer_list< X > &lens, const std::initializer_list< Y > &strides, const Layout &layout=Layout{}) |
|
template<typename Layout = DefaultLayout> |
| HostTensorDescriptor (const std::initializer_list< ck::long_index_t > &lens, const std::initializer_list< ck::long_index_t > &strides, const Layout &layout=Layout{}) |
|
template<typename Strides , typename Layout = DefaultLayout> |
| HostTensorDescriptor (const std::initializer_list< std::size_t > &lens, const Strides &strides, const Layout &layout=Layout{}) |
|
template<typename Lengths , typename Strides , typename Layout = DefaultLayout, typename = std::enable_if_t< ((std::is_convertible_v<ck::ranges::range_value_t<Lengths>, std::size_t> && std::is_convertible_v<ck::ranges::range_value_t<Strides>, std::size_t>) || (std::is_convertible_v<ck::ranges::range_value_t<Lengths>, ck::long_index_t> && std::is_convertible_v<ck::ranges::range_value_t<Strides>, ck::long_index_t>)) && std::is_convertible_v<Layout, BaseTensorLayout>>> |
| HostTensorDescriptor (const Lengths &lens, const Strides &strides, const Layout &layout=Layout{}) |
|
std::size_t | GetNumOfDimension () const |
|
std::size_t | GetElementSize () const |
|
std::size_t | GetElementSpaceSize () const |
|
const std::vector< std::size_t > & | GetLengths () const |
|
const std::vector< std::size_t > & | GetStrides () const |
|
template<typename... Is> |
std::size_t | GetOffsetFromMultiIndex (Is... is) const |
|
std::size_t | GetOffsetFromMultiIndex (const std::vector< std::size_t > &iss) const |
|
A descriptor class for host tensors that manages tensor dimensions, strides, and layout.
The HostTensorDescriptor provides a comprehensive interface for describing multi-dimensional tensors with configurable layouts and automatic stride calculation capabilities.
Stride Handling
The descriptor supports multiple stride specification modes:
- Explicit Strides: When strides are provided explicitly, they are validated against the specified layout to ensure memory access patterns are correct.
- Auto-calculated Strides: When strides are empty or all-zero, they are automatically calculated based on the tensor layout:
- For RowMajor layout: rightmost dimension has stride 1, others calculated as cumulative products
- For ColumnMajor layout: similar to RowMajor but with swapped stride positions for last two dimensions
- Partial Stride Specification: For GEMM layouts, unknown strides (represented as 0 or negative values) in the last two dimensions can be auto-calculated while preserving higher dimension strides.
- Bypass: When using
BypassLayoutVerification
layout, no stride calculation or validation is performed. That allows to pass in any arbitrary strides including 0.
For more details see CalculateStrides
method.
Layout Support
- GEMM Layouts: Supports RowMajor and ColumnMajor layouts with full validation
- Convolution Layouts: Recognized but validation is not yet implemented
- Abstract Layouts: BaseTensorLayout will attempt automatic layout detection for 2D tensors
Limitations
- Layout Detection: Automatic layout detection only works reliably for 2D tensors. This is done mostly for legacy GEMM cases to avoid modifying many existing GEMM tests to pass RowMajor/ColumnMajor explicitly. Higher-dimensional tensors with BaseTensorLayout will throw validation errors. For more details see
HandleDefaultLayout
method.
- Stride Validation: Only GEMM layouts (RowMajor/ColumnMajor) have full stride validation. Convolution layouts are accepted but not validated. For more details see
ValidateStrides
.
- GEMM Assumptions: For tensors with more than 2 dimensions, GEMM layout validation assumes the last two dimensions represent the height-width pattern (e.g., BHW or BWH for batched GEMM).
- Negative Stride Handling: Negative stride values are interpreted as "unknown" and converted to auto-calculated values only for supported layouts.
Thread Safety
This class is not thread-safe. External synchronization is required for concurrent access.
Usage Examples
A descriptor class for host tensors that manages tensor dimensions, strides, and layout.
Definition: host_tensor.hpp:171
Definition: tensor_layout.hpp:26
template<typename Lengths , typename Strides , typename Layout = DefaultLayout, typename = std::enable_if_t< ((std::is_convertible_v<ck::ranges::range_value_t<Lengths>, std::size_t> && std::is_convertible_v<ck::ranges::range_value_t<Strides>, std::size_t>) || (std::is_convertible_v<ck::ranges::range_value_t<Lengths>, ck::long_index_t> && std::is_convertible_v<ck::ranges::range_value_t<Strides>, ck::long_index_t>)) && std::is_convertible_v<Layout, BaseTensorLayout>>>
HostTensorDescriptor::HostTensorDescriptor |
( |
const Lengths & |
lens, |
|
|
const Strides & |
strides, |
|
|
const Layout & |
layout = Layout{} |
|
) |
| |
|
inline |