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

François Beaufort
François Beaufort

Эксперименты с подгруппами

Функция подгрупп позволяет использовать параллелизм на уровне SIMD, благодаря чему потоки в группе могут обмениваться данными и выполнять коллективные математические операции (например, вычислять сумму 16 чисел). Это позволяет эффективно обмениваться данными между потоками.

Минимальная реализация предложения о подгруппах доступна для локального тестирования за флагом "Unsafe WebGPU Support" по адресу chrome://flags/#enable-unsafe-webgpu.

Вы также можете попробовать использовать подгруппы на своем сайте с реальными пользователями, зарегистрировавшись для участия в эксперименте с источником. Чтобы узнать, как подготовить сайт к использованию пробных версий, ознакомьтесь со статьей Как начать работу с пробными версиями. Эксперимент с источником будет доступен в Chrome 128–131 (до 19 февраля 2025 г.). Подробнее о намерении провести эксперимент…

Когда функция "subgroups" станет доступна в GPUAdapter, запросите GPUDevice с этой функцией, чтобы получить поддержку подгрупп в WGSL, и проверьте ее ограничения minSubgroupSize и maxSubgroupSize.

Вам также нужно явно включить это расширение в коде WGSL с помощью enable subgroups;. Если этот параметр включен, вам будут доступны следующие функции:

  • subgroup_invocation_id – встроенное значение индекса потока в подгруппе.
  • subgroup_size – встроенное значение для доступа к размеру подгруппы.
  • subgroupBallot(value) – возвращает набор битовых полей, в которых бит, соответствующий subgroup_invocation_id, равен 1, если value имеет значение true для активного вызова, и 0 в противном случае.
  • subgroupBroadcast(value, id): передает value из вызова с subgroup_invocation_id, соответствующим id, всем вызовам в подгруппе. Примечание. id должно быть константой времени компиляции.

В будущем мы добавим больше встроенных функций, таких как subgroupAdd, subgroupAll, subgroupElect и subgroupShuffle. Подробнее о проблеме 354738715…

Чтобы разрешить использование f16 в операциях с подгруппами, запросите GPUDevice с функциями "subgroups", "subgroups-f16" и "shader-f16", а затем включите его в коде WGSL с помощью enable f16, subgroups, subgroups_f16;.

В приведенном ниже фрагменте кода показано, как использовать подгруппы.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

Прекращение поддержки настройки смещения глубины для линий и точек

Согласно изменению спецификации WebGPU, если топология конвейера отрисовки имеет тип линии или точки, то при установке для параметров depthBias, depthBiasSlopeScale и depthBiasClamp ненулевого значения возникает ошибка проверки. Чтобы у разработчиков было достаточно времени на обновление кода, в консоли инструментов разработчика показывается предупреждение о предстоящей проверке, а значения в таких случаях принудительно устанавливаются равными нулю. Подробнее о проблеме 352567424…

Скрыть предупреждение инструментов разработчика о необработанной ошибке, если используется preventDefault

В консоли инструментов разработчика больше не показываются предупреждения о событиях uncapturederror, если зарегистрирован прослушиватель событий для uncapturederror и в обратном вызове прослушивателя событий был вызван метод preventDefault(). Это соответствует обработке событий в JavaScript. Ознакомьтесь с примером ниже и проблемой 40263619.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL сначала выполняет выборку для интерполяции, а затем:

Атрибут WGSL interpolate позволяет управлять интерполяцией данных ввода-вывода, заданных пользователем. Новые параметры выборки с интерполяцией first (по умолчанию) и either дают вам больше возможностей управления: first использует значение из первой вершины примитива, а either позволяет использовать первую или последнюю вершину. Подробнее о проблеме 340278447…

Обновления на рассвете

Реализация WGPUFuture в Dawn для обработки асинхронных операций завершена. Среди основных концепций – wgpuInstanceProcessEvents для обработки событий и WGPUCallbackMode для определения местоположения обратного вызова. WGPUFuture обозначает однократные события с бесконечным сроком действия, а wgpuInstanceWaitAny ожидает завершения любого будущего события или истечения времени ожидания. Подробнее о проблеме 42240932…

Значение CompositeAlphaMode::Auto больше не передается с помощью параметра Surface::GetCapabilities(). Он по-прежнему действителен и эквивалентен значению Surface::GetCapabilities().alphaMode[0]. Подробнее о проблеме 292…

Теперь серверная часть OpenGL поддерживает Surface с копированием с отражением по оси Y для каждого вызова Present(). Подробнее об этой проблеме…

Метод Adapter::GetProperties() устарел. Вместо него рекомендуется использовать метод Adapter::GetInfo().

Внешний разработчик Jaswant переписал все файлы CMake, чтобы их было проще обновлять и чтобы можно было выполнять предварительную сборку. Ознакомьтесь с кратким руководством по использованию Dawn в проектах CMake.

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

Что нового в WebGPU

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

Chrome 155–156

Chrome 153–154

Chrome 151–152

Chrome 149–150

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113