Что нового в WebGPU (Chrome 123)

Франсуа Бофор
François Beaufort

Поддержка встроенных функций DP4a в WGSL

DP4a (Dot Product of 4 Elements and Accumulate) относится к набору инструкций GPU, обычно используемых в глубоком обучении для квантования. Он эффективно выполняет 8-битные целочисленные скалярные произведения для ускорения вычисления таких int8-квантованных моделей. Он может сэкономить (до 75%) памяти и пропускной способности сети и улучшить производительность любых моделей машинного обучения в выводе по сравнению с их версией f32. В результате он теперь широко используется во многих популярных фреймворках ИИ.

Когда расширение языка WGSL "packed_4x8_integer_dot_product" присутствует в navigator.gpu.wgslLanguageFeatures , вы теперь можете использовать 32-битные целочисленные скаляры, упаковывающие 4-компонентные векторы 8-битных целых чисел в качестве входных данных для инструкций скалярного произведения в коде шейдера WGSL со встроенными функциями dot4U8Packed и dot4I8Packed . Вы также можете использовать инструкции упаковки и распаковки с упакованными 4-компонентными векторами 8-битных целых чисел со встроенными функциями WGSL pack4xI8 , pack4xU8 , pack4xI8Clamp , pack4xU8Clamp , unpack4xI8 и unpack4xU8 .

Рекомендуется использовать директиву require-directive для сигнализации о потенциальной непереносимости с помощью requires packed_4x8_integer_dot_product; в верхней части кода шейдера WGSL. См. следующий пример и выдайте tint:1497 .

if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
  throw new Error(`DP4a built-in functions are not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires packed_4x8_integer_dot_product;

  fn main() {
    const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
  }`,
});

Особая благодарность команде Intel Web Graphics в Шанхае за доведение этой спецификации и ее реализацию до завершения!

Неограниченные параметры указателя в WGSL

Расширение языка WGSL "unrestricted_pointer_parameters" ослабляет ограничения на то, какие указатели могут передаваться функциям WGSL:

  • Указатели параметров адресных пространств storage , uniform и адреса workgroup на объявленные пользователем функции.

  • Передача указателей на элементы структуры и элементы массива в объявленные пользователем функции.

Подробнее об этом можно узнать в статье Указатели как параметры функций | Обзор WGSL .

Эту функцию можно обнаружить с помощью navigator.gpu.wgslLanguageFeatures . Рекомендуется всегда использовать директиву require-directive для сигнализации о потенциальной непереносимости с помощью requires unrestricted_pointer_parameters; в верхней части кода шейдера WGSL. См. следующий пример, изменения спецификации WGSL и проблему tint:2053 .

if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
  throw new Error(`Unrestricted pointer parameters are not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires unrestricted_pointer_parameters;

  @group(0) @binding(0) var<storage, read_write> S : i32;

  fn func(pointer : ptr<storage, i32, read_write>) {
    *pointer = 42;
  }

  @compute @workgroup_size(1)
  fn main() {
    func(&S);
  }`
});

Синтаксический сахар для разыменования композитов в WGSL

Когда расширение языка WGSL "pointer_composite_access" присутствует в navigator.gpu.wgslLanguageFeatures , ваш код шейдера WGSL теперь поддерживает доступ к компонентам сложных типов данных с использованием того же синтаксиса с точкой ( . ), независимо от того, работаете ли вы напрямую с данными или с указателем на них. Вот как это работает:

  • Если foo — указатель: foo.bar — более удобный способ записи (*foo).bar . Звездочка ( * ) обычно нужна для превращения указателя в «ссылку», которую можно разыменовать, но теперь и указатели, и ссылки гораздо более похожи и почти взаимозаменяемы.

  • Если foo не является указателем: оператор точки ( . ) работает точно так же, как вы привыкли для прямого доступа к членам.

Аналогично, если pa — указатель, хранящий начальный адрес массива, то использование pa[i] дает вам прямой доступ к ячейке памяти, где хранится 'i -й элемент этого массива.

Рекомендуется использовать директиву require-directive для сигнализации о потенциальной непереносимости с помощью requires pointer_composite_access; в верхней части кода шейдера WGSL. См. следующий пример и выдайте tint:2113 .

if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
  throw new Error(`Pointer composite access is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires pointer_composite_access;

  fn main() {
    var a = vec3f();
    let p : ptr<function, vec3f> = &a;
    let r1 = (*p).x; // always valid.
    let r2 = p.x; // requires pointer composite access.
  }`
});

Отдельное состояние «только для чтения» для аспектов трафарета и глубины

Ранее вложения трафарета глубины только для чтения в проходах рендеринга требовали, чтобы оба аспекта (глубина и трафарет) были только для чтения. Это ограничение было снято. Теперь вы можете использовать аспект глубины только для чтения, например, для трассировки контактной тени, в то время как буфер трафарета записывается для идентификации пикселей для дальнейшей обработки. См. issue dawn:2146 .

Обновления рассвета

Незахваченный обратный вызов ошибки, установленный с помощью wgpuDeviceSetUncapturedErrorCallback() , теперь вызывается немедленно при возникновении ошибки. Это то, чего разработчики постоянно ожидают и хотят для отладки. См. изменение dawn:173620 .

Реализован метод wgpuSurfaceGetPreferredFormat() из API webgpu.h . См. issue dawn:1362 .

Это охватывает только некоторые из ключевых моментов. Ознакомьтесь с исчерпывающим списком коммитов .

Что нового в WebGPU

Список всего, что было рассмотрено в серии « Что нового в WebGPU» .

Хром 138

Хром 137

Хром 136

Хром 135

Хром 134

Хром 133

Хром 132

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113