Vulkan 运行时
TVM 支持使用 Vulkan 计算着色器来执行查询。每个计算内核都被编译成 SPIR-V 着色器,然后可以使用 TVM 接口调用。
Vulkan 特性、限制
由于不同的 Vulkan 实现可能启用不同的可选特性或具有不同的物理限制,代码生成必须知道哪些特性可用。这些特性对应于特定的 Vulkan 功能/限制,如Vulkan 功能表所示。如果未指定,TVM 假定某项功能不可用,或者限制是 Vulkan 规范在必需限制部分中保证的最小值。
这些参数可以在定义目标 (Target)时显式指定,也可以从设备查询。要从设备查询,可以使用特殊参数 -from_device=N
从设备 ID N
查询所有 vulkan 设备参数。任何显式指定的附加参数都将覆盖从设备查询的参数。
目标参数 |
必需的 Vulkan 版本/扩展 |
查询的参数 |
默认值 |
---|---|---|---|
|
Vulkan 1.1+ |
|
0 (解释为 VkSubgroupFeatureFlagBits) |
|
|
128 字节 |
|
|
|
16384 字节 |
|
|
|
227 字节 |
|
|
|
4 |
|
|
VK_KHR_storage_buffer_storage_class |
false |
|
|
VK_KHR_8bit_storage |
|
false |
|
VK_KHR_16bit_storage |
|
false |
|
VK_KHR_shader_float16_int8 |
|
false |
|
|
false |
|
|
VK_KHR_shader_float16_int8 |
|
false |
|
|
false |
|
|
|
false |
截至 2021 年 5 月,并非所有 Vulkan 实现都受支持。例如,需要支持 64 位整数。如果 Vulkan 目标不受支持,则应在 SPIR-V 代码生成期间发出错误消息。目前也在努力消除这些要求并支持其他 Vulkan 实现。
SPIR-V 功能
某些设备特定的功能也对应于 SPIR-V 功能或扩展,这些功能或扩展必须在着色器中声明,或者使用某项功能所需的最低 SPIR-V 版本。TVM 生成的着色器将声明执行编译图所需的最低扩展/功能集以及 SPIR-V 的最低允许版本。
如果着色器生成需要 目标 (Target)
中未启用的功能或扩展,则会引发异常。
目标参数 |
必需的 SPIR-V 版本/扩展 |
声明的功能 |
---|---|---|
|
SPIR-V 1.3+ |
可变,请参阅 VkSubgroupFeatureFlagBits |
|
SPV_KHR_storage_buffer_storage_class |
|
|
SPV_KHR_8bit_storage |
StorageBuffer8BitAccess |
|
SPV_KHR_16bit_storage |
StorageBuffer16BitAccess |
|
Float16 |
|
|
Float64 |
|
|
Int8 |
|
|
Int16 |
|
|
Int64 |
Vulkan 特定环境变量
SPIR-V 代码生成和 Vulkan 运行时都有环境变量,可以修改一些运行时行为。这些变量旨在用于调试目的,既可以更轻松地测试特定代码路径,也可以根据需要输出更多信息。如果环境变量设置为非零整数,则所有布尔标志均为 true。未设置的变量、整数零或空字符串均为 false 布尔标志。
TVM_VULKAN_DISABLE_PUSH_DESCRIPTOR
- 一个布尔标志。如果为 true,TVM 将显式分配描述符,并且不会使用 VK_KHR_push_descriptor 或 VK_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 着色器保存到此目录,以用于调试目的。