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

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

تاریخ انتشار: 3 ژوئن 2025

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

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

پیش نیاز

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

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

کوانتیزاسیون پرس و جوهای مهر زمانی را غیرفعال کنید

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

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

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

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

  • ویژگی device (استاندارد شده) یک شناسه آداپتور مخصوص فروشنده است.
  • ویژگی description (استاندارد شده) یک رشته قابل خواندن توسط انسان است که جزئیات آداپتور را ارائه می دهد.
  • ویژگی driver (غیر استاندارد) یک رشته قابل خواندن توسط انسان است که راننده را توصیف می کند.
  • ویژگی backend (غیر استاندارد) پشتیبان گرافیکی را نشان می‌دهد، مانند "WebGPU" ، "D3D11" ، "D3D12" ، "metal" ، "vulkan" ، "openGL" ، "openGLES" یا "null" .
  • ویژگی type (غیر استاندارد) نوع GPU را مشخص می کند: "discrete GPU" ، "integrated GPU" ، "CPU" یا "unknown" .
  • ویژگی d3dShaderModel (غیر استاندارد) حداکثر شماره مدل سایه زن D3D پشتیبانی شده را مشخص می کند، برای مثال، 62 نشان دهنده پشتیبانی 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)   { /* ... */ }
}

گزینه کامپایل ماژول Shader ریاضی سخت

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');
}