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 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