Unterstützung für 16-Bit-Gleitkommawerte in WGSL
In WGSL ist der f16
-Typ die Menge von 16-Bit-Gleitkommawerten im IEEE-754-Binärformat 16 (Halbpräzision). Das bedeutet, dass für eine Gleitkommazahl 16 Bit verwendet werden, im Gegensatz zu 32 Bit für einen herkömmlichen Gleitkommawert mit einfacher Genauigkeit (f32
). Diese kleinere Größe kann insbesondere bei der Verarbeitung großer Datenmengen zu erheblichen Leistungsverbesserungen führen.
Auf einem Apple M1 Pro-Gerät ist die f16
-Implementierung von Llama2 7B-Modellen, die in der WebLLM-Chat-Demo verwendet werden, deutlich schneller als die f32
-Implementierung. Die Vorabfüllgeschwindigkeit ist um 28% und die Dekodierungsgeschwindigkeit um 41% verbessert, wie in den folgenden Screenshots dargestellt.
Nicht alle GPUs unterstützen 16-Bit-Gleitkommawerte. Wenn die Funktion "shader-f16"
in einer GPUAdapter
verfügbar ist, können Sie jetzt mit dieser Funktion ein GPUDevice
anfordern und ein WGSL-Shader-Modul erstellen, das den Gleitkommatyp f16
mit halber Genauigkeit nutzt. Dieser Typ kann nur dann im WGSL-Shader-Modul verwendet werden, wenn Sie die WGSL-Erweiterung f16
mit enable f16;
aktivieren. Andernfalls generiert createShaderModule() einen Validierungsfehler. Sehen Sie sich das folgende Beispiel und issue dawn:1510 an.
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...
Es ist möglich, sowohl f16
- als auch f32
-Typen im WGSL-Shader-Modulcode mit einem alias
zu unterstützen, das von der "shader-f16"
-Featureunterstützung abhängt, wie im folgenden Snippet gezeigt.
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);
}
`;
Geh an die Grenzen
Die maximale Anzahl von Byte, die zur Aufnahme einer Stichprobe (Pixel oder Subpixel) von Ausgabedaten der Rendering-Pipeline über alle Farbanhänge hinweg erforderlich ist, beträgt standardmäßig 32 Byte. Über das Limit maxColorAttachmentBytesPerSample
können jetzt bis zu 64 angefordert werden. Sehen Sie sich das folgende Beispiel und issue dawn:2036 an.
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 },
});
Die Limits für maxInterStageShaderVariables
und maxInterStageShaderComponents
für die Kommunikation zwischen den Phasen wurden auf allen Plattformen erhöht. Weitere Informationen finden Sie unter Problem dawn:1448.
Für jede Shader-Phase beträgt die maximale Anzahl von Bindgruppen-Layouteinträgen in einem Pipeline-Layout, die Speicherpuffer sind, standardmäßig 8. Über das Limit maxStorageBuffersPerShaderStage
können jetzt bis zu zehn Anfragen gesendet werden. Weitere Informationen finden Sie unter Problem dawn:2159.
Ein neues Limit für maxBindGroupsPlusVertexBuffers
wurde hinzugefügt. Sie besteht aus der maximalen Anzahl von Bindungsgruppen- und Scheitelpunkt-Pufferslots, die gleichzeitig verwendet werden, wobei alle leeren Slots unter dem höchsten Index gezählt werden. Der Standardwert ist 24. Siehe Problem dawn:1849.
Änderungen am Status der Tiefenschablone
Um die Entwicklung für Entwickler zu verbessern, sind die Attribute „Schablonenstatus“ depthWriteEnabled
und depthCompare
nicht mehr erforderlich: depthWriteEnabled
ist nur für Formate mit Tiefe erforderlich und depthCompare
ist nicht mehr für Formate mit Tiefe erforderlich, wenn sie gar nicht verwendet werden. Weitere Informationen finden Sie unter Problem dawn:2132.
Aktualisierung der Adapterinformationen
Nicht standardmäßige type
- und backend
-Adapterinformationen sind jetzt beim Aufrufen von requestAdapterInfo() verfügbar, wenn der Nutzer die Kennzeichnung „WebGPU Developer Features“ bei chrome://flags/#enable-webgpu-developer-features
aktiviert hat. Die type
kann eine „diskrete GPU“, „integrierte GPU“, „CPU“ oder „unbekannt“ sein. backend
ist entweder "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" oder "null". Weitere Informationen finden Sie unter Ausgabe:2112 und Ausgabe:2107.
Der optionale Listenparameter unmaskHints
in requestAdapterInfo() wurde entfernt. Weitere Informationen finden Sie unter Problem dawn:1427.
Quantisierung von Zeitstempelabfragen
Mit Zeitstempelabfragen können Anwendungen die Ausführungszeit von GPU-Befehlen auf Nanosekunden genau messen. Die WebGPU-Spezifikation macht Zeitstempelabfragen jedoch aufgrund von Bedenken hinsichtlich zeitlicher Angriffen optional. Das Chrome-Team ist der Meinung, dass die Quantisierung von Zeitstempelabfragen einen guten Kompromiss zwischen Präzision und Sicherheit darstellt, da die Auflösung auf 100 Mikrosekunden reduziert wird. Weitere Informationen finden Sie unter Problem dawn:1800.
In Chrome können Nutzer die Zeitstempelquantisierung deaktivieren, indem sie das Flag „WebGPU Developer Features“ auf chrome://flags/#enable-webgpu-developer-features
aktivieren. Durch dieses Flag wird die Funktion "timestamp-query"
nicht aktiviert. Seine Implementierung befindet sich noch in der Testphase und erfordert daher das Flag „Unsafe WebGPU Support“ bei chrome://flags/#enable-unsafe-webgpu
.
In „Dawn“ wurde eine neue Geräteauswahl namens „timestamp_quantization“ hinzugefügt, die standardmäßig aktiviert ist. Das folgende Snippet zeigt, wie Sie die experimentelle Funktion „Zeitstempel-Abfrage“ ohne Zeitstempel-Quantisierung beim Anfordern eines Geräts zulassen.
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);
Frühjahrsputz-Funktionen
Die experimentelle Funktion „timestamp-query-inside-passes“ wurde in „chromium-experimental-timestamp-query-inside-passes“ umbenannt, um Entwicklern zu verdeutlichen, dass diese Funktion sich noch in der Testphase befindet und derzeit nur in Chromium-basierten Browsern verfügbar ist. Weitere Informationen finden Sie unter Problem dawn:1193.
Die experimentelle Funktion „pipeline-statistics-query“, die nur teilweise implementiert wurde, wurde entfernt, da sie sich nicht mehr in der Entwicklung befindet. Siehe Problem „chromium:1177506“.
Dies sind nur einige der wichtigsten Punkte. Hier finden Sie eine vollständige Liste der Commits.
Neu bei WebGPU
Hier finden Sie eine Liste aller Inhalte, die in der Reihe What's New in WebGPU behandelt wurden.
Chrome 125
Chrome 124
- Schreibgeschützte und nicht schreibgeschützte Speichertexturen
- Unterstützung für Service Worker und Shared Worker
- Neue Attribute für Adapterinformationen
- Diverse Fehlerkorrekturen
- Updates zum Morgengrauen
Chrome 123
- Unterstützung von integrierten Funktionen in DP4a in WGSL
- Uneingeschränkte Zeigerparameter in WGSL
- Syntax für die Dereferenzierung von zusammengesetzten Elementen in WGSL
- Separater schreibgeschützter Status für Schablonen- und Tiefenaspekte
- Updates zum Morgengrauen
Chrome 122
- Reichweite mit Kompatibilitätsmodus erhöhen (Funktion in Entwicklung)
- Limit für „maxVertexAttributes“ erhöhen
- Updates zum Morgengrauen
Chrome 121
- Unterstützung von WebGPU unter Android
- Für die Shader-Kompilierung unter Windows DXC statt FXC verwenden
- Zeitstempelabfragen in Rechen- und Renderingdurchläufen
- Standardeinstiegspunkte für Shader-Module
- display-p3 als GPUExternalTexture-Farbraum unterstützen
- Informationen zum Arbeitsspeicher-Heaps
- Updates zum Morgengrauen
Chrome 120
- Unterstützung von 16-Bit-Gleitkommawerten in WGSL
- Gehe an die Grenzen
- Änderungen am Status der Tiefenschablone
- Aktualisierungen der Adapterinformationen
- Quantisierung von Zeitstempelabfragen
- Frühjahrsputz-Funktionen
Chrome 119
- Filterbare 32-Bit-Float-Texturen
- Vertex-Format „unorm10-10-10-2“
- rgb10a2uint Texturformat
- Updates zum Morgengrauen
Chrome 118
- Unterstützung von HTMLImageElement und ImageData in
copyExternalImageToTexture()
- Experimentelle Unterstützung für nicht schreibgeschützte und schreibgeschützte Speichertexturen
- Updates zum Morgengrauen
Chrome 117
- Nicht festgelegter Vertex-Zwischenspeicher
- Bindungsgruppe aufheben
- Fehler aufgrund asynchroner Pipelineerstellung bei Verlust des Geräts stummschalten
- Updates zur Erstellung von SPIR-V-Shader-Modulen
- Entwicklererfahrung verbessern
- Pipelines mit automatisch generiertem Layout im Cache speichern
- Updates zum Morgengrauen
Chrome 116
- WebCodecs-Integration
- Verlorenes Gerät vom GPUAdapter
requestDevice()
zurückgegeben - Für eine flüssige Videowiedergabe bei
importExternalTexture()
-Aufrufen sorgen - Spezifikationskonformität
- Entwicklererfahrung verbessern
- Updates zum Morgengrauen
Chrome 115
- Unterstützte WGSL-Spracherweiterungen
- Experimentelle Unterstützung für Direct3D 11
- Diskrete GPU standardmäßig mit Netzstrom betreiben
- Entwicklererfahrung verbessern
- Updates zum Morgengrauen
Chrome 114
- JavaScript optimieren
- getCurrentTexture() auf nicht konfiguriertem Canvas wirft InvalidStateError
- Updates zu WGSL
- Updates zum Morgengrauen