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

François Beaufort
François Beaufort

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

DP4a (ضرب نقطه‌ای ۴ عنصر و انباشت) به مجموعه‌ای از دستورالعمل‌های GPU اشاره دارد که معمولاً در استنتاج یادگیری عمیق برای کم‌سازی استفاده می‌شود. این واحد به‌طور کارآمد حاصل ضرب نقطه‌ای عدد صحیح ۸ بیتی را انجام می‌دهد تا محاسبات چنین مدل‌های کمّی‌سازی‌شده int8 را تسریع کند. این نوع می‌تواند (تا ۷۵٪) از حافظه و پهنای باند شبکه صرفه‌جویی کند و عملکرد هر مدل یادگیری ماشین را در استنباط در مقایسه با نسخه f32 آن بهبود دهد. در نتیجه، اکنون به‌طور گسترده در بسیاری از چارچوب‌های هوش مصنوعی محبوب استفاده می‌شود.

وقتی "packed_4x8_integer_dot_product" WGSL افزونه زبان در navigator.gpu.wgslLanguageFeatures وجود داشته باشد، اکنون می‌توانید از اسکالرهای عدد صحیح ۳۲ بیتی که بردارهای ۴ مؤلفه‌ای از اعداد صحیح ۸ بیتی را بسته‌بندی می‌کنند به‌عنوان ورودی دستورالعمل‌های ضرب نقطه‌ای در کد سایه‌زن WGSL خود با توابع داخلی dot4U8Packed و dot4I8Packed استفاده کنید. همچنین می‌توانید از دستورالعمل‌های بسته‌بندی و باز کردن بسته‌بندی با بردارهای ۴ مؤلفه‌ای بسته‌بندی‌شده از اعداد صحیح ۸ بیتی با توابع داخلی pack4xI8، pack4xU8، pack4xI8Clamp، pack4xU8Clamp، unpack4xI8، و unpack4xU8 WGSL استفاده کنید.

توصیه می‌شود از requires-directive برای نشان دادن احتمال غیرقابل‌حمل بودن با requires packed_4x8_integer_dot_product; در بالای کد سایه‌زن WGSL استفاده کنید. مثال زیر و رنگ مشکل:۱۴۹۷ را ببینید.

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

از تیم «گرافیک وب» Intel در شانگهای برای پیشبرد این مشخصات و پیاده‌سازی تا تکمیل آن سپاس‌گزاریم!

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

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

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

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

برای کسب اطلاعات بیشتر درباره آن، اشاره‌گرها به‌عنوان پارامترهای تابع | تور WGSL را بررسی کنید.

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

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

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

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

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

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

توصیه می‌شود از requires-directive برای نشان دادن احتمال غیرقابل‌حمل بودن با requires pointer_composite_access; در بالای کد سایه‌زن WGSL استفاده کنید. مثال زیر و رنگ مشکل:۲۱۱۳ را ببینید.

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

وضعیت فقط خواندنی جداگانه برای جنبه‌های شابلون و عمق

قبلاً، پیوست‌های عمق-استنسیل فقط خواندنی در گذرگاه‌های رندر به هر دو جنبه (عمق و استنسیل) فقط خواندنی نیاز داشتند. این محدودیت برداشته شده است. اکنون می‌توانید از جنبه عمق به‌صورت فقط خواندنی استفاده کنید، مثلاً برای ردیابی سایه تماس، درحالی‌که بافر شابلون برای شناسایی پیکسل‌ها برای پردازش بیشتر نوشته می‌شود. مشکل سپیده دم:۲۱۴۶ را ببینید.

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

وقتی خطا رخ می‌دهد، تابع برگشتی خطای ثبت‌نشده که با wgpuDeviceSetUncapturedErrorCallback() تنظیم شده است اکنون بلافاصله فراخوانی می‌شود. این چیزی است که توسعه‌دهندگان به‌طور مداوم برای اشکال‌زدایی انتظار دارند و می‌خواهند. تغییر سپیده دم:۱۷۳۶۲۰ را ببینید.

روش wgpuSurfaceGetPreferredFormat() از webgpu.h API پیاده‌سازی شده است. طلوع مشکل:۱۳۶۲ را ببینید.

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

ویژگی‌های جدید 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