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

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

توابع داخلی DP4a در WGSL پشتیبانی می کند

DP4a (محصول نقطه‌ای از 4 عنصر و انباشته) به مجموعه‌ای از دستورالعمل‌های GPU اشاره دارد که معمولاً در استنتاج یادگیری عمیق برای کوانتیزاسیون استفاده می‌شوند. برای تسریع در محاسبه چنین مدل‌های کوانتیزه‌شده int8، محصولات 8 بیتی نقطه صحیح را به طور موثر انجام می‌دهد. این می تواند (تا 75٪) از حافظه و پهنای باند شبکه را ذخیره کند و عملکرد هر مدل یادگیری ماشینی را در استنتاج در مقایسه با نسخه f32 آنها بهبود بخشد. در نتیجه، اکنون به شدت در بسیاری از چارچوب‌های AI محبوب استفاده می‌شود.

هنگامی که پسوند زبان WGSL "packed_4x8_integer_dot_product" در navigator.gpu.wgslLanguageFeatures وجود دارد، اکنون می توانید از اسکالرهای عدد صحیح 32 بیتی که بردارهای 4 جزء اعداد صحیح 8 بیتی را بسته بندی می کنند، به عنوان ورودی برای کدهای محصول نقطه ای در WG خود استفاده کنید. توابع داخلی dot4U8Packed و dot4I8Packed . همچنین می‌توانید از دستورالعمل‌های بسته‌بندی و باز کردن بسته‌بندی با بردارهای 4 جزء اعداد صحیح 8 بیتی با توابع داخلی pack4xI8 ، pack4xU8 ، pack4xI8Clamp ، pack4xU8Clamp ، unpack4xI8 ، و unpack4xU8 WGSL استفاده کنید.

توصیه می‌شود از دستورالعمل نیازمندی‌ها برای سیگنال دادن به پتانسیل غیرقابل‌حمل‌بودن با requires packed_4x8_integer_dot_product; در بالای کد سایه زن WGSL شما. مثال زیر و شماره tint:1497 را ببینید.

if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
  throw new Error(`DP4a built-in functions are not available`);
}

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

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

  fn main() {
    const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
  }`,
});

تشکر ویژه از تیم گرافیک وب اینتل در شانگهای برای تکمیل این مشخصات و پیاده سازی!

پارامترهای اشاره گر نامحدود در WGSL

پسوند زبان WGSL "unrestricted_pointer_parameters" محدودیت‌هایی را که نشانگرها می‌توانند به توابع WGSL ارسال شوند را کاهش می‌دهد:

  • نشانگرهای پارامتر فضای storage ، uniform و آدرس workgroup به توابع اعلام شده توسط کاربر.

  • ارسال اشاره گر به اعضای ساختار و عناصر آرایه به توابع اعلام شده توسط کاربر.

Pointers As Function Parameters | تور WGSL برای کسب اطلاعات بیشتر در مورد آن.

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

if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
  throw new Error(`Unrestricted pointer parameters are not available`);
}

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

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

  @group(0) @binding(0) var<storage, read_write> S : i32;

  fn func(pointer : ptr<storage, i32, read_write>) {
    *pointer = 42;
  }

  @compute @workgroup_size(1)
  fn main() {
    func(&S);
  }`
});

قند نحوی برای عدم ارجاع کامپوزیت ها در WGSL

هنگامی که پسوند زبان WGSL "pointer_composite_access" در navigator.gpu.wgslLanguageFeatures وجود دارد، کد سایه زن WGSL شما اکنون از دسترسی به اجزای انواع داده های پیچیده با استفاده از نحو نقطه ( . ) پشتیبانی می کند، چه مستقیماً با داده ها کار می کنید یا با یک دستور. اشاره به آن در اینجا نحوه کار آن آمده است:

  • اگر foo یک اشاره گر است: foo.bar راه راحت تری برای نوشتن (*foo).bar است. ستاره ( * ) معمولاً برای تبدیل نشانگر به یک "مرجع" مورد نیاز است که می تواند ارجاع داده شود، اما اکنون هر دو اشاره گر و مرجع بسیار شبیه تر و تقریباً قابل تعویض هستند.

  • اگر foo یک اشاره گر نیست: عملگر نقطه ( . ) دقیقاً همانطور که برای دسترسی مستقیم به اعضا عادت کرده اید کار می کند.

به طور مشابه، اگر pa یک اشاره گر است که آدرس شروع یک آرایه را ذخیره می کند، استفاده از pa[i] به شما امکان دسترسی مستقیم به محل حافظه را می دهد که عنصر 'i " آن آرایه در آن ذخیره شده است.

توصیه می‌شود از یک دستورالعمل نیازمندی برای سیگنال‌دهی پتانسیل غیرقابل‌حمل‌پذیری با requires pointer_composite_access; در بالای کد سایه زن WGSL شما. مثال زیر و شماره tint:2113 را ببینید.

if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
  throw new Error(`Pointer composite access is not available`);
}

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

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

  fn main() {
    var a = vec3f();
    let p : ptr<function, vec3f> = &a;
    let r1 = (*p).x; // always valid.
    let r2 = p.x; // requires pointer composite access.
  }`
});

حالت فقط خواندنی را برای جنبه های استنسیل و عمق جدا کنید

پیش از این، پیوست‌های عمقی فقط خواندنی در پاس‌های رندر نیاز به هر دو جنبه (عمق و استنسیل) داشتند که فقط خواندنی باشند. این محدودیت برداشته شده است. اکنون می توانید از جنبه عمقی به صورت فقط خواندنی استفاده کنید، برای مثال برای ردیابی سایه تماس، در حالی که بافر استنسیل برای شناسایی پیکسل ها برای پردازش بیشتر نوشته شده است. رجوع به شماره سپیده دم: 2146 شود.

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

پاسخ تماس خطای ضبط نشده با wgpuDeviceSetUncapturedErrorCallback() اکنون بلافاصله پس از وقوع خطا فراخوانی می شود. این همان چیزی است که توسعه دهندگان به طور مداوم برای اشکال زدایی انتظار دارند و می خواهند. تغییر سپیده دم: 173620 را ببینید.

متد wgpuSurfaceGetPreferredFormat() از webgpu.h API پیاده سازی شده است. رجوع به شماره فجر: 1362 شود.

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

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

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

کروم 130

کروم 129

کروم 128

کروم 127

کروم 126

کروم 125

کروم 124

کروم 123

کروم 122

کروم 121

کروم 120

کروم 119

کروم 118

کروم 117

کروم 116

کروم 115

کروم 114

کروم 113