WebGPU'daki (Chrome 123) Yenilikler

François Beaufort
François Beaufort

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

DP4a (4 Öğe ve Biriktirme Nokta Çarpımı), niceleme için derin öğrenme çıkarımında yaygın olarak kullanılan bir GPU talimatları kümesini ifade eder. Bu tür 8 bitlik niceleştirilmiş modellerin hesaplanmasını hızlandırmak için 8 bit tamsayılı nokta ürünlerini verimli bir şekilde gerçekleştirir. Bellek ve ağ bant genişliğinden (%75'e kadar) tasarruf edebilir ve çıkarım yapma konusunda tüm makine öğrenimi modellerinin f32 sürümlerine kıyasla performansını artırabilir. Bu nedenle, yapay zeka artık birçok popüler yapay zeka çerçevesinde yoğun olarak kullanılmaktadır.

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

WGSL gölgelendirici kodunuzun üst kısmındaki requires packed_4x8_integer_dot_product; ile taşınabilirlik potansiyelini belirtmek için zorunludur yönergesini kullanmanız önerilir. Aşağıdaki örneğe ve sorun tonu: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 spesifikasyona ve uygulamaya uygunluk için Şangay'daki Intel Web Graphics ekibine teşekkür ediyoruz.

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

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

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

  • Yapı üyelerine ve dizi öğelerine işaretçiler, kullanıcı tarafından bildirilen işlevlere iletme.

İşlev Parametreleri Olarak İşaretçiler | Daha fazla bilgi edinmek için WGSL turuna göz atın.

Bu özellik, navigator.gpu.wgslLanguageFeatures kullanılarak özellik tarafından algılanabilir. WGSL gölgelendirici kodunuzun üst kısmındaki requires unrestricted_pointer_parameters; ile taşınabilirlik olasılığını bildirmek için her zaman bir requires-directive yönergesi kullanmanız önerilir. Aşağıdaki örneğe, WGSL spesifikasyonu değişiklikleri ve sorun tonu:2053'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 kompozitleri referans kaldırmak için söz dizimi şekeri

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

  • foo işaretçiyse: foo.bar (*foo).bar yazmak için daha kullanışlı bir yöntemdir. Normalde, işaretçiyi bir "başvuru"ya dönüştürmek için yıldız işareti (*) kullanılması gerekir. başvurulabilir, ancak artık hem işaretçiler hem de referanslar çok daha benzer ve neredeyse birbirinin yerine kullanılabilir.

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

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

WGSL gölgelendirici kodunuzun üst kısmındaki requires pointer_composite_access; ile taşınabilirlik potansiyelini belirtmek için zorunludur yönergesini kullanmanız önerilir. Aşağıdaki örneğe ve sorun tonu: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 unsurları için ayrı salt okunur durum

Daha önce, oluşturma geçişlerindeki salt okunur derin şablon ekleri, her iki yönün (derinlik ve şablon) salt okunur olmasını gerektiriyordu. Bu sınırlama kaldırıldı. Şimdi, derinlik boyutunu örneğin temas gölge izleme için salt okunur biçimde kullanabilirsiniz. Şablon arabelleği ise daha fazla işlenmek üzere pikselleri tanımlamak için yazılır. Issue dawn:2146'yı inceleyin.

Şafak güncellemeleri

wgpuDeviceSetUncapturedErrorCallback() ile ayarlanan yakalanmamış hata geri çağırması artık hata oluştuğunda hemen çağrılıyor. Geliştiricilerin sürekli olarak hata ayıklamayı beklediği ve istedikleri şey budur. şafak vaktini değiştirme:173620 bölümünü inceleyin.

webgpu.h API'den wgpuSurfaceGetPreferredFormat() yöntemi uygulandı. Sorun şafak:1362 bölümünü inceleyin.

Bunlar, öne çıkan özelliklerden yalnızca bazılarıdır. Taahhütlerin kapsamlı listesini inceleyin.

WebGPU'daki Yenilikler

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

Chrome 127 sürümü

Chrome 126

Chrome 125 sürümü

Chrome 124 sürümü

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119 sürümü

Chrome 118 sürümü

Chrome 117 sürümü

Chrome 116

Chrome 115 sürümü

Chrome 114 sürümü

Chrome 113