Ondersteuning voor 16-bit drijvende-kommawaarden in WGSL
In WGSL is het f16
type de set van 16-bits drijvende-kommawaarden van het IEEE-754 binary16-formaat (halve precisie). Het betekent dat het 16 bits gebruikt om een getal met drijvende komma weer te geven, in tegenstelling tot 32 bits voor conventionele drijvende komma met enkele precisie ( f32
). Deze kleinere omvang kan tot aanzienlijke prestatieverbeteringen leiden, vooral bij het verwerken van grote hoeveelheden gegevens.
Ter vergelijking: op een Apple M1 Pro-apparaat is de f16
implementatie van Llama2 7B-modellen die worden gebruikt in de WebLLM-chatdemo aanzienlijk sneller dan de f32
implementatie, met een verbetering van 28% in de snelheid van vooraf invullen en een verbetering van 41% in de decoderingssnelheid, zoals weergegeven in de volgende schermafbeeldingen.
![Schermafbeelding van WebLLM-chatdemo's met f32- en f16 Llama2 7B-modellen.](https://developer.chrome.google.cn/static/blog/new-in-webgpu-120/image/webllm-chat-demos.png?authuser=6&hl=nl)
f32
(links) en f16
(rechts) Llama2 7B-modellen. Niet alle GPU's ondersteunen 16-bit drijvende-kommawaarden. Wanneer de functie "shader-f16"
beschikbaar is in een GPUAdapter
, kunt u nu een GPUDevice
met deze functie aanvragen en een WGSL-shadermodule maken die profiteert van het drijvende-kommatype f16
met halve precisie. Dit type is alleen geldig voor gebruik in de WGSL-shadermodule als u de f16
WGSL-extensie inschakelt met enable f16;
. Anders genereert createShaderModule() een validatiefout. Zie het volgende minimale voorbeeld en uitgave Dawn:1510 .
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
requiredFeatures: ["shader-f16"],
});
const code = `
enable f16;
@compute @workgroup_size(1)
fn main() {
const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
}
`;
const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...
Het is mogelijk om zowel f16
als f32
-typen te ondersteunen in de WGSL-shadermodulecode met een alias
afhankelijk van de ondersteuning van de functie "shader-f16"
zoals weergegeven in het volgende fragment.
const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");
const device = await adapter.requestDevice({
requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});
const header = hasShaderF16
? `enable f16;
alias min16float = f16;`
: `alias min16float = f32;`;
const code = `
${header}
@compute @workgroup_size(1)
fn main() {
const c = vec3<min16float>(1.0, 2.0, 3.0);
}
`;
Grenzen verleggen
Het maximale aantal bytes dat nodig is om één monster (pixel of subpixel) van uitvoergegevens van de renderpijplijn vast te houden, voor alle kleurbijlagen, is standaard 32 bytes. Het is nu mogelijk om maximaal 64 aan te vragen met behulp van de maxColorAttachmentBytesPerSample
limiet. Zie het volgende voorbeeld en uitgave Dawn:2036 .
const adapter = await navigator.gpu.requestAdapter();
if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
// When the desired limit isn't supported, take action to either fall back to
// a code path that does not require the higher limit or notify the user that
// their device does not meet minimum requirements.
}
// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});
De limieten maxInterStageShaderVariables
en maxInterStageShaderComponents
die worden gebruikt voor communicatie tussen fasen zijn op alle platforms verhoogd. Zie uitgave Dawn:1448 voor details.
Voor elke shaderfase is het maximale aantal bindgroepindelingsitems in een pijplijnindeling die opslagbuffers zijn standaard 8. Het is nu mogelijk om maximaal 10 aan te vragen met behulp van de maxStorageBuffersPerShaderStage
-limiet. Zie uitgave Dawn:2159 .
Er is een nieuwe maxBindGroupsPlusVertexBuffers
limiet toegevoegd. Het bestaat uit het maximale aantal gelijktijdig gebruikte bindgroep- en hoekpuntbufferslots, waarbij eventuele lege slots onder de hoogste index worden geteld. De standaardwaarde is 24. Zie issue dageraad:1849 .
Veranderingen in de staat van de diepte-stencil
Om de ontwikkelaarservaring te verbeteren, zijn de kenmerken depth-stencil-status depthWriteEnabled
en depthCompare
niet altijd meer vereist: depthWriteEnabled
is alleen vereist voor formaten met diepte, en depthCompare
is niet vereist voor formaten met diepte als deze helemaal niet worden gebruikt. Zie uitgave Dawn:2132 .
Updates van adapterinformatie
Niet-standaard type
en backend
-adapterinfo-kenmerken zijn nu beschikbaar bij het aanroepen van requestAdapterInfo() wanneer de gebruiker de vlag "WebGPU Developer Features" heeft ingeschakeld op chrome://flags/#enable-webgpu-developer-features
. Het type
kan "discrete GPU", "geïntegreerde GPU", "CPU" of "onbekend" zijn. De backend
is "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" of "null". Zie uitgave Dawn:2112 en uitgave Dawn:2107 .
![Schermafbeelding van https://webgpureport.org met backend en type adapterinformatie.](https://developer.chrome.google.cn/static/blog/new-in-webgpu-120/image/webgpureport.png?authuser=6&hl=nl)
De optionele lijstparameter unmaskHints
in requestAdapterInfo() is verwijderd. Zie uitgave Dawn:1427 .
Kwantisering van tijdstempelquery's
Met tijdstempelquery's kunnen applicaties de uitvoeringstijd van GPU-opdrachten meten met een nauwkeurigheid van nanoseconden. De WebGPU-specificatie maakt tijdstempelquery's echter optioneel vanwege zorgen over de timing van aanvallen . Het Chrome-team is van mening dat het kwantificeren van tijdstempelquery's een goed compromis biedt tussen precisie en veiligheid, door de resolutie terug te brengen tot 100 microseconden. Zie uitgave Dawn:1800 .
In Chrome kunnen gebruikers de kwantisering van tijdstempels uitschakelen door de vlag "WebGPU Developer Features" in te schakelen op chrome://flags/#enable-webgpu-developer-features
. Houd er rekening mee dat deze vlag alleen de functie "timestamp-query"
niet inschakelt. De implementatie ervan is nog experimenteel en vereist daarom de vlag "Onveilige WebGPU-ondersteuning" op chrome://flags/#enable-unsafe-webgpu
.
In Dawn is een nieuwe apparaatschakelaar met de naam "timestamp_quantization" toegevoegd, die standaard is ingeschakeld. In het volgende fragment ziet u hoe u de experimentele functie 'tijdstempelquery' zonder tijdstempelkwantisering kunt toestaan bij het aanvragen van een apparaat.
wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};
const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;
const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = ×tampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;
wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};
// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);
Lenteschoonmaakfuncties
De experimentele functie 'timestamp-query-inside-passes' is hernoemd naar 'chromium-experimental-timestamp-query-inside-passes' om ontwikkelaars duidelijk te maken dat deze functie experimenteel is en voorlopig alleen beschikbaar is in Chromium-gebaseerde browsers . Zie uitgave Dawn:1193 .
De experimentele functie "pipeline-statistics-query", die slechts gedeeltelijk was geïmplementeerd, is verwijderd omdat deze niet langer wordt ontwikkeld. Zie uitgave chroom:1177506 .
Dit behandelt slechts enkele van de belangrijkste hoogtepunten. Bekijk de uitgebreide lijst met commits .
Wat is er nieuw in WebGPU
Een lijst met alles wat aan bod komt in de What's New in WebGPU- serie.
Chroom 127
- Experimentele ondersteuning voor OpenGL ES op Android
- GPUAdapter info-kenmerk
- Verbeteringen in de interoperabiliteit van WebAssembly
- Verbeterde opdracht-encoderfouten
- Dawn-updates
Chroom 126
- Verhoog de maxTextureArrayLayers-limiet
- Bufferuploadoptimalisatie voor Vulkan-backend
- Verbeteringen in de compilatietijd van Shader
- Ingezonden opdrachtbuffers moeten uniek zijn
- Dawn-updates
Chroom 125
Chroom 124
- Alleen-lezen en lezen-schrijven opslagtexturen
- Ondersteuning van servicemedewerkers en gedeelde medewerkers
- Nieuwe attributen voor adapterinformatie
- Bugfixes
- Dawn-updates
Chroom 123
- DP4a ingebouwde functies ondersteunen in WGSL
- Onbeperkte pointerparameters in WGSL
- Syntaxissuiker voor het derefereren van composieten in WGSL
- Afzonderlijke alleen-lezen-status voor stencil- en diepteaspecten
- Dawn-updates
Chroom 122
- Vergroot het bereik met de compatibiliteitsmodus (functie in ontwikkeling)
- Verhoog de maxVertexAttributes-limiet
- Dawn-updates
Chroom 121
- Ondersteuning WebGPU op Android
- Gebruik DXC in plaats van FXC voor shader-compilatie op Windows
- Tijdstempelquery's in reken- en renderpassen
- Standaardingangspunten voor shadermodules
- Ondersteuning display-p3 als GPUExternalTexture-kleurruimte
- Informatie over geheugenheaps
- Dawn-updates
Chroom 120
- Ondersteuning voor 16-bit drijvende-kommawaarden in WGSL
- Grenzen verleggen
- Veranderingen in de staat van de diepte-stencil
- Updates van adapterinformatie
- Kwantisering van tijdstempelquery's
- Lenteschoonmaakfuncties
Chroom 119
- Filterbare 32-bit float-texturen
- unorm10-10-10-2 hoekpuntformaat
- rgb10a2uint textuurformaat
- Dawn-updates
Chroom 118
- HTMLImageElement- en ImageData-ondersteuning in
copyExternalImageToTexture()
- Experimentele ondersteuning voor lees-schrijf- en alleen-lezen opslagtextuur
- Dawn-updates
Chroom 117
- Schakel hoekpuntbuffer uit
- Schakel de bindingsgroep uit
- Stil fouten bij het maken van asynchrone pijplijnen wanneer het apparaat verloren gaat
- Updates voor het maken van SPIR-V-shadermodules
- Verbetering van de ontwikkelaarservaring
- Caching van pijplijnen met automatisch gegenereerde lay-out
- Dawn-updates
Chroom 116
- WebCodecs-integratie
- Verloren apparaat geretourneerd door GPUAdapter
requestDevice()
- Houd het afspelen van video soepel als
importExternalTexture()
wordt aangeroepen - Spec-conformiteit
- Verbetering van de ontwikkelaarservaring
- Dawn-updates
Chroom 115
- Ondersteunde WGSL-taalextensies
- Experimentele ondersteuning voor Direct3D 11
- Krijg standaard een discrete GPU op wisselstroom
- Verbetering van de ontwikkelaarservaring
- Dawn-updates
Chroom 114
- Optimaliseer JavaScript
- getCurrentTexture() op een niet-geconfigureerd canvas genereert InvalidStateError
- WGSL-updates
- Dawn-updates