WebGPU'daki (Chrome 123) Yenilikler

François Beaufort
François Beaufort

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

DP4a (4 Öğenin Nokta Çarpımı ve Toplama), derin öğrenme çıkarımında nicemleme için yaygın olarak kullanılan bir dizi GPU talimatını ifade eder. Bu tür int8-nicelendirilmiş modellerin hesaplanmasını hızlandırmak için 8 bitlik tam sayı nokta çarpımlarını verimli bir şekilde gerçekleştirir. Bellek ve ağ bant genişliğinin %75'e kadar tasarruf edilmesini sağlayabilir ve çıkarım aşamasındaki tüm makine öğrenimi modellerinin performansını f32 sürümüne kıyasla iyileştirebilir. Bu nedenle, artık birçok popüler yapay zeka çerçevesinde yoğun olarak kullanılmaktadır.

navigator.gpu.wgslLanguageFeatures içinde "packed_4x8_integer_dot_product" WGSL dil uzantısı bulunduğunda artık dot4U8Packed ve dot4I8Packed yerleşik işlevleriyle WGSL gölgelendirici kodunuzdaki nokta çarpımı talimatlarına giriş olarak 8 bitlik tam sayılardan oluşan 4 bileşenli vektörleri paketleyen 32 bitlik tam sayı skalerlerini kullanabilirsiniz. Ayrıca pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 ve unpack4xU8 WGSL yerleşik işlevleriyle 8 bitlik tam sayıların paketlenmiş 4 bileşenli vektörleriyle paketleme ve paket açma talimatlarını da kullanabilirsiniz.

WGSL gölgelendirici kodunuzun en üstünde requires packed_4x8_integer_dot_product; ile taşınabilirlik dışı olma olasılığını belirtmek için requires-directive kullanmanız önerilir. Aşağıdaki örneğe ve tint:1497 sorununa 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 spesifikasyonun ve uygulamanın tamamlanmasını sağlayan Şanghay'daki Intel Web Grafikleri Ekibi'ne özel teşekkürlerimizi sunarız.

WGSL'de sınırsız işaretçi parametreleri

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

  • storage, uniform ve workgroup adres alanlarının kullanıcı tarafından tanımlanan işlevlere yönelik parametre işaretçileri.

  • Kullanıcı tarafından tanımlanan işlevlere yapı üyeleri ve dizi öğeleri için işaretçiler geçirme.

Bu konu hakkında daha fazla bilgi edinmek için Pointers As Function Parameters | Tour of WGSL (İşlev Parametresi Olarak İşaretçiler | WGSL Turu) başlıklı makaleyi inceleyin.

Bu özellik, navigator.gpu.wgslLanguageFeatures kullanılarak özellik algılama yoluyla tespit edilebilir. WGSL gölgelendirici kodunuzun en üstünde requires unrestricted_pointer_parameters; ile taşınabilirlik dışı olma olasılığını belirtmek için her zaman bir requires-directive kullanmanız önerilir. Aşağıdaki örneğe, WGSL spesifikasyonundaki değişikliklere ve issue tint: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 bileşikleri referanssızlaştırmak için söz dizimi kolaylığı

navigator.gpu.wgslLanguageFeatures içinde "pointer_composite_access" WGSL dil uzantısı bulunduğunda, WGSL gölgelendirici kodunuz artık verilerle doğrudan veya verilerin işaretçisiyle çalışıyor olmanızdan bağımsız olarak aynı nokta (.) söz dizimini kullanarak karmaşık veri türlerinin bileşenlerine erişimi destekliyor. İşleyiş şekli:

  • foo bir işaretçiyse: foo.bar, (*foo).bar yazmanın daha kolay bir yoludur. Normalde işaretçiyi, referansı kaldırılabilen bir "referans"a dönüştürmek için yıldız işareti (*) gerekirdi 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ıştığınız şekilde çalışır.

Benzer şekilde, pa bir dizinin başlangıç adresini depolayan bir işaretçiyse pa[i] kullanıldığında bu dizinin 'i. öğesinin depolandığı bellek konumuna doğrudan erişebilirsiniz.

WGSL gölgelendirici kodunuzun en üstünde requires pointer_composite_access; ile taşınabilirlik dışı olma olasılığını belirtmek için requires-directive kullanmanız önerilir. Aşağıdaki örneğe ve sorun tonuna:2113 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 yönleri için ayrı salt okunur durum

Daha önce, oluşturma geçişlerindeki salt okunur derinlik-şablon eklerinin her iki yönünün (derinlik ve şablon) de salt okunur olması gerekiyordu. Bu sınırlama kaldırıldı. Artık şablon arabelleği, daha fazla işleme için pikselleri tanımlamak üzere yazılırken derinlik yönünü salt okunur şekilde (ör. temas gölgesi izleme için) kullanabilirsiniz. dawn:2146 numaralı soruna bakın.

Dawn güncellemeleri

wgpuDeviceSetUncapturedErrorCallback() ile ayarlanan yakalanmamış hata geri çağırması, hata oluştuğunda artık hemen çağrılıyor. Geliştiriciler, hata ayıklama için sürekli olarak bunu bekler ve ister. change dawn:173620 başlıklı makaleyi inceleyin.

webgpu.h API'sindeki wgpuSurfaceGetPreferredFormat() yöntemi uygulandı. issue dawn:1362 başlıklı makaleyi inceleyin.

Bu özet yalnızca önemli noktalardan bazılarını kapsar. Kapsamlı commit listesine göz atın.

WebGPU'daki yenilikler

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

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