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

François Beaufort
François Beaufort

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

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

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

เราขอแนะนำให้ใช้ requires-directive เพื่อส่งสัญญาณถึงความเป็นไปได้ที่จะไม่สามารถพกพาได้ด้วย requires packed_4x8_integer_dot_product; ที่ด้านบนของโค้ด Shader 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 จะรองรับการเข้าถึงคอมโพเนนต์ของประเภทข้อมูลที่ซับซ้อนโดยใช้ไวยากรณ์จุด (.) เดียวกัน ไม่ว่าคุณจะทำงานกับข้อมูลโดยตรงหรือใช้พอยน์เตอร์ไปยังข้อมูลนั้น วิธีการมีดังนี้

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

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

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

เราขอแนะนำให้ใช้ requires-directive เพื่อส่งสัญญาณถึงความเป็นไปได้ที่จะไม่สามารถพกพาได้ด้วย requires pointer_composite_access; ที่ด้านบนของโค้ด Shader WGSL ดูตัวอย่างต่อไปนี้และออกสี: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() ทันทีเมื่อเกิดข้อผิดพลาด นี่คือสิ่งที่นักพัฒนาแอปคาดหวังและต้องการสำหรับการแก้ไขข้อบกพร่องอย่างสม่ำเสมอ ดูการเปลี่ยนแปลง dawn:173620

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

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

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