ویژگی‌های جدید WebGPU (کروم ۱۴۴)

فرانسوا بوفور
François Beaufort

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

افزونه‌ی زیرگروه_id در WGSL

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

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

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

این افزونه زبان را می‌توان با استفاده از navigator.gpu.wgslLanguageFeatures شناسایی کرد. توصیه می‌شود از یک دستورالعمل require-برای نشان دادن احتمال عدم قابلیت حمل با requires subgroup_id; در بالای کد سایه‌زن WGSL خود استفاده کنید. به مثال زیر و intent to ship مراجعه کنید.

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.
  }`,
});

افزونه‌ی uniform_buffer_standard_layout در WGSL

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

این افزونه‌ی زبان را می‌توان با استفاده از navigator.gpu.wgslLanguageFeatures شناسایی کرد. توصیه می‌شود از یک دستورالعمل requires برای نشان دادن احتمال عدم قابلیت حمل با requires uniform_buffer_standard_layout; در بالای کد سایه‌زن WGSL خود استفاده کنید. به مثال زیر و intent to ship مراجعه کنید.

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 برای لینوکس است و با پشتیبانی از پردازنده‌های گرافیکی نسل ۱۲+ اینتل شروع می‌کند، اما برنامه‌ای آزمایشی برای گسترش آن به دستگاه‌های بیشتر (AMD، NVIDIA) دارد. این پیاده‌سازی از معماری‌ای استفاده می‌کند که در آن WebGPU از Vulkan استفاده می‌کند و بقیه کرومیوم با استفاده از مسیرهای کد خوب و شناخته‌شده موجود، روی OpenGL باقی می‌ماند. به شماره ۴۴۲۷۹۱۴۴۰ ​​مراجعه کنید.

نوشتن بافر و نوشتن بافت سریع‌تر

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

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

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

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

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

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

کروم ۱۴۵

کروم ۱۴۴

کروم ۱۴۳

کروم ۱۴۲

کروم ۱۴۱

کروم ۱۴۰

کروم ۱۳۹

کروم ۱۳۸

کروم ۱۳۷

کروم ۱۳۶

کروم ۱۳۵

کروم ۱۳۴

کروم ۱۳۳

کروم ۱۳۲

کروم ۱۳۱

کروم ۱۳۰

کروم ۱۲۹

کروم ۱۲۸

کروم ۱۲۷

کروم ۱۲۶

کروم ۱۲۵

کروم ۱۲۴

کروم ۱۲۳

کروم ۱۲۲

کروم ۱۲۱

کروم ۱۲۰

کروم ۱۱۹

کروم ۱۱۸

کروم ۱۱۷

کروم ۱۱۶

کروم ۱۱۵

کروم ۱۱۴

کروم ۱۱۳