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

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113