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

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

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

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

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

Вы также можете протестировать подгруппы на своем сайте с реальными пользователями, зарегистрировавшись для участия в пробном периоде . Инструкции по подготовке сайта к использованию пробного периода см. в разделе «Начало работы с пробными периодами» . Пробный период будет проходить с 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 истинно для данного активного вызова, и 0 в противном случае.
  • subgroupBroadcast(value, id) : Передает value из вызова с subgroup_invocation_id , соответствующим id всем вызовам внутри подгруппы. Примечание: id должен быть константой времени компиляции.

В будущем будут добавлены дополнительные встроенные функции, такие как subgroupAdd , subgroupAll , subgroupElect , subgroupShuffle . См. проблему 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 если топология конвейера рендеринга имеет линейный или точечный тип. Чтобы дать разработчикам достаточно времени для обновления кода, в консоли инструментов разработчика отображается предупреждение об этой предстоящей проверке, а также принудительно обнуляются значения в таких случаях. См. проблему 352567424 .

Скрыть предупреждение DevTools о незафиксированной ошибке, если используется preventDefault.

В консоли инструментов разработчика предупреждения о событиях 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 сначала интерполирует выборку, а затем либо

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

Утренние обновления

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

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

Теперь бэкенд OpenGL поддерживает Surface с переворотом по оси Y для каждого вызова Present() . См. проблему 344814083 .

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

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

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

Что нового в WebGPU?

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

Хром 144

Хром 143

Хром 142

Хром 141

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