WebGPU में नया क्या है (Chrome 128)

François Beaufort
François Beaufort

सबग्रुप के साथ प्रयोग करना

सबग्रुप की सुविधा से, SIMD-लेवल पर पैरललिज़्म की सुविधा मिलती है. इससे, किसी ग्रुप में मौजूद थ्रेड एक-दूसरे से कम्यूनिकेट कर सकते हैं और एक साथ मिलकर गणित की कार्रवाइयां कर सकते हैं. जैसे, 16 नंबरों का योग निकालना. इससे, थ्रेड के बीच डेटा शेयर करने का एक बहुत ही असरदार तरीका मिलता है.

सबग्रुप के सुझाव को कम से कम लागू करने की सुविधा, स्थानीय तौर पर जांच करने के लिए उपलब्ध है. इसे "Unsafe WebGPU Support" फ़्लैग के पीछे, chrome://flags/#enable-unsafe-webgpu पर जाकर ऐक्सेस किया जा सकता है.

ऑरिजिन ट्रायल के लिए साइन अप करके, अपनी साइट पर असली उपयोगकर्ताओं के साथ सबग्रुप आज़माए जा सकते हैं. ऑरिजिन ट्रायल का इस्तेमाल करने के लिए, अपनी साइट को तैयार करने के निर्देशों के लिए, ऑरिजिन ट्रायल का इस्तेमाल शुरू करना लेख पढ़ें. ऑरिजिन ट्रायल, Chrome के वर्शन 128 से 131 तक चलेगा. यह 19 फ़रवरी, 2025 को खत्म होगा. एक्सपेरिमेंट करने के इरादे के बारे में जानकारी देखें.

जब "subgroups" सुविधा GPUAdapter में उपलब्ध हो, तो WGSL में सबग्रुप की सुविधा पाने के लिए इस सुविधा के साथ GPUDevice का अनुरोध करें. साथ ही, इसकी minSubgroupSize और maxSubgroupSize की सीमाओं की जांच करें.

आपको enable subgroups; के साथ, अपने WGSL कोड में इस एक्सटेंशन को साफ़ तौर पर चालू भी करना होगा. इसे चालू करने पर, आपको ये सुविधाएं मिलती हैं:

  • subgroup_invocation_id: यह सबग्रुप में मौजूद थ्रेड के इंडेक्स के लिए, पहले से मौजूद वैल्यू है.
  • subgroup_size: यह सबग्रुप के साइज़ को ऐक्सेस करने के लिए, पहले से मौजूद वैल्यू है.
  • subgroupBallot(value): यह बिट फ़ील्ड का एक सेट दिखाता है. इसमें, subgroup_invocation_id से जुड़ी बिट की वैल्यू 1 होती है. ऐसा तब होता है, जब उस ऐक्टिव इनवोकेशन के लिए value सही हो. इसके अलावा, इसकी वैल्यू 0 होती है.
  • subgroupBroadcast(value, id): यह subgroup_invocation_id के साथ इनवोकेशन से value को ब्रॉडकास्ट करता है. यह 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 को नॉन-ज़ीरो वैल्यू पर सेट करना, पुष्टि करने में गड़बड़ी मानी जाती है. डेवलपर को अपना कोड अपडेट करने के लिए, DevTools कंसोल में इस आने वाली पुष्टि के बारे में एक चेतावनी दिखाई जाती है. साथ ही, इन स्थितियों में वैल्यू को 0 पर सेट किया जाता है. समस्या 352567424 देखें.

preventDefault का इस्तेमाल करने पर, DevTools में कैप्चर न की गई गड़बड़ी की चेतावनी न दिखाएं

अगर uncapturederror के लिए कोई इवेंट लिसनर रजिस्टर किया गया है और इवेंट लिसनर कॉलबैक में, इवेंट preventDefault() तरीके को कॉल किया गया है, तो DevTools कंसोल में uncapturederror इवेंट के लिए चेतावनियां नहीं दिखेंगी. यह व्यवहार, 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 में इंटरपोलेट सैंपलिंग, फ़र्स्ट और आइदर

WGSL का interpolate एट्रिब्यूट, उपयोगकर्ता के तय किए गए आईओ डेटा इंटरपोलेशन को मैनेज करने की सुविधा देता है. अब, इंटरपोलेट सैंपलिंग के नए पैरामीटर first (डिफ़ॉल्ट) और either आपको ज़्यादा कंट्रोल देते हैं: first प्रिमिटिव के पहले वर्टेक्स से वैल्यू का इस्तेमाल करता है, जबकि either पहले या आखिरी वर्टेक्स का इस्तेमाल करने की अनुमति देता है. समस्या 340278447 देखें.

Dawn से जुड़े अपडेट

एसिंक्रोनस कार्रवाइयों को हैंडल करने के लिए, Dawn के WGPUFuture को लागू करने की प्रोसेस अब पूरी हो गई है. मुख्य कॉन्सेप्ट में, मौके के हिसाब से इवेंट प्रोसेसिंग के लिए wgpuInstanceProcessEvents और कॉलबैक की जगहें तय करने के लिए WGPUCallbackMode शामिल हैं. WGPUFuture, एक बार होने वाले इवेंट को दिखाता है. इसकी लाइफ़टाइम की कोई सीमा नहीं होती. वहीं, wgpuInstanceWaitAny, किसी भी फ़्यूचर या टाइम आउट के पूरा होने का इंतज़ार करता है. समस्या 42240932 देखें.

Surface::GetCapabilities() अब CompositeAlphaMode::Auto वैल्यू की रिपोर्ट नहीं करता. यह अब भी मान्य है और Surface::GetCapabilities().alphaMode[0] के बराबर है. समस्या 292 देखें.

OpenGL बैकएंड अब हर Present() कॉल के लिए, y-फ़्लिप ब्लिट के साथ Surface को सपोर्ट करता है. समस्या 344814083 देखें.

Adapter::GetProperties() तरीके को अब इस्तेमाल नहीं किया जा सकता. इसके बजाय, Adapter::GetInfo() का इस्तेमाल करें.

बाहर से योगदान देने वाले जसवंत ने, CMake की सभी फ़ाइलें फिर से लिखी हैं. इससे उन्हें अपडेट करना आसान हो गया है और प्री-बिल्ड की अनुमति मिल गई है. CMake प्रोजेक्ट में Dawn का इस्तेमाल करने के लिए, आसानी से सीखें गाइड देखें.

इसमें सिर्फ़ कुछ मुख्य हाइलाइट शामिल हैं. कमिट की पूरी सूची देखें.

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