موارد جدید در WebGPU (Chrome 128)

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

آزمایش با زیر گروه ها

ویژگی زیرگروه‌ها موازی‌سازی سطح SIMD را فعال می‌کند و به رشته‌های درون یک گروه اجازه می‌دهد تا با هم ارتباط برقرار کنند و عملیات ریاضی جمعی را انجام دهند (مثلاً محاسبه مجموع 16 عدد). این یک شکل بسیار کارآمد از اشتراک گذاری داده های بین رشته ای را فراهم می کند.

حداقل پیاده‌سازی پیشنهاد زیرگروه‌ها برای آزمایش محلی پشت پرچم «پشتیبانی از WebGPU ناامن» در 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 از فراخوانی با id تطبیق subgroup_invocation_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 را روی یک مقدار غیر صفر تنظیم کنید. برای اینکه به توسعه‌دهندگان زمان کافی برای به‌روزرسانی کدشان داده شود، هشداری در DevTools Console درباره این اعتبارسنجی آینده نشان داده می‌شود و در عین حال مقادیر را به 0 در این شرایط مجبور می‌کند. شماره 352567424 را ببینید.

در صورت جلوگیری از Default، هشدار DevTools خطای ضبط نشده را مخفی کنید

در DevTools Console، اگر شنونده رویداد برای uncapturederror ثبت شده باشد و متد Event preventDefault() در پاسخ تماس شنونده رویداد فراخوانی شده باشد، دیگر هشدارهای مربوط به رویدادهای uncapturederror نمایش داده نمی شود. این رفتار با مدیریت رویداد در جاوا اسکریپت مطابقت دارد. مثال زیر و شماره 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 به شما امکان می دهد تا درونیابی داده های IO تعریف شده توسط کاربر را مدیریت کنید. اکنون، first پارامترهای نمونه برداری جدید را درون یابی کنید (پیش فرض) و either به شما کنترل بیشتری می دهد: first از مقدار راس اول ابتدایی استفاده می کند، در حالی که هر either راس اول یا آخرین راس را مجاز می کند. به شماره 340278447 مراجعه کنید.

به روز رسانی سحر

اجرای Dawn's WGPUFuture برای مدیریت عملیات ناهمزمان اکنون کامل شده است. مفاهیم کلیدی عبارتند از wgpuInstanceProcessEvents برای پردازش رویدادهای فرصت طلب و WGPUCallbackMode برای تعریف مکان های برگشت به تماس. WGPUFuture نشان‌دهنده رویدادهای یک‌باره با طول عمر بی‌نهایت است، و wgpuInstanceWaitAny منتظر تکمیل هر آینده یا مهلت زمانی است. شماره 42240932 را ببینید.

مقدار CompositeAlphaMode::Auto اکنون توسط Surface::GetCapabilities() گزارش نشده است. هنوز معتبر است و معادل Surface::GetCapabilities().alphaMode[0] . به شماره 292 مراجعه کنید.

باطن OpenGL اکنون از Surface با blit y-flip برای هر فراخوانی Present() پشتیبانی می کند. به شماره 344814083 مراجعه کنید.

متد Adapter::GetProperties() به نفع استفاده از Adapter::GetInfo() منسوخ شده است.

Jaswant، یک مشارکت‌کننده خارجی، همه فایل‌های CMake را بازنویسی کرده است و به‌روزرسانی آن‌ها را آسان‌تر کرده و امکان پیش‌سازی را فراهم می‌کند. راهنمای شروع سریع برای استفاده از Dawn در پروژه‌های CMake را بررسی کنید.

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

چه چیزی در WebGPU جدید است

فهرستی از همه چیزهایی که در سری What's New in WebGPU پوشش داده شده است.

کروم 128

کروم 127

کروم 126

کروم 125

کروم 124

کروم 123

کروم 122

کروم 121

کروم 120

کروم 119

کروم 118

کروم 117

کروم 116

کروم 115

کروم 114

کروم 113