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

François Beaufort
François Beaufort

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

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

عند توفُّر إضافة اللغة 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 packed_4x8_integer_dot_product; في أعلى رمز أداة تظليل WGSL. راجِع المثال التالي وissue 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
  }`,
});

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

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

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

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

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

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

يمكن اكتشاف هذه الميزة باستخدام navigator.gpu.wgslLanguageFeatures. نقترح استخدام يتطلب التوجيه دائمًا للإشارة إلى إمكانية عدم قابلية النقل باستخدام requires unrestricted_pointer_parameters; في أعلى رمز أداة تظليل WGSL. يمكنك الاطّلاع على المثال التالي التغييرات في مواصفات WGSL وissue 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'th من هذا الصفيف.

نقترح استخدام يتطلب توجيهًا للإشارة إلى إمكانية عدم قابلية النقل باستخدام 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.
  }`
});

حالة منفصلة للقراءة فقط لجوانب الاستنسل والعمق

في السابق، كانت مرفقات استنسل العمق للقراءة فقط في بطاقات العرض تتطلب أن يكون كلا الجانبين (العمق والاستنسل) للقراءة فقط. وقد أزلنا هذا القيد. أما الآن، فقد أصبح بإمكانك استخدام جانب العمق في وضع القراءة فقط، مثلاً لتتبُّع ظلال التلامس، بينما تتم كتابة المخزن المؤقت بالاستنسل لتحديد وحدات البكسل لإجراء مزيد من المعالجة. راجِع عدد الفجر:2146.

آخر أخبار الفجر

يتم الآن استدعاء مجموعة معاودة الاتصال للخطأ التي لم يتم التقاطها باستخدام wgpuDeviceSetUncapturedErrorCallback() على الفور عند حدوث الخطأ. وهذا ما يتوقعه المطوّرون باستمرار ويريدونه في تصحيح الأخطاء. راجِع change dawn:173620.

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

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

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

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

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