Eksperymentowanie z podgrupami
Funkcja podgrup umożliwia równoległość na poziomie SIMD, dzięki czemu wątki w grupie mogą się komunikować i wykonywać zbiorcze operacje matematyczne (np. obliczać sumę 16 liczb). Zapewnia to bardzo wydajną formę udostępniania danych między wątkami.
Minimalna implementacja propozycji podgrup jest dostępna do testowania lokalnego za flagą „Unsafe WebGPU Support” (Niebezpieczne wsparcie WebGPU) pod adresem chrome://flags/#enable-unsafe-webgpu
.
Możesz też wypróbować podgrupy w swojej witrynie z udziałem prawdziwych użytkowników, rejestrując się w programie testów źródła. Instrukcje przygotowania witryny do korzystania z okresów próbnych znajdziesz w artykule Wprowadzenie do okresów próbnych. Wersja próbna origin będzie działać od Chrome 128 do Chrome 131 (zakończy się 19 lutego 2025 r.). Zobacz Zamiar przeprowadzenia eksperymentu.
Gdy funkcja "subgroups"
będzie dostępna w GPUAdapter
, poproś o GPUDevice
z tą funkcją, aby uzyskać obsługę podgrup w WGSL i sprawdzić limity minSubgroupSize
i maxSubgroupSize
.
Musisz też wyraźnie włączyć to rozszerzenie w kodzie WGSL za pomocą enable subgroups;
. Po włączeniu tej opcji uzyskasz dostęp do tych dodatków:
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, w którym bit odpowiadający argumentowisubgroup_invocation_id
ma wartość 1, jeśli argumentvalue
ma wartość true w przypadku aktywnego wywołania, a w przeciwnym razie – 0.subgroupBroadcast(value, id)
: rozsyłavalue
z wywołania zsubgroup_invocation_id
pasującym doid
do wszystkich wywołań w podgrupie. Uwaga:id
musi być stałą czasu kompilacji.
W przyszłości dodamy więcej wbudowanych funkcji, takich jak subgroupAdd
, subgroupAll
, subgroupElect
i subgroupShuffle
. Zobacz problem 354738715.
Aby zezwolić na używanie typu f16 w operacjach na podgrupach, poproś o GPUDevice
z funkcjami "subgroups"
, "subgroups-f16"
i "shader-f16"
, a następnie włącz go w kodzie WGSL za pomocą enable f16, subgroups, subgroups_f16;
.
Poniższy fragment kodu stanowi podstawę do eksperymentowania i odkrywania potencjału 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 ustawiania odchylenia głębi dla linii i punktów
Zmiana specyfikacji WebGPU powoduje, że ustawienie wartości depthBias
, depthBiasSlopeScale
i depthBiasClamp
na wartość inną niż zero, gdy topologia potoku renderowania jest typu linia lub punkt, jest błędem weryfikacji. Aby dać deweloperom wystarczająco dużo czasu na zaktualizowanie kodu, w konsoli Narzędzi deweloperskich wyświetlane jest ostrzeżenie o nadchodzącej weryfikacji, a w tych okolicznościach wartości są wymuszane na 0. Zobacz problem 352567424.
Ukrywanie ostrzeżenia Narzędzi deweloperskich o nieprzechwyconym błędzie, jeśli użyto metody preventDefault
W konsoli Narzędzi deweloperskich nie są już wyświetlane ostrzeżenia dotyczące zdarzeń uncapturederror
, jeśli zarejestrowano detektor zdarzeń dla uncapturederror
, a w wywołaniu zwrotnym detektora zdarzeń wywołano metodę preventDefault()
zdarzenia. Takie działanie jest zgodne z obsługą zdarzeń w JavaScript. Zapoznaj się z tym przykładem i problemem 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 następnie
Atrybut WGSL interpolate
umożliwia zarządzanie interpolacją danych wejścia/wyjścia zdefiniowanych przez użytkownika. Nowe parametry próbkowania interpolacyjnego first
(domyślny) i either
zapewniają dodatkową kontrolę: first
używa wartości z pierwszego wierzchołka elementu pierwotnego, a either
umożliwia użycie pierwszego lub ostatniego wierzchołka. Zobacz problem 340278447.
Aktualizacje o świcie
Wdrożenie WGPUFuture w Dawn do obsługi operacji asynchronicznych zostało zakończone. Kluczowe pojęcia to wgpuInstanceProcessEvents do oportunistycznego przetwarzania zdarzeń i WGPUCallbackMode do definiowania lokalizacji wywołań zwrotnych. WGPUFuture oznacza jednorazowe zdarzenia o nieskończonym czasie trwania, a wgpuInstanceWaitAny czeka na zakończenie dowolnego przyszłego zdarzenia lub na upłynięcie limitu czasu. Zobacz problem 42240932.
Wartość CompositeAlphaMode::Auto
nie jest już raportowana przez Surface::GetCapabilities()
. Jest nadal ważny i odpowiada Surface::GetCapabilities().alphaMode[0]
. Zobacz problem 292.
Backend OpenGL obsługuje teraz Surface
z operacją blit 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żliwiają one wstępne kompilacje. Zapoznaj się z krótkim przewodnikiem po używaniu Dawn w projektach CMake.
Obejmuje to tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.
Nowości w WebGPU
Lista wszystkich tematów omówionych w serii Co nowego w WebGPU.
Chrome 140
- Żądania dotyczące urządzeń wykorzystują adapter
- Skrót do używania tekstury w miejscu, w którym używany jest widok tekstury
- Funkcja WGSL textureSampleLevel obsługuje tekstury 1D
- Wycofanie użycia tekstury pamięci tylko do odczytu bgra8unorm
- Usunięcie atrybutu GPUAdapter isFallbackAdapter
- Aktualizacje dotyczące Dawn
Chrome 139
- Obsługa tekstur 3D w przypadku formatów skompresowanych BC i ASTC
- Nowa funkcja „core-features-and-limits”
- Testowanie wersji próbnej trybu zgodności WebGPU
- Aktualizacje dotyczące Dawn
Chrome 138
- Skrót do używania bufora jako zasobu wiążącego
- Zmiany wymagań dotyczących rozmiaru buforów mapowanych podczas tworzenia
- Raport o architekturze najnowszych układów GPU
- Wycofanie atrybutu GPUAdapter isFallbackAdapter
- Aktualizacje dotyczące Dawn
Chrome 137
- Używanie widoku tekstury do wiązania externalTexture
- Kopiowanie buforów bez określania przesunięć i rozmiaru
- WGSL workgroupUniformLoad using pointer to atomic
- Atrybut powerPreference interfejsu GPUAdapterInfo
- Usunięcie atrybutu compatibilityMode z interfejsu GPURequestAdapterOptions
- Aktualizacje dotyczące Dawn
Chrome 136
- Atrybut GPUAdapterInfo isFallbackAdapter
- Krótszy czas kompilacji shaderów w D3D12
- Zapisywanie i kopiowanie obrazów z płótna
- Ograniczenia trybu zgodności pomiaru wzrostu
- Aktualizacje dotyczące Dawn
Chrome 135
- Zezwalaj na tworzenie układu potoku z układem grupy wiązań o wartości null
- Zezwalaj na wykraczanie obszarów widoku poza granice docelowych obszarów renderowania
- Łatwiejszy dostęp do eksperymentalnego trybu zgodności na Androidzie
- Usuwanie limitu maxInterStageShaderComponents
- Aktualizacje dotyczące Dawn
Chrome 134
- Ulepszanie zadań systemów uczących się za pomocą podgrup
- Usunięcie obsługi typów tekstur z możliwością filtrowania zmiennoprzecinkowego jako mieszalnych
- Aktualizacje dotyczące Dawn
Chrome 133
- Dodatkowe formaty wierzchołków unorm8x4-bgra i 1-component
- Zezwalaj na żądanie nieznanych limitów z niezdefiniowaną wartością
- Zmiany w regułach wyrównywania WGSL
- Wzrost wydajności WGSL dzięki odrzucaniu
- Używanie parametru VideoFrame displaySize w przypadku tekstur zewnętrznych
- Obsługa obrazów o orientacji innej niż domyślna za pomocą funkcji copyExternalImageToTexture
- Poprawianie komfortu pracy programistów
- Włączanie trybu zgodności za pomocą parametru featureLevel
- Usuwanie funkcji eksperymentalnych podgrup
- Wycofanie limitu maxInterStageShaderComponents
- Aktualizacje dotyczące Dawn
Chrome 132
- Korzystanie z widoku tekstury
- Mieszanie tekstur zmiennoprzecinkowych 32-bitowych
- Atrybut adapterInfo interfejsu GPUDevice
- Konfigurowanie kontekstu elementu canvas w nieprawidłowym formacie powoduje błąd JavaScriptu
- Ograniczenia dotyczące próbkowania tekstur
- Eksperymentowanie z rozszerzonymi podgrupami
- Poprawianie komfortu pracy programistów
- Eksperymentalna obsługa 16-bitowych znormalizowanych formatów tekstur
- Aktualizacje dotyczące Dawn
Chrome 131
- Obcinanie odległości w WGSL
- GPUCanvasContext getConfiguration()
- Elementy pierwotne punktów i linii nie mogą mieć odchylenia głębi
- Wbudowane funkcje skanowania obejmującego podgrupy
- Eksperymentalna obsługa rysowania pośredniego
- Opcja kompilacji modułu cieniowania strict math
- Usunięcie metody GPUAdapter requestAdapterInfo()
- Aktualizacje dotyczące Dawn
Chrome 130
- Miksowanie z 2 źródeł
- Krótszy czas kompilacji cieniowania w Metal
- Wycofanie metody GPUAdapter requestAdapterInfo()
- Aktualizacje dotyczące Dawn
Chrome 129
- Obsługa HDR w trybie mapowania tonów na płótnie
- Rozszerzona obsługa podgrup
- Aktualizacje dotyczące Dawn
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofanie ustawiania odchylenia głębi dla linii i punktów
- Ukrywanie ostrzeżenia Narzędzi deweloperskich o nieprzechwyconym błędzie, jeśli użyto preventDefault
- WGSL interpolate sampling first and either
- Aktualizacje dotyczące Dawn
Chrome 127
- Eksperymentalna obsługa OpenGL ES na Androidzie
- Atrybut informacji GPUAdapter
- Ulepszenia interoperacyjności WebAssembly
- Poprawione błędy kodera poleceń
- Aktualizacje dotyczące Dawn
Chrome 126
- Zwiększanie limitu maxTextureArrayLayers
- Optymalizacja przesyłania bufora na potrzeby backendu Vulkan
- Ulepszenia czasu kompilacji cieniowania
- Przesłane bufory poleceń muszą być unikalne
- Aktualizacje dotyczące Dawn
Chrome 125
- Podgrupy (funkcja w trakcie opracowywania)
- Renderowanie do wycinka tekstury 3D
- Aktualizacje dotyczące Dawn
Chrome 124
- Tekstury pamięci tylko do odczytu i do odczytu i zapisu
- Obsługa pracowników usługowych i współdzielonych
- Nowe atrybuty informacji o adapterze
- Poprawki błędów
- Aktualizacje dotyczące Dawn
Chrome 123
- Obsługa wbudowanych funkcji DP4a w WGSL
- Parametry wskaźnika bez ograniczeń w WGSL
- Uproszczona składnia dereferencji typów złożonych w WGSL
- Oddzielny stan tylko do odczytu dla aspektów szablonu i głębi
- Aktualizacje dotyczące Dawn
Chrome 122
- Zwiększanie zasięgu dzięki trybowi zgodności (funkcja w trakcie opracowywania)
- Zwiększanie limitu maxVertexAttributes
- Aktualizacje dotyczące Dawn
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilacji cieniowania w systemie Windows
- Zapytania o sygnatury czasowe w przypadku obliczeń i renderowania
- Domyślne punkty wejścia do modułów cieniowania
- Obsługa przestrzeni kolorów display-p3 jako przestrzeni kolorów GPUExternalTexture
- Informacje o obszarach pamięci
- Aktualizacje dotyczące Dawn
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przekraczaj granice
- Zmiany stanu bufora głębi i szablonu
- Aktualizacje informacji o adapterze
- Kwantyzacja zapytań dotyczących sygnatur czasowych
- Funkcje wiosennych porządków
Chrome 119
- Filtrowane tekstury zmiennoprzecinkowe 32-bitowe
- unorm10-10-10-2 vertex format
- Format tekstury rgb10a2uint
- Aktualizacje dotyczące Dawn
Chrome 118
- Obsługa elementów HTMLImageElement i ImageData w
copyExternalImageToTexture()
- Eksperymentalna obsługa tekstur pamięci do odczytu i zapisu oraz tylko do odczytu
- Aktualizacje dotyczące Dawn
Chrome 117
- Usuwanie bufora wierzchołków
- Usuwanie powiązania grupy
- Wyciszanie błędów podczas asynchronicznego tworzenia potoku, gdy urządzenie zostanie utracone
- Aktualizacje dotyczące tworzenia modułów cieniowania SPIR-V
- Poprawianie komfortu pracy programistów
- Buforowanie potoków z automatycznie generowanym układem
- Aktualizacje dotyczące Dawn
Chrome 116
- Integracja WebCodecs
- Zwrócono utracone urządzenie przez GPUAdapter
requestDevice()
- Zapewnij płynne odtwarzanie wideo, jeśli wywoływana jest funkcja
importExternalTexture()
- Zgodność ze specyfikacją
- Poprawianie komfortu pracy programistów
- Aktualizacje dotyczące Dawn
Chrome 115
- Obsługiwane rozszerzenia języka WGSL
- Eksperymentalna obsługa Direct3D 11
- Domyślne korzystanie z osobnego procesora graficznego po podłączeniu do zasilania sieciowego
- Poprawianie komfortu pracy programistów
- Aktualizacje dotyczące Dawn
Chrome 114
- Optymalizacja JavaScript
- getCurrentTexture() w nieskonfigurowanym elemencie canvas zgłasza błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje dotyczące Dawn