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

François Beaufort
François Beaufort

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

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

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

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

ข้อมูลอัปเดตรุ่งเช้า

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

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

รายการทั้งหมดที่กล่าวถึงในซีรีส์ What's New in WebGPU

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