Поддержка 16-битных значений с плавающей запятой в WGSL
В WGSL тип f16 представляет собой набор 16-битных значений с плавающей запятой в формате IEEE-754 binary16 (половинная точность). Это означает, что для представления числа с плавающей запятой используется 16 бит, в отличие от 32 бит для обычных чисел с плавающей запятой одинарной точности ( f32 ). Меньший размер может привести к значительному повышению производительности , особенно при обработке больших объемов данных.
Для сравнения, на устройстве Apple M1 Pro реализация f16 моделей Llama2 7B, использованная в демонстрационном чате WebLLM, значительно быстрее, чем реализация f32 , с улучшением скорости предварительного заполнения на 28% и улучшением скорости декодирования на 41%, как показано на следующих скриншотах.

f32 (слева) и f16 (справа). Не все графические процессоры поддерживают 16-битные значения с плавающей запятой. Если функция "shader-f16" доступна в GPUAdapter , вы можете запросить GPUDevice с этой функцией и создать модуль шейдера WGSL, который использует тип данных с плавающей запятой половинной точности f16 . Этот тип допустим для использования в модуле шейдера WGSL только в том случае, если вы включите расширение WGSL f16 с помощью enable f16; В противном случае функция createShaderModule() выдаст ошибку проверки. См. следующий минимальный пример и проблему dawn:1510 .
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
requiredFeatures: ["shader-f16"],
});
const code = `
enable f16;
@compute @workgroup_size(1)
fn main() {
const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
}
`;
const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...
В коде модуля шейдеров WGSL можно поддерживать как типы f16 , так и f32 используя alias зависящий от поддержки функции "shader-f16" как показано в следующем фрагменте кода.
const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");
const device = await adapter.requestDevice({
requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});
const header = hasShaderF16
? `enable f16;
alias min16float = f16;`
: `alias min16float = f32;`;
const code = `
${header}
@compute @workgroup_size(1)
fn main() {
const c = vec3<min16float>(1.0, 2.0, 3.0);
}
`;
Расширяйте границы возможного
Максимальное количество байтов, необходимое для хранения одного сэмпла (пикселя или субпикселя) выходных данных конвейера рендеринга, со всеми цветовыми привязками, по умолчанию составляет 32 байта. Теперь можно запросить до 64 байтов, используя ограничение maxColorAttachmentBytesPerSample . См. следующий пример и проблему dawn:2036 .
const adapter = await navigator.gpu.requestAdapter();
if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
// When the desired limit isn't supported, take action to either fall back to
// a code path that does not require the higher limit or notify the user that
// their device does not meet minimum requirements.
}
// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});
На всех платформах увеличены ограничения maxInterStageShaderVariables и maxInterStageShaderComponents , используемые для межэтапного взаимодействия. Подробности см. в сообщении об ошибке dawn:1448 .
Для каждого этапа шейдера максимальное количество элементов компоновки групп привязки в рамках конвейерной компоновки, являющихся буферами хранения, по умолчанию составляет 8. Теперь можно запросить до 10, используя ограничение maxStorageBuffersPerShaderStage . См. проблему dawn:2159 .
Добавлено новое ограничение maxBindGroupsPlusVertexBuffers . Оно представляет собой максимальное количество слотов групп привязки и вершинных буферов, используемых одновременно, с учетом любых пустых слотов ниже наивысшего индекса. Значение по умолчанию — 24. См. проблему dawn:1849 .
Изменения в состоянии глубины-шаблона
Для улучшения удобства работы разработчиков атрибуты depthWriteEnabled и depthCompare , относящиеся к состоянию depth-stencil, больше не всегда требуются: depthWriteEnabled необходим только для форматов с глубиной, а depthCompare не требуется для форматов с глубиной, если он вообще не используется. См. проблему dawn:2132 .
Обновления информации об адаптере
Теперь при вызове функции requestAdapterInfo() , если пользователь включил флаг "WebGPU Developer Features" по адресу chrome://flags/#enable-webgpu-developer-features , доступны нестандартные атрибуты type и информации об адаптере backend type может быть "discrete GPU", "integrated GPU", "CPU" или "unknown". backend может быть "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" или "null". См. проблемы dawn:2112 и dawn:2107 .

Необязательный параметр списка unmaskHints в функции requestAdapterInfo() был удален. См. проблему dawn:1427 .
Квантование запросов по временным меткам
Запросы с использованием временных меток позволяют приложениям измерять время выполнения команд GPU с точностью до наносекунды. Однако спецификация WebGPU делает запросы с использованием временных меток необязательными из-за опасений по поводу атак по времени . Команда Chrome считает, что квантование запросов с использованием временных меток обеспечивает хороший компромисс между точностью и безопасностью, уменьшая разрешение до 100 микросекунд. См. проблему dawn:1800 .
В Chrome пользователи могут отключить квантование временных меток, включив флаг "WebGPU Developer Features" по адресу chrome://flags/#enable-webgpu-developer-features . Обратите внимание, что этот флаг сам по себе не включает функцию "timestamp-query" . Ее реализация все еще экспериментальная и поэтому требует флага "Unsafe WebGPU Support" по адресу chrome://flags/#enable-unsafe-webgpu .
В Dawn добавлен новый переключатель для устройств под названием "timestamp_quantization", который включен по умолчанию. Следующий фрагмент кода показывает, как включить экспериментальную функцию "timestamp-query" без квантования временной метки при запросе устройства.
wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};
const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;
const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = ×tampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;
wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};
// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);
Особенности весенней уборки
Экспериментальная функция "timestamp-query-inside-passes" была переименована в "chromium-experimental-timestamp-query-inside-passes", чтобы разработчикам было понятно, что эта функция является экспериментальной и пока доступна только в браузерах на основе Chromium. См. проблему dawn:1193 .
Экспериментальная функция "pipeline-statistics-query", которая была реализована лишь частично, была удалена, поскольку её разработка прекращена. См. проблему chromium:1177506 .
Здесь описаны лишь некоторые из ключевых моментов. Ознакомьтесь с полным списком изменений .
Что нового в WebGPU?
Список всего, что было рассмотрено в серии статей «Что нового в WebGPU» .
Хром 145
- Расширение WGSL subgroup_uniformity
- Экспериментальное синхронное отображение буферов в рабочих процессах
- Утренние обновления
Хром 144
- Расширение WGSL subgroup_id
- Расширение WGSL uniform_buffer_standard_layout
- WebGPU на Linux
- Более быстрая запись буфера и текстуры
- Утренние обновления
Хром 143
- Компонент текстуры swizzle
- Удалить использование текстур в хранилище только для чтения bgra8unorm
- Утренние обновления
Хром 142
Хром 141
- Завершено тонирование ИК-излучения
- Анализ целочисленных диапазонов в компиляторе WGSL
- Обновление SPIR-V 1.4 для бэкенда Vulkan
- Утренние обновления
Хром 140
- Устройство запрашивает использование адаптера
- Сокращенная запись для использования текстуры там, где используется представление текстуры.
- WGSL textureSampleLevel поддерживает одномерные текстуры.
- Прекратить использование текстур в режиме только для чтения в bgra8unorm
- Удалите атрибут isFallbackAdapter из списка GPUAdapter.
- Утренние обновления
Хром 139
- Поддержка 3D-текстур для сжатых форматов BC и ASTC.
- Новая функция «Основные функции и ограничения»
- Пробная версия Origin для режима совместимости с WebGPU
- Утренние обновления
Хром 138
- Сокращенная запись для использования буфера в качестве ресурса привязки.
- Изменения требований к размеру буферов, отображаемых при создании.
- Архитектурный отчет для современных графических процессоров.
- Устаревший атрибут isFallbackAdapter для GPUAdapter
- Утренние обновления
Хром 137
- Используйте представление текстуры для привязки внешней текстуры.
- Копирование буферов выполняется без указания смещений и размера.
- Рабочая группа WGSL UniformLoad с использованием указателя на атомарную функцию
- Атрибут powerPreference GPUAdapterInfo
- Удалите атрибут compatibilityMode из GPURequestAdapterOptions.
- Утренние обновления
Хром 136
- Атрибут gPUAdapterInfo isFallbackAdapter
- Улучшения времени компиляции шейдеров в D3D12
- Сохраняйте и копируйте изображения холста.
- Ограничения режима совместимости лифта
- Утренние обновления
Хром 135
- Разрешить создание макета конвейера с макетом группы привязки пустого значения
- Разрешите области просмотра выходить за пределы границ целевых областей рендеринга.
- Упрощенный доступ к экспериментальному режиму совместимости на Android.
- Удалите ограничение maxInterStageShaderComponents.
- Утренние обновления
Хром 134
- Оптимизация рабочих нагрузок машинного обучения с помощью подгрупп
- Удалить поддержку типов текстур с возможностью фильтрации (float filterable texture types) как смешиваемых (blendable).
- Утренние обновления
Хром 133
- Дополнительные форматы unorm8x4-bgra и 1-компонентные вершинные форматы
- Разрешить запрос неизвестных лимитов с неопределенным значением.
- Изменения в правилах выравнивания WGSL
- Повышение производительности WGSL за счет отбрасывания
- Используйте параметр `videoFrame displaySize` для внешних текстур.
- Обработка изображений с нестандартной ориентацией осуществляется с помощью функции copyExternalImageToTexture.
- Улучшение опыта разработчиков
- Включите режим совместимости с помощью featureLevel
- Очистка характеристик экспериментальной подгруппы
- Устаревшее ограничение maxInterStageShaderComponents
- Утренние обновления
Хром 132
- Использование текстурного представления
- смешивание 32-битных текстур с плавающей запятой
- Атрибут GPUDevice adapterInfo
- Настройка контекста холста с недопустимым форматом вызывает ошибку JavaScript.
- Фильтрация ограничений сэмплера для текстур
- Эксперименты с расширенными подгруппами
- Улучшение опыта разработчиков
- Экспериментальная поддержка 16-битных нормализованных форматов текстур.
- Утренние обновления
Хром 131
- Расстояние между клипами в WGSL
- GPUCanvasContext getConfiguration()
- Примитивы точек и линий не должны иметь смещения по глубине.
- Встроенные функции сканирования для подгрупп.
- Экспериментальная поддержка непрямого режима с несколькими вариантами отсчета.
- Параметр компиляции модуля шейдера: строгая математика
- Удалить GPUAdapter requestAdapterInfo()
- Утренние обновления
Хром 130
- Смешивание из двух источников
- Улучшения времени компиляции шейдеров в Metal.
- Функция requestAdapterInfo() объявлена устаревшей.
- Утренние обновления
Хром 129
- Поддержка HDR с режимом тонального отображения холста.
- Расширенная поддержка подгрупп
- Утренние обновления
Хром 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
- Для компиляции шейдеров в Windows используйте DXC вместо FXC.
- Запросы по временным меткам в вычислительных и рендеринговых проходах
- Точки входа по умолчанию для модулей шейдеров
- Поддержка display-p3 в качестве цветового пространства GPUExternalTexture
- информация о кучах памяти
- Утренние обновления
Хром 120
- Поддержка 16-битных значений с плавающей запятой в WGSL
- Расширяйте границы возможного
- Изменения в состоянии глубины-шаблона
- Обновления информации об адаптере
- Квантование запросов по временным меткам
- Особенности весенней уборки
Хром 119
- Фильтруемые 32-битные текстуры с плавающей запятой
- unorm10-10-10-2 формат вершин
- формат текстуры rgb10a2uint
- Утренние обновления
Хром 118
- Поддержка HTMLImageElement и ImageData в
copyExternalImageToTexture() - Экспериментальная поддержка текстур для чтения и записи, а также для чтения и только для чтения.
- Утренние обновления
Хром 117
- Неустановленный буфер вершин
- Отключить группу привязки
- Отключение ошибок при создании асинхронного конвейера в случае потери устройства
- Обновления по созданию шейдерных модулей SPIR-V
- Улучшение опыта разработчиков
- Конвейеры кэширования с автоматически генерируемой структурой.
- Утренние обновления
Хром 116
- Интеграция с WebCodecs
-
requestDevice()объекта GPUAdapter возвращает сообщение о потере устройства. - Обеспечьте плавное воспроизведение видео, если вызывается
importExternalTexture() - Соответствие спецификации
- Улучшение опыта разработчиков
- Утренние обновления
Хром 115
- Поддерживаемые языковые расширения WGSL
- Экспериментальная поддержка Direct3D 11
- При подключении к сети переменного тока по умолчанию используется дискретная видеокарта.
- Улучшение опыта разработчиков
- Утренние обновления
Хром 114
- Оптимизировать JavaScript
- Метод getCurrentTexture() на неконфигурированном холсте вызывает ошибку InvalidStateError.
- Обновления WGSL
- Утренние обновления