มีอะไรใหม่ใน 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 ยอดนิยมจึงนิยมใช้กันมาก

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

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

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

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

ส่วนขยายภาษา WGSL ของ "unrestricted_pointer_parameters" จะลดข้อจำกัดในการส่งผ่านไปยังฟังก์ชัน WGSL ดังนี้

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

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

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

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

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

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

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

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

ขอแนะนำให้ใช้ requires-directive เพื่อส่งสัญญาณความเป็นไปได้ที่จะดำเนินการไม่ได้ด้วย requires pointer_composite_access; ที่ด้านบนของโค้ดตัวปรับแสง 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.
  }`
});

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

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

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

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

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

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

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

รายการของทุกอย่างที่มีการพูดถึงในซีรีส์มีอะไรใหม่ใน WebGPU

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