الميزات الجديدة في WebGPU (Chrome 123)

François Beaufort
François Beaufort

دعم دوال DP4a المضمنة في WGSL

يشير DP4a (الناتج المكون من 4 عناصر وتراكم) إلى مجموعة من تعليمات وحدة معالجة الرسومات التي يشيع استخدامها في استنتاج التعلم المتعمق من أجل تحديد الكمي. وتعمل هذه الأداة بكفاءة على تنفيذ منتجات النقاط بأعداد صحيحة مكوّنة من 8 بتات لتسريع وتيرة احتساب هذه النماذج الكمية بطريقة int8. ويمكنها توفير (ما يصل إلى %75) من الذاكرة ومعدل نقل البيانات للشبكة وتحسين أداء أي نماذج لتعلُّم الآلة في الاستنتاج مقارنةً بإصدار f32 الخاص بها. ونتيجة لذلك، يتم الآن استخدامه بكثرة في العديد من أُطر عمل الذكاء الاصطناعي الشائعة.

عند توفُّر إضافة لغة WGSL "packed_4x8_integer_dot_product" في navigator.gpu.wgslLanguageFeatures، يمكنك الآن استخدام مقاييس عدد صحيح 32 بت تتضمّن 4 مكوّنات من أعداد صحيحة مقدارها 8 بت كمدخلات إلى تعليمات المنتج النقطية في رمز أداة تظليل WGSL مع الدالتَين المُدمَجة dot4U8Packed وdot4I8Packed. يمكنك أيضًا استخدام تعليمات التعبئة والفكّ باستخدام متّجهات مكوّنة من 4 مكوّنات مع أعداد صحيحة مكوّنة من 8 بت مع pack4xI8 وpack4xU8 وpack4xI8Clamp وpack4xU8Clamp وunpack4xI8 وunpack4xU8 وظائف WGSL المضمّنة.

يُنصَح باستخدام سمة Requires-directive للإشارة إلى احتمال عدم إمكانية النقل باستخدام requires packed_4x8_integer_dot_product; أعلى رمز أداة تظليل WGSL. يُرجى الاطّلاع على المثال التالي وتحديد اللون: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
  }`,
});

شكر خاص لفريق رسومات الويب الخاص بشركة Intel في شنغهاي لقيادة هذه المواصفات والتنفيذ حتى الاكتمال!

معلمات المؤشر غير المحدودة في WGSL

تخفف إضافة لغة WGSL "unrestricted_pointer_parameters" القيود المفروضة على إمكانية تمرير المؤشرات إلى دوال WGSL:

  • مؤشرات معلَمات لمساحات عناوين storage وuniform وworkgroup إلى الدوال التي اختارها المستخدم

  • تمرير المؤشرات إلى بنية الأعضاء وعناصر الصفيف إلى الوظائف التي أعلن عنها المستخدم

راجِع المؤشرات كمعلَمات دالة | جولة في WGSL لمعرفة المزيد عنها.

يمكن اكتشاف هذه الميزة باستخدام navigator.gpu.wgslLanguageFeatures. ننصحك دائمًا باستخدام السمة Requires-directive للإشارة إلى احتمال عدم إمكانية النقل باستخدام السمة requires unrestricted_pointer_parameters; أعلى رمز أداة تظليل WGSL. اطّلِع على المثال التالي تغييرات في مواصفات WGSL ولون المشكلة: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-directive للإشارة إلى احتمال عدم إمكانية النقل باستخدام requires pointer_composite_access; أعلى رمز أداة تظليل WGSL. يُرجى الاطّلاع على المثال التالي وتحديد لون المشكلة: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() يتم الآن الحصول عليها فورًا عند حدوث الخطأ. هذا ما يتوقعه المطوّرون باستمرار ويريدون تصحيح الأخطاء. يمكنك الاطّلاع على تغيير الفجر:173620.

تم تنفيذ الطريقة wgpuSurfaceGetPreferredFormat() من webgpu.h API. راجِع مشكلة dawn:1362.

يتناول هذا فقط بعض النقاط الرئيسية. يمكنك الاطّلاع على القائمة الشاملة لعمليات الالتزام.

الميزات الجديدة في WebGPU

قائمة بكل ما تمت مناقشته في سلسلة الميزات الجديدة في WebGPU.

الإصدار 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 من متصفّح Chrome