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

François Beaufort
François Beaufort

В этот раз количество функций WebGPU может показаться небольшим, но некоторые важные улучшения уже на подходе! В будущих версиях будут добавлены такие функции, как повышение скорости компиляции шейдеров, а также изменения в асинхронной модели реализации с использованием WGPUFuture.

Подгруппы (функция в разработке)

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

Операции с подгруппами поддерживаются современными API графических процессоров, но названия и детали реализации различаются. Команда Chrome выявила общие черты и сейчас работает над стандартизацией этой функции. Если у вас возникли вопросы, ознакомьтесь с предложением и комментарием.

За флагом "Экспериментальные функции веб-платформы" по адресу chrome://flags/#enable-experimental-web-platform-features скрыта минимальная и нестандартизированная реализация подгрупп, чтобы разработчики могли попробовать ее и поделиться отзывами, поскольку реальные преимущества в контексте WebGPU ещё не доказаны.

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

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

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

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

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

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

  @compute @workgroup_size(64) fn main(
      @builtin(global_invocation_id) global_id : vec3u,
      @builtin(subgroup_size) sg_size : u32,
      @builtin(subgroup_invocation_id) sg_id : u32) {
    // TODO: Use subgroupBallot() and subgroupBroadcast().
  }`,
});

Визуализация в фрагмент 3D-текстуры

Теперь можно выполнять рендеринг непосредственно в фрагменты 3D-текстур в проходах рендеринга, расширяя возможности за пределы обычного рендеринга 2D-текстур с помощью нового элемента depthSlice в GPURenderPassColorAttachment. Это позволяет, например, создавать сцены и эффекты на основе вокселей, выполняя отрисовку непосредственно в трехмерные текстурные объемы. Подробнее о проблеме dawn:1020…

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

Ознакомьтесь с полным списком коммитов.

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