Add extension subgroup-size-control#5578
Conversation
This patch adds a new WebGPU and WGSL extension `subgroup-size-control` based on `proposals/subgroup-size-control.md`.
|
Previews, as seen when this build job started (22e75bf): |
spec/index.bs
Outdated
| readonly attribute unsigned long minExplicitComputeSubgroupSize; | ||
| readonly attribute unsigned long maxExplicitComputeSubgroupSize; |
There was a problem hiding this comment.
It's a bit awkward that there are two min/max attributes. Are there devices where subgroupMin/MaxSize do not match min/maxExplicitComputeSubgroupSize?
There was a problem hiding this comment.
Separately the naming conventions seem mismatched. If these are needed, maybe explicit[Compute]SubgroupMinSize and explicit[Compute]SubgroupMaxSize. Not sure including compute is helpful.
There was a problem hiding this comment.
It's a bit awkward that there are two min/max attributes. Are there devices where subgroupMin/MaxSize do not match min/maxExplicitComputeSubgroupSize?
On D3D12 we should use D3D12_FEATURE_DATA_D3D12_OPTIONS1::waveLaneCountMin and D3D12_FEATURE_DATA_D3D12_OPTIONS1::waveLaneCountMax to verify the range of the [WaveSize] attribute in compute shader, but these two values are not always used as wgpu::AdapterInfo::subgroupMinSize or wgpu::AdapterInfo::subgroupMaxSize.
For example:
- On some Intel GPUs, it is possible to run some pixel shaders with wave lane count 8, while on that platform
waveLaneCountMinis 16, meaning in compute shaders the wave lane count will always be at least 16 (A toggle "d3d12_relax_min_subgroup_size_to_8" has been added for this issue). - Now Dawn always uses
128asSubgroupMaxSizebecause in D3D12 document "the WaveLaneCountMax queried from D3D12 API is not reliable and the meaning is unclear, whilewaveLaneCountMaxis actually the maximum value that can be used as HLSL attribute[WaveSize].
spec/index.bs
Outdated
|
|
||
| Note: To preserve privacy, the user agent may choose to not support some features or provide values | ||
| for the property which do not distinguish different devices, but are still usable | ||
| (e.g. use the default value of 4 for all devices). |
There was a problem hiding this comment.
I think this wouldn't work. The user agent can't default to 4 for all devices unless 4 is supported by all devices.
Maybe it would be better to say the user agent may choose a narrower range for min (and max) to limit distinguishing devices.
There was a problem hiding this comment.
Now I all use 0 as the default values since they won't be used when subgroup-size-control is not supported.
spec/index.bs
Outdated
|
|
||
| 1. If {{GPUFeatureName/"subgroup-size-control"}} is supported, set | ||
| {{GPUAdapterInfo/maxComputeWorkgroupSubgroups}} to the largest supported number of | ||
| subgroups per compute workgroup with explicit subgroup size. Otherwise, set this value to 32. |
There was a problem hiding this comment.
Is 32 guaranteed supported on all devices or are implementations expected to filter out devices with less?
vulkan.gpuinfo.org seems to indicate there are devices that only support 16.
There was a problem hiding this comment.
Now I all use 0 as the default values since they won't be used when subgroup-size-control is not supported.
|
Should this PR also update the correspondence reference? |
Done |
|
PTAL, thanks! |
| : <dfn>maxComputeWorkgroupSubgroups</dfn> | ||
| :: | ||
| If the {{GPUFeatureName/"subgroup-size-control"}} feature is supported, the maximum | ||
| number of subgroups per workgroup when [=attribute/subgroup_size=] is used in compute shaders | ||
| on the [=adapter=]. | ||
|
|
There was a problem hiding this comment.
This isn't mentioned in the correspondence. Where does this limit come from?
| Note: To preserve privacy, the user agent may choose a larger value for the property which do not | ||
| distinguish different devices, but are still usable. |
There was a problem hiding this comment.
| Note: To preserve privacy, the user agent may choose a larger value for the property which do not | |
| distinguish different devices, but are still usable. | |
| Note: To preserve privacy, the user agent may choose a larger value for the property which does not | |
| distinguish different devices, but is still usable. |
| Note: To preserve privacy, the user agent may choose a smaller value for the property which do not | ||
| distinguish different devices, but are still usable. |
There was a problem hiding this comment.
| Note: To preserve privacy, the user agent may choose a smaller value for the property which do not | |
| distinguish different devices, but are still usable. | |
| Note: To preserve privacy, the user agent may choose a smaller value for the property which does not | |
| distinguish different devices, but is still usable. |
|
|
||
| 1. If {{GPUFeatureName/"subgroup-size-control"}} is supported, set | ||
| {{GPUAdapterInfo/explicitComputeSubgroupMinSize}} to the smallest supported explicit compute | ||
| subgroup size. Otherwise, set this value to 0. |
There was a problem hiding this comment.
This text should explicitly refer to the @subgroup_size attribute in WGSL. Similarly for the Max limit.
| Note: To preserve privacy, the user agent may choose a smaller value for the property which do not | ||
| distinguish different devices, but are still usable. |
There was a problem hiding this comment.
| Note: To preserve privacy, the user agent may choose a smaller value for the property which do not | |
| distinguish different devices, but are still usable. | |
| Note: To preserve privacy, the user agent may choose a smaller value for the property which does not | |
| distinguish different devices, but is still usable. |
| 1. |entryPoint| |must| use ≤ | ||
| <code>|subgroupSize| × |this|.{{GPUDevice/adapterInfo}}.{{GPUAdapterInfo/maxComputeWorkgroupSubgroups}}</code> | ||
| per workgroup. |
There was a problem hiding this comment.
I think there's a word missing from this sentence. What must be less than or equal to the given expression?
| <h3 id=dom-gpufeaturename-subgroup-size-control data-dfn-type=enum-value data-dfn-for=GPUFeatureName>`"subgroup-size-control"` | ||
| </h3> | ||
|
|
||
| Allows the use of [=attribute/subgroup_size=] attribute in WGSL to control over compute pipeline subgroup size. |
There was a problem hiding this comment.
| Allows the use of [=attribute/subgroup_size=] attribute in WGSL to control over compute pipeline subgroup size. | |
| Allows the use of the [=attribute/subgroup_size=] attribute in WGSL to control compute pipeline subgroup size. |
jimblandy
left a comment
There was a problem hiding this comment.
My comments above were mostly editorial, but there was one spot that required a fix.
mwyrzykowski
left a comment
There was a problem hiding this comment.
In general the concept seems fine as an optional extension, as noted on Metal this property is read only and can not be configured as far as I know.
This patch adds a new WebGPU and WGSL extension
subgroup-size-controlbased on subgroup-size-control.md.
Fixed: #5545