Nowości w WebGPU (Chrome 128)

François Beaufort
François Beaufort

Eksperymentowanie z podgrupami

Funkcja podgrup umożliwia równoległość na poziomie SIMD, umożliwiając wątkom w grupie komunikację i wykonywanie zbiorczych operacji matematycznych (np. sumowanie 16 liczb). To bardzo wydajna forma udostępniania danych między wątkami.

Minimalna implementacja propozycji podgrup jest dostępna do lokalnych testów z oznaczeniem „Unsafe WebGPU Support” (Obsługa niebezpiecznego procesora WebGPU) na stronie chrome://flags/#enable-unsafe-webgpu.

Możesz też wypróbować w swojej witrynie podgrupy z prawdziwymi użytkownikami, rejestrując się do udziału w testowaniu origin. Więcej informacji o przygotowaniu witryny do korzystania z testów wersji próbnej Origin znajdziesz w artykule Pierwsze kroki z testami wersji próbnej Origin. Wersja próbna origin będzie dostępna w Chrome od wersji 128 do 131 (do 19 lutego 2025 r.). Patrz sekcja Zamiar eksperymentowania.

Gdy funkcja "subgroups" będzie dostępna w GPUAdapter, poproś o GPUDevice z tą funkcją, aby uzyskać obsługę podgrup w WGSL, i sprawdź limity minSubgroupSize i maxSubgroupSize.

Rozszerzenie musisz też włączyć w kodzie WGSL za pomocą atrybutu enable 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 wartość 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łą wartościową kompilacji.

W przyszłości dodamy więcej wbudowanych funkcji, takich jak subgroupAdd, subgroupAll, subgroupElectsubgroupShuffle. Zobacz problem 354738715.

Aby umożliwić użycie funkcji f16 w operacjach na podgrupach, poproś o GPUDevice z funkcjami "subgroups", "subgroups-f16""shader-f16", a potem włącz tę funkcję w kodzie WGSL za pomocą instrukcji enable f16, subgroups, subgroups_f16;.

Poniższy fragment kodu stanowi podstawę do eksperymentowania i odkrywania możliwości podgrup.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

wycofanie obsługi ustawień zniekształcenia głębi w przypadku linii i punktów;

Zmiana specyfikacji WebGPU powoduje, że ustawianie wartości depthBias, depthBiasSlopeScaledepthBiasClamp na niezerową powoduje błąd walidacji, gdy topologia dla potoku renderowania jest typu linia lub punkt. Aby dać deweloperom wystarczająco dużo czasu na zaktualizowanie kodu, w konsoli Narzędzi deweloperskich wyświetla się ostrzeżenie o nadchodzącej weryfikacji, a wartości są ustawiane na 0. Zobacz problem 352567424.

Ukryj ostrzeżenie o nieprzechwyconym błędzie w Narzędziach deweloperskich w przypadku funkcji preventDefault

W Konsoli DevTools ostrzeżenia dotyczące zdarzeń uncapturederror nie są już wyświetlane, jeśli zarejestrowano detektor zdarzeń uncapturederror i w wywołaniu zwrotnym detektora zdarzeń wywołano metodę zdarzenia preventDefault(). Takie działanie odpowiada obsłudze zdarzeń w JavaScript. Zobacz poniższy przykład i problem 40263619.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL najpierw interpoluje próbkowanie, a potem:

Atrybut WGSL interpolate umożliwia zarządzanie interpolacją danych zdefiniowanych przez użytkownika IO. Nowe parametry interpolacji próbkowania first (domyślny) i either zapewniają dodatkową kontrolę: first używa wartości z pierwszego wierzchołka prymitywu, a either pozwala na użycie pierwszego lub ostatniego wierzchołka. Zapoznaj się z problemem 340278447.

Aktualizacje świtu

Implementacja WGPUFuture w Dawn do obsługi operacji asynchronicznych została zakończona. Najważniejsze pojęcia to wgpuInstanceProcessEvents do obsługi oportunistycznego przetwarzania zdarzeń i WGPUCallbackMode do definiowania lokalizacji wywołania zwrotnego. WGPUFuture oznacza jednorazowe zdarzenia o nieograniczonym czasie trwania, a wgpuInstanceWaitAny oczekuje na zakończenie dowolnego przyszłego zdarzenia lub limitu czasu. Zobacz problem 42240932.

Wartość CompositeAlphaMode::Auto nie jest już rejestrowana przez Surface::GetCapabilities(). Nadal jest ważny i jest równoważny z Surface::GetCapabilities().alphaMode[0]. Zobacz problem 292.

Backend OpenGL obsługuje teraz Surface z odwróceniem w osi Y dla każdego wywołania Present(). Zobacz problem 344814083.

Metoda Adapter::GetProperties() została wycofana i zastąpiona metodą Adapter::GetInfo().

Jaswant, zewnętrzny współtwórca, przepisał wszystkie pliki CMake, dzięki czemu łatwiej je aktualizować i umożliwić kompilację wstępną. Zapoznaj się z krótkim wprowadzeniem dotyczącym używania Dawn w projektach CMake.

Obejmuje to tylko niektóre najważniejsze informacje. Zapoznaj się z pełną listą commitów.

Co nowego w WebGPU

Lista wszystkich tematów omawianych w cyklu Co nowego w WebGPU.

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