跳到主要内容
版本:0.12.0

Vulkan Runtime

TVM 支持用 Vulkan 计算着色器(Vulkan compute shaders)来查询。所有计算内核都被编译成一个 SPIR-V 着色器,然后可以用 TVM 接口来调用它。

Vulkan 的功能和限制

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

这些参数应在定义 Target 时明确指定,或是可从设备中查询。若要从设备查询,可用特殊参数 -from_device=N 从 id 为 N 的设备中,查询所有 vulkan 设备参数。任何显式指定的附加参数,都会覆盖从设备查询的参数。

Target 参数要求的 Vulkan 版本/扩查询参数默认值
supported_subgroup_operationsVulkan 1.1+VkPhysicalDeviceSubgroupProperties::supportedOperations0 (interpreted as VkSubgroupFeatureFlagBits)
max_push_constants_sizeVkPhysicalDeviceLimits::maxPushConstantsSize128 bytes
max_uniform_buffer_rangeVkPhysicalDeviceLimits::maxUniformBufferRange16384 bytes
max_storage_buffer_rangeVkPhysicalDeviceLimits::maxStorageBufferRange227bytes
max_per_stage_descriptor_storage_bufferVkPhysicalDeviceLimits::maxPerStageDescriptorStorageBuffers4
supports_storage_buffer_storage_classVK_KHR_storage_buffer_storage_classfalse
supports_storage_buffer_8bit_accessVK_KHR_8bit_storageVkPhysicalDevice8BitStorageFeaturesKHR::storageBuffer8BitAccessfalse
supports_storage_buffer_16bit_accessVK_KHR_16bit_storageVkPhysicalDevice16BitStorageFeaturesKHR::storageBuffer16BitAccessfalse
supports_float16VK_KHR_shader_float16_int8VkPhysicalDeviceShaderFloat16Int8FeaturesKHR::shaderFloat16false
supports_float64VkPhysicalDeviceFeatures::shaderFloat64false
supports_int8VK_KHR_shader_float16_int8VkPhysicalDeviceShaderFloat16Int8FeaturesKHR::shaderInt8false
supports_int16VkPhysicalDeviceFeatures::shaderInt16false
supports_int64VkPhysicalDeviceFeatures::shaderInt64false

截至 2021 年 5 月,还有一些 Vulkan 的实现没支持。例如,要支持 64 位整数。若不支持 Vulkan target,则会在 SPIR-V 代码生成期间报错。我们正努力消除这些限制,并支持其他 Vulkan 实现。

SPIR-V 功能

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

若着色器生成需要 Target 中未启用的功能或扩展,则会引发异常。

Target 参数要求的 SPIR-V 版本/扩展声明的功能
supported_subgroup_operationsSPIR-V 1.3+Varies, see VkSubgroupFeatureFlagBits
supports_storage_buffer_storage_classSPV_KHR_storage_buffer_storage_class
supports_storage_buffer_8bit_accessSPV_KHR_8bit_storageStorageBuffer8BitAccess
supports_storage_buffer_16bit_accessSPV_KHR_16bit_storageStorageBuffer16BitAccess
supports_float16Float16
supports_float64Float64
supports_int8Int8
supports_int16Int16
supports_int64Int64

Vulkan 特定的环境变量

SPIR-V 代码生成和 Vulkan runtime 都有可以修改某些 runtime 行为的环境变量。这些变量用于调试,既可以轻松地测试特定代码路径,也可以根据需要输出更多信息。

若环境变量被设置为非零整数,则所有布尔标志都为真。未设置的变量、整数零或空字符串,都是错误的布尔标志。

  • 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 着色器保存到此目录,用于调试。