Vulkan 运行时#

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

Vulkan 特性与限制#

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

这些参数在定义 Target 时可以是明确指定的,或者可以从设备中查询。要从设备中查询,可以使用特殊的参数 -from_device=N 来获取设备 ID 为 N 的所有 Vulkan 设备参数。任何额外明确指定的参数都将覆盖从设备查询到的参数。

Vulkan 功能#

Target 参数

所需的 Vulkan 版本/扩展

参数查询

默认值

supported_subgroup_operations

Vulkan 1.1+

VkPhysicalDeviceSubgroupProperties::supportedOperations

0 (interpreted as VkSubgroupFeatureFlagBits)

max_push_constants_size

VkPhysicalDeviceLimits::maxPushConstantsSize

128 bytes

max_uniform_buffer_range

VkPhysicalDeviceLimits::maxUniformBufferRange

16384 bytes

max_storage_buffer_range

VkPhysicalDeviceLimits::maxStorageBufferRange

227bytes

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 功能#

Target 参数

所需SPIR-V版本/扩展

声明的能力

supported_subgroup_operations

SPIR-V 1.3+

Varies, see 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 运行时均包含环境变量,这些变量可以调整运行时的某些行为。它们主要用于调试目的,旨在更便捷地测试特定代码路径,并根据需要输出更多信息。所有布尔标志在环境变量被设置为非零整数时都为真。未设置的变量、整数零或空字符串都被视为假的布尔标志。

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

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

  • TVM_VULKAN_ENABLE_VALIDATION_LAYERS - 布尔标志。如果为真,TVM 将启用设备支持的 Vulkan validation layers。如果为假,则不启用任何验证层。

  • TVM_VULKAN_DISABLE_SHADER_VALIDATION 布尔标志。如果设置为真,则跳过使用 spvValidate 进行的 SPIR-V shader 验证。如果为假(默认设置),则由 TVM 生成的所有 SPIR-V shaders 都将通过 spvValidate 进行验证。

  • TVM_VULKAN_DEBUG_SHADER_SAVEPATH - 指向目录的路径。如果设置为非空字符串,Vulkan 代码生成器将把中间表示(IR)、二进制SPIR-V以及反汇编的SPIR-V着色器保存到这个目录中,用于调试目的。