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

François Beaufort
François Beaufort

การรองรับฟังก์ชันในตัว DP4a ใน WGSL

DP4a (Dot Product of 4 Elements and Accumulate) หมายถึงชุดคำสั่ง GPU ที่ใช้กันโดยทั่วไปในการอนุมานการเรียนรู้เชิงลึกสำหรับการหาปริมาณ โดยจะดำเนินการผลคูณแบบดอทของจำนวนเต็ม 8 บิตอย่างมีประสิทธิภาพเพื่อเร่งการคำนวณโมเดลที่แปลงเป็นจำนวนเต็ม 8 บิตดังกล่าว ซึ่งช่วยประหยัดหน่วยความจำและแบนด์วิดท์เครือข่าย (สูงสุด 75%) และปรับปรุงประสิทธิภาพของโมเดลแมชชีนเลิร์นนิงในการอนุมานเมื่อเทียบกับเวอร์ชัน f32 ด้วยเหตุนี้ ปัจจุบันจึงมีการใช้งานอย่างแพร่หลายในเฟรมเวิร์ก AI ยอดนิยมหลายรายการ

เมื่อมี"packed_4x8_integer_dot_product"ส่วนขยายภาษา WGSL ใน navigator.gpu.wgslLanguageFeatures ตอนนี้คุณสามารถใช้สเกลาร์จำนวนเต็ม 32 บิตที่แพ็กเวกเตอร์ 4 องค์ประกอบของจำนวนเต็ม 8 บิตเป็นอินพุตสำหรับคำสั่งดอทโปรดักต์ในโค้ด Shader ของ WGSL ด้วยฟังก์ชันในตัว dot4U8Packed และ dot4I8Packed นอกจากนี้ คุณยังใช้คำสั่งการแพ็กและแกะแพ็กกับเวกเตอร์ 4 องค์ประกอบที่แพ็กแล้วของจำนวนเต็ม 8 บิตได้ด้วยฟังก์ชันในตัว pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 และ unpack4xU8 ของ WGSL

ขอแนะนำให้ใช้ requires-directive เพื่อส่งสัญญาณความเป็นไปได้ที่จะไม่สามารถพกพาได้ด้วย requires packed_4x8_integer_dot_product; ที่ด้านบนของโค้ดเชดเดอร์ WGSL ดูตัวอย่างต่อไปนี้และissue tint:1497

if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
  throw new Error(`DP4a built-in functions are not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires packed_4x8_integer_dot_product;

  fn main() {
    const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
  }`,
});

ขอขอบคุณเป็นพิเศษต่อทีมกราฟิกบนเว็บของ Intel ในเซี่ยงไฮ้ที่ขับเคลื่อนข้อกำหนดและการใช้งานนี้จนเสร็จสมบูรณ์

พารามิเตอร์พอยน์เตอร์แบบไม่จำกัดใน WGSL

"unrestricted_pointer_parameters"ส่วนขยายภาษาWGSLช่วยลดข้อจำกัดเกี่ยวกับพอยน์เตอร์ที่ส่งไปยังฟังก์ชัน WGSL ได้

  • ตัวชี้พารามิเตอร์ของช่องที่อยู่ storage, uniform และ workgroup ไปยังฟังก์ชันที่ผู้ใช้ประกาศ

  • การส่งพอยน์เตอร์ไปยังสมาชิกของโครงสร้างและองค์ประกอบของอาร์เรย์ไปยังฟังก์ชันที่ผู้ใช้ประกาศ

ดูข้อมูลเพิ่มเติมได้ที่ตัวชี้เป็นพารามิเตอร์ฟังก์ชัน | ทัวร์ WGSL

ฟีเจอร์นี้ตรวจหาได้โดยใช้ navigator.gpu.wgslLanguageFeatures ขอแนะนำให้ใช้ requires-directive เสมอเพื่อส่งสัญญาณถึงความเป็นไปได้ที่จะไม่สามารถพกพาได้ด้วย requires unrestricted_pointer_parameters; ที่ด้านบนของโค้ด Shader WGSL ดูตัวอย่างต่อไปนี้ การเปลี่ยนแปลงข้อกำหนด WGSL และปัญหา tint:2053

if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
  throw new Error(`Unrestricted pointer parameters are not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires unrestricted_pointer_parameters;

  @group(0) @binding(0) var<storage, read_write> S : i32;

  fn func(pointer : ptr<storage, i32, read_write>) {
    *pointer = 42;
  }

  @compute @workgroup_size(1)
  fn main() {
    func(&S);
  }`
});

ไวยากรณ์ที่ช่วยให้การอ้างอิงองค์ประกอบใน WGSL ง่ายขึ้น

เมื่อ"pointer_composite_access"ส่วนขยายภาษา WGSL อยู่ใน navigator.gpu.wgslLanguageFeatures โค้ด Shader WGSL จะรองรับการเข้าถึงคอมโพเนนต์ของประเภทข้อมูลที่ซับซ้อนโดยใช้ไวยากรณ์จุด (.) เดียวกัน ไม่ว่าคุณจะทำงานกับข้อมูลโดยตรงหรือใช้ Pointer ไปยังข้อมูลนั้น วิธีการมีดังนี้

  • หาก foo เป็น Pointer foo.bar จะเป็นวิธีที่สะดวกกว่าในการเขียน (*foo).bar โดยปกติแล้วจะต้องมีเครื่องหมายดอกจัน (*) เพื่อเปลี่ยน Pointer ให้เป็น "ข้อมูลอ้างอิง" ที่สามารถยกเลิกการอ้างอิงได้ แต่ตอนนี้ทั้ง Pointer และข้อมูลอ้างอิงมีความคล้ายคลึงกันมากขึ้นและใช้แทนกันได้เกือบทั้งหมด

  • หาก foo ไม่ใช่ Pointer ตัวดำเนินการจุด (.) จะทำงานเหมือนกับที่คุณเคยใช้เพื่อเข้าถึงสมาชิกโดยตรง

ในทำนองเดียวกัน หาก pa เป็นพอยน์เตอร์ที่จัดเก็บที่อยู่เริ่มต้นของอาร์เรย์ การใช้ pa[i] จะช่วยให้คุณเข้าถึงตำแหน่งในหน่วยความจำที่จัดเก็บองค์ประกอบที่ 'i ของอาร์เรย์นั้นได้โดยตรง

ขอแนะนำให้ใช้ requires-directive เพื่อส่งสัญญาณความเป็นไปได้ที่จะไม่สามารถพกพาได้ด้วย requires pointer_composite_access; ที่ด้านบนของโค้ดเชดเดอร์ WGSL ดูตัวอย่างต่อไปนี้และissue tint:2113

if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
  throw new Error(`Pointer composite access is not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires pointer_composite_access;

  fn main() {
    var a = vec3f();
    let p : ptr<function, vec3f> = &a;
    let r1 = (*p).x; // always valid.
    let r2 = p.x; // requires pointer composite access.
  }`
});

สถานะแบบอ่านอย่างเดียวแยกกันสำหรับด้านลายฉลุและความลึก

ก่อนหน้านี้สิ่งที่แนบมากับสเตนซิลเชิงลึกแบบอ่านอย่างเดียวใน Render Pass ต้องมีทั้ง 2 ด้าน (ความลึกและสเตนซิล) เป็นแบบอ่านอย่างเดียว เราได้ยกเลิกข้อจำกัดนี้แล้ว ตอนนี้คุณสามารถใช้ลักษณะความลึกในโหมดอ่านอย่างเดียวได้ เช่น สำหรับการติดตามเงาที่สัมผัส ในขณะที่เขียนบัฟเฟอร์ลายฉลุเพื่อระบุพิกเซลสำหรับการประมวลผลเพิ่มเติม ดูปัญหา dawn:2146

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

ตอนนี้ระบบจะเรียกใช้การเรียกกลับข้อผิดพลาดที่ไม่ได้บันทึกซึ่งตั้งค่าด้วย wgpuDeviceSetUncapturedErrorCallback() ทันทีเมื่อเกิดข้อผิดพลาด นี่คือสิ่งที่นักพัฒนาแอปคาดหวังและต้องการสำหรับการแก้ไขข้อบกพร่องอย่างสม่ำเสมอ ดู change dawn:173620

มีการติดตั้งใช้งานเมธอด wgpuSurfaceGetPreferredFormat() จาก webgpu.h API แล้ว ดูปัญหา dawn:1362

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

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

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

Chrome 155-156

Chrome 153-154

Chrome 151-152

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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