Ondersteuning voor 16-bits zwevendekommawaarden in WGSL
In WGSL is het f16-type de set van 16-bits drijvende-kommawaarden van de IEEE-754 binary16-indeling (halve precisie). Dit betekent dat het 16 bits gebruikt om een drijvendekommagetal weer te geven, in tegenstelling tot 32 bits voor conventionele drijvendekommagetallen met enkele precisie (f32). Deze kleinere grootte kan leiden tot aanzienlijke prestatieverbeteringen, vooral bij de verwerking van grote hoeveelheden gegevens.
Ter vergelijking: op een Apple M1 Pro-apparaat is de f16-implementatie van Llama2 7B-modellen die wordt gebruikt in de WebLLM-chatdemo aanzienlijk sneller dan de f32-implementatie. De prefill-snelheid is 28% hoger en de decodesnelheid is 41% hoger, zoals te zien is in de volgende screenshots.
f32 (links) en f16 (rechts) Llama2 7B-modellen.Niet alle GPU's ondersteunen 16-bits zwevende kommawaarden. Als de functie "shader-f16" beschikbaar is in een GPUAdapter, kun je nu een GPUDevice met deze functie aanvragen en een WGSL-shadermodule maken die gebruikmaakt van het half-precision zwevende-komma-type f16. Dit type is alleen geldig voor gebruik in de WGSL-shader-module als je de f16 WGSL-extensie aanzet met enable f16;. Anders genereert createShaderModule() een validatiefout. Bekijk het volgende minimale voorbeeld en probleem 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 het type f16 als het type f32 te ondersteunen in de WGSL-shader-modulecode met een alias, afhankelijk van de ondersteuning voor de functie "shader-f16", zoals getoond 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);
}
`;
De grenzen verleggen
Het maximale aantal bytes dat nodig is om één voorbeeld (pixel of subpixel) van de uitvoergegevens van de weergavepijplijn op te slaan, voor alle kleurbijlagen, is standaard 32 bytes. Je kunt nu maximaal 64 verzoeken indienen met de limiet van maxColorAttachmentBytesPerSample. Bekijk het volgende voorbeeld en probleem 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 voor maxInterStageShaderVariables en maxInterStageShaderComponents die worden gebruikt voor communicatie tussen fasen, zijn op alle platforms verhoogd. Ga naar issue dawn:1448 voor meer informatie.
Voor elke shaderfase is het maximumaantal bind group layout-items in een pijplijnlayout dat opslagbuffers is, standaard 8. Je kunt er nu maximaal 10 aanvragen met de limiet maxStorageBuffersPerShaderStage. Ga naar probleem dawn:2159.
Er is een nieuwe limiet voor maxBindGroupsPlusVertexBuffers toegevoegd. Het bestaat uit het maximale aantal bindgroep- en hoekpuntbufferslots dat tegelijkertijd wordt gebruikt, waarbij lege slots onder de hoogste index worden meegeteld. De standaardwaarde is 24. Ga naar issue dawn:1849.
Wijzigingen in de diepte-stencilstatus
We willen de ontwikkelaarservaring verbeteren. Daarom zijn de kenmerken depthWriteEnabled en depthCompare niet altijd meer vereist: depthWriteEnabled is alleen vereist voor indelingen met diepte en depthCompare is niet vereist voor indelingen met diepte als het helemaal niet wordt gebruikt. Ga naar probleem dawn:2132.
Updates van adaptergegevens
Niet-standaard kenmerken voor type- en backend-adapterinformatie zijn nu beschikbaar als requestAdapterInfo() wordt aangeroepen en de gebruiker de flag WebGPU Developer Features (WebGPU-ontwikkelaarsfuncties) heeft aangezet op chrome://flags/#enable-webgpu-developer-features. De type kan Discrete GPU, Geïntegreerde GPU, CPU of Onbekend zijn. De backend is WebGPU, D3D11, D3D12, metal, vulkan, openGL, openGLES of null. Ga naar issue dawn:2112 en issue dawn:2107.
De optionele lijstparameter unmaskHints in requestAdapterInfo() is verwijderd. Ga naar issue dawn:1427.
Kwantisatie van tijdstempelquery's
Met tijdstempelquery's kunnen apps de uitvoeringstijd van GPU-opdrachten meten met een nauwkeurigheid van nanoseconden. De WebGPU-specificatie maakt tijdstempelquery's optioneel vanwege zorgen over timingaanvallen. Het Chrome-team is van mening dat het kwantificeren van tijdstempelquery's een goed compromis is tussen nauwkeurigheid en beveiliging, omdat de resolutie wordt verlaagd naar 100 microseconden. Ga naar issue dawn:1800.
In Chrome kunnen gebruikers kwantisering van tijdstempels uitzetten door de flag WebGPU-ontwikkelaarsfuncties aan te zetten op chrome://flags/#enable-webgpu-developer-features. Deze vlag alleen zet de functie "timestamp-query" niet aan. De implementatie is nog experimenteel en vereist daarom de vlag 'Unsafe WebGPU Support' op chrome://flags/#enable-unsafe-webgpu.
In Dawn is een nieuwe apparaatwissel toegevoegd met de naam timestamp_quantization. Deze staat standaard aan. Het volgende fragment toont hoe je de experimentele functie timestamp-query toestaat zonder timestampkwantisering als je een apparaat aanvraagt.
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);
Functies voor de voorjaarsschoonmaak
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 op dit moment alleen beschikbaar is in Chromium-browsers. Ga naar probleem dawn:1193.
De experimentele functie pipeline-statistics-query, die maar gedeeltelijk was geïmplementeerd, is verwijderd omdat deze niet meer wordt ontwikkeld. Ga naar issue chromium:1177506.
Dit zijn maar enkele van de belangrijkste punten. Neem de uitgebreide lijst met doorvoeringen door.
Wat is er nieuw in WebGPU?
Een lijst met alles wat is behandeld in de serie Nieuw in WebGPU.
Chrome 155-156
- WGSL-extensie fragment_depth
- Textuurcompressie niet uitgelijnd
- Kleurruimten srgb-lineair en display-p3-lineair
- Aanvullende hoekpuntindeling snorm10-10-10-2
- f16-ondersteuning op Linux voor NVIDIA
- Updates voor Dageraad
Chrome 153-154
- WGSL buffer_view-extensie
- WGSL-extensie voor swizzle-toewijzing
- Updates voor WGSL-extensies
- Updates voor Dageraad
Chrome 151-152
- Subgroepgrootte beheren
- OperationError voor validatiefouten voor setImmediates
- Updates voor Dageraad
Chrome 149-150
Chrome 147-148
Chrome 146
- Ondersteuning voor de WebGPU-compatibiliteitsmodus op OpenGL ES 3.1
- Tijdelijke bijlagen
- WGSL-extensie texture_and_sampler_let
- Updates voor Dageraad
Chrome 145
- WGSL-extensie subgroup_uniformity
- Experimentele synchrone buffermapping in werknemers
- Updates voor Dageraad
Chrome 144
- WGSL-extensie subgroup_id
- WGSL uniform_buffer_standard_layout-extensie
- WebGPU op Linux
- Snellere writeBuffer en writeTexture
- Updates voor Dageraad
Chrome 143
- Swizzle van textuurcomponent
- Gebruik van alleen-lezen opslagtextuur bgra8unorm verwijderen
- Updates voor Dageraad
Chrome 142
Chrome 141
- Tint IR afgerond
- Analyse van gehele getallen in de WGSL-compiler
- SPIR-V 1.4-update voor Vulkan-backend
- Updates voor Dageraad
Chrome 140
- Apparaatverzoeken verbruiken de adapter
- Afkorting voor het gebruik van textuur als de textuurweergave wordt gebruikt
- WGSL textureSampleLevel ondersteunt 1D-textures
- Gebruik van alleen-lezen opslagtextuur bgra8unorm beëindigen
- Kenmerk isFallbackAdapter van GPUAdapter verwijderen
- Updates voor Dageraad
Chrome 139
- Ondersteuning voor 3D-texturen voor BC- en ASTC-gecomprimeerde indelingen
- Nieuwe functie kernfuncties en limieten
- Origin trial voor de compatibiliteitsmodus van WebGPU
- Updates voor Dageraad
Chrome 138
- Afkorting voor het gebruik van een buffer als bindende bron
- Wijzigingen in de formaatvereisten voor buffers die bij het maken zijn toegewezen
- Architectuurrapport voor recente GPU's
- Kenmerk isFallbackAdapter van GPUAdapter beëindigen
- Updates voor Dageraad
Chrome 137
- Textuurweergave gebruiken voor externe textuurbinding
- Buffers copy without specifying offsets and size
- WGSL workgroupUniformLoad met een pointer naar atomic
- Kenmerk powerPreference van GPUAdapterInfo
- Kenmerk compatibilityMode verwijderen uit GPURequestAdapterOptions
- Updates voor Dageraad
Chrome 136
- Kenmerk isFallbackAdapter van GPUAdapterInfo
- Verbeteringen in de compilatietijd van shaders op D3D12
- Canvasafbeeldingen opslaan en kopiëren
- Beperkingen voor de compatibiliteitsmodus voor impact
- Updates voor Dageraad
Chrome 135
- Pijplijnindeling maken met een null-bindgroepindeling toestaan
- Toestaan dat viewports buiten de grenzen van de weergavedoelen vallen
- Makkelijker toegang tot de experimentele compatibiliteitsmodus op Android
- De limiet maxInterStageShaderComponents verwijderen
- Updates voor Dageraad
Chrome 134
- Workloads voor machine learning verbeteren met subgroepen
- Ondersteuning verwijderen voor zwevende filterbare textuurtypen als mengbaar
- Updates voor Dageraad
Chrome 133
- Aanvullende unorm8x4-bgra- en 1-component vertex-indelingen
- Toestaan dat onbekende limieten worden aangevraagd met een niet-gedefinieerde waarde
- Wijzigingen in de uitlijningsregels voor WGSL
- WGSL-prestatieverbeteringen met discard
- VideoFrame.displaySize gebruiken voor externe texturen
- Afbeeldingen met niet-standaard richtingen verwerken met copyExternalImageToTexture
- De ontwikkelaarservaring verbeteren
- De compatibiliteitsmodus aanzetten met featureLevel
- Opschoning van experimentele subgroepfuncties
- De limiet maxInterStageShaderComponents beëindigen
- Updates voor Dageraad
Chrome 132
- Gebruik van textuurweergave
- 32-bits floating-point texture blending
- GPUDevice-kenmerk adapterInfo
- Als u het canvascontext configureert met een ongeldige indeling, treedt er een JavaScript-fout op
- Beperkingen voor het filteren van samplers op texturen
- Uitgebreide experimenten met subgroepen
- De ontwikkelaarservaring verbeteren
- Experimentele ondersteuning voor genormaliseerde 16-bits textuurindelingen
- Updates voor Dageraad
Chrome 131
- Afstanden knippen in WGSL
- GPUCanvasContext getConfiguration()
- Punt- en lijnprimitieven mogen geen dieptebias hebben
- Inclusieve scan met ingebouwde functies voor subgroepen
- Experimentele ondersteuning voor indirect tekenen met meerdere tekeningen
- Optie voor compilatie van shader-modules strict math
- GPUAdapter requestAdapterInfo() verwijderen
- Updates voor Dageraad
Chrome 130
- Mengen van 2 bronnen
- Verbeteringen in de compilatietijd van shaders op Metal
- Beëindiging van GPUAdapter requestAdapterInfo()
- Updates voor Dageraad
Chrome 129
- HDR-ondersteuning met de modus voor tinttoewijzing van het canvas
- Uitgebreide ondersteuning voor subgroepen
- Updates voor Dageraad
Chrome 128
- Experimenteren met subgroepen
- Dieptebias instellen voor lijnen en punten wordt beëindigd
- DevTools-waarschuwing voor niet-vastgelegde fout verbergen als preventDefault
- WGSL interpoleert eerst de sampling en daarna
- Updates voor Dageraad
Chrome 127
- Experimentele ondersteuning voor OpenGL ES op Android
- Kenmerk info van GPUAdapter
- Verbeteringen in WebAssembly-interoperabiliteit
- Verbeterde fouten in opdrachtcodering
- Updates voor Dageraad
Chrome 126
- De limiet voor maxTextureArrayLayers verhogen
- Optimalisatie van bufferuploads voor Vulkan-backend
- Verbeteringen in de compilatietijd van shaders
- Ingediende opdrachtbuffers moeten uniek zijn
- Updates voor Dageraad
Chrome 125
- Subgroepen (functie in ontwikkeling)
- Renderen naar een segment van een 3D-textuur
- Updates voor Dageraad
Chrome 124
- Alleen-lezen en lees-/schrijftopslagtexturen
- Ondersteuning voor service workers en shared workers
- Nieuwe kenmerken voor adapterinformatie
- Bug fixes
- Updates voor Dageraad
Chrome 123
- Ondersteuning voor ingebouwde DP4a-functies in WGSL
- Onbeperkte aanwijzerparameters in WGSL
- Syntactische suiker voor het derefereren van samengestelde typen in WGSL
- Aparte alleen-lezen status voor stencils en diepte
- Updates voor Dageraad
Chrome 122
- Uw bereik vergroten met de compatibiliteitsmodus (functie in ontwikkeling)
- De limiet voor maxVertexAttributes verhogen
- Updates voor Dageraad
Chrome 121
- WebGPU ondersteunen op Android
- DXC gebruiken in plaats van FXC voor shadercompilatie in Windows
- Tijdstempelquery's in berekenings- en weergavefasen
- Standaard toegangspunten voor shadermodules
- Ondersteuning voor display-p3 als GPUExternalTexture-kleurruimte
- Informatie over geheugen-heaps
- Updates voor Dageraad
Chrome 120
- Ondersteuning voor 16-bits zwevendekommawaarden in WGSL
- De grenzen verleggen
- Wijzigingen in de diepte-stencilstatus
- Updates van adaptergegevens
- Kwantisatie van tijdstempelquery's
- Functies voor voorjaarsschoonmaak
Chrome 119
- Filterbare 32-bits float-texturen
- unorm10-10-10-2-hoekpuntindeling
- rgb10a2uint-textuurindeling
- Updates voor Dageraad
Chrome 118
- Ondersteuning voor HTMLImageElement en ImageData in
copyExternalImageToTexture() - Experimentele ondersteuning voor opslagtexturen met lees-/schrijfrechten en alleen-lezenrechten
- Updates voor Dageraad
Chrome 117
- Knooppuntbuffer verwijderen
- Bindgroep verwijderen
- Fouten bij het maken van een asynchrone pijplijn negeren als het apparaat kwijt is
- Updates voor het maken van SPIR-V-shadermodules
- De ontwikkelaarservaring verbeteren
- Caching-pipelines met automatisch gegenereerde indeling
- Updates voor Dageraad
Chrome 116
- WebCodecs-integratie
- Verloren apparaat geretourneerd door GPUAdapter
requestDevice() - Zorgen dat video's vloeiend worden afgespeeld als
importExternalTexture()wordt aangeroepen - Specificatieovereenstemming
- De ontwikkelaarservaring verbeteren
- Updates voor Dageraad
Chrome 115
- Ondersteunde WGSL-taalextensies
- Experimentele ondersteuning voor Direct3D 11
- Standaard discrete GPU bij netvoeding
- De ontwikkelaarservaring verbeteren
- Updates voor Dageraad
Chrome 114
- JavaScript van Optimize
- getCurrentTexture() voor niet-ingestelde canvas geeft InvalidStateError
- WGSL-updates
- Updates voor Dageraad