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

Франсуа Бофор
François Beaufort

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

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

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

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

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

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

Также необходимо явно включить это расширение в коде WGSL с помощью enable chromium_experimental_subgroups . После включения вы получите доступ к следующим дополнениям:

  • subgroup_invocation_id : Встроенное значение для индекса потока внутри подгруппы.
  • subgroup_size : Встроенное значение для доступа к размеру подгруппы.
  • subgroupBallot(value): Возвращает набор битовых полей, где бит, соответствующий subgroup_invocation_id , равен 1, если value истинно для данного активного вызова, и 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 . Это дополнение позволяет, например, создавать сцены и эффекты на основе вокселей, выполняя рендеринг непосредственно в объемы 3D-текстур. См. проблему dawn:1020 .

Утренние обновления

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

Что нового в WebGPU?

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

Хром 144

Хром 143

Хром 142

Хром 141

Хром 140

Хром 139

Хром 138

Хром 137

Хром 136

Хром 135

Хром 134

Хром 133

Хром 132

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113