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

François Beaufort
François Beaufort

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

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

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

يمكنك أيضًا تجربة مجموعات فرعية على موقعك الإلكتروني مع مستخدمين حقيقيين من خلال الاشتراك في مرحلة التجربة والتقييم. اطّلِع على مقالة البدء باستخدام إصدارات الإصدارات العلنية للحصول على تعليمات حول كيفية إعداد موقعك الإلكتروني لاستخدام إصدارات الإصدارات العلنية. سيتم تشغيل مرحلة التجربة والتقييم من Chrome 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

في وحدة التحكّم في أدوات مطوّري البرامج، لن يتم عرض تحذيرات أحداث 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

الإصدار 127 من Chrome

الإصدار 126 من Chrome

الإصدار 125 من Chrome

الإصدار 124 من Chrome

Chrome 123

Chrome 122

الإصدار 121 من Chrome

الإصدار 120 من Chrome

الإصدار 119 من Chrome

Chrome 118

Chrome 117

الإصدار 116 من Chrome

الإصدار 115 من Chrome

الإصدار 114 من Chrome

Chrome 113