ویژگی‌های جدید WebGPU (‏Chrome 144)

François Beaufort
François Beaufort

منتشرشده: ۷ ژانویه ۲۰۲۶

افزونه WGSL subgroup_id

افزونه زبان WGSL subgroup_id به شما امکان می‌دهد وقتی افزونه subgroups فعال است از مقادیر داخلی جدید زیر در گروه‌های کاری استفاده کنید:

  • ‫subgroup_id: شناسه زیرگروه یک فراخوانی را در گروه کاری فعلی ارائه می‌دهد.
  • ‫num_subgroups: تعداد زیرگروه‌های موجود در گروه کاری را گزارش می‌کند.

قبلاً، برای نمایه کردن حافظه بااستفاده از شناسه‌های فراخوانی زیرگروه، باید شناسه زیرگروه را (معمولاً ازطریق عملیات اتمی) بازسازی می‌کردید تا از دسترسی‌های حافظه هم‌پوشانی جلوگیری کنید. اکنون می‌توانید از subgroup_id برای پر کردن نیمه دیگر این معادله استفاده کنید. ازآنجایی‌که این کارکرد هنوز در زیرینه D3D دردسترس نیست، در آنجا شبیه‌سازی می‌شود. ایجاد معادل برای local_invocation_index به‌عنوان subgroup_invocation_id + subgroup_size * subgroup_id باید ایمن باشد. توجه داشته باشید که ممکن است مواردی وجود داشته باشد که زیرگروه‌ها کامل نباشند.

این افزونه زبان را می‌توان بااستفاده از navigator.gpu.wgslLanguageFeatures تشخیص ویژگی کرد. توصیه می‌شود از یک دستور requires برای نشان دادن احتمال غیرقابل انتقال بودن با requires subgroup_id; در بالای کد سایه‌زن WGSL خود استفاده کنید. مثال زیر و قصد ارسال را ببینید.

if (!navigator.gpu.wgslLanguageFeatures.has("subgroup_id")) {
  throw new Error(`WGSL subgroup_id and num_subgroups built-in values are not available`);
}

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

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

  @compute @workgroup_size(64, 1, 1)
  fn main(@builtin(subgroup_id) subgroup_id : u32,
          @builtin(num_subgroups) num_subgroups : u32) {
    // TODO: Use subgroup_id and num_subgroups values.
  }`,
});

افزونه WGSL uniform_buffer_standard_layout

افزونه زبان WGSL uniform_buffer_standard_layout به بافرهای یکنواخت اجازه می‌دهد از همان محدودیت‌های چیدمان حافظه بافرهای ذخیره‌سازی استفاده کنند، که باعث می‌شود هم‌رسانی ساختارهای داده در هر دو نوع بافر آسان‌تر شود. این یعنی بافرهای یکنواخت دیگر نیازی ندارند که عناصر آرایه را ۱۶ بایتی تراز کنند یا افست‌های ساختار تودرتو را به مضربی از ۱۶ بایت گسترش دهند.

این افزونه زبان را می‌توان بااستفاده از navigator.gpu.wgslLanguageFeatures تشخیص ویژگی کرد. توصیه می‌شود از یک دستور requires برای نشان دادن احتمال غیرقابل انتقال بودن با requires uniform_buffer_standard_layout; در بالای کد سایه‌زن WGSL خود استفاده کنید. مثال زیر و قصد ارسال را ببینید.

if (!navigator.gpu.wgslLanguageFeatures.has("uniform_buffer_standard_layout")) {
  throw new Error(`WGSL uniform buffer standard layout is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires uniform_buffer_standard_layout;

  struct S {
      x: f32
  }
  struct Uniforms {
      a: S,
      b: f32
      // b is at offset 4. Without standard layout, alignment rules would
      // force b to be at offset 16 (or a multiple of 16), and you would have
      // to add extra fields or use an @align attribute.
  }

  @group(0) @binding(0) var<uniform> u: Uniforms;

  @fragment fn fs_main() -> @location(0) vec4<f32> {
      return vec4<f32>(u.a.x);
  }`,
});

‫WebGPU در Linux

تیم Chrome درحال عرضه تدریجی WebGPU برای Linux است، که در ابتدا از واحدهای پردازش گرافیکی Intel Gen12+ پشتیبانی می‌کند اما طرحی آزمایشی برای گسترش آن به دستگاه‌های بیشتر (AMD،‏ NVIDIA) دارد. این پیاده‌سازی از معماری‌ای استفاده می‌کند که در آن WebGPU از Vulkan استفاده می‌کند و بقیه Chromium در OpenGL باقی می‌ماند و مسیرهای کد خوب شناخته‌شده موجود را اجرا می‌کند. مشکل ۴۴۲۷۹۱۴۴۰ را ببینید.

‫writeBuffer و writeTexture سریع‌تر

‫writeBuffer() و writeTexture() در Chrome بهینه‌سازی شده‌اند که بسته به اندازه داده‌های منتقل‌شده، منجر به بهبود عملکرد تا ۲ برابر بهتر از نسخه قبلی می‌شود. این تغییر بر همه کاربران پیاده‌سازی Dawn Wire نیز تأثیر می‌گذارد. مشکل ۴۴۱۹۰۰۷۴۵ را ببینید.

به‌روزرسانی‌های سپیده‌دم

تیم Android GPU اولین نسخه آلفا از پیوندهای Kotlin برای WebGPU در Android را منتشر کرده است که بااستفاده از Jetpack دردسترس است. بسته androidx.webgpu به توسعه‌دهندگان Android امکان می‌دهد بااستفاده از Kotlin به یک GPU API مدرن دسترسی داشته باشند و از مشکلات قدیمی OpenGL یا پیچیدگی Vulkan عبور کنند. این توسعه‌ای هیجان‌انگیز برای این بوم‌سازگان است!

این فقط برخی‌از نکات برجسته کلیدی را پوشش می‌دهد. فهرست کامل تعهدات را بررسی کنید.

ویژگی‌های جدید WebGPU

فهرستی از همه مواردی که در مجموعه ویژگی‌های جدید WebGPU پوشش داده شده است.

‫۱۵۵-۱۵۶ Chrome

‫۱۵۳-۱۵۴ Chrome

Chrome 151-152

‫۱۴۹-۱۵۰ Chrome

‫۱۴۷-۱۴۸ Chrome

‫۱۴۶ Chrome

‫Chrome 145

‫۱۴۴ Chrome

‫۱۴۳ Chrome

‫۱۴۲ Chrome

Chrome 141

‫۱۴۰ Chrome

Chrome 139

‫Chrome 138

Chrome 137

‫Chrome 136

‫۱۳۵ Chrome

‫۱۳۴ Chrome

‫Chrome 133

‫۱۳۲ Chrome

‫۱۳۱ Chrome

‫Chrome 130

‫Chrome 129

‫Chrome 128

‫Chrome 127

‫Chrome 126

‫Chrome 125

‫Chrome 124

‫Chrome 123

‫Chrome 122

Chrome 121

‫Chrome 120

‫Chrome 119

‫Chrome 118

Chrome 117

‫Chrome 116

‫Chrome 115

Chrome 114

‫Chrome 113