Nowości w WebGPU (Chrome 125)

François Beaufort
François Beaufort

Tym razem liczba funkcji korzystających z WebGPU może wydawać się nieco niewystarczająca, ale kilka kolejnych ulepszeń jest już w fazie rozwoju. W kolejnych wersjach wprowadzimy takie funkcje jak ulepszenia szybkości kompilacji programu do cieniowania i zmiany w asynchronicznym modelu implementacji korzystającej z WGPUFuture.

Podgrupy (funkcja w trakcie opracowywania)

Funkcja podgrup umożliwia równoległość na poziomie SIMD, umożliwiając wątkom w grupie komunikację i wykonywanie zbiorowych operacji matematycznych (na przykład obliczanie sumy 16 liczb). Zapewnia to bardzo skuteczną 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 są różne. Zespół Chrome dostrzegł cechy wspólne i pracuje teraz nad ujednoliceniem tej funkcji. Jeśli masz pytania, zapoznaj się z propozycją i komentarzem.

Flaga „Eksperymentalne funkcje platformy internetowej” na chrome://flags/#enable-experimental-web-platform-features obejmuje minimalne i niestandaryzowane podgrupy, dzięki czemu deweloperzy mogą wypróbować tę funkcję i podzielić się opinią, ponieważ rzeczywiste korzyści nie zostały jeszcze potwierdzone w kontekście WebGPU.

Gdy funkcja "chromium-experimental-subgroups" będzie dostępna w GPUAdapter, poproś o GPUDevice z tą funkcją, aby uzyskać pomoc dotyczącą podgrup eksperymentalnych 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. Gdy włączysz tę funkcję, 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 zbiór pól bitowych, w których bit odpowiadający bitowi subgroup_invocation_id ma wartość 1, jeśli dla danego aktywnego wywołania zasada value ma wartość prawda. W przeciwnym razie zwraca wartość 0.
  • subgroupBroadcast(value, id): rozgłasza value z wywołania z wartością subgroup_invocation_id odpowiadającą id do wszystkich wywołań w podgrupie. Uwaga: id musi być stałą w czasie kompilacji.

Poniższy fragment kodu stanowi podstawę do majsterkowania 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().
  }`,
});

Renderuj na wycinku tekstury 3D

Dzięki nowemu elementowi depthSlice w GPURenderPassColorAttachment możesz teraz renderować bezpośrednio na wycinkach tekstur 3D w ramach procesów renderowania, co wykracza poza typowe renderowanie tekstur 2D. Umożliwia to na przykład tworzenie scen i efektów opartych na woksele przez renderowanie bezpośrednio w objętości tekstur 3D. Zobacz Data wydania:1020.

Powiadomienia o świcie

Zobacz pełną listę zatwierdzeń.

Co nowego w WebGPU

Lista wszystkich zagadnień omówionych w serii Co nowego w WebGPU.

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