| // Copyright 2016-2021 The Khronos Group Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_EXT_shader_subgroup_vote.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2016-11-28 |
| *IP Status*:: |
| No known IP claims. |
| *Interactions and External Dependencies*:: |
| - This extension requires |
| {spirv}/KHR/SPV_KHR_subgroup_vote.html[`SPV_KHR_subgroup_vote`] |
| - This extension provides API support for |
| https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_group_vote.txt[`GL_ARB_shader_group_vote`] |
| *Contributors*:: |
| - Neil Henning, Codeplay |
| - Daniel Koch, NVIDIA Corporation |
| |
| === Description |
| |
| This extension adds support for the following SPIR-V extension in Vulkan: |
| |
| * `SPV_KHR_subgroup_vote` |
| |
| This extension provides new SPIR-V instructions: |
| |
| * code:OpSubgroupAllKHR, |
| * code:OpSubgroupAnyKHR, and |
| * code:OpSubgroupAllEqualKHR. |
| |
| to compute the composite of a set of boolean conditions across a group of |
| shader invocations that are running concurrently (a _subgroup_). |
| These composite results may be used to execute shaders more efficiently on a |
| slink:VkPhysicalDevice. |
| |
| When using GLSL source-based shader languages, the following shader |
| functions from GL_ARB_shader_group_vote can map to these SPIR-V |
| instructions: |
| |
| * code:anyInvocationARB() -> code:OpSubgroupAnyKHR, |
| * code:allInvocationsARB() -> code:OpSubgroupAllKHR, and |
| * code:allInvocationsEqualARB() -> code:OpSubgroupAllEqualKHR. |
| |
| The subgroup across which the boolean conditions are evaluated is |
| implementation-dependent, and this extension provides no guarantee over how |
| individual shader invocations are assigned to subgroups. |
| In particular, a subgroup has no necessary relationship with the compute |
| shader _local workgroup_ -- any pair of shader invocations in a compute |
| local workgroup may execute in different subgroups as used by these |
| instructions. |
| |
| Compute shaders operate on an explicitly specified group of threads (a local |
| workgroup), but many implementations will also group non-compute shader |
| invocations and execute them concurrently. |
| When executing code like |
| |
| [source,c++] |
| ---------------------------------------- |
| if (condition) { |
| result = do_fast_path(); |
| } else { |
| result = do_general_path(); |
| } |
| ---------------------------------------- |
| |
| where code:condition diverges between invocations, an implementation might |
| first execute code:do_fast_path() for the invocations where code:condition |
| is true and leave the other invocations dormant. |
| Once code:do_fast_path() returns, it might call code:do_general_path() for |
| invocations where code:condition is code:false and leave the other |
| invocations dormant. |
| In this case, the shader executes *both* the fast and the general path and |
| might be better off just using the general path for all invocations. |
| |
| This extension provides the ability to avoid divergent execution by |
| evaluating a condition across an entire subgroup using code like: |
| |
| [source,c++] |
| ---------------------------------------- |
| if (allInvocationsARB(condition)) { |
| result = do_fast_path(); |
| } else { |
| result = do_general_path(); |
| } |
| ---------------------------------------- |
| |
| The built-in function code:allInvocationsARB() will return the same value |
| for all invocations in the group, so the group will either execute |
| code:do_fast_path() or code:do_general_path(), but never both. |
| For example, shader code might want to evaluate a complex function |
| iteratively by starting with an approximation of the result and then |
| refining the approximation. |
| Some input values may require a small number of iterations to generate an |
| accurate result (code:do_fast_path) while others require a larger number |
| (code:do_general_path). |
| In another example, shader code might want to evaluate a complex function |
| (code:do_general_path) that can be greatly simplified when assuming a |
| specific value for one of its inputs (code:do_fast_path). |
| |
| === Deprecated by Vulkan 1.1 |
| |
| All functionality in this extension is superseded by the core Vulkan 1.1 |
| <<VkPhysicalDeviceSubgroupProperties, subgroup operations>>. |
| |
| include::{generated}/interfaces/VK_EXT_shader_subgroup_vote.txt[] |
| |
| === New SPIR-V Capabilities |
| |
| * <<spirvenv-capabilities-table-SubgroupVoteKHR,SubgroupVoteKHR>> |
| |
| === Version History |
| |
| * Revision 1, 2016-11-28 (Daniel Koch) |
| - Initial draft |