มีอะไรใหม่ใน 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 อย่างแพร่หลายในเฟรมเวิร์ก AI ยอดนิยมหลายรายการในขณะนี้

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

ขอแนะนำให้ใช้ requires-directive เพื่อบ่งบอกโอกาสในการถ่ายโอนไม่ได้ด้วย requires packed_4x8_integer_dot_product; ที่ด้านบนของโค้ด Shader ของ WGSL ดูตัวอย่างและสีของปัญหา: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
  }`,
});

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

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

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

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

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

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

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

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

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

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

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

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

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

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