Что нового в 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» .

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113

,

Франсуа Бофор
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» .

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113