WebGPU'daki (Chrome 123) Yenilikler

François Beaufort
François Beaufort

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

DP4a (4 Öğenin Nokta Çarpımı ve Toplama), kesme işlemi için derin öğrenme çıkarımlarında yaygın olarak kullanılan bir GPU talimatı grubunu ifade eder. Bu tür int8 kesirli modellerin hesaplamasını hızlandırmak için 8 bit tam sayı nokta çarpımlarını verimli bir şekilde gerçekleştirir. Bu özellik, bellek ve ağ bant genişliğinden (%75'e varan oranda) tasarruf sağlayabilir ve tüm makine öğrenimi modellerinin performansını, f32 sürümlerine kıyasla çıkarım yaparken iyileştirebilir. Sonuç olarak, günümüzde birçok popüler yapay zeka çerçevesinde yoğun olarak kullanılmaktadır.

navigator.gpu.wgslLanguageFeatures sürümünde "packed_4x8_integer_dot_product" WGSL dil uzantısı mevcut olduğ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ılardan oluşan paketlenmiş 4 bileşenli vektörlerle paketleme ve paket açma talimatlarını da kullanabilirsiniz.

WGSL gölgelendirici kodunuzun en üstünde requires packed_4x8_integer_dot_product; ile birlikte taşınabilirlik olmaması olasılığını belirtmek için bir requires-directive kullanılması önerilir. Aşağıdaki örneğe ve issue tint:1497 değerine 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ı tamamlama konusundaki çalışmaları için Intel'in Şanghay'daki Web Grafikleri Ekibi'ne özel olarak teşekkür ederiz.

WGSL'de sınırsız 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şetir:

  • storage, uniform ve workgroup parametre işaretçileri, kullanıcı tarafından tanımlanan işlevlerin alanlarını adresler.

  • Kullanıcı tarafından tanımlanan işlevlere yapı üyelerine ve dizi öğelerine işaretçiler gönderme.

Bu konu hakkında daha fazla bilgi edinmek için İşlev Parametreleri Olarak İşaretçi Kullanımı | WGSL Turu başlıklı makaleyi inceleyin.

Bu özellik, navigator.gpu.wgslLanguageFeatures kullanılarak özellik algılanabilir. WGSL gölgelendirici kodunuzun en üstünde requires unrestricted_pointer_parameters; ile birlikte taşınabilirlik olmaması olasılığını belirtmek için her zaman bir requires-directive kullanmanız önerilir. Aşağıdaki örneğe, WGSL spesifikasyonu değişikliklerine ve issue tint:2053 değerine 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şimlerin referansını kaldırmak için söz dizimi şekeri

navigator.gpu.wgslLanguageFeatures sürümünde "pointer_composite_access"WGSL dil uzantısı mevcut olduğunda WGSL gölgelendirici kodunuz artık doğrudan verilerle veya bir veri işaretçisiyle çalışıyor olsanız da aynı nokta (.) söz dizimini kullanarak karmaşık veri türlerinin bileşenlerine erişimi destekler. İşleyiş şekli:

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

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

WGSL gölgelendirici kodunuzun en üstünde requires pointer_composite_access; ile birlikte taşınabilirlik olmaması olasılığını belirtmek için bir requires-directive kullanılması önerilir. Aşağıdaki örneğe ve issue tint:2113 değerine 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-maske ekleri için her iki yönü de (derinlik ve maske) salt okunur olması gerekiyordu. Bu sınırlama kaldırıldı. Artık derinlik boyutunu salt okunur olarak kullanabilirsiniz (ör. temas gölgesi izleme için). Bu sırada şablon arabelleği, daha fazla işleme alınacak pikselleri tanımlamak için yazılır. issue dawn:2146 konusuna bakın.

Şafak güncellemeleri

wgpuDeviceSetUncapturedErrorCallback() ile ayarlanan yakalanmayan hata geri çağırma işlevi artık hata oluştuğunda hemen çağrılıyor. Geliştiriciler, hata ayıklama için her zaman bu tür bir deneyim bekler ve ister. change dawn:173620 adresine bakın.

webgpu.h API'deki wgpuSurfaceGetPreferredFormat() yöntemi uygulandı. issue dawn:1362 konusuna bakın.

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

WebGPU'daki Yenilikler

WebGPU'daki Yenilikler serisinde ele alınan tüm konuların listesi.

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