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

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

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

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

Рекомендуется использовать директиву `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

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

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

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

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

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

Метод wgpuSurfaceGetPreferredFormat() из API webgpu.h реализован. См. проблему dawn:1362 .

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

Что нового в WebGPU?

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

Хром 144

Хром 143

Хром 142

Хром 141

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