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), 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. Bu nedenle, yapay zeka artık 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şetmektedir:

  • 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 tarafından algılanabilir. WGSL gölgelendirici kodunuzun üst kısmındaki requires unrestricted_pointer_parameters; ile taşınabilirlik potansiyelini belirtmek için her zaman bir requires-directive yönergesi 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 referansları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 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] kullanılması, bu dizinin 'i'inci öğ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ği ve issue tint:2113 değerini inceleyin.

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ştiricilerin sürekli olarak hata ayıklamayı beklediği ve istedikleri şey budur. 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 sürümü

Chrome 128

Chrome 127 sürümü

Chrome 126

Chrome 125

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

Chrome 113