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

Do testów lokalnych w ramach „Unsafe WebGPU Support” można przeprowadzić minimalne wdrożenie propozycji podgrup. flagę: 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. Instrukcje dotyczące przygotowania witryny do testowania origin znajdziesz w artykule Pierwsze kroki z testowaniem origin. Testowanie origin będzie się odbywać od wersji 128 do wersji 131 Chrome (zakończy się 19 lutego 2025 r.). Patrz sekcja Zamiar eksperymentowania.

Gdy funkcja "subgroups" jest dostępna w języku GPUAdapter, poproś o GPUDevice z tą funkcją, aby uzyskać obsługę podgrup w WGSL i sprawdzić limity minSubgroupSize oraz 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łą czasu kompilacji.

W przyszłości dodamy więcej wbudowanych funkcji, takich jak subgroupAdd, subgroupAll, subgroupElect i subgroupShuffle. Zapoznaj się z problemem 354738715.

Aby zezwolić na operacje f16 w podgrupach, poproś o funkcję GPUDevice z funkcjami "subgroups", "subgroups-f16" i "shader-f16", a następnie włącz ją w kodzie WGSL, używając parametru enable f16, subgroups, subgroups_f16;.

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

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

Wycofaj odchylenie ustawień głębi w przypadku linii i punktów

Zmiana specyfikacji WebGPU powoduje błąd weryfikacji i ustawienie wartości depthBias, depthBiasSlopeScale i depthBiasClamp na wartość inną niż zero, gdy topologia potoku renderowania to linia lub typ punktu. Aby dać deweloperom dostatecznie dużo czasu na zaktualizowanie kodu, w konsoli Narzędzi deweloperskich wyświetla się ostrzeżenie o nadchodzącej weryfikacji. W takiej sytuacji wartości są też wymuszane na poziomie 0. Zapoznaj się z problemem 352567424.

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

W konsoli Narzędzi deweloperskich ostrzeżenia dotyczące zdarzeń uncapturederror nie są już wyświetlane, jeśli został zarejestrowany detektor zdarzeń uncapturederror, a metoda Zdarzenie preventDefault() została wywołana w ramach wywołania zwrotnego detektora zdarzeń. To zachowanie odpowiada obsłudze zdarzeń w języku JavaScript. Zobacz przykład poniżej 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
});

Najpierw interpoluj próbkowanie WGSL, a następnie

Atrybut WGSL interpolate umożliwia zarządzanie definiowaną przez użytkownika interpolacją danych wejścia-wyjścia. Nowe parametry próbkowania interpolacji first (domyślne) i either dają Ci dodatkową kontrolę: first wykorzystuje wartość z pierwszego wierzchołka prostego, a either dopuszcza pierwszy lub ostatni wierzchołek. Zapoznaj się z problemem 340278447.

Aktualizacje o świcie

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 zdarzenia jednorazowe o nieskończonym czasie działania, a metoda wgpuInstanceWaitAny oczekuje na zakończenie swojej przyszłości lub upływu limitu czasu. Zobacz problem 42240932.

Surface::GetCapabilities() nie zgłasza teraz wartości CompositeAlphaMode::Auto. Jest ona nadal prawidłowa i odpowiednia do atrybutu Surface::GetCapabilities().alphaMode[0]. Zobacz problem 292.

Backend OpenGL obsługuje teraz interfejs Surface z wyświetleniem „y-flip” w przypadku każdego wywołania Present(). Zapoznaj się z problemem 344814083.

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

Jaswant zewnętrzny napisał wszystkie pliki CMake, dzięki czemu można je łatwiej aktualizować i tworzyć gotowe kompilacje. Zapoznaj się z krótkim wprowadzeniem dotyczącym używania Dawn w projektach CMake.

To tylko niektóre z najważniejszych informacji. 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