WebGPU'daki (Chrome 123) Yenilikler

François Beaufort
François Beaufort

WGSL'de DP4a yerleşik işlevleri desteği

DP4a (4 Öğe ve Biriktirme Noktalı Ürün), niceleme için derin öğrenme çıkarımında yaygın olarak kullanılan bir dizi GPU talimatını ifade eder. 8 bitlik tam sayı nokta ürünleri ile bu tür int8 nicelenmiş modellerin daha hızlı hesaplanması için verimli bir şekilde çalışır. Bellek ve ağ bant genişliğinden (%75'e kadar) tasarruf edebilir ve çıkarımdaki tüm makine öğrenimi modellerinin performansını f32 sürümlerine kıyasla iyileştirebilir. Sonuç olarak, artık birçok popüler yapay zeka çerçevesinde yaygın olarak kullanılmaktadır.

navigator.gpu.wgslLanguageFeatures konumunda "packed_4x8_integer_dot_product" WGSL dil uzantısı mevcut olduğunda, yerleşik dot4U8Packed ve dot4I8Packed işlevleriyle WGSL gölgelendirici kodunuzdaki nokta ürün talimatlarına giriş olarak, 8 bitlik tam sayılardan oluşan 4 bileşenli vektörleri paketleyen 32 bit tam sayı skalerleri kullanabilirsiniz. Paketleme ve açma talimatlarını pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 ve unpack4xU8 WGSL yerleşik işlevlerine sahip 8 bit tam sayılardan oluşan paketlenmiş 4 bileşenli vektörlerle de kullanabilirsiniz.

Taşınabilirlik potansiyelini belirtmek için WGSL gölgelendirici kodunuzun en üstünde requires packed_4x8_integer_dot_product; ile bir requires-directive yönergesini kullanmanız önerilir. Aşağıdaki örneğe ve issue tint:1497'ye bakın.

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
  }`,
});

Bu spesifikasyonu ve uygulamayı tamamladığı için Intel'in Şangay'daki Web Grafikleri ekibine özel teşekkür ederiz!

WGSL'de kısıtlanmamış işaretçi parametreleri

"unrestricted_pointer_parameters" WGSL dil uzantısı, WGSL işlevlerine hangi işaretçilerin aktarılabileceğiyle ilgili kısıtlamaları gevşetir:

  • storage, uniform ve workgroup parametre işaretçileri, kullanıcı tarafından bildirilen işlevlere yönelik boşlukları gider.

  • Üyeleri ve dizi öğelerini kullanıcı tarafından bildirilen işlevlere yapılandırmak için işaretçiler iletme.

Bu özellik hakkında daha fazla bilgi edinmek için İşlev Parametreleri Olarak İşaretçiler | WGSL Turu'na göz atın.

Bu özellik, navigator.gpu.wgslLanguageFeatures kullanılarak algılanabilir. Taşınabilirlik potansiyelini belirtmek için her zaman WGSL gölgeleyici kodunuzun en üstünde requires unrestricted_pointer_parameters; ile bir requires-directive yönergesini kullanmanız önerilir. WGSL spesifikasyon değişiklikleri ve sorun tonu:2053 adlı aşağıdaki örneğe bakın.

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'de kompozitlerin referansını kaldırmak için söz dizimi şeker

navigator.gpu.wgslLanguageFeatures içinde "pointer_composite_access" WGSL dil uzantısı mevcut olduğunda, WGSL gölgelendirici kodunuz artık verilerle doğrudan veya işaretçi kullanarak çalışın, aynı nokta (.) söz dizimini kullanan karmaşık veri türlerindeki bileşenlere erişimi desteklemektedir. İşleyiş şekli:

  • foo bir işaretçiyse: foo.bar, (*foo).bar yazmanın daha kolay bir yoludur. Normalde yıldız işareti (*) işaretçiyi, referansı gösterilebilecek bir "referansa" dönüştürmek için gereklidir. Ancak artık hem işaretçiler hem de referanslar çok daha benzer ve neredeyse birbirinin yerine kullanılabilir.

  • foo bir işaretçi değilse: Nokta (.) operatörü, üyelere doğrudan erişmek için alışkın olduğunuz şekilde çalışır.

Benzer şekilde, pa bir dizinin başlangıç adresini depolayan bir işaretçiyse pa[i] işlevini kullanmak, dizinin 'i'inci öğesinin depolandığı bellek konumuna doğrudan erişim sağlar.

Taşınabilirlik potansiyelini belirtmek için WGSL gölgelendirici kodunuzun en üstünde requires pointer_composite_access; ile bir requires-directive yönergesini kullanmanız önerilir. Aşağıdaki örneğe ve issue tint:2113'e bakın.

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.
  }`
});

Şablon ve derinlik özellikleri için ayrı salt okuma durumu

Daha önce, oluşturma geçişlerindeki salt okunur derinlik şablon eklerinin her iki özelliğin de (derinlik ve şablon) salt okunur olması gerekiyordu. Bu sınırlama kaldırıldı. Artık derinlik özelliğini, örneğin temas gölgesi izleme için salt okunur biçimde kullanabilirsiniz. Şablon arabelleği ise ilerideki işlemler için pikselleri tanımlamak üzere yazılır. issue dawn:2146'ya bakın.

Dawn ile ilgili güncellemeler

wgpuDeviceSetUncapturedErrorCallback() ile ayarlanan yakalanmamış hata geri çağırması artık hata oluştuğunda hemen çağrılıyor. Geliştiricilerin sürekli olarak beklediği ve hata ayıklaması istediği durum budur. change dawn:173620 bölümüne bakın.

webgpu.h API'sındaki wgpuSurfaceGetPreferredFormat() yöntemi uygulanmıştır. issue dawn:1362'yi inceleyin.

Burada, öne çıkan özelliklerin yalnızca bir kısmı ele alınıyor. Kayıtların kapsamlı listesine göz atın.

WebGPU'daki Yenilikler

WebGPU'daki Yenilikler serisinde ele alınan her şeyin listesi.

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