Vulkan-Docs/appendices/VK_EXT_subgroup_size_control.txt
Jon Leech 7b81afeb9f Change log for July 20, 2019 Vulkan 1.1.116 spec update:
* Happy 50th Lunar Landing Day!
  * Update release number to 116.

Internal Issues:

  * Clarify that flink:vkCmdBeginQuery is the same as
    flink:vkCmdBeginQueryIndexEXT with index = 0, and that
    flink:vkCmdEndQuery is the same as flink:vkCmdEndQueryIndexEXT with
    index = 0 (internal issue 1735).
  * Clarify that when copying the depth aspect between buffers and images
    via slink:VkBufferImage Copy, the depth values in buffer memory must be
    in range if the `<<VK_EXT_depth_range_unrestricted>>` extension is not
    enabled (internal issue 1737).
  * Minor language tweaks in the <<spirvenv-module-validation, Validation
    Rules within a Module>> section (internal issue 1744).
  * Change the slink:VkPhysicalDeviceFloatControlsPropertiesKHR structure in
    the `<<VK_KHR_shader_controls>>` extension. This is a rare case of
    breaking the interface of an existing extension to acknowledge the
    reality of divergent vendor implementations that could not be described
    properly otherwise, and the breaking change is considered acceptable
    given the expected low use of the extension (internal issue 1734).
    Specific changes:
  ** Added the slink:VkShaderFloatControlsIndependenceKHR enumeration to
     describe the three possible behaviors.
  ** Renamed pname:separateDenormSettings to
     pname:denormBehaviorIndependence.
  ** Renamed pname:separateRoundingModeSettings to
     pname:roundingModeIndependence
  * Add a missing valid usage statement for
    slink:VkQueryPoolCreateInfo::pname:queryCount (internal issue 1742).
  * Update the `<<VK_NV_shading_rate_image>>` appendix to list all
    interfaces defined by the extension.
  * Add a valid usage statement to
    slink:VkWriteDescriptorSetAccelerationStructureNV to clarify that
    acceleration structure descriptors must be top level structures.

New Extensions:

  * `<<VK_EXT_subgroup_size_control>>`
2019-07-20 01:49:16 -07:00

93 lines
3.5 KiB
Plaintext

// Copyright (c) 2017-2019 Khronos Group. This work is licensed under a
// Creative Commons Attribution 4.0 International License; see
// http://creativecommons.org/licenses/by/4.0/
include::meta/VK_EXT_subgroup_size_control.txt[]
*Last Modified Date*::
2019-03-05
*Contributors*::
- Jeff Bolz, NVIDIA
- Jason Ekstrand, Intel
- Sławek Grajewski, Intel
- Jesse Hall, Google
- Neil Henning, AMD
- Daniel Koch, NVIDIA
- Jeff Leger, Qualcomm
- Graeme Leese, Broadcom
- Allan MacKinnon, Google
- Mariusz Merecki, Intel
- Graham Wihlidal, Electronic Arts
=== Short Description
Enables an implementation to control the subgroup size by allowing a varying
subgroup size and also specifying a required subgroup size.
=== Description
This extension extends the subgroup support in Vulkan 1.1 to allow an
implementation to expose a varying subgroup size.
Previously Vulkan exposed a single subgroup size per physical device, with
the expectation that implementations will behave as if all subgroups have
the same size.
Some implementations may: dispatch shaders with a varying subgroup size for
different subgroups.
As a result they could implicitly split a large subgroup into smaller
subgroups or represent a small subgroup as a larger subgroup, some of whose
invocations were inactive on launch.
To aid developers in understanding the performance characteristics of their
programs, this extension exposes a minimum and maximum subgroup size that a
physical device supports and a pipeline create flag to enable that pipeline
to vary its subgroup size.
If enabled, any code:SubgroupSize decorated variables in the SPIR-V shader
modules provided to pipeline creation may: vary between the
<<limits-min-subgroup-size,minimum>> and
<<limits-max-subgroup-size,maximum>> subgroup sizes.
An implementation is also optionally allowed to support specifying a
required subgroup size for a given pipeline stage.
Implementations advertise which <<limits-required-subgroup-size-stages,
stages support a required subgroup size>>, and any pipeline of a supported
stage can be passed a
slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure to
set the subgroup size for that shader stage of the pipeline.
For compute shaders, this requires the developer to query the
<<limits-max-subgroups-per-workgroup, pname:maxComputeWorkgroupSubgroups>>
and ensure that:
[latexmath]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
s = {WorkGroupSize.x * WorkGroupSize.y * WorkgroupSize.z <= SubgroupSize * maxComputeWorkgroupSubgroups }
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Developers can also specify a new pipeline shader stage create flag that
requires the implementation to have fully populated subgroups within local
workgroups.
This requires the workgroup size in the X dimension to be a multiple of the
subgroup size.
=== New Enum Constants
* Extending elink:VkStructureType:
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT
** ename:VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT
* Extending elink:VkPipelineShaderStageCreateFlagBits:
** ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
** ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
=== New Structures
* slink:VkPhysicalDeviceSubgroupSizeControlPropertiesEXT
* slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
=== Issues
None.
=== Version History
* Revision 1, 2019-03-05 (Neil Henning)
- Initial draft