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

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

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

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

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

Операции подгрупп поддерживаются современными API GPU, но детали именования и реализации различаются. Команда 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 .

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

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

Что нового в WebGPU

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

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