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_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 target,则会在 SPIR-V 代码生成期间报错。我们正努力消除这些限制,并支持其他 Vulkan 实现。
SPIR-V 功能
某些特定于设备的功能还对应于 SPIR-V 功能或扩展,它们必须在着色器中声明,或对应于要使用某个功能所需的最低 SPIR-V 版本。TVM 生成的着色器将声明执行编译好的计算图所需的最小扩展/功能集,以及 SPIR-V 的最小允许版本。
若着色器生成需要 Target
中未启用的功能或扩展,则会引发异常。
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 |