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

François Beaufort
François Beaufort

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

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

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

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

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

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

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

Подробнее о передаче указателей в качестве параметров функций…

Эту функцию можно обнаружить с помощью navigator.gpu.wgslLanguageFeatures. Рекомендуется всегда использовать директиву requires, чтобы указать на потенциальную непортируемость с помощью 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 есть "pointer_composite_access" расширение языка WGSL, код шейдера WGSL теперь поддерживает доступ к компонентам сложных типов данных с помощью того же синтаксиса с точкой (.), независимо от того, работаете ли вы непосредственно с данными или с указателем на них. Вот как это работает:

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

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

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

Рекомендуется использовать директиву requires, чтобы указать на потенциальную непортируемость с помощью 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(), теперь вызывается сразу после возникновения ошибки. Именно этого ожидают разработчики при отладке. См. change dawn:173620.

Реализован метод wgpuSurfaceGetPreferredFormat() из webgpu.h API. Подробнее об ошибке dawn:1362…

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

Что нового в WebGPU

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

Chrome 155–156

Chrome 153–154

Chrome 151–152

Chrome 149–150

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

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