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

François Beaufort
François Beaufort

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

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

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

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

มีการนํากลุ่มย่อยไปใช้เพียงเล็กน้อยและไม่เป็นไปตามมาตรฐานหลัง Flag "ฟีเจอร์แพลตฟอร์มเว็บเวอร์ชันทดลอง" ที่ 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 มิติภายในการผ่านข้อมูลเรนเดอร์ได้โดยตรง ซึ่งจะขยายความสามารถนอกเหนือจากการเรนเดอร์พื้นผิว 2 มิติทั่วไปด้วยสมาชิก depthSlice ใหม่ใน GPURenderPassColorAttachment การเพิ่มนี้ช่วยให้คุณสร้างฉากและเอฟเฟกต์แบบโวเซลได้ด้วยการเรนเดอร์เป็นวอลุ่มพื้นผิว 3 มิติโดยตรง ดู issue dawn:1020

การอัปเดต Dawn

ดูรายการคอมมิตทั้งหมด

มีอะไรใหม่ใน WebGPU

รายการทุกอย่างที่ครอบคลุมในชุดมีอะไรใหม่ใน WebGPU

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