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

François Beaufort
François Beaufort

إتاحة دوال DP4a المضمّنة في WGSL

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

عندما تكون "packed_4x8_integer_dot_product" إضافة لغة WGSL متوفّرة في 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. راجِع المثال التالي والمشكلة 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 والمشكلة 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

عندما يكون "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() على الفور عند حدوث الخطأ. وهذا ما يتوقّعه المطوّرون ويريدونه باستمرار لتصحيح الأخطاء. راجِع تغيير الفجر:173620.

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

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

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

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

Chrome 153-154

‫Chrome 151-152

‫Chrome 149-150

Chrome 147-148

‫Chrome 146

Chrome 145

‫Chrome 144

Chrome 143

Chrome 142

‫Chrome 141

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