Eksperymentowanie z podgrupami
Funkcja podgrup umożliwia równoległość na poziomie SIMD, umożliwiając wątkom w grupie komunikację i wykonywanie zbiorczych operacji matematycznych (np. sumowanie 16 liczb). To bardzo wydajna forma udostępniania danych między wątkami.
Minimalna implementacja propozycji grup podrzędnych jest dostępna do testowania lokalnego za pomocą flagi „Niebezpieczne obsługi WebGPU” na stronie chrome://flags/#enable-unsafe-webgpu
.
Możesz też wypróbować grupy podrzędne w swojej witrynie z udziałem prawdziwych użytkowników, rejestrując się w programie próbnym Origin. Instrukcje dotyczące przygotowania witryny do testowania origin znajdziesz w artykule Pierwsze kroki z testowaniem origin. Wersja próbna origin będzie dostępna w Chrome od wersji 128 do 131 (do 19 lutego 2025 r.). Zobacz Intencje eksperymentowania.
Gdy funkcja "subgroups"
będzie dostępna w GPUAdapter
, poproś o GPUDevice
z tą funkcją, aby uzyskać obsługę podgrup w WGSL, i sprawdź limity minSubgroupSize
i maxSubgroupSize
.
Musisz też wyraźnie włączyć to rozszerzenie w kodzie WGSL za pomocą instrukcji enable subgroups;
. Po włączeniu tej opcji uzyskasz dostęp do tych funkcji:
subgroup_invocation_id
: wbudowana wartość indeksu wątku w podgrupie.subgroup_size
: wbudowana wartość dostępu do rozmiaru podgrupy.subgroupBallot(value)
: zwraca zbiór pól bitowych, w których bit odpowiadający wartościsubgroup_invocation_id
ma wartość 1, jeślivalue
ma wartość true w przypadku danego aktywnego wywołania, a w przeciwnym razie – wartość 0.subgroupBroadcast(value, id)
: rozgłaszavalue
z wywołania zsubgroup_invocation_id
pasującym doid
we wszystkich wywołaniach w podgrupie. Uwaga:id
musi być stałą wartościową kompilacji.
W przyszłości dodamy więcej wbudowanych funkcji, takich jak subgroupAdd
, subgroupAll
, subgroupElect
i subgroupShuffle
. Zobacz problem 354738715.
Aby umożliwić użycie funkcji f16 w operacjach na podgrupach, poproś o GPUDevice
z funkcjami "subgroups"
, "subgroups-f16"
i "shader-f16"
, a potem włącz tę funkcję w kodzie WGSL za pomocą instrukcji enable f16, subgroups, subgroups_f16;
.
Poniższy fragment kodu stanowi podstawę do eksperymentowania i odkrywania możliwości podgrup.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
requiredFeatures: ["subgroups"],
});
const shaderModule = device.createShaderModule({ code: `
enable subgroups;
var<workgroup> wgmem : u32;
@group(0) @binding(0)
var<storage, read> inputs : array<u32>;
@group(0) @binding(1)
var<storage, read_write> output : array<u32>;
@compute @workgroup_size(64)
fn main(@builtin(subgroup_size) subgroupSize : u32,
@builtin(subgroup_invocation_id) id : u32,
@builtin(local_invocation_index) lid : u32) {
// One thread per workgroup writes the value to workgroup memory.
if (lid == 0) {
wgmem = inputs[lid];
}
workgroupBarrier();
var v = 0u;
// One thread per subgroup reads the value from workgroup memory
// and shares that value with every other thread in the subgroup
// to reduce local memory bandwidth.
if (id == 0) {
v = wgmem;
}
v = subgroupBroadcast(v, 0);
output[lid] = v;
}`,
});
// Send the appropriate commands to the GPU...
wycofanie obsługi ustawień zniekształcenia głębi w przypadku linii i punktów;
Zmiana specyfikacji WebGPU powoduje, że ustawianie wartości depthBias
, depthBiasSlopeScale
i depthBiasClamp
na niezerową powoduje błąd walidacji, gdy topologia dla potoku renderowania jest typu linia lub punkt. Aby dać deweloperom wystarczająco dużo czasu na zaktualizowanie kodu, w konsoli Narzędzi deweloperskich wyświetla się ostrzeżenie o nadchodzącej weryfikacji, a wartości są ustawiane na 0. Zobacz problem 352567424.
Ukrywanie ostrzeżenia w Narzędziach deweloperskich w przypadku nieuchwyconego błędu, jeśli wywołano funkcję preventDefault
W Konsoli DevTools ostrzeżenia dotyczące zdarzeń uncapturederror
nie są już wyświetlane, jeśli zarejestrowano detektor zdarzeń uncapturederror
i w wywołaniu zwrotnym detektora zdarzeń wywołano metodę zdarzenia preventDefault()
. Takie działanie odpowiada obsłudze zdarzeń w JavaScript. Zobacz poniższy przykład i problem 40263619.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
device.addEventListener("uncapturederror", (event) => {
// Prevents browser warning to show up in the DevTools Console.
event.preventDefault();
// TODO: Handle event.error
});
WGSL najpierw interpoluje próbkowanie, a potem:
Atrybut WGSL interpolate
umożliwia zarządzanie definiowaną przez użytkownika interpolacją danych wejścia-wyjścia. Nowe parametry próbkowania interpolacji first
(domyślne) i either
dają Ci dodatkową kontrolę: first
wykorzystuje wartość z pierwszego wierzchołka prostego, a either
dopuszcza pierwszy lub ostatni wierzchołek. Zobacz problem 340278447.
Aktualizacje świtu
Zaimplementowano WGPUFuture z Dawn, aby obsługiwać operacje asynchroniczne. Kluczowe pojęcia to wgpuInstanceProcessEvents do przetwarzania zdarzeń w ramach możliwości oraz WGPUCallbackMode do definiowania lokalizacji wywołań zwrotnych. WGPUFuture oznacza zdarzenia jednorazowe o nieskończonym czasie działania, a metoda wgpuInstanceWaitAny oczekuje na zakończenie wszelkich przyszłych wydarzeń lub przekroczenie limitu czasu. Zobacz problem 42240932.
Wartość CompositeAlphaMode::Auto
nie jest już rejestrowana przez Surface::GetCapabilities()
. Nadal jest ważny i jest równoważny z Surface::GetCapabilities().alphaMode[0]
. Zobacz problem 292.
Backend OpenGL obsługuje teraz Surface
z odwróceniem w osi Y dla każdego wywołania Present()
. Zobacz problem 344814083.
Metoda Adapter::GetProperties()
została wycofana i zastąpiona metodą Adapter::GetInfo()
.
Jaswant, zewnętrzny współtwórca, przepisał wszystkie pliki CMake, dzięki czemu łatwiej je aktualizować i umożliwić kompilację wstępną. Aby dowiedzieć się, jak używać Dawn w projektach CMake, zapoznaj się z krótkim przewodnikiem.
To tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą commitów.
Co nowego w WebGPU
Lista wszystkich tematów omawianych w cyklu Co nowego w WebGPU.
Chrome 130
- Łączenie z podwójnym źródłem
- Skrócony czas kompilowania shadera w metalu
- Wycofanie metody requestAdapterInfo() klasy GPUAdapter
- Aktualizacje dotyczące Dawn
Chrome 129
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofanie obsługi ustawiania głębi dla linii i punktów
- Ukrywanie ostrzeżenia DevTools o nieuwzględnionym błędzie, jeśli wywołano funkcję preventDefault
- WGSL interpoluje próbkowanie najpierw i potem
- Aktualizacje dotyczące Dawn
Chrome 127
- Doświadczalna obsługa OpenGL ES na Androidzie
- Atrybut informacji o GPUAdapter
- Ulepszenia interoperacyjności WebAssembly
- Poprawione błędy kodowania poleceń
- Aktualizacje dotyczące Dawn
Chrome 126
- Zwiększenie limitu maxTextureArrayLayers
- Optymalizacja przesyłania buforów w backendzie Vulkan
- Ulepszenia dotyczące czasu kompilacji shaderów
- Przesłane bufory poleceń muszą być unikalne
- Aktualizacje dotyczące Dawn
Chrome 125
Chrome 124
- Tekstury tylko do odczytu i do odczytu i zapisu
- Obsługa pracowników usług i pracowników wspólnych
- Nowe atrybuty informacji o adapterze
- Poprawki błędów
- Aktualizacje dotyczące Dawn
Chrome 123
- Obsługa wbudowanych funkcji DP4a w WGSL
- Nieograniczone parametry wskaźnika w WGSL
- Składnia cukrowa do odwoływania się do elementów złożonych w WGSL
- Oddzielny stan tylko do odczytu dla stempli i aspektów głębi
- Informacje o świcie
Chrome 122
- Zwiększenie zasięgu dzięki trybowi zgodności (funkcja w trakcie tworzenia)
- Zwiększenie limitu maxVertexAttributes
- Aktualizacje dotyczące Dawn
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilowania danych do cieniowania w systemie Windows
- Zapytania o sygnatury czasowe w przelotach obliczeniowych i renderowania
- Domyślne punkty wejścia do modułów shaderów
- Obsługuj display-p3 jako przestrzeń kolorów GPUExternalTexture
- Informacje o kupach pamięci
- Aktualizacje dotyczące Dawn
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przesuwaj granice
- Zmiany stanu głębi cieniowania
- Aktualizacje informacji o adapterze
- Kwantyzacja zapytań dotyczących sygnatury czasowej
- Funkcje wiosenne porządki
Chrome 119
- Filtrowane tekstury 32-bitowe zmiennoprzecinkowe
- format wierzchołkowy unorm10-10-10-2
- Format tekstury rgb10a2uint
- Aktualizacje dotyczące Dawn
Chrome 118
- Obsługa HTMLImageElement i ImageData w
copyExternalImageToTexture()
- Eksperymentalna obsługa tekstury pamięci masowej tylko do odczytu i do odczytu i zapisu
- Informacje o świcie
Chrome 117
- Bufor wierzchołka nieustawiony
- Nieskonfigurowana grupa powiązań
- Błędy w przypadku tworzenia asynchronicznego potoku, gdy urządzenie jest utracone
- Aktualizacje dotyczące tworzenia modułów shaderów SPIR-V
- Ułatwienie pracy programistom
- Przetwarzanie za pomocą przepływów z automatycznie wygenerowanym układem
- Aktualizacje dotyczące Dawn
Chrome 116
- Integracja z WebCodecs
- Utracone urządzenie zwrócone przez GPUAdapter
requestDevice()
- Utrzymanie płynnego odtwarzania filmu, jeśli wywołana zostanie funkcja
importExternalTexture()
- Zgodność ze specyfikacją
- Ułatwienie pracy programistom
- Informacje o świcie
Chrome 115
- Obsługiwane rozszerzenia języka WGSL
- Eksperymentalna obsługa interfejsu Direct3D 11
- Uzyskaj oddzielny procesor graficzny domyślnie na zasilaniu z sieci
- Ułatwienie pracy programistom
- Aktualizacje dotyczące Dawn
Chrome 114
- Optymalizacja kodu JavaScript
- getCurrentTexture() na nieskonfigurowanym płótnie powoduje błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje dotyczące Dawn