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

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

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

DP4a (скалярное произведение 4 элементов с накоплением) — это набор инструкций графического процессора, обычно используемых в глубоком обучении для квантования. Он эффективно выполняет скалярные произведения 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-, чтобы обозначить потенциальную непереносимость, с помощью 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

Если расширение языка WGSL "pointer_composite_access" присутствует в navigator.gpu.wgslLanguageFeatures , ваш код шейдера 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.
  }`
});

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

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

Обновления Dawn

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

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

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

Что нового в WebGPU

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

Хром 140

Хром 139

Хром 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