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 serangkaian petunjuk GPU yang biasa digunakan dalam inferensi deep learning untuk kuantisasi. Model ini secara efisien melakukan produk titik bilangan bulat 8-bit untuk mempercepat komputasi model yang dikuantisasi int8 tersebut. Hal ini dapat menghemat (hingga 75%) memori dan bandwidth jaringan serta meningkatkan performa model machine learning dalam inferensi dibandingkan dengan versi f32-nya. Oleh karena itu, TensorFlow 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 memaketkan vektor 4 komponen dari bilangan bulat 8-bit sebagai input ke petunjuk perkalian titik di kode shader WGSL dengan fungsi bawaan dot4U8Packed dan dot4I8Packed. Anda juga dapat menggunakan petunjuk pengepakan dan pemecatan dengan vektor 4 komponen yang dikemas dari bilangan bulat 8-bit dengan fungsi bawaan pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8, dan unpack4xU8 WGSL.

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

Terima kasih khusus kepada tim Web Graphics Intel di Shanghai karena telah mendorong spesifikasi dan penerapan ini hingga selesai.

Parameter pointer yang tidak dibatasi di WGSL

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

  • Pointer 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 Pointers As Function Parameters | Tour of WGSL untuk mempelajarinya lebih lanjut.

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

Sintaksis yang lebih mudah untuk mendereferensikan 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 sintaksis titik (.) yang sama, baik Anda bekerja langsung dengan data atau dengan pointer ke data tersebut. Berikut caranya:

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

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

Demikian pula, jika pa adalah pointer yang menyimpan alamat awal array, 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 non-portabilitas dengan requires pointer_composite_access; di bagian atas kode shader WGSL Anda. Lihat contoh berikut dan 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.
  }`
});

Status hanya baca terpisah untuk aspek stencil dan kedalaman

Sebelumnya, lampiran depth-stencil hanya baca di render pass mengharuskan kedua aspek (depth dan stencil) hanya baca. Batasan ini telah dicabut. Sekarang, Anda dapat menggunakan aspek kedalaman dalam mode hanya baca, misalnya untuk pelacakan bayangan kontak, sementara buffering stencil ditulis untuk mengidentifikasi piksel untuk pemrosesan lebih lanjut. Lihat masalah dawn:2146.

Update fajar

Callback error yang tidak direkam yang ditetapkan dengan wgpuDeviceSetUncapturedErrorCallback() kini langsung dipanggil saat error terjadi. Hal ini yang secara konsisten diharapkan dan diinginkan developer untuk proses debug. Lihat perubahan dawn:173620.

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

Bagian ini hanya membahas beberapa sorotan utama. Lihat daftar commit yang lengkap.

Yang Baru di WebGPU

Daftar semua yang telah dibahas dalam seri Yang Baru di WebGPU.

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