Nowości w WebGPU (Chrome 125)

François Beaufort
François Beaufort

Liczba funkcji WebGPU może wydawać się tym razem uciążliwa, ale wkrótce nastąpią istotne postępy. 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 różnią się. Zespół Chrome zidentyfikował podobieństwa i pracuje teraz nad ujednoliceniem tej funkcji. Jeśli masz pytania, zapoznaj się z ofertą pakietową i 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.

Rozszerzenie musisz też włączyć w kodzie WGSL za pomocą atrybutu 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 zestaw pól bitowych, gdzie bit odpowiadający funkcji subgroup_invocation_id ma wartość 1, jeśli parametr value ma wartość prawda w przypadku tego aktywnego wywołania, lub 0 w przeciwnym razie.
  • 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.

Poniższy fragment kodu stanowi podstawę do eksperymentowania i odkrywania możliwości 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 potrzeby wycinka 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żna na przykład tworzyć sceny i efekty oparte na wokselach, renderując je bezpośrednio do objętości tekstur 3D. Zobacz problem: świt:1020.

Aktualizacje o świcie

Zobacz pełną listę zatwierdzeń.

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