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

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

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

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

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

توصیه می‌شود از یک دستورالعمل require- برای نشان دادن احتمال عدم قابلیت حمل با استفاده از 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 به توابع اعلام‌شده توسط کاربر.

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

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

این ویژگی را می‌توان با استفاده از navigator.gpu.wgslLanguageFeatures شناسایی کرد. توصیه می‌شود همیشه از یک دستورالعمل requires- برای نشان دادن احتمال عدم قابلیت حمل با 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 'ام آن آرایه در آن ذخیره شده است.

توصیه می‌شود از یک دستورالعمل require- برای نشان دادن احتمال عدم قابلیت حمل با 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.
  }`
});

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

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

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

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

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

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

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

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

کروم ۱۴۲

کروم ۱۴۱

کروم ۱۴۰

کروم ۱۳۹

کروم ۱۳۸

کروم ۱۳۷

کروم ۱۳۶

کروم ۱۳۵

کروم ۱۳۴

کروم ۱۳۳

کروم ۱۳۲

کروم ۱۳۱

کروم ۱۳۰

کروم ۱۲۹

کروم ۱۲۸

کروم ۱۲۷

کروم ۱۲۶

کروم ۱۲۵

کروم ۱۲۴

کروم ۱۲۳

کروم ۱۲۲

کروم ۱۲۱

کروم ۱۲۰

کروم ۱۱۹

کروم ۱۱۸

کروم ۱۱۷

کروم ۱۱۶

کروم ۱۱۵

کروم ۱۱۴

کروم ۱۱۳