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

François Beaufort
François Beaufort

توافق دوال DP4a المضمّنة مع WGSL

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

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

يُنصح باستخدام requires-directive للإشارة إلى احتمال عدم إمكانية نقل الرمز البرمجي مع 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
  }`,
});

نشكر بشكل خاص فريق Web Graphics في شركة Intel في شنغهاي على إكمال هذه المواصفات وعملية التنفيذ.

مَعلمات المؤشر غير المقيدة في WGSL

يؤدي "unrestricted_pointer_parameters" امتداد لغة WGSL إلى تخفيف القيود المفروضة على المؤشرات التي يمكن تمريرها إلى دوال 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

عندما يكون "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. اطّلِع على المثال التالي وissue 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() من webgpu.h API. راجِع المشكلة dawn:1362.

هذا يشمل بعض النقاط الرئيسية فقط. اطّلِع على القائمة الشاملة لعمليات الإيداع.

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

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

Chrome 140

‫Chrome 139

‫Chrome 138

‫Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

‫Chrome 132

Chrome 131

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