WebGPU डेवलपर के लिए सुविधाएं

François Beaufort
François Beaufort

पब्लिश होने की तारीख: 3 जून, 2025

Chrome में WebGPU API को लागू करने के लिए, ऐसी सुविधाएं शामिल की गई हैं जो सिर्फ़ डेवलपमेंट और टेस्टिंग के लिए हैं. ये सुविधाएं, WebGPU के स्टैंडर्ड स्पेसिफ़िकेशन से बाहर हैं. इन सुविधाओं का इस्तेमाल प्रोडक्शन में न करें.

इस दस्तावेज़ में, WebGPU की डेवलपर सुविधाएं चालू करने का तरीका बताया गया है. साथ ही, इसमें सुविधाओं की पूरी सूची दी गई है.

पूर्वापेक्षा

Chrome में WebGPU डेवलपर सुविधाओं को चालू करने के लिए, यह तरीका अपनाएं:

  1. chrome://flags/#enable-webgpu-developer-features पर जाकर, "WebGPU Developer Features" फ़्लैग चालू करें.
  2. Chrome ब्राउज़र को रीस्टार्ट करें.

टाइमस्टैंप क्वेरी के क्वांटाइज़ेशन की सुविधा बंद करें

टाइमस्टैंप क्वेरी की मदद से, WebGPU ऐप्लिकेशन, कंप्यूट और रेंडर पास के दौरान जीपीयू कमांड के एक्ज़ीक्यूशन टाइम को सटीक तरीके से (नैनोसेकंड तक) मेज़र कर सकते हैं. जीपीयू के वर्कलोड की परफ़ॉर्मेंस और व्यवहार का विश्लेषण करने के लिए, ये क्वेरी ज़रूरी हैं. ज़्यादा जानकारी के लिए, कंप्यूट और रेंडर पास में टाइमस्टैंप क्वेरी देखें.

टाइमिंग अटैक की वजह से, टाइमस्टैंप क्वेरी को 100 माइक्रोसेकंड के रिज़ॉल्यूशन के साथ क्वांटाइज़ किया जाता है. इससे सटीक जानकारी और सुरक्षा के बीच बेहतर समझौता होता है. "WebGPU Developer Features" फ़्लैग चालू होने पर, यह क्वांटाइज़ेशन अपने-आप बंद हो जाता है.

अडैप्टर के बारे में ज़्यादा जानकारी

इस्तेमाल किए जा रहे अडैप्टर के बारे में ज़्यादा जानकारी पाने के लिए, GPUAdapterInfo इन एट्रिब्यूट को दिखाता है:

  • device एट्रिब्यूट (स्टैंडर्ड के मुताबिक) वेंडर के हिसाब से अडैप्टर आइडेंटिफ़ायर होता है.
  • description एट्रिब्यूट (स्टैंडर्ड के मुताबिक) एक ऐसी स्ट्रिंग है जिसे कोई भी व्यक्ति आसानी से पढ़ सकता है. इसमें अडैप्टर के बारे में जानकारी होती है.
  • driver एट्रिब्यूट (नॉन-स्टैंडर्ड) एक ऐसी स्ट्रिंग है जिसे कोई भी व्यक्ति आसानी से पढ़ सकता है. इसमें ड्राइवर के बारे में जानकारी होती है.
  • backend एट्रिब्यूट (नॉन-स्टैंडर्ड) से ग्राफ़िक्स बैकएंड के बारे में पता चलता है. जैसे, "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" या "null".
  • type एट्रिब्यूट (स्टैंडर्ड नहीं किया गया) से जीपीयू टाइप की पहचान होती है: "discrete GPU", "integrated GPU", "CPU" या "unknown".
  • d3dShaderModel एट्रिब्यूट (नॉन-स्टैंडर्ड) से, D3D शेडर मॉडल के लिए ज़्यादा से ज़्यादा इस्तेमाल किए जा सकने वाले नंबर के बारे में पता चलता है. उदाहरण के लिए, 62 का मतलब है कि HLSL SM 6.2 का इस्तेमाल किया जा सकता है.
  • vkDriverVersion एट्रिब्यूट (नॉन-स्टैंडर्ड) वेंडर की ओर से तय किया गया Vulkan ड्राइवर वर्शन है.
  • GPURequestAdapterOptions में GPUPowerPreference के आधार पर, powerPreference एट्रिब्यूट (नॉन-स्टैंडर्ड) "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 और इनफ़िनिटी वैल्यू की संभावना को अनदेखा करना.
  • -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() की मदद से इंपोर्ट किए गए वीडियो को सीधे तौर पर जीपीयू ने ऐक्सेस किया था या नहीं. इसके लिए, इंटरमीडिएट कॉपी की ज़रूरत नहीं पड़ी.

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