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

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

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

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

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

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

За флагом «Экспериментальные функции веб-платформы» по адресу 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 равно 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 . Это дополнение позволяет, например, создавать воксельные сцены и эффекты, рендеряя их непосредственно в объёмы 3D-текстур. См. issue dawn:1020 .

Обновления Dawn

Ознакомьтесь с исчерпывающим списком коммитов .

Что нового в WebGPU

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

Хром 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