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

François Beaufort
François Beaufort

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

تشير DP4a (المنتج النقطي لأربعة عناصر وتجميعها) إلى مجموعة من تعليمات وحدة معالجة الرسومات (GPU) الشائعة الاستخدام في استنتاج التعلّم العميق للتكميم. تُجري هذه الوحدة حواصل ضرب نقطية فعّالة للأعداد الصحيحة ذات 8 بتات من أجل تسريع عملية الحوسبة لهذه النماذج الكمّية من النوع int8. يمكن أن توفّر (ما يصل إلى ‎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 والمشكلة 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() على الفور عند حدوث الخطأ. وهذا ما يتوقّعه المطوّرون ويريدونه باستمرار لتصحيح الأخطاء. يمكنك الاطّلاع على تغيير dawn:173620.

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

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

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

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

‫Chrome 155-156

‫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