# VK_ARM_tensors(3) Manual Page

## Name

VK_ARM_tensors - device extension

Loading… please wait.

## Registered Extension Number

461

## Revision

1

## Ratification Status

Not ratified

## Extension and Version Dependencies

Vulkan Version 1.3

## API Interactions

- Interacts with VK_EXT_descriptor_buffer

- Interacts with VK_EXT_frame_boundary

## SPIR-V Dependencies

- SPV_ARM_tensors

## Contact

- Kevin Petit [GitHub]kpet

## Extension Proposal

VK_ARM_tensors

## Other Extension Metadata

Last Modified Date

  2025-06-03

Interactions and External Dependencies

  - This extension requires `SPV_ARM_tensors`

  - This extension provides API support for `GL_ARM_tensors`

  - This extension interacts with `VK_EXT_mutable_descriptor_type`

  - This extension interacts with `VK_EXT_descriptor_buffer`

  - This extension interacts with `VK_EXT_frame_boundary`

  - This extension interacts with `VK_EXT_robustness2`

IP Status

  No known IP claims.

Contributors

  - Kévin Petit, Arm Ltd.

  - Einar Hov, Arm Ltd.

  - Dominic Symes, Arm Ltd.

  - Jan-Harald Fredriksen, Arm Ltd.

  - Marco Cattani, Arm Ltd.

  - Lisa Wu, Arm Ltd.

  - Robert Hughes, Arm Ltd.

  - David Garbett, Arm Ltd.

  - Oualid Khelifi, Arm Ltd.

## Description

This extension adds support for tensors.

## New Object Types

- VkTensorARM

- VkTensorViewARM

## New Commands

- vkBindTensorMemoryARM

- vkCmdCopyTensorARM

- vkCreateTensorARM

- vkCreateTensorViewARM

- vkDestroyTensorARM

- vkDestroyTensorViewARM

- vkGetDeviceTensorMemoryRequirementsARM

- vkGetPhysicalDeviceExternalTensorPropertiesARM

- vkGetTensorMemoryRequirementsARM

If VK_EXT_descriptor_buffer is supported:

- vkGetTensorOpaqueCaptureDescriptorDataARM

- vkGetTensorViewOpaqueCaptureDescriptorDataARM

## New Structures

- VkBindTensorMemoryInfoARM

- VkCopyTensorInfoARM

- VkDeviceTensorMemoryRequirementsARM

- VkExternalTensorPropertiesARM

- VkPhysicalDeviceExternalTensorInfoARM

- VkTensorCopyARM

- VkTensorCreateInfoARM

- VkTensorMemoryRequirementsInfoARM

- VkTensorViewCreateInfoARM

- Extending VkDataGraphPipelineResourceInfoARM, VkDataGraphPipelineConstantARM:

  - VkTensorDescriptionARM

- Extending VkDependencyInfo:

  - VkTensorDependencyInfoARM

  - VkTensorMemoryBarrierARM

- Extending VkFormatProperties2:

  - VkTensorFormatPropertiesARM

- Extending VkMemoryAllocateInfo:

  - VkMemoryDedicatedAllocateInfoTensorARM

- Extending VkPhysicalDeviceFeatures2, VkDeviceCreateInfo:

  - VkPhysicalDeviceTensorFeaturesARM

- Extending VkPhysicalDeviceProperties2:

  - VkPhysicalDeviceTensorPropertiesARM

- Extending VkTensorCreateInfoARM:

  - VkExternalMemoryTensorCreateInfoARM

- Extending VkWriteDescriptorSet:

  - VkWriteDescriptorSetTensorARM

If VK_EXT_descriptor_buffer is supported:

- VkTensorCaptureDescriptorDataInfoARM

- VkTensorViewCaptureDescriptorDataInfoARM

- Extending VkDescriptorGetInfoEXT:

  - VkDescriptorGetTensorInfoARM

- Extending VkPhysicalDeviceFeatures2, VkDeviceCreateInfo:

  - VkPhysicalDeviceDescriptorBufferTensorFeaturesARM

- Extending VkPhysicalDeviceProperties2:

  - VkPhysicalDeviceDescriptorBufferTensorPropertiesARM

If VK_EXT_frame_boundary is supported:

- Extending VkSubmitInfo, VkSubmitInfo2, VkPresentInfoKHR, VkBindSparseInfo:

  - VkFrameBoundaryTensorsARM

## New Enums

- VkTensorCreateFlagBitsARM

- VkTensorTilingARM

- VkTensorUsageFlagBitsARM

- VkTensorViewCreateFlagBitsARM

## New Bitmasks

- VkTensorCreateFlagsARM

- VkTensorUsageFlagsARM

- VkTensorViewCreateFlagsARM

## New Enum Constants

- `VK_ARM_TENSORS_EXTENSION_NAME`

- `VK_ARM_TENSORS_SPEC_VERSION`

- Extending VkDescriptorType:

  - `VK_DESCRIPTOR_TYPE_TENSOR_ARM`

- Extending VkFormat:

  - `VK_FORMAT_R8_BOOL_ARM`

- Extending VkFormatFeatureFlagBits2:

  - `VK_FORMAT_FEATURE_2_TENSOR_IMAGE_ALIASING_BIT_ARM`

  - `VK_FORMAT_FEATURE_2_TENSOR_SHADER_BIT_ARM`

- Extending VkImageLayout:

  - `VK_IMAGE_LAYOUT_TENSOR_ALIASING_ARM`

- Extending VkImageUsageFlagBits:

  - `VK_IMAGE_USAGE_TENSOR_ALIASING_BIT_ARM`

- Extending VkObjectType:

  - `VK_OBJECT_TYPE_TENSOR_ARM`

  - `VK_OBJECT_TYPE_TENSOR_VIEW_ARM`

- Extending VkStructureType:

  - `VK_STRUCTURE_TYPE_BIND_TENSOR_MEMORY_INFO_ARM`

  - `VK_STRUCTURE_TYPE_COPY_TENSOR_INFO_ARM`

  - `VK_STRUCTURE_TYPE_DEVICE_TENSOR_MEMORY_REQUIREMENTS_ARM`

  - `VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_TENSOR_CREATE_INFO_ARM`

  - `VK_STRUCTURE_TYPE_EXTERNAL_TENSOR_PROPERTIES_ARM`

  - `VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_TENSOR_ARM`

  - `VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_TENSOR_INFO_ARM`

  - `VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_FEATURES_ARM`

  - `VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_PROPERTIES_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_COPY_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_CREATE_INFO_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_DEPENDENCY_INFO_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_DESCRIPTION_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_FORMAT_PROPERTIES_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_MEMORY_BARRIER_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_MEMORY_REQUIREMENTS_INFO_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_VIEW_CREATE_INFO_ARM`

  - `VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_TENSOR_ARM`

If VK_EXT_descriptor_buffer is supported:

- Extending VkStructureType:

  - `VK_STRUCTURE_TYPE_DESCRIPTOR_GET_TENSOR_INFO_ARM`

  - `VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_FEATURES_ARM`

  - `VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_PROPERTIES_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_CAPTURE_DESCRIPTOR_DATA_INFO_ARM`

  - `VK_STRUCTURE_TYPE_TENSOR_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_ARM`

- Extending VkTensorCreateFlagBitsARM:

  - `VK_TENSOR_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_ARM`

- Extending VkTensorViewCreateFlagBitsARM:

  - `VK_TENSOR_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_ARM`

If VK_EXT_frame_boundary is supported:

- Extending VkStructureType:

  - `VK_STRUCTURE_TYPE_FRAME_BOUNDARY_TENSORS_ARM`

## New SPIR-V Capabilities

- `TensorsARM`

- `StorageTensorArrayDynamicIndexingARM`

- `StorageTensorArrayNonUniformIndexingARM`

## Issues

1) Should tensor strides be passed in elements or in bytes?

RESOLVED: Strides are passed in bytes but are required to be a multiple of the tensor element size. Passing strides in bytes makes it possible to relax this requirement in the future without an interface change. It also makes it easier to describe memory alignment requirements.

2) Should there be commands to copy data between tensors and buffers/images?

RESOLVED: Adding these commands would result in a rather large API surface and not insignificant implementation and validation cost. The same outcome can be achieved with memory aliasing and tensor to tensor copy operations.

3) Should this extension define transpose and/or other data reorganization operations?

RESOLVED: These operations are useful to expose but this extension is only meant to add base support for tensors. Additional operations should be layered on top and defined in other extensions.

4) Why are tensor strides described using signed integers?

RESOLVED: Negative strides make it possible to describe different linear data layouts. While this extension does not allow negative strides, it uses signed integers for strides to make it possible to relax this limitation in future extensions.

## Version History

- Revision 1, 2025-06-03 (Kévin Petit)

  - Initial revision

## See Also

No cross-references are available

## Document Notes

For more information, see the Vulkan Specification

This page is a generated document. Fixes and changes should be made to the generator scripts, not directly.

## Copyright

Copyright 2014-2025 The Khronos Group Inc.

SPDX-License-Identifier: CC-BY-4.0