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

François Beaufort
François Beaufort

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

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

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

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

عندما تتوفّر ميزة "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 `interpolate` sampling `first` و`either`

تتيح لك سمة interpolate في WGSL إدارة استيفاء بيانات الإدخال/الإخراج المحدّدة من قِبل المستخدم. الآن، تمنحك مَعلمتا أخذ العينات الجديدتان 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().

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

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

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

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

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