มีอะไรใหม่ใน WebGPU (Chrome 125)

François Beaufort
François Beaufort

จำนวนฟีเจอร์ WebGPU อาจดูไม่มากนักในครั้งนี้ แต่ความก้าวหน้าครั้งสำคัญกำลังจะมาถึง โดยเวอร์ชันที่จะเผยแพร่ในอนาคตจะมีฟีเจอร์ต่างๆ เช่น การปรับปรุงความเร็วในการคอมไพล์เชเดอร์ และการเปลี่ยนแปลงโมเดลแบบไม่พร้อมกันของการติดตั้งใช้งานโดยใช้ WGPUFuture

กลุ่มย่อย (ฟีเจอร์อยู่ระหว่างการพัฒนา)

ฟีเจอร์กลุ่มย่อยช่วยให้เกิดการทำงานแบบขนานในระดับ SIMD ซึ่งช่วยให้เธรดภายในกลุ่มสื่อสารและดำเนินการทางคณิตศาสตร์ร่วมกันได้ (เช่น การคำนวณผลรวมของตัวเลข 16 ตัว) ซึ่งเป็นการแชร์ข้อมูลระหว่างเธรดที่มีประสิทธิภาพสูง

API ของ GPU สมัยใหม่รองรับการดำเนินการของกลุ่มย่อย แต่รายละเอียดการตั้งชื่อและการติดตั้งใช้งานจะแตกต่างกันไป ทีม Chrome ได้ระบุความเหมือนกันและกำลังดำเนินการเพื่อกำหนดมาตรฐานฟีเจอร์นี้ โปรดดูที่ ข้อเสนอ และ แสดงความคิดเห็น หากมีคำถาม

มีการติดตั้งใช้งานกลุ่มย่อยแบบน้อยที่สุดและไม่เป็นมาตรฐานอยู่เบื้องหลังแฟล็ก "ฟีเจอร์แพลตฟอร์มเว็บเวอร์ชันทดลอง" ที่ chrome://flags/#enable-experimental-web-platform-features เพื่อให้นักพัฒนาซอฟต์แวร์ได้ลองใช้และแชร์ความคิดเห็น เนื่องจากยังไม่มีการพิสูจน์ให้เห็นถึงประโยชน์ในโลกจริงในบริบทของ WebGPU

เมื่อฟีเจอร์ "chromium-experimental-subgroups" พร้อมใช้งานใน GPUAdapter ให้ขอ GPUDevice ที่มีฟีเจอร์นี้เพื่อรับการรองรับกลุ่มย่อยเวอร์ชันทดลองใน WGSL และตรวจสอบขีดจำกัด minSubgroupSize และ maxSubgroupSize

นอกจากนี้ คุณยังต้องเปิดใช้ส่วนขยายนี้อย่างชัดแจ้งในโค้ด WGSL ด้วย enable chromium_experimental_subgroups เมื่อเปิดใช้แล้ว คุณจะได้รับสิทธิ์เข้าถึงส่วนเพิ่มเติมต่อไปนี้

  • subgroup_invocation_id: ค่าบิวท์อินสำหรับดัชนีของเธรดภายในกลุ่มย่อย
  • subgroup_size: ค่าบิวท์อินสำหรับการเข้าถึงขนาดกลุ่มย่อย
  • subgroupBallot(value): แสดงผลชุดฟิลด์บิต โดยบิตที่สอดคล้องกับ subgroup_invocation_id จะเป็น 1 หาก value เป็นจริงสำหรับการเรียกใช้ที่ใช้งานอยู่ และเป็น 0 ในกรณีอื่นๆ
  • subgroupBroadcast(value, id): บรอดแคสต์ value จากการเรียกใช้ที่มี subgroup_invocation_id ที่ตรงกับ id ไปยังการเรียกใช้ทั้งหมดภายในกลุ่มย่อย หมายเหตุ: id ต้องเป็นค่าคงที่ในเวลาคอมไพล์

ข้อมูลโค้ดต่อไปนี้เป็นฐานให้คุณได้ลองใช้และค้นพบศักยภาพของกลุ่มย่อย

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-subgroups")) {
  throw new Error("Experimental subgroups support is not available");
}
// Explicitly request experimental subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable chromium_experimental_subgroups;

  @compute @workgroup_size(64) fn main(
      @builtin(global_invocation_id) global_id : vec3u,
      @builtin(subgroup_size) sg_size : u32,
      @builtin(subgroup_invocation_id) sg_id : u32) {
    // TODO: Use subgroupBallot() and subgroupBroadcast().
  }`,
});

แสดงผลไปยังสไลซ์ของพื้นผิว 3 มิติ

ตอนนี้คุณสามารถแสดงผลไปยังสไลซ์ของพื้นผิว 3 มิติได้โดยตรงภายใน Render Pass ซึ่งจะขยายขีดความสามารถให้มากกว่าการแสดงผลพื้นผิว 2 มิติทั่วไปด้วยสมาชิก depthSlice ใหม่ใน GPURenderPassColorAttachment ส่วนเพิ่มเติมนี้ช่วยให้คุณสร้างฉากและเอฟเฟกต์ที่อิงตามว็อกเซลได้โดยการแสดงผลลงในปริมาตรพื้นผิว 3 มิติโดยตรง ดู ปัญหา dawn:1020

ข้อมูลอัปเดตเกี่ยวกับ 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