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. Kolejne wersje obejmą m.in. ulepszenia szybkości kompilacji cieniowania i zmiany w asynchronicznym modelu implementacji z wykorzystaniem WGPUFuture.

Podgrupy (funkcja w trakcie opracowywania)

Funkcja podgrup umożliwia równoległość na poziomie SIMD, co umożliwia wątkom w grupie komunikację i wykonywanie zbiorczych operacji matematycznych (na przykład obliczanie sumy 16 cyfr). To bardzo wydajna forma 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 zidentyfikował podobieństwa i obecnie pracuje nad ujednoliceniem tej funkcji. Jeśli masz pytania, zapoznaj się z ofertą pakietową i komentarzem.

„Eksperymentalne funkcje platformy internetowej” zapewniają minimalną i niestandaryzowaną implementację podgrup. flagę chrome://flags/#enable-experimental-web-platform-features, aby deweloperzy mogli wypróbować tę usługę i podzielić się opinią, ponieważ rzeczywiste korzyści nie zostały jeszcze zweryfikowane w kontekście WebGPU.

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

Rozszerzenie musisz też włączyć w kodzie WGSL za pomocą atrybutu enable chromium_experimental_subgroups. Gdy włączysz to ustawienie, uzyskasz dostęp do tych dodatkowych 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): przesyła value z wywołania z parametrem subgroup_invocation_id pasującym do id do wszystkich wywołań w podgrupie. Uwaga: id musi być stałą czasu kompilacji.

Poniższy fragment kodu umożliwia poeksperymentowanie z podgrupami i ich odkrycie.

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

Teraz możesz renderować bezpośrednio na wycinkach tekstur 3D w ramach przebiegu renderowania, co rozszerza możliwości renderowania tekstur 2D dzięki nowemu elementowi depthSlice w elemencie GPURenderPassColorAttachment. Dzięki temu można na przykład tworzyć sceny i efekty oparte na woksielu przez renderowanie bezpośrednio w woluminach tekstur 3D. Zobacz problem: świt:1020.

Aktualizacje o świcie

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

Co nowego w WebGPU

Lista wszystkiego, co zostało omówione w serii Co nowego w WebGPU.

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