Vulkan 运行时

TVM 支持使用 Vulkan 计算着色器来执行查询。每个计算内核都被编译成 SPIR-V 着色器,然后可以使用 TVM 接口调用。

Vulkan 特性、限制

由于不同的 Vulkan 实现可能启用不同的可选特性或具有不同的物理限制,代码生成必须知道哪些特性可用。这些特性对应于特定的 Vulkan 功能/限制,如Vulkan 功能表所示。如果未指定,TVM 假定某项功能不可用,或者限制是 Vulkan 规范在必需限制部分中保证的最小值。

这些参数可以在定义目标 (Target)时显式指定,也可以从设备查询。要从设备查询,可以使用特殊参数 -from_device=N 从设备 ID N 查询所有 vulkan 设备参数。任何显式指定的附加参数都将覆盖从设备查询的参数。

Vulkan 功能

目标参数

必需的 Vulkan 版本/扩展

查询的参数

默认值

supported_subgroup_operations

Vulkan 1.1+

VkPhysicalDeviceSubgroupProperties::supportedOperations

0 (解释为 VkSubgroupFeatureFlagBits)

max_push_constants_size

VkPhysicalDeviceLimits::maxPushConstantsSize

128 字节

max_uniform_buffer_range

VkPhysicalDeviceLimits::maxUniformBufferRange

16384 字节

max_storage_buffer_range

VkPhysicalDeviceLimits::maxStorageBufferRange

227 字节

max_per_stage_descriptor_storage_buffer

VkPhysicalDeviceLimits::maxPerStageDescriptorStorageBuffers

4

supports_storage_buffer_storage_class

VK_KHR_storage_buffer_storage_class

false

supports_storage_buffer_8bit_access

VK_KHR_8bit_storage

VkPhysicalDevice8BitStorageFeaturesKHR::storageBuffer8BitAccess

false

supports_storage_buffer_16bit_access

VK_KHR_16bit_storage

VkPhysicalDevice16BitStorageFeaturesKHR::storageBuffer16BitAccess

false

supports_float16

VK_KHR_shader_float16_int8

VkPhysicalDeviceShaderFloat16Int8FeaturesKHR::shaderFloat16

false

supports_float64

VkPhysicalDeviceFeatures::shaderFloat64

false

supports_int8

VK_KHR_shader_float16_int8

VkPhysicalDeviceShaderFloat16Int8FeaturesKHR::shaderInt8

false

supports_int16

VkPhysicalDeviceFeatures::shaderInt16

false

supports_int64

VkPhysicalDeviceFeatures::shaderInt64

false

截至 2021 年 5 月,并非所有 Vulkan 实现都受支持。例如,需要支持 64 位整数。如果 Vulkan 目标不受支持,则应在 SPIR-V 代码生成期间发出错误消息。目前也在努力消除这些要求并支持其他 Vulkan 实现。

SPIR-V 功能

某些设备特定的功能也对应于 SPIR-V 功能或扩展,这些功能或扩展必须在着色器中声明,或者使用某项功能所需的最低 SPIR-V 版本。TVM 生成的着色器将声明执行编译图所需的最低扩展/功能集以及 SPIR-V 的最低允许版本。

如果着色器生成需要 目标 (Target) 中未启用的功能或扩展,则会引发异常。

Vulkan 功能

目标参数

必需的 SPIR-V 版本/扩展

声明的功能

supported_subgroup_operations

SPIR-V 1.3+

可变,请参阅 VkSubgroupFeatureFlagBits

supports_storage_buffer_storage_class

SPV_KHR_storage_buffer_storage_class

supports_storage_buffer_8bit_access

SPV_KHR_8bit_storage

StorageBuffer8BitAccess

supports_storage_buffer_16bit_access

SPV_KHR_16bit_storage

StorageBuffer16BitAccess

supports_float16

Float16

supports_float64

Float64

supports_int8

Int8

supports_int16

Int16

supports_int64

Int64

Vulkan 特定环境变量

SPIR-V 代码生成和 Vulkan 运行时都有环境变量,可以修改一些运行时行为。这些变量旨在用于调试目的,既可以更轻松地测试特定代码路径,也可以根据需要输出更多信息。如果环境变量设置为非零整数,则所有布尔标志均为 true。未设置的变量、整数零或空字符串均为 false 布尔标志。

  • TVM_VULKAN_DISABLE_PUSH_DESCRIPTOR - 一个布尔标志。如果为 true,TVM 将显式分配描述符,并且不会使用 VK_KHR_push_descriptorVK_KHR_descriptor_update_template 扩展。如果为 false,TVM 将根据这些扩展的可用性决定是否使用它们。

  • TVM_VULKAN_DISABLE_DEDICATED_ALLOCATION - 一个布尔标志。如果为 true,TVM 不会将内存分配标记为专用分配,并且不会使用 VK_KHR_dedicated_allocation 扩展。如果为 false,TVM 将根据该缓冲区的 VkMemoryDedicatedRequirements 决定是否应将内存分配标记为专用。

  • TVM_VULKAN_ENABLE_VALIDATION_LAYERS - 一个布尔标志。如果为 true,TVM 将启用设备支持的 Vulkan 验证层。如果为 false,则不启用任何验证层。

  • TVM_VULKAN_DISABLE_SHADER_VALIDATION - 一个布尔标志。如果为 true,则跳过使用 spvValidate 完成的 SPIR-V 着色器验证。如果为 false(默认),则 TVM 生成的所有 SPIR-V 着色器都将使用 spvValidate 进行验证。

  • TVM_VULKAN_DEBUG_SHADER_SAVEPATH - 目录的路径。如果设置为非空字符串,Vulkan 代码生成器会将 tir、二进制 SPIR-V 和反汇编的 SPIR-V 着色器保存到此目录,以用于调试目的。