Nowości w WebGPU (Chrome 125)

François Beaufort
François Beaufort

Liczba funkcji WebGPU może się tym razem wydawać niewielka, ale wkrótce pojawią się duże postępy. W przyszłych wersjach pojawią się funkcje takie jak szybsza kompilacja shaderów i zmiany w modelu asynchronicznym implementacji z użyciem WGPUFuture.

Podgrupy (funkcja w fazie rozwoju)

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 nazewnictwo i szczegóły implementacji różnią się. Zespół Chrome zidentyfikował podobieństwa i pracuje obecnie nad ujednoliceniem tej funkcji. Jeśli masz pytania, zapoznaj się z propozycjąkomentarzem.

Za flagą „Experimental Web Platform Features” (Eksperymentalne funkcje platformy internetowej) na stronie chrome://flags/#enable-experimental-web-platform-features znajduje się minimalna i niestandardowa implementacja podgrup, dzięki czemu deweloperzy mogą ją wypróbować i przesłać opinię. 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ć jej limity minSubgroupSizemaxSubgroupSize.

Musisz też wyraźnie włączyć to rozszerzenie w kodzie WGSL za pomocą enable chromium_experimental_subgroups. Po włączeniu tej opcji 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 wartości subgroup_invocation_id ma wartość 1, jeśli wartość value jest w przypadku tego aktywnego wywołania równa „true”, a w przeciwnym razie – 0.
  • subgroupBroadcast(value, id): rozsyła 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

Dzięki nowemu elementowi depthSliceGPURenderPassColorAttachment możesz teraz renderować bezpośrednio do wycinków tekstur 3D w przejściach renderowania, co rozszerza jego możliwości poza zwykłe renderowanie tekstur 2D. Dzięki temu możesz na przykład tworzyć sceny i efekty oparte na wokselach, renderując je bezpośrednio w trójwymiarowych teksturach. Zobacz problem dawn:1020.

Aktualizacje o świcie

Zapoznaj się z pełną listą zatwierdzeń.

Nowości w WebGPU

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

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