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 podgrup jest dostępna do lokalnych testów z oznaczeniem „Unsafe WebGPU Support” (Obsługa niebezpiecznego procesora WebGPU) na stronie chrome://flags/#enable-unsafe-webgpu
.
Możesz też wypróbować w swojej witrynie podgrupy z prawdziwymi użytkownikami, rejestrując się do udziału w testowaniu origin. Więcej informacji o przygotowaniu witryny do korzystania z testów wersji próbnej Origin znajdziesz w artykule Pierwsze kroki z testami wersji próbnej Origin. Wersja próbna origin będzie dostępna w Chrome od wersji 128 do 131 (do 19 lutego 2025 r.). Patrz sekcja Zamiar 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
.
Rozszerzenie musisz też włączyć w kodzie WGSL za pomocą atrybutu enable subgroups;
. Gdy włączysz to ustawienie, uzyskasz dostęp do tych dodatkowych funkcji:
subgroup_invocation_id
: wbudowana wartość indeksu wątku w podgrupie.subgroup_size
: wbudowana wartość dostępu do rozmiaru podgrupy.subgroupBallot(value)
: zwraca zestaw pól bitowych, gdzie bit odpowiadający funkcjisubgroup_invocation_id
ma wartość 1, jeśli parametrvalue
ma wartość prawda w przypadku tego aktywnego wywołania, lub wartość 0 w przeciwnym razie.subgroupBroadcast(value, id)
: przesyłavalue
z wywołania z parametremsubgroup_invocation_id
pasującym doid
do wszystkich wywołań 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.
Ukryj ostrzeżenie o nieprzechwyconym błędzie w Narzędziach deweloperskich w przypadku funkcji 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 interpolacją danych zdefiniowanych przez użytkownika IO. Nowe parametry interpolacji próbkowania first
(domyślny) i either
zapewniają dodatkową kontrolę: first
używa wartości z pierwszego wierzchołka prymitywu, a either
pozwala na użycie pierwszego lub ostatniego wierzchołka. Zapoznaj się z problemem 340278447.
Aktualizacje świtu
Implementacja WGPUFuture w Dawn do obsługi operacji asynchronicznych została zakończona. Najważniejsze pojęcia to wgpuInstanceProcessEvents do obsługi oportunistycznego przetwarzania zdarzeń i WGPUCallbackMode do definiowania lokalizacji wywołania zwrotnego. WGPUFuture oznacza jednorazowe zdarzenia o nieograniczonym czasie trwania, a wgpuInstanceWaitAny oczekuje na zakończenie dowolnego przyszłego zdarzenia lub 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ą. Zapoznaj się z krótkim wprowadzeniem dotyczącym używania Dawn w projektach CMake.
Obejmuje to tylko niektóre najważniejsze informacje. Zapoznaj się z pełną listą commitów.
Co nowego w WebGPU
Lista wszystkich tematów omawianych w cyklu Co nowego w WebGPU.
Chrome 131
- Odcinki odległości w WGSL
- GPUCanvasContext getConfiguration()
- Punkty i linie nie mogą mieć ustawienia głębi
- Funkcje wbudowane w skanowanie z uwzględnieniem wszystkich grup
- Dodanie eksperymentalnej obsługi pośredniego rysowania wielokrotnego
- Opcja kompilacji modułu shadera: ścisłe obliczenia matematyczne
- Usuwanie metody requestAdapterInfo() klasy GPUAdapter
- Aktualizacje dotyczące Dawn
Chrome 130
- Łączenie z podwójnym źródłem
- Skrócony czas kompilowania shadera w metalu
- Wycofanie metody requestAdapterInfo() klasy GPUAdapter
- Informacje o świcie
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 karcie GPU
- Ulepszenia interoperacyjności WebAssembly
- Poprawione błędy kodera poleceń
- Informacje o świcie
Chrome 126
- Zwiększenie limitu maxTextureArrayLayers
- Optymalizacja przesyłania bufora dla backendu Vulkana
- Ulepszenia dotyczące czasu kompilacji shaderów
- Przesłane bufory poleceń muszą być unikalne
- Informacje o świcie
Chrome 125
- Podgrupy (funkcja w trakcie tworzenia)
- Renderowanie na potrzeby wycinka tekstury 3D
- Aktualizacje dotyczące Dawn
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 języku WGSL
- Parametry wskaźnika bez ograniczeń w WGSL
- Składnia cukrowa do odwoływania się do elementów złożonych w WGSL
- Oddzielny stan tylko do odczytu w przypadku elementów związanych z szablonem i głębią
- Aktualizacje dotyczące Dawn
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 shaderów w systemie Windows
- Zapytania o sygnatury czasowe w przelotach obliczeniowych i renderowania
- Domyślne punkty wejścia do modułów cieniowania
- Obsługa przestrzeni barw display-p3 jako przestrzeni barw GPUExternalTexture
- Informacje o kupach pamięci
- Aktualizacje dotyczące Dawn
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przekraczanie limitów
- 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łka 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
- Aktualizacje dotyczące Dawn
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
- Potoki pamięci podręcznej z układem generowanym automatycznie
- 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ą
- Polepszanie wrażeń programistów
- Aktualizacje dotyczące Dawn
Chrome 115
- Obsługiwane rozszerzenia językowe WGSL
- Wstępna obsługa Direct3D 11
- Domyślnie używaj dyskretnego GPU przy zasilaniu sieciowym
- 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