子群
Vulkan 规范将子群定义为
一组着色器调用,它们可以彼此同步并高效地共享数据。在计算着色器中,局部工作组是子群的超集。 |
对于许多实现,子群是同时运行相同指令的调用组。子群允许着色器编写者以比单个工作组更精细的粒度工作。
资源
有关子群的更详细信息,请参阅优秀的 Khronos 博客文章以及 Vulkan 开发人员日 2018 的演示文稿(幻灯片 和 视频)。GLSL 支持可以在 GL_KHR_shader_subgroup 扩展中找到。
子群大小
重要的是还要意识到,对于实现来说,子群的大小可以是动态的。某些实现可能会为不同的子群分派具有不同子群大小的着色器。因此,它们可能会隐式地将一个大型子群拆分为更小的子群,或者将一个小型子群表示为一个更大的子群,其中一些调用在启动时处于非活动状态。
检查支持
在 Vulkan 1.1 中,有关子群的所有信息都可以在 VkPhysicalDeviceSubgroupProperties
中找到
VkPhysicalDeviceSubgroupProperties subgroupProperties;
VkPhysicalDeviceProperties2KHR deviceProperties2;
deviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
deviceProperties2.pNext = &subgroupProperties;
vkGetPhysicalDeviceProperties2(physicalDevice, &deviceProperties2);
// Example of checking if supported in fragment shader
if ((subgroupProperties.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT) != 0) {
// fragment shaders supported
}
// Example of checking if ballot is supported
if ((subgroupProperties.supportedOperations & VK_SUBGROUP_FEATURE_BALLOT_BIT) != 0) {
// ballot subgroup operations supported
}