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

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

Эксперименты с подгруппами

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

Минимальная реализация предложения подгрупп доступна для локального тестирования с флагом «Unsafe WebGPU Support» по адресу chrome://flags/#enable-unsafe-webgpu .

Вы также можете попробовать создать на своём сайте подгруппы с реальными пользователями, зарегистрировавшись на пробную версию Origin . Инструкции по подготовке сайта к использованию пробных версий Origin см. в статье «Начало работы с пробными версиями Origin». Пробная версия Origin будет действовать с Chrome 128 по 131 (до 19 февраля 2025 г.). См. раздел «Намерение экспериментировать» .

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

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

  • subgroup_invocation_id : встроенное значение индекса потока внутри подгруппы.
  • subgroup_size : встроенное значение для доступа к размеру подгруппы.
  • subgroupBallot(value) : возвращает набор битовых полей, где бит, соответствующий subgroup_invocation_id , равен 1, если value равно true для этого активного вызова, и 0 в противном случае.
  • subgroupBroadcast(value, id) : транслирует value из вызова с subgroup_invocation_id , соответствующим id , всем вызовам внутри подгруппы. Примечание: id должен быть константой времени компиляции.

В будущем будут добавлены дополнительные встроенные функции, такие как subgroupAdd , subgroupAll , subgroupElect и subgroupShuffle . См. issue 354738715 .

Чтобы разрешить f16 в операциях с подгруппами, запросите GPUDevice с функциями "subgroups" , "subgroups-f16" и "shader-f16" , а затем включите его в коде WGSL с помощью enable f16, subgroups, subgroups_f16;

Следующий фрагмент кода предоставляет основу для экспериментов и раскрытия потенциала подгрупп.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

Отменить настройку смещения глубины для линий и точек

Изменение спецификации WebGPU приводит к тому, что установка ненулевых значений для параметров depthBias , depthBiasSlopeScale и depthBiasClamp при топологии конвейера рендеринга линейного или точечного типа приводит к ошибке валидации. Чтобы дать разработчикам достаточно времени для обновления кода, в консоли DevTools отображается предупреждение о предстоящей валидации, а также принудительно устанавливаются нулевые значения в таких случаях. См. issue 352567424 .

Скрыть предупреждение DevTools об ошибке, если preventDefault

В консоли DevTools предупреждения о событиях uncapturederror больше не отображаются, если зарегистрирован прослушиватель событий uncapturederror и в обратном вызове прослушивателя событий был вызван метод Event preventDefault() . Это поведение соответствует обработке событий в JavaScript. См. следующий пример и ошибку 40263619 .

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL сначала интерполирует выборку, а затем либо

Атрибут WGSL interpolate позволяет управлять пользовательской интерполяцией данных ввода-вывода. Теперь новые параметры выборки interpolate first (по умолчанию) и either предоставляют дополнительный контроль: first использует значение из первой вершины примитива, а either допускает либо первую, либо последнюю вершину. См. issue 340278447 .

Обновления Dawn

Реализация WGPUFuture в Dawn для обработки асинхронных операций завершена. Ключевые концепции включают wgpuInstanceProcessEvents для оппортунистической обработки событий и WGPUCallbackMode для определения точек обратного вызова. WGPUFuture обозначает одноразовые события с бесконечным временем существования, а wgpuInstanceWaitAny ожидает завершения любого будущего события или истечения времени ожидания. См. issue 42240932 .

Значение CompositeAlphaMode::Auto теперь не возвращается функцией Surface::GetCapabilities() . Оно по-прежнему допустимо и эквивалентно Surface::GetCapabilities().alphaMode[0] . См. проблему 292 .

Бэкэнд OpenGL теперь поддерживает Surface с y-flip-переворотом для каждого вызова Present() . См . issue 344814083 .

Метод Adapter::GetProperties() устарел, вместо него используется Adapter::GetInfo() .

Джасвант, внешний участник, переписал все файлы CMake, упростив их обновление и сделав возможным предварительную сборку. Ознакомьтесь с кратким руководством по использованию Dawn в проектах CMake.

Здесь рассматриваются лишь некоторые из ключевых моментов. Ознакомьтесь с полным списком коммитов .

Что нового в WebGPU

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

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