Поддержка 16-битных значений с плавающей запятой в WGSL.
В WGSL тип f16
представляет собой набор 16-битных значений с плавающей запятой в двоичном формате IEEE-754 (полуточность). Это означает, что для представления числа с плавающей запятой используется 16 бит, в отличие от 32 бит для обычных чисел с плавающей запятой одинарной точности ( f32
). Этот меньший размер может привести к значительному повышению производительности , особенно при обработке больших объемов данных.
Для сравнения, на устройстве Apple M1 Pro реализация f16
моделей Llama2 7B, использованная в демонстрации чата WebLLM, работает значительно быстрее, чем реализация f32
, с улучшением скорости предварительного заполнения на 28 % и скоростью декодирования на 41 %, как показано на рис. следующие скриншоты.
Не все графические процессоры поддерживают 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
состояния трафарета глубины больше не требуются всегда: depthWriteEnabled
требуется только для форматов с глубиной, а depthCompare
не требуется для форматов с глубиной, если она вообще не используется. См. выпуск Dawn:2132 .
Обновления информации об адаптере
Атрибуты нестандартного type
и информации backend
адаптере теперь доступны при вызове requestAdapterInfo() , когда пользователь включил флаг «Функции разработчика WebGPU» в chrome://flags/#enable-webgpu-developer-features
. type
может быть «дискретный графический процессор», «интегрированный графический процессор», «ЦП» или «неизвестный». backend
может быть «WebGPU», «D3D11», «D3D12», «metal», «vulkan», «openGL», «openGLES» или «null». См. выпуск Dawn:2112 и выпуск Dawn:2107 .
Необязательный параметр списка unmaskHints
в requestAdapterInfo() был удален. См. выпуск Dawn:1427 .
Квантование запросов временных меток
Запросы временных меток позволяют приложениям измерять время выполнения команд графического процессора с точностью до наносекунды. Однако спецификация WebGPU делает запросы временных меток необязательными из-за проблем с атакой по времени . Команда Chrome считает, что квантование запросов временных меток обеспечивает хороший компромисс между точностью и безопасностью за счет снижения разрешения до 100 микросекунд. См. выпуск Dawn:1800 .
В Chrome пользователи могут отключить квантование временных меток, включив флаг «Функции разработчика WebGPU» по адресу chrome://flags/#enable-webgpu-developer-features
. Обратите внимание, что сам по себе этот флаг не включает функцию "timestamp-query"
. Его реализация все еще является экспериментальной и поэтому требует наличия флага «Поддержка Unsafe WebGPU» в chrome://flags/#enable-unsafe-webgpu
.
В Dawn был добавлен новый переключатель устройств под названием «timestamp_quantization», который включен по умолчанию. В следующем фрагменте показано, как разрешить экспериментальную функцию «запрос метки времени» без квантования метки времени при запросе устройства.
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 .
Экспериментальная функция «конвейерного запроса статистики», которая была реализована лишь частично, была удалена, поскольку она больше не разрабатывается. См. выпуск chromium:1177506 .
Это касается только некоторых ключевых моментов. Ознакомьтесь с исчерпывающим списком коммитов .
Что нового в WebGPU
Список всего, что было описано в серии «Что нового в WebGPU» .
Хром 130
- Смешение двух источников
- Улучшение времени компиляции шейдеров в Metal
- Устаревшая функция запроса GPUAdapterInfo().
- Обновления рассвета
Хром 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
- Обновления рассвета