Поддержка встроенных функций 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» .
Хром 129
Хром 128
- Экспериментируем с подгруппами
- Устарела настройка смещения глубины для линий и точек.
- Скрыть предупреждение DevTools о неперехваченной ошибке, если PreventDefault
- WGSL сначала интерполирует выборку и либо
- Обновления рассвета
Хром 127
- Экспериментальная поддержка OpenGL ES на Android
- Информационный атрибут GPUAdapter
- Улучшения взаимодействия с WebAssembly
- Улучшены ошибки кодировщика команд.
- Обновления рассвета
Хром 126
- Увеличьте лимит maxTextureArrayLayers
- Оптимизация загрузки буфера для серверной части Vulkan
- Улучшение времени компиляции шейдеров
- Отправленные командные буферы должны быть уникальными.
- Обновления рассвета
Хром 125
Хром 124
- Текстуры хранения только для чтения и чтения-записи.
- Поддержка сервисных работников и коллективных работников
- Новые информационные атрибуты адаптера
- Исправления ошибок
- Обновления рассвета
Хром 123
- Поддержка встроенных функций DP4a в WGSL
- Неограниченные параметры указателя в WGSL
- Синтаксический сахар для разыменования композитов в WGSL
- Отдельное состояние только для чтения для аспектов трафарета и глубины.
- Обновления рассвета
Хром 122
- Расширьте охват с помощью режима совместимости (функция в разработке)
- Увеличьте лимит maxVertexAttributes
- Обновления рассвета
Хром 121
- Поддержка WebGPU на Android
- Используйте DXC вместо FXC для компиляции шейдеров в Windows.
- Запросы меток времени в проходах вычислений и рендеринга
- Точки входа по умолчанию в шейдерные модули
- Поддержка display-p3 как цветового пространства GPUExternalTexture.
- Информация о кучах памяти
- Обновления рассвета
Хром 120
- Поддержка 16-битных значений с плавающей запятой в WGSL.
- Расширьте границы
- Изменения состояния трафарета глубины
- Обновления информации об адаптере
- Квантование запросов временных меток
- Особенности генеральной уборки
Хром 119
- Фильтруемые 32-битные текстуры с плавающей запятой.
- формат вершин unorm10-10-10-2
- формат текстур rgb10a2uint
- Обновления рассвета
Хром 118
- Поддержка HTMLImageElement и ImageData в
copyExternalImageToTexture()
- Экспериментальная поддержка текстур для чтения-записи и хранения только для чтения.
- Обновления рассвета
Хром 117
- Сбросить буфер вершин
- Сбросить группу привязки
- Ошибки молчания при создании асинхронного конвейера при потере устройства
- Обновления создания шейдерного модуля SPIR-V
- Улучшение опыта разработчиков
- Кэширование конвейеров с автоматически создаваемым макетом
- Обновления рассвета
Хром 116
- Интеграция веб-кодеков
- Потерянное устройство, возвращенное
requestDevice()
- Обеспечьте плавное воспроизведение видео, если вызывается
importExternalTexture()
- Соответствие спецификациям
- Улучшение опыта разработчиков
- Обновления рассвета
Хром 115
- Поддерживаемые языковые расширения WGSL
- Экспериментальная поддержка Direct3D 11
- Получите дискретный графический процессор по умолчанию от сети переменного тока
- Улучшение опыта разработчиков
- Обновления рассвета
Хром 114
- Оптимизировать JavaScript
- getCurrentTexture() на ненастроенном холсте выдает InvalidStateError
- Обновления WGSL
- Обновления рассвета