ویژگی‌های توسعه‌دهنده WebGPU

فرانسوا بوفور
François Beaufort

منتشر شده: ۳ ژوئن ۲۰۲۵

پیاده‌سازی WebGPU API کروم شامل ویژگی‌هایی است که صرفاً برای توسعه و آزمایش در نظر گرفته شده‌اند. این ویژگی‌ها خارج از مشخصات استاندارد WebGPU هستند. از این ویژگی‌ها در محیط عملیاتی استفاده نکنید.

این سند جزئیات نحوه فعال‌سازی ویژگی‌های توسعه‌دهندگان WebGPU را شرح داده و فهرست جامعی از آن‌ها ارائه می‌دهد.

پیش‌نیاز

برای فعال کردن ویژگی‌های توسعه‌دهنده WebGPU در کروم، این مراحل را دنبال کنید:

  1. پرچم «ویژگی‌های توسعه‌دهنده WebGPU» را در chrome://flags/#enable-webgpu-developer-features فعال کنید.
  2. مرورگر کروم را مجدداً راه‌اندازی کنید.

غیرفعال کردن کوانتیزاسیون کوئری‌های برچسب زمانی

پرس‌وجوهای برچسب زمانی، برنامه‌های WebGPU را قادر می‌سازند تا زمان اجرای دستورات GPU را در طول مراحل محاسبه و رندر، به طور دقیق (در حد نانوثانیه) اندازه‌گیری کنند. این پرس‌وجوها برای تجزیه و تحلیل عملکرد و رفتار بار کاری GPU ضروری هستند. برای جزئیات بیشتر، به پرس‌وجوهای برچسب زمانی در مراحل محاسبه و رندر مراجعه کنید.

با توجه به نگرانی‌های مربوط به حمله زمان‌بندی ، کوئری‌های برچسب زمانی با وضوح ۱۰۰ میکروثانیه کوانتیزه می‌شوند که مصالحه خوبی بین دقت و امنیت ایجاد می‌کند. این کوانتیزه‌سازی به طور خودکار با فعال شدن پرچم "ویژگی‌های توسعه‌دهنده WebGPU" غیرفعال می‌شود.

اطلاعات آداپتور توسعه‌یافته

برای درک عمیق‌تر از آداپتور مورد استفاده، GPUAdapterInfo ویژگی‌های زیر را ارائه می‌دهد:

  • ویژگی device (استاندارد شده) یک شناسه آداپتور مخصوص فروشنده است.
  • ویژگی description (استاندارد) یک رشته قابل خواندن توسط انسان است که جزئیات آداپتور را ارائه می‌دهد.
  • ویژگی driver (غیر استاندارد) یک رشته قابل خواندن توسط انسان است که درایور را توصیف می‌کند.
  • ویژگی backend (غیر استاندارد) نشان دهنده‌ی گرافیک backend است، مانند "WebGPU" ، "D3D11" ، "D3D12" ، "metal" ، "vulkan" ، "openGL" ، "openGLES" یا "null" .
  • ویژگی type (غیر استاندارد) نوع GPU را مشخص می‌کند: "discrete GPU" ، "integrated GPU" ، "CPU" یا "unknown" .
  • ویژگی d3dShaderModel (غیر استاندارد) حداکثر شماره مدل سایه‌زن D3D پشتیبانی شده را مشخص می‌کند، برای مثال، ۶۲ نشان دهنده پشتیبانی از HLSL SM 6.2 است.
  • ویژگی vkDriverVersion (غیر استاندارد) نسخه درایور Vulkan است که توسط فروشنده مشخص شده است.
  • ویژگی powerPreference (غیر استاندارد) بر اساس GPUPowerPreference در GPURequestAdapterOptions ، "low-power" یا "high-performance" است.

برای پیش‌بینی محدودیت‌های حافظه هنگام تخصیص مقادیر زیاد در طول توسعه برنامه، GPUAdapterInfo اطلاعات غیراستاندارد memoryHeaps مانند اندازه و نوع هیپ‌های حافظه موجود در آداپتور را افشا می‌کند.

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

for (const { size, properties } of adapter.info.memoryHeaps) {
  console.log(size); // memory heap size in bytes
  if (properties & GPUHeapProperty.DEVICE_LOCAL)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_VISIBLE)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_CACHED)   { /* ... */ }
}

گزینه کامپایل ماژول شیدر با محاسبات دقیق

GPUShaderModuleDescriptor شامل یک گزینه بولی غیر استاندارد strictMath است که دقت ریاضی دقیق را در طول کامپایل ماژول شیدر فعال یا غیرفعال می‌کند. این گزینه در Metal و Direct3D پشتیبانی می‌شود. وقتی strictMath فعال باشد، کامپایلر به قوانین دقیق ریاضی پایبند است. برعکس، غیرفعال کردن آن به کامپایلر اجازه می‌دهد تا شیدرها را با موارد زیر بهینه کند:

  • نادیده گرفتن احتمال مقادیر NaN و Infinity.
  • رفتار با ‎-0‎ به عنوان ‎+0‎
  • جایگزینی تقسیم با ضرب سریع‌تر در معکوس.
  • مرتب‌سازی مجدد عملیات بر اساس ویژگی‌های انجمنی و توزیعی.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

وارد کردن ویدیو با کپی صفر

ویژگی بولی غیراستاندارد GPUExternalTexture isZeroCopy به شما این امکان را می‌دهد که بدانید آیا ویدیوی وارد شده با importExternalTexture() مستقیماً توسط GPU و بدون نیاز به یک کپی واسطه قابل دسترسی بوده است یا خیر.

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

const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });

if (externalTexture.isZeroCopy) {
  console.log('Video frame was accessed directly by the GPU');
}