Co nowego w WebGPU (Chrome 120)

François Beaufort
François Beaufort

Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL

W WGSL typ f16 to zbiór 16-bitowych wartości zmiennoprzecinkowych formatu IEEE-754 binarnego (połowa precyzji). Oznacza to, że do reprezentowania liczby zmiennoprzecinkowej używa się 16 bitów, a nie 32 bitów w przypadku konwencjonalnej liczby zmiennoprzecinkowej pojedynczej precyzji (f32). Taki mniejszy rozmiar może prowadzić do znacznego zwiększenia wydajności, zwłaszcza w przypadku przetwarzania dużych ilości danych.

Dla porównania: na urządzeniach Apple M1 Pro implementacja modeli Llama2 7B używanych w demonstracji czatu WebLLM odbywa się znacznie szybciej niż implementacja f32, zapewniając o 28% większą szybkość wstępnego uzupełniania i o 41% większą szybkość dekodowania, jak pokazano na poniższych zrzutach ekranu.f16

Zrzut ekranu z prezentacjami czatu WebLLM z modelami F32 i F16 Llama2 7B.
Prezentacje czatu WebLLM z modelami f32 (po lewej) i f16 (po prawej) Llama2 7B.

Nie wszystkie GPU obsługują 16-bitowe wartości zmiennoprzecinkowe. Gdy funkcja "shader-f16" jest dostępna w GPUAdapter, możesz teraz wysłać żądanie GPUDevice z tą funkcją i utworzyć moduł cieniowania WGSL, który korzysta z połowiowej dokładności typu zmiennoprzecinkowego f16. Tego typu można używać w module cieniowania WGSL tylko wtedy, gdy włączysz rozszerzenie f16 WGSL za pomocą enable f16;. W przeciwnym razie createShaderModule() wygeneruje błąd weryfikacji. Zobacz ten minimalny przykład i problem świt:1510.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
  throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
  requiredFeatures: ["shader-f16"],
});

const code = `
  enable f16;

  @compute @workgroup_size(1)
  fn main() {
    const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...

W kodzie modułu cieniowania WGSL możesz obsługiwać zarówno typy f16, jak i f32 z parametrem alias w zależności od obsługi funkcji "shader-f16", jak pokazano w tym fragmencie kodu.

const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");

const device = await adapter.requestDevice({
  requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});

const header = hasShaderF16
  ? `enable f16;
     alias min16float = f16;`
  : `alias min16float = f32;`;

const code = `
  ${header}

  @compute @workgroup_size(1)
  fn main() {
    const c = vec3<min16float>(1.0, 2.0, 3.0);
  }
`;

Przekraczaj granice

Maksymalna liczba bajtów niezbędnych do przechowywania 1 próbki (piksela lub subpiksela) danych wyjściowych renderowanego potoku dla wszystkich załączników w kolorze, domyślnie wynosi 32 bajty. Teraz za pomocą limitu maxColorAttachmentBytesPerSample możesz przesłać prośbę o maksymalnie 64. Zobacz ten przykład i problem świt:2036.

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

if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
  // When the desired limit isn't supported, take action to either fall back to
  // a code path that does not require the higher limit or notify the user that
  // their device does not meet minimum requirements.
}

// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
  requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});

Zwiększyliśmy limity maxInterStageShaderVariables i maxInterStageShaderComponents używane w komunikacji międzyetapowej na wszystkich platformach. Szczegółowe informacje znajdziesz w artykule Data problemu:1448.

Na każdym etapie cieniowania maksymalna liczba wpisów układu grup powiązań w układzie potoku, które są buforami pamięci masowej, wynosi domyślnie 8. Teraz za pomocą limitu maxStorageBuffersPerShaderStage możesz przesłać prośbę o maksymalnie 10. Zobacz problem: świt:2159.

Dodano nowy limit maxBindGroupsPlusVertexBuffers. Składa się z maksymalnej liczby używanych jednocześnie przedziałów grupy powiązań i bufora wierzchołków, przy czym wszystkie puste przedziały są liczone poniżej najwyższego indeksu. Jej wartość domyślna to 24. Zobacz problem: świt:1849.

Zmiany stanu szablonu głębi

Ze względu na wygodę programistów atrybuty głębi szablonu depthWriteEnabled i depthCompare nie zawsze są już wymagane: element depthWriteEnabled jest wymagany tylko w przypadku formatów z głębokością, a element depthCompare nie jest wymagany w przypadku formatów z głębią, jeśli nie jest używany w ogóle. Zobacz problem: świt:2132.

Aktualizacje informacji o karcie

Niestandardowe atrybuty informacji o adapterze type i backend są teraz dostępne po wywołaniu funkcji requestAdapterInfo(), gdy użytkownik włączy „Funkcje dla programistów WebGPU”. flagę o chrome://flags/#enable-webgpu-developer-features. type może mieć wartość „oddzielny GPU”, „zintegrowany GPU”, „CPU” lub „nieznany”. backend to „WebGPU”, „D3D11”, „D3D12”, „metal”, „vulkan”, „openGL”, „openGLES” lub „null”. Zobacz problem o świcie:2112 i wydanie świt:2107.

Zrzut ekranu strony https://webgpureport.org przedstawiający backend i wpisanie informacji o adaperze.
Informacje o karcie i typ karty wyświetlane na stronie https://webgpureport.org.

Opcjonalny parametr listy unmaskHints w funkcji requestAdapterInfo() został usunięty. Zobacz problem: świt:1427.

Kwantyzacja zapytań dotyczących sygnatury czasowej

Zapytania dotyczące sygnatury czasowej pozwalają aplikacjom mierzyć czas wykonywania poleceń GPU z dokładnością do nanosekund. Specyfikacja WebGPU sprawia jednak, że zapytania dotyczące sygnatury czasowej są opcjonalne ze względu na potencjalne problemy z atakami czasowymi. Zespół Chrome uważa, że kwantyzacja zapytań dotyczących sygnatury czasowej stanowi dobry kompromis między precyzją a bezpieczeństwem, ponieważ ogranicza rozdzielczość do 100 mikrosekund. Zobacz problem świt:1800.

W Chrome użytkownicy mogą wyłączyć kwantyzację sygnatur czasowych, włączając „Funkcje dla programistów WebGPU”. flag na chrome://flags/#enable-webgpu-developer-features. Pamiętaj, że to oznaczenie nie włącza funkcji "timestamp-query". Implementacja jego działania jest nadal w fazie eksperymentalnej i dlatego wymaga „niebezpiecznej obsługi WebGPU”. flaga na chrome://flags/#enable-unsafe-webgpu.

O świcie nowy przełącznik urządzeń o nazwie „timestamp_quantization” została dodana i jest domyślnie włączona. Fragment kodu poniżej pokazuje, jak zezwolić na eksperymentalne zapytanie „timestamp-query” bez kwantyzacji sygnatury czasowej przy wysyłaniu żądania urządzenia.

wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};

const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;

const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = &timestampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;

wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};

// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);

Funkcje sprzątania wiosną

Eksperymentalna funkcja „timestamp-query-inside-passes” funkcja została zmieniona na „chromium-experimental-timestamp-query-inside-passes” , aby wyjaśnić deweloperom, że ta funkcja jest eksperymentalna i obecnie jest dostępna tylko w przeglądarkach opartych na Chromium. Zobacz problem: świt:1193.

Eksperymentalne zapytanie „pipeline-statistics-query” Funkcja, która była jedynie częściowo wdrożona, została usunięta, ponieważ nie jest już rozwijana. Zobacz problem chromium:1177506.

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