Nowości w WebGPU (Chrome 128)

François Beaufort
François Beaufort

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ści subgroup_invocation_id ma wartość 1, jeśli value ma wartość true w przypadku danego aktywnego wywołania, a w przeciwnym razie – wartość 0.
  • subgroupBroadcast(value, id): rozgłasza value z wywołania z subgroup_invocation_id pasującym do id 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, subgroupElectsubgroupShuffle. Zobacz problem 354738715.

Aby umożliwić użycie funkcji f16 w operacjach na podgrupach, poproś o GPUDevice z funkcjami "subgroups", "subgroups-f16""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, depthBiasSlopeScaledepthBiasClamp 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

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113