Nowości w WebGPU (Chrome 125)

François Beaufort
François Beaufort

Liczba funkcji WebGPU może wydawać się w tej chwili nieco uboga, ale już wkrótce pojawią się ważne nowości. Przyszłe wersje będą zawierać funkcje takie jak poprawa szybkości kompilacji shaderów i zmiany w modelu asynchronicznym implementacji za pomocą WGPUFuture.

Podgrupy (funkcja w fazie rozwoju)

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.

Operacje dotyczące podgrup są obsługiwane przez nowoczesne interfejsy API GPU, ale szczegóły dotyczące nazewnictwa i implementacji mogą się różnić. Zespół Chrome zidentyfikował podobieństwa i pracuje teraz nad ujednoliceniem tej funkcji. Jeśli masz pytania, zapoznaj się z propozycjąkomentarzem.

W flagach „Funkcje eksperymentalnej platformy internetowej” chrome://flags/#enable-experimental-web-platform-features jest minimalna i niestandardowa implementacja podgrup, aby deweloperzy mogli je wypróbować i przekazać opinię. W kontekście WebGPU korzyści w praktyce nie zostały jeszcze udowodnione.

Gdy funkcja "chromium-experimental-subgroups" będzie dostępna w GPUAdapter, poproś o GPUDevice z tą funkcją, aby uzyskać wsparcie dla eksperymentalnych podgrup w WGSL, i sprawdź limity minSubgroupSize i maxSubgroupSize.

Musisz też wyraźnie włączyć to rozszerzenie w kodzie WGSL za pomocą instrukcji enable chromium_experimental_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 parametrowi subgroup_invocation_id ma wartość 1, jeśli parametr 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.

Ten fragment kodu stanowi podstawę do eksperymentowania z potencjałem podgrup.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-subgroups")) {
  throw new Error("Experimental subgroups support is not available");
}
// Explicitly request experimental subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable chromium_experimental_subgroups;

  @compute @workgroup_size(64) fn main(
      @builtin(global_invocation_id) global_id : vec3u,
      @builtin(subgroup_size) sg_size : u32,
      @builtin(subgroup_invocation_id) sg_id : u32) {
    // TODO: Use subgroupBallot() and subgroupBroadcast().
  }`,
});

Renderowanie na przekrój tekstury 3D

Dzięki nowemu parametrowi depthSliceGPURenderPassColorAttachment możesz teraz renderować bezpośrednio na slajdy tekstur 3D w ramach przejść renderowania, co zwiększa możliwości programu poza zwykłym renderowaniem tekstur 2D. Dzięki temu możesz np. tworzyć sceny i efekty oparte na wokselach, renderując je bezpośrednio do objętości tekstur 3D. Zobacz issue dawn:1020.

Aktualizacje świtu

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