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

François Beaufort
François Beaufort

การทดสอบกลุ่มย่อย

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

การใช้งาน proposal ของกลุ่มย่อยขั้นต่ำพร้อมให้ใช้งานแล้วสำหรับการทดสอบในเครื่องหลังการตั้งค่าสถานะ "การรองรับ WebGPU ที่ไม่เป็นอันตราย" ที่ chrome://flags/#enable-unsafe-webgpu

นอกจากนี้ คุณยังลองใช้กลุ่มย่อยในเว็บไซต์กับผู้ใช้จริงได้โดยลงชื่อสมัครใช้ช่วงทดลองใช้เวอร์ชันที่ใช้งานจริง อ่านเริ่มต้นใช้งานการทดสอบต้นทางเพื่อดูวิธีการเตรียมเว็บไซต์ให้พร้อมใช้การทดสอบต้นทาง ช่วงทดลองใช้จากต้นทางจะเริ่มต้นจาก Chrome 128 ถึง 131 (สิ้นสุดวันที่ 19 กุมภาพันธ์ 2025) ดูความตั้งใจที่จะทดสอบ

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

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

  • subgroup_invocation_id: ค่าในตัวสำหรับดัชนีของชุดข้อความภายในกลุ่มย่อย
  • subgroup_size: ค่าในตัวสำหรับการเข้าถึงขนาดกลุ่มย่อย
  • subgroupBallot(value): แสดงผลชุดของช่องบิตซึ่งบิตที่ตรงกับ subgroup_invocation_id คือ 1 หาก value เป็นจริงสำหรับการเรียกใช้ที่ทำงานอยู่นั้น และจะแสดงผลเป็น 0 ในกรณีอื่นๆ
  • subgroupBroadcast(value, id): ออกอากาศ value จากคําเรียกที่มี subgroup_invocation_id ตรงกับ 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 เป็นค่าที่ไม่ใช่ 0 เมื่อโทโพโลยีสำหรับไปป์ไลน์การแสดงผลเป็นชนิดเส้นหรือประเภทจุด ระบบจะแสดงคำเตือนในคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บเกี่ยวกับการตรวจสอบที่กําลังจะเกิดขึ้นนี้ และบังคับให้ค่าเป็น 0 ในกรณีเหล่านี้เพื่อให้นักพัฒนาแอปมีเวลาเพียงพอในการอัปเดตโค้ด ดูปัญหา 352567424

ซ่อนคำเตือนข้อผิดพลาดที่ไม่ได้บันทึกไว้สำหรับ DevTools หาก preventDefault

ในคอนโซลเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ คำเตือนสําหรับเหตุการณ์ uncapturederror จะไม่แสดงอีกต่อไปหากมีการลงทะเบียน Listener เหตุการณ์สําหรับ uncapturederror และมีการเรียกใช้เมธอดเหตุการณ์ preventDefault() ภายใน Callback ของ Listener เหตุการณ์ ลักษณะการทํางานนี้ตรงกับการจัดการเหตุการณ์ใน 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 ช่วยให้คุณจัดการการอินเตอร์โพเลชันข้อมูล IO ที่ผู้ใช้กำหนดได้ ในตอนนี้ พารามิเตอร์การสุ่มตัวอย่างแบบช่วงใหม่ first (ค่าเริ่มต้น) และ either จะช่วยให้คุณควบคุมเพิ่มเติมได้ โดย first จะใช้ค่าจากจุดยอดมุมแรกของดั้งเดิม ในขณะที่ either อนุญาตให้ใช้จุดยอดมุมแรกหรือจุดสุดท้าย ดูปัญหา 340278447

การอัปเดต Dawn

การติดตั้งใช้งาน WGPUFuture ของ Dawn เพื่อจัดการการดำเนินการแบบไม่พร้อมกันเสร็จสมบูรณ์แล้ว แนวคิดหลัก ได้แก่ wgpuInstanceProcessEvents สำหรับการประมวลผลเหตุการณ์แบบมีโอกาส และ WGPUCallbackMode สำหรับการกําหนดตําแหน่งการเรียกกลับ WGPUFuture หมายถึงเหตุการณ์ที่เกิดขึ้นเพียงครั้งเดียวซึ่งมีอายุการใช้งานแบบไม่จำกัด และ wgpuInstanceWaitAny จะรอให้การดำเนินการในอนาคตเสร็จสมบูรณ์หรือรอให้หมดเวลา ดูปัญหา 42240932

ตอนนี้ Surface::GetCapabilities() ไม่ได้รายงานค่า CompositeAlphaMode::Auto รหัสดังกล่าวยังคงใช้งานได้และเทียบเท่ากับ Surface::GetCapabilities().alphaMode[0] โปรดดูปัญหา 292

ตอนนี้แบ็กเอนด์ OpenGL รองรับ Surface ด้วย blit แบบพลิก Y สําหรับการเรียก Present() แต่ละครั้ง ดูปัญหา 344814083

เลิกใช้งานเมธอด Adapter::GetProperties() แล้วเพื่อใช้ Adapter::GetInfo() แทน

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

ข้อมูลนี้เป็นเพียงไฮไลต์สำคัญบางส่วนเท่านั้น ดูรายการคอมมิตทั้งหมด

มีอะไรใหม่ใน 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