Yang Baru di WebGPU (Chrome Formulir 123)

François Beaufort
François Beaufort

Dukungan fungsi bawaan DP4a di WGSL

DP4a (Dot Product of 4 Elements and Accumulate) mengacu pada sekumpulan instruksi GPU yang umum digunakan dalam inferensi deep learning untuk kuantisasi. GPU ini secara efisien melakukan produk titik bilangan bulat 8-bit untuk mempercepat komputasi model yang dikuantisasi int8 tersebut. Hal ini dapat menghemat (hingga 75%) bandwidth memori dan jaringan serta meningkatkan performa model machine learning apa pun dalam inferensi dibandingkan dengan versi f32-nya. Akibatnya, kini banyak digunakan dalam banyak framework AI populer.

Jika ekstensi bahasa WGSL "packed_4x8_integer_dot_product" ada di navigator.gpu.wgslLanguageFeatures, Anda kini dapat menggunakan skalar bilangan bulat 32-bit yang mengemas vektor 4 komponen bilangan bulat 8-bit sebagai input ke petunjuk produk titik dalam kode shader WGSL Anda dengan fungsi bawaan dot4U8Packed dan dot4I8Packed. Anda juga dapat menggunakan petunjuk pengemasan dan pembongkaran dengan vektor 4 komponen yang dikemas dari bilangan bulat 8-bit dengan fungsi bawaan WGSL pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8, dan unpack4xU8.

Sebaiknya gunakan requires-directive untuk menandakan potensi tidak portabel dengan requires packed_4x8_integer_dot_product; di bagian atas kode shader WGSL Anda. Lihat contoh berikut dan masalah warna: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
  }`,
});

Terima kasih khusus kepada tim Web Graphics Intel di Shanghai yang telah mendorong penyelesaian spesifikasi dan penerapan ini.

Parameter penunjuk yang tidak dibatasi di WGSL

Ekstensi bahasa "unrestricted_pointer_parameters" WGSL melonggarkan batasan pada pointer yang dapat diteruskan ke fungsi WGSL:

  • Penunjuk parameter ruang alamat storage, uniform, dan workgroup ke fungsi yang dideklarasikan pengguna.

  • Meneruskan pointer ke anggota struktur dan elemen array ke fungsi yang dideklarasikan pengguna.

Lihat Pointer Sebagai Parameter Fungsi | Tur WGSL untuk mempelajari lebih lanjut.

Fitur ini dapat dideteksi menggunakan navigator.gpu.wgslLanguageFeatures. Sebaiknya selalu gunakan requires-directive untuk menandakan potensi tidak portabel dengan requires unrestricted_pointer_parameters; di bagian atas kode shader WGSL Anda. Lihat contoh berikut, perubahan spesifikasi WGSL, dan masalah warna: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);
  }`
});

Sugar sintaksis untuk menghilangkan referensi komposit di WGSL

Jika ekstensi bahasa WGSL "pointer_composite_access" ada di navigator.gpu.wgslLanguageFeatures, kode shader WGSL Anda kini mendukung akses ke komponen jenis data kompleks menggunakan sintaks titik (.) yang sama, baik saat Anda bekerja langsung dengan data maupun dengan pointer ke data tersebut. Berikut caranya:

  • Jika foo adalah pointer: foo.bar adalah cara yang lebih mudah untuk menulis (*foo).bar. Tanda bintang (*) biasanya diperlukan untuk mengubah pointer menjadi "referensi" yang dapat di-dereferensikan, tetapi kini pointer dan referensi jauh lebih mirip dan hampir dapat dipertukarkan.

  • Jika foo bukan pointer: Operator titik (.) berfungsi persis seperti yang biasa Anda lakukan untuk mengakses anggota secara langsung.

Demikian pula, jika pa adalah pointer yang menyimpan alamat awal array, maka penggunaan pa[i] akan memberi Anda akses langsung ke lokasi memori tempat elemen ke-'i dari array tersebut disimpan.

Sebaiknya gunakan requires-directive untuk menandakan potensi tidak portabel dengan requires pointer_composite_access; di bagian atas kode shader WGSL Anda. Lihat contoh berikut dan masalah warna: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.
  }`
});

Memisahkan status hanya baca untuk aspek stensil dan kedalaman

Sebelumnya, lampiran stensil kedalaman hanya baca dalam meneruskan render memerlukan kedua aspek (kedalaman dan stensil) agar hanya dapat dibaca. Batasan ini telah dicabut. Sekarang, Anda dapat menggunakan aspek kedalaman dalam mode hanya baca, misalnya untuk penelusuran bayangan kontak, sementara buffer stensil ditulis untuk mengidentifikasi piksel untuk pemrosesan lebih lanjut. Lihat issue dawn:2146.

Update Dawn

Callback error yang tidak tertangkap yang ditetapkan dengan wgpuDeviceSetUncapturedErrorCallback() kini dipanggil segera saat terjadi error. Inilah yang secara konsisten diharapkan dan diinginkan developer untuk proses debug. Lihat change dawn:173620.

Metode wgpuSurfaceGetPreferredFormat() dari webgpu.h API telah diimplementasikan. Lihat issue dawn:1362.

Hal ini hanya mencakup beberapa sorotan utama. Lihat daftar commit yang lengkap.

Yang Baru di WebGPU

Daftar semua hal yang telah dibahas dalam seri Yang Baru di 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