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). Jest to bardzo wydajna forma udostępniania danych w różnych wątkach.

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. 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 (a kończy się 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 do wszystkich wywołań w podgrupie. Uwaga: id musi być stałą wartością 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;.

Ten fragment kodu stanowi podstawę do eksperymentowania z potencjałem 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ą wymuszane na 0. Zobacz problem 352567424.

Ukrywanie ostrzeżenia DevTools o nieuchwycionych błędach, jeśli wywołano 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. 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 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żliwiają one kompilację wstępną. Aby dowiedzieć się, jak używać Dawn w projektach CMake, zapoznaj się z krótkim przewodnikiem.

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

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