الميزات الجديدة في WebGPU (الإصدار 120 من Chrome)

François Beaufort
François Beaufort

دعم قيم النقطة العائمة 16 بت في WGSL

في WGSL، يمثل النوع f16 مجموعة من قيم النقطة العائمة 16 بت لتنسيق IEEE-754 الثنائي16 (نصف الدقة). وهذا يعني أنّها تستخدم 16 بت لتمثيل رقم النقطة العائمة، مقارنةً بـ 32 بت للنقطة العائمة التقليدية أحادية الدقة (f32). ويمكن أن يؤدي هذا الحجم الأصغر إلى تحسينات كبيرة في الأداء، خاصةً عند معالجة كميات كبيرة من البيانات.

على سبيل المقارنة، على جهاز Apple M1 Pro، فإنّ تنفيذ f16 لطُرز Llama2 7B المستخدَمة في الإصدار التجريبي من محادثات WebLLM أسرع بكثير من استخدام f32، حيث تحسّنت سرعة الملء المُسبق بنسبة 28% وتحسّن سرعة فك الترميز بنسبة 41% كما هو موضّح في لقطات الشاشة التالية.

لقطة شاشة لعروض توضيحية للمحادثات من النوع WebLLM تتضمّن طرازَي f32 وf16 Llama2 7B.
نماذج تجريبية للمحادثات من WebLLM مع طرازَي f32 (في اليسار) وf16 (في اليمين) Llama2 7B

لا تتوافق بعض وحدات معالجة الرسومات مع قيم النقاط العائمة 16 بت. عند توفّر ميزة "shader-f16" في GPUAdapter، يمكنك الآن طلب GPUDevice مع هذه الميزة وإنشاء وحدة تظليل WGSL تستفيد من نوع النقطة العائمة نصف الدقة f16. لا يصلح هذا النوع للاستخدام في وحدة أداة تظليل WGSL إلا في حال تفعيل إضافة WGSL f16 باستخدام enable f16;. وإلا، ستنتج عن createShaderModule() خطأ في عملية التحقّق. يُرجى الاطّلاع على المثال التالي للحد الأدنى والمشكلة dawn:1510.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
  throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
  requiredFeatures: ["shader-f16"],
});

const code = `
  enable f16;

  @compute @workgroup_size(1)
  fn main() {
    const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...

من الممكن إتاحة النوعَين f16 وf32 في رمز وحدة أداة تظليل WGSL باستخدام alias بناءً على إتاحة ميزة "shader-f16" كما هو موضّح في المقتطف التالي.

const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");

const device = await adapter.requestDevice({
  requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});

const header = hasShaderF16
  ? `enable f16;
     alias min16float = f16;`
  : `alias min16float = f32;`;

const code = `
  ${header}

  @compute @workgroup_size(1)
  fn main() {
    const c = vec3<min16float>(1.0, 2.0, 3.0);
  }
`;

أطلِق العنان لقدراتك

الحد الأقصى لعدد وحدات البايت اللازمة للاحتفاظ ببيانات نموذج واحد (بكسل أو بكسل فرعي) من بيانات إخراج مسار العرض في جميع مرفقات الألوان هو 32 بايت تلقائيًا. يمكن الآن طلب ما يصل إلى 64 طلب باستخدام الحدّ الأقصى المسموح به وهو maxColorAttachmentBytesPerSample. يمكنك الاطّلاع على المثال التالي ومشكلة dawn:2036.

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

if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
  // When the desired limit isn't supported, take action to either fall back to
  // a code path that does not require the higher limit or notify the user that
  // their device does not meet minimum requirements.
}

// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
  requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});

تمت زيادة الحدود القصوى المسموح بها maxInterStageShaderVariables وmaxInterStageShaderComponents للتواصل بين المراحل على جميع المنصات. يُرجى الاطّلاع على مشكلة الفجر:1448 لمعرفة التفاصيل.

بالنسبة إلى كل مرحلة في أداة التظليل، يكون الحد الأقصى افتراضيًا لعدد إدخالات تخطيط المجموعة المرتبطة عبر تخطيط مسار التعلّم هو 8 مخازن مؤقتة للتخزين. يمكنك الآن طلب 10 طلبات بحد أقصى باستخدام الحدّ الأقصى المسموح به وهو maxStorageBuffersPerShaderStage. راجِع مشكلة dawn:2159.

تمت إضافة حد maxBindGroupsPlusVertexBuffers جديد. يتكوّن من الحد الأقصى لعدد الروابط في مجموعة الروابط وخانات المخزن المؤقت الرأسي المستخدمة في آنٍ واحد، مع حساب أي خانات فارغة أسفل أعلى فهرس. قيمتها الافتراضية هي 24. راجِع مشكلة dawn:1849.

تغييرات في حالة الاستنسل للعمق

لتحسين تجربة المطوّرين، لم تعُد سمتا الاستنسل المعمَّق depthWriteEnabled وdepthCompare مطلوبة دائمًا: يجب توفير السمة depthWriteEnabled فقط للتنسيقات ذات التفاصيل، في حين أنّ السمة depthCompare ليست مطلوبة للتنسيقات ذات التفاصيل العميقة في حال عدم استخدامها على الإطلاق. ويمكنك الاطّلاع على مشكلة dawn:2132.

إشعارات حول المحوّل

تتوفّر الآن سمتا معلومات محوّل "type" و"backend" غير العادية عند استدعاء requestAdapterInfo() عندما يفعّل المستخدم علامة "ميزات مطور برامج WebGPU" على chrome://flags/#enable-webgpu-developer-features. قد تكون قيمة type "وحدة معالجة رسومات منفصلة" أو "وحدة معالجة رسومات مدمَجة" أو "وحدة معالجة مركزية" أو "غير معروفة". قيمة backend هي إما "WebGPU" أو "D3D11" أو "D3D12" أو "ميتال" أو "vulkan" أو "openGL" أو "openGLES" أو "null". يمكنك الاطّلاع على مشكلة dawn:2112 وعدد المشاكل: dawn:2107.

لقطة شاشة لـ https://webgpureport.org تعرض معلومات الواجهة الخلفية وكتابة معلومات المحوّل.
معلومات عن المحوّل ونوعه المعروضان على https://webgpureport.org

تمت إزالة معلمة قائمة unmaskHints الاختيارية في requestAdapterInfo(). راجِع مشكلة dawn:1427.

تحديد كميّة طلبات الطوابع الزمنية

تتيح طلبات البحث في الطوابع الزمنية للتطبيقات قياس وقت تنفيذ أوامر وحدة معالجة الرسومات بدقة نانو ثانية. ومع ذلك، فإن مواصفات WebGPU تجعل طلبات الطابع الزمني اختيارية بسبب مخاوف الهجوم على توقيت. ويعتقد فريق Chrome أنّ تحديد كم طلبات البحث في الطوابع الزمنية يقدّم حلاً وسطًا جيدًا بين الدقة والأمان عن طريق تقليل درجة الدقة إلى 100 ميكرو ثانية. راجِع مشكلة dawn:1800.

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

في الفجر، تمت إضافة إيقاف/تفعيل جديد للجهاز يُطلق عليه اسم "timestamp_quantization" وتم تفعيله تلقائيًا. يوضِّح لك المقتطف التالي كيفية السماح بميزة "timestamp-query" التجريبية بدون تحديد كمي للطابع الزمني عند طلب جهاز.

wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};

const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;

const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = &timestampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;

wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};

// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);

ميزات تنظيف النوابض

تمت إعادة تسمية ميزة "timestamp-query-inside-passes" التجريبية لتصبح "chromium-experimental-timestamp-query-inside-passes" لتوضيح للمطوّرين أنّ هذه الميزة تجريبية ولا تتوفر حاليًا إلا في المتصفحات المستندة إلى Chromium. راجِع مشكلة dawn:1193.

تمّت إزالة ميزة "طلب البحث-إحصاءات مسار الأنابيب" التجريبية، التي تم تنفيذها جزئيًا فقط، لأنّها لم تعُد قيد التطوير. راجع المشكلة chromium:1177506.

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

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

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

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