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

François Beaufort
François Beaufort

تجربة المجموعات الفرعية

تتيح ميزة المجموعات الفرعية إجراء عمليات متوازية على مستوى SIMD، ما يسمح لخيوط المعالجة ضمن مجموعة بالتواصل وإجراء عمليات حسابية جماعية (على سبيل المثال، احتساب مجموع 16 رقمًا). ويوفر ذلك شكلاً عالي الكفاءة لمشاركة البيانات بين سلاسل المحادثات.

يتوفّر الحد الأدنى لتنفيذ اقتراح المجموعات الفرعية للاختبار على الجهاز فقط، وذلك من خلال علامة "دعم WebGPU غير الآمن" في chrome://flags/#enable-unsafe-webgpu.

يمكنك أيضًا تجربة المجموعات الفرعية على موقعك الإلكتروني مع مستخدمين حقيقيين من خلال الاشتراك في الفترة التجريبية الأصلية. اطّلِع على مقالة البدء باستخدام إصدارات الإصدارات العلنية للحصول على تعليمات حول كيفية إعداد موقعك الإلكتروني لاستخدام إصدارات الإصدارات العلنية. ستتم الفترة التجريبية من الإصدار 128 من Chrome إلى الإصدار 131 (تنتهي في 19 شباط (فبراير) 2025). اطّلِع على الهدف من التجربة.

عندما تكون ميزة "subgroups" متاحة في GPUAdapter، اطلب GPUDevice تتضمّن هذه الميزة للحصول على دعم المجموعات الفرعية في WGSL والتحقّق من حدود minSubgroupSize وmaxSubgroupSize.

عليك أيضًا تفعيل هذه الإضافة صراحةً في رمز WGSL باستخدام enable subgroups;. عند تفعيل هذه الميزة، يمكنك الوصول إلى الإضافات التالية:

  • subgroup_invocation_id: قيمة مضمّنة لفهرس سلسلة المحادثات ضمن المجموعة الفرعية.
  • subgroup_size: قيمة مضمّنة للوصول إلى حجم المجموعة الفرعية
  • subgroupBallot(value): تعرض مجموعة من حقول الوحدات بتية حيث يكون العنصر الثنائي المقابل لـ subgroup_invocation_id هو 1 إذا كانت value صحيحة لهذا الطلب النشط و0 في الحالات الأخرى.
  • subgroupBroadcast(value, id): تُرسِل value من الطلب الذي يتضمّن subgroup_invocation_id مطابقًا id إلى جميع الطلبات ضمن المجموعة الفرعية. ملاحظة: يجب أن يكون id ثابتًا في وقت الترجمة.

ستتم إضافة المزيد من الدوال المضمّنة، مثل subgroupAdd وsubgroupAll وsubgroupElect وsubgroupShuffle في المستقبل. راجِع المشكلة 354738715.

للسماح باستخدام f16 في عمليات المجموعات الفرعية، اطلب GPUDevice مع ميزات "subgroups" و"subgroups-f16" و"shader-f16"، ثم فعِّله في رمز WGSL باستخدام enable f16, subgroups, subgroups_f16;.

يوفّر مقتطف الرمز البرمجي التالي قاعدة لتعديل المجموعات الفرعية واكتشاف إمكاناتها.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

إيقاف نهائي لإعداد "انحياز العمق" للخطوط والنقاط

يؤدي تغيير في مواصفات WebGPU إلى ظهور خطأ في التحقّق من الصحة عند ضبط depthBias وdepthBiasSlopeScale وdepthBiasClamp على قيمة غير صفرية عندما يكون شكل شبكة التقديم من النوع خط أو نقطة. لمنح المطوّرين وقتًا كافيًا لتعديل الرمز البرمجي، يظهر تحذير في "وحدة تحكّم أدوات مطوّري البرامج" بشأن عملية التحقّق القادمة هذه، مع ضبط القيم على 0 في هذه الظروف. راجِع الطلب 352567424.

إخفاء تحذير أدوات المطوّرين بشأن الخطأ الذي لم يتم تسجيله في حال استخدام preventDefault

في وحدة تحكّم DevTools، لم يعُد يتم عرض التحذيرات بشأن أحداث uncapturederror إذا تم تسجيل مستمع أحداث uncapturederror وتم استدعاء طريقة الحدث preventDefault() ضمن دالة الاستدعاء لمستمع الأحداث. يتطابق هذا السلوك مع معالجة الأحداث في JavaScript. اطّلِع على المثال التالي والمشكلة 40263619.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

تُجري WGSL عملية توسيع النطاق على عيّنات البيانات أولاً، ثمّ

تتيح لك سمة WGSL interpolate إدارة الاستقراء المُحدَّد من المستخدِم لبيانات الإدخال/الإخراج. تمنحك الآن مَعلمتا أخذ عيّنات الاستقراء الجديدة first (التلقائية) وeither إمكانية التحكّم بشكل أكبر: تستخدِم first القيمة من رأس العنصر الأوّل، في حين تسمح either باستخدام رأس العنصر الأوّل أو الأخير. راجِع الطلب 340278447.

آخر الأخبار من Dawn

اكتملت الآن عملية تنفيذ WGPUFuture في Dawn لمعالجة العمليات غير المتزامنة. تشمل المفاهيم الرئيسية wgpuInstanceProcessEvents لمعالجة الأحداث المُحتمَلة وWGPUCallbackMode لتحديد مواضع الاستدعاء. يشير WGPUFuture إلى الأحداث لمرة واحدة التي تبلغ مدة صلاحيتها إلى ما لا نهاية، وينتظر wgpuInstanceWaitAny اكتمال أي مستقبل أو مهلة. راجِع المشكلة 42240932.

لا يتم الآن الإبلاغ عن قيمة CompositeAlphaMode::Auto من خلال Surface::GetCapabilities(). لا يزال صالحًا ويعادل Surface::GetCapabilities().alphaMode[0]. راجِع المشكلة 292.

تتيح الآن الخلفية في OpenGL استخدام Surface مع blit للقلب على محور y لكل طلب Present(). راجِع الطلب 344814083.

تم إيقاف الطريقة Adapter::GetProperties() نهائيًا، ويمكنك استخدام Adapter::GetInfo() بدلاً منها.

أعاد جايسوار، وهو مساهم خارجي، كتابة جميع ملفات CMake، ما سهّل تعديلها وسمح بإنشاء الإصدارات التجريبية. اطّلِع على دليل البدء السريع لاستخدام Dawn في مشاريع CMake.

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

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

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

Chrome 131

Chrome 130

الإصدار 129 من Chrome

Chrome 128

Chrome 127

الإصدار 126 من Chrome

الإصدار 125 من Chrome

Chrome 124

Chrome 123

Chrome 122

الإصدار 121 من Chrome

الإصدار 120 من Chrome

الإصدار 119 من Chrome

Chrome 118

Chrome 117

Chrome 116

Chrome 115

الإصدار 114 من Chrome

Chrome 113