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

François Beaufort
François Beaufort

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

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

การนำข้อเสนอกลุ่มย่อยมาใช้เพียงเล็กน้อยสำหรับการทดสอบในเครื่องที่อยู่เบื้องหลัง "การสนับสนุน 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 ก่อนและแบบใดแบบหนึ่ง

แอตทริบิวต์ interpolate ของ WGSL ช่วยให้คุณจัดการการประมาณช่วงข้อมูล IO ที่ผู้ใช้กำหนดได้ ในตอนนี้ พารามิเตอร์การสุ่มตัวอย่างแบบช่วงใหม่ first (ค่าเริ่มต้น) และ either จะช่วยให้คุณควบคุมเพิ่มเติมได้ โดย first จะใช้ค่าจากจุดยอดมุมแรกของดั้งเดิม ในขณะที่ either อนุญาตให้ใช้จุดยอดมุมแรกหรือจุดสุดท้าย ดูปัญหา 340278447

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

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

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

ตอนนี้แบ็กเอนด์ OpenGL รองรับ Surface พร้อม y- Flip สำหรับการเรียก Present() แต่ละครั้งแล้ว ดูปัญหา 344814083

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

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

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

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

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

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