Что нового в 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 истинно для этого активного вызова, и 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» .

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113