Eksperymentowanie z podgrupami
Funkcja podgrup umożliwia równoległość na poziomie SIMD, co umożliwia wątkom w grupie komunikację i wykonywanie zbiorczych operacji matematycznych (na przykład obliczanie sumy 16 cyfr). To bardzo wydajna forma udostępniania danych między wątkami.
Do testów lokalnych w ramach „Unsafe WebGPU Support” można przeprowadzić minimalne wdrożenie propozycji podgrup. flagę: 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. Instrukcje dotyczące przygotowania witryny do testowania origin znajdziesz w artykule Pierwsze kroki z testowaniem origin. Testowanie origin będzie się odbywać od wersji 128 do wersji 131 Chrome (zakończy się 19 lutego 2025 r.). Patrz sekcja Zamiar eksperymentowania.
Gdy funkcja "subgroups"
jest dostępna w języku GPUAdapter
, poproś o GPUDevice
z tą funkcją, aby uzyskać obsługę podgrup w WGSL i sprawdzić limity minSubgroupSize
oraz 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łą czasu kompilacji.
W przyszłości dodamy więcej wbudowanych funkcji, takich jak subgroupAdd
, subgroupAll
, subgroupElect
i subgroupShuffle
. Zapoznaj się z problemem 354738715.
Aby zezwolić na operacje f16 w podgrupach, poproś o funkcję GPUDevice
z funkcjami "subgroups"
, "subgroups-f16"
i "shader-f16"
, a następnie włącz ją w kodzie WGSL, używając parametru enable f16, subgroups, subgroups_f16;
.
Poniższy fragment kodu umożliwia poeksperymentowanie z podgrupami i ich odkrycie.
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...
Wycofaj odchylenie ustawień głębi w przypadku linii i punktów
Zmiana specyfikacji WebGPU powoduje błąd weryfikacji i ustawienie wartości depthBias
, depthBiasSlopeScale
i depthBiasClamp
na wartość inną niż zero, gdy topologia potoku renderowania to linia lub typ punktu. Aby dać deweloperom dostatecznie dużo czasu na zaktualizowanie kodu, w konsoli Narzędzi deweloperskich wyświetla się ostrzeżenie o nadchodzącej weryfikacji. W takiej sytuacji wartości są też wymuszane na poziomie 0. Zapoznaj się z problemem 352567424.
Ukryj ostrzeżenie o nieprzechwyconym błędzie w Narzędziach deweloperskich w przypadku opcji preventDefault
W konsoli Narzędzi deweloperskich ostrzeżenia dotyczące zdarzeń uncapturederror
nie są już wyświetlane, jeśli został zarejestrowany detektor zdarzeń uncapturederror
, a metoda Zdarzenie preventDefault()
została wywołana w ramach wywołania zwrotnego detektora zdarzeń. To zachowanie odpowiada obsłudze zdarzeń w języku JavaScript. Zobacz przykład poniżej 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
});
Najpierw interpoluj próbkowanie WGSL, a następnie
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. Zapoznaj się z problemem 340278447.
Aktualizacje o świcie
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 zdarzenia jednorazowe o nieskończonym czasie działania, a metoda wgpuInstanceWaitAny oczekuje na zakończenie swojej przyszłości lub upływu limitu czasu. Zobacz problem 42240932.
Surface::GetCapabilities()
nie zgłasza teraz wartości CompositeAlphaMode::Auto
. Jest ona nadal prawidłowa i odpowiednia do atrybutu Surface::GetCapabilities().alphaMode[0]
. Zobacz problem 292.
Backend OpenGL obsługuje teraz interfejs Surface
z wyświetleniem „y-flip” w przypadku każdego wywołania Present()
. Zapoznaj się z problemem 344814083.
Metoda Adapter::GetProperties()
została wycofana i zastąpiona metodą Adapter::GetInfo()
.
Jaswant zewnętrzny napisał wszystkie pliki CMake, dzięki czemu można je łatwiej aktualizować i tworzyć gotowe kompilacje. Zapoznaj się z krótkim wprowadzeniem dotyczącym używania Dawn w projektach CMake.
To tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.
Co nowego w WebGPU
Lista wszystkiego, co zostało omówione w serii Co nowego w WebGPU.
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofywanie odchylenia ustawień głębi w przypadku linii i punktów
- Ukryj nieprzechwycony błąd w Narzędziach deweloperskich w przypadku funkcji preventDefault
- Testuj najpierw próbkowanie WGSL, a potem jedno i drugie.
- Informacje o świcie
Chrome 127
- Eksperymentalna obsługa OpenGL ES na Androidzie
- Atrybut informacji o karcie GPU
- Ulepszenia współpracy WebAssembly
- Poprawione błędy kodera poleceń
- Informacje o świcie
Chrome 126
- Zwiększanie limitu maxTextureSlateWarstwy
- Optymalizacja przesyłania buforów w backendzie Vulkan
- Skrócony czas kompilacji shadera
- Przesłane bufory poleceń muszą być unikalne
- Informacje o świcie
Chrome 125
Chrome 124
- Tekstury pamięci masowej przeznaczone tylko do odczytu oraz do odczytu i zapisu
- Obsługa pracowników Service Worker i pracowników współużytkowanych
- Nowe atrybuty informacji o adapterze
- Poprawki błędów.
- Informacje o świcie
Chrome 123
- Obsługa wbudowanych funkcji DP4a w języku WGSL
- Nieograniczone parametry wskaźnika w WGSL
- Składnikowy cukier do dereferencji elementów złożonych w WGSL
- Oddzielny stan tylko do odczytu w przypadku elementów związanych z szablonem i głębią
- Informacje o świcie
Chrome 122
- Zwiększanie zasięgu dzięki trybowi zgodności (funkcja w trakcie opracowywania)
- Zwiększanie limitu maxVertexAttributes
- Informacje o świcie
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilowania danych do cieniowania w systemie Windows
- Zapytania dotyczące sygnatury czasowej w kartach obliczeń i renderowania
- Domyślne punkty wejścia do modułów cieniowania
- Obsługuj display-p3 jako przestrzeń kolorów GPUExternalTexture
- Informacje o stertach pamięci
- Informacje o świcie
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przesuwaj granice
- Zmiany stanu szablonu z głębokością
- Aktualizacje informacji o karcie
- Kwantyzacja zapytań dotyczących sygnatury czasowej
- Funkcje sprzątania przed wiosną
Chrome 119
- Filtrowalne 32-bitowe tekstury zmiennoprzecinkowe
- format wierzchołkowy unorm10-10-10-2
- Format tekstury rgb10a2uint
- Informacje o świcie
Chrome 118
- Obsługa HTMLImageElement i ImageData w
copyExternalImageToTexture()
- Eksperymentalna obsługa tekstury pamięci do odczytu i zapisu oraz tylko do odczytu
- Informacje o świcie
Chrome 117
- Nieskonfigurowany bufor wierzchołkowy
- Nieskonfigurowana grupa powiązań
- Wyciszaj błędy tworzenia potoku asynchronicznego w przypadku utraty urządzenia
- Zmiany związane z tworzeniem modułu cieniowania SPIR-V
- Polepszanie obsługi dla programistów
- Potoki pamięci podręcznej z układem generowanym automatycznie
- Informacje o świcie
Chrome 116
- Integracja z WebCodecs
- Utracone urządzenie zwrócone przez GPUAdapter
requestDevice()
- Odtwarzaj płynnie po wywołaniu
importExternalTexture()
- Zgodność ze specyfikacją
- Polepszanie obsługi dla programistów
- Informacje o świcie
Chrome 115
- Obsługiwane rozszerzenia języka WGSL
- Eksperymentalna obsługa interfejsu Direct3D 11
- Domyślnie używaj dyskretnego GPU przy zasilaniu sieciowym
- Polepszanie obsługi dla programistów
- Informacje o świcie
Chrome 114
- Optymalizacja JavaScriptu
- Funkcja getCurrentTexture() w nieskonfigurowanym obszarze roboczym powoduje zgłoszenie nieprawidłowego stanu błędu
- Aktualizacje WGSL
- Informacje o świcie