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

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

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

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

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

Рекомендуется использовать директиву require, чтобы сигнализировать о возможности непереносимости с помощью 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, чтобы сигнализировать о возможности непереносимости с помощью 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

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

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

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

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

Рекомендуется использовать директиву require, чтобы сигнализировать о возможности невозможности переносимости с помощью 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.
  }`
});

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

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

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

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

Реализован метод wgpuSurfaceGetPreferredFormat() из API webgpu.h . См. выпуск Dawn:1362 .

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

Что нового в WebGPU

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

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113