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

François Beaufort
François Beaufort

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

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

การใช้งานข้อเสนอเกี่ยวกับกลุ่มย่อยแบบน้อยที่สุดพร้อมให้ทดสอบในพื้นที่แล้วโดยอยู่หลังฟีเจอร์แฟล็ก "การรองรับ WebGPU ที่ไม่ปลอดภัย" ที่ chrome://flags/#enable-unsafe-webgpu

นอกจากนี้ คุณยังลองใช้กลุ่มย่อยในเว็บไซต์กับผู้ใช้จริงได้โดยลงชื่อสมัครใช้การทดลองใช้ต้นทาง อ่านเริ่มต้นใช้งาน Origin Trials เพื่อดูวิธีการเตรียมเว็บไซต์ให้พร้อมใช้งาน Origin Trials ช่วงทดลองใช้จากต้นทางจะเริ่มตั้งแต่ 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 เป็นค่าที่ไม่ใช่ศูนย์เมื่อโทโพโลยีสำหรับไปป์ไลน์การแสดงผลเป็นประเภทเส้นหรือจุดถือเป็นข้อผิดพลาดในการตรวจสอบ เราจะแสดงคำเตือนในคอนโซล DevTools เกี่ยวกับการตรวจสอบที่กำลังจะเกิดขึ้นนี้ พร้อมทั้งบังคับให้ค่าเป็น 0 ในกรณีดังกล่าว เพื่อให้นักพัฒนาแอปมีเวลาเพียงพอในการอัปเดตโค้ด ดูปัญหา 352567424

ซ่อนคำเตือนเครื่องมือสำหรับนักพัฒนาเว็บเกี่ยวกับข้อผิดพลาดที่ไม่ได้บันทึกหาก 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

ข้อมูลอัปเดตเกี่ยวกับ Dawn

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

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

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

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

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

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

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

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

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