Nowości w WebGPU (Chrome 125)

François Beaufort
François Beaufort

Liczba funkcji WebGPU może się tym razem wydawać nieco skromna, ale już wkrótce pojawią się duże zmiany. Kolejne wersje będą zawierać takie funkcje jak szybsza kompilacja shaderów i zmiany w modelu asynchronicznym implementacji za pomocą WGPUFuture.

Podgrupy (funkcja w trakcie opracowywania)

Funkcja podgrup umożliwia równoległość na poziomie SIMD, dzięki czemu wątki w grupie mogą się komunikować i wykonywać zbiorcze operacje matematyczne (np. obliczać sumę 16 liczb). Zapewnia to bardzo wydajną formę udostępniania danych między wątkami.

Operacje na podgrupach są obsługiwane przez nowoczesne interfejsy API GPU, ale nazwy i szczegóły implementacji różnią się. Zespół Chrome zidentyfikował wspólne cechy i pracuje nad standaryzacją tej funkcji. Jeśli masz pytania, zapoznaj się z propozycją i dodaj komentarz.

Za flagą „Experimental Web Platform Features” (Funkcje eksperymentalne platformy internetowej) w chrome://flags/#enable-experimental-web-platform-features znajduje się minimalna i niestandardowa implementacja podgrup, dzięki której deweloperzy mogą ją wypróbować i podzielić się opiniami. W kontekście WebGPU nie udowodniono jeszcze korzyści w rzeczywistych zastosowaniach.

Gdy funkcja "chromium-experimental-subgroups" jest dostępna w GPUAdapter, poproś o GPUDevice z tą funkcją, aby uzyskać eksperymentalną obsługę podgrup w WGSL i sprawdzić limity minSubgroupSize i maxSubgroupSize.

Musisz też wyraźnie włączyć to rozszerzenie w kodzie WGSL za pomocą enable chromium_experimental_subgroups. Po włączeniu uzyskasz dostęp do tych dodatków:

  • 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, w których bit odpowiadający subgroup_invocation_id ma wartość 1, jeśli value jest prawdziwe w przypadku tego aktywnego wywołania, a w przeciwnym razie 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łą czasu kompilacji.

Poniższy fragment kodu stanowi podstawę do eksperymentowania i odkrywania potencjału 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 do wycinka tekstury 3D

Teraz możesz renderować bezpośrednio do wycinków tekstur 3D w ramach przekazywania renderowania, rozszerzając jego możliwości poza zwykłe renderowanie tekstur 2D, dzięki nowemu depthSlice w GPURenderPassColorAttachment. Ten dodatek umożliwia na przykład tworzenie scen i efektów opartych na wokselach przez renderowanie bezpośrednio do woluminów tekstur 3D. Zobacz problem dawn:1020.

Aktualizacje Dawn

Zapoznaj się z pełną listą commitów.

Co nowego w WebGPU

Lista wszystkich funkcji omówionych w serii Co nowego w WebGPU.

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

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