WebGPU'daki (Chrome 120) Yenilikler

François Beaufort
François Beaufort

WGSL'de 16 bit kayan nokta değerleri için destek

WGSL'de f16 türü, IEEE-754 binary16 (yarım duyarlıklı) biçimindeki 16 bitlik kayan nokta değerleri kümesidir. Bu, geleneksel tek duyarlıklı kayan nokta (f32) için 32 bit yerine kayan nokta sayısını temsil etmek için 16 bit kullandığı anlamına gelir. Bu daha küçük boyut, özellikle büyük miktarda veri işlenirken önemli performans iyileştirmeleri sağlayabilir.

Karşılaştırma için, WebLLM sohbet demosunda kullanılan Llama2 7B modellerinin f16 uygulaması, Apple M1 Pro cihazda f32 uygulamasından önemli ölçüde daha hızlıdır. Aşağıdaki ekran görüntülerinde gösterildiği gibi, ön doldurma hızında% 28 ve kod çözme hızında% 41 iyileşme sağlanmıştır.

f32 ve f16 Llama2 7B modelleriyle WebLLM sohbet demolarının ekran görüntüsü.
f32 (sol) ve f16 (sağ) Llama2 7B modelleriyle WebLLM sohbet demoları.

Tüm GPU'lar 16 bit kayan nokta değerlerini desteklemez. "shader-f16" özelliği GPUAdapter içinde kullanılabildiğinde artık bu özellik ile GPUDevice isteğinde bulunabilir ve yarım duyarlıklı kayan nokta türü f16'dan yararlanan bir WGSL gölgelendirici modülü oluşturabilirsiniz. Bu tür, yalnızca enable f16; ile f16 WGSL uzantısını etkinleştirirseniz WGSL gölgelendirici modülünde kullanılabilir. Aksi takdirde, createShaderModule() doğrulama hatası oluşturur. Aşağıdaki en kısa örneği inceleyin ve dawn:1510 sorununu bildirin.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
  throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
  requiredFeatures: ["shader-f16"],
});

const code = `
  enable f16;

  @compute @workgroup_size(1)
  fn main() {
    const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...

Aşağıdaki snippet'te gösterildiği gibi, "shader-f16" özelliği desteğine bağlı olarak alias ile WGSL gölgelendirici modülü kodunda hem f16 hem de f32 türlerini desteklemek mümkündür.

const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");

const device = await adapter.requestDevice({
  requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});

const header = hasShaderF16
  ? `enable f16;
     alias min16float = f16;`
  : `alias min16float = f32;`;

const code = `
  ${header}

  @compute @workgroup_size(1)
  fn main() {
    const c = vec3<min16float>(1.0, 2.0, 3.0);
  }
`;

Sınırları zorlayın

Tüm renk ekleri genelinde, oluşturma işlem hattı çıkış verilerinin bir örneğini (piksel veya alt piksel) tutmak için gereken maksimum bayt sayısı varsayılan olarak 32 bayttır. Artık maxColorAttachmentBytesPerSample sınırı kullanılarak en fazla 64 istekte bulunulabilir. Aşağıdaki örneği inceleyin ve sorunu gönderin:2036.

const adapter = await navigator.gpu.requestAdapter();

if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
  // When the desired limit isn't supported, take action to either fall back to
  // a code path that does not require the higher limit or notify the user that
  // their device does not meet minimum requirements.
}

// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
  requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});

Aşamalar arası iletişimde kullanılan maxInterStageShaderVariables ve maxInterStageShaderComponents sınırları tüm platformlarda artırıldı. Ayrıntılar için issue dawn:1448 başlıklı makaleyi inceleyin.

Her gölgelendirici aşaması için, bir işlem hattı düzenindeki bağlama grubu düzeni girişlerinin maksimum sayısı varsayılan olarak 8'dir. Artık maxStorageBuffersPerShaderStage sınırını kullanarak 10 adede kadar istekte bulunabilirsiniz. dawn:2159 sorununa bakın.

Yeni bir maxBindGroupsPlusVertexBuffers sınırı eklendi. En yüksek dizinin altındaki boş yuvalar da dahil olmak üzere, aynı anda kullanılan maksimum bağlama grubu ve köşe arabelleği yuvası sayısından oluşur. Varsayılan değeri 24'tür. dawn:1849 sorununa bakın.

Derinlik-şablon durumundaki değişiklikler

Geliştirici deneyimini iyileştirmek için derinlik-şablon durumu depthWriteEnabled ve depthCompare özellikleri artık her zaman gerekli değildir: depthWriteEnabled yalnızca derinlik içeren biçimler için gereklidir ve depthCompare hiç kullanılmıyorsa derinlik içeren biçimler için gerekli değildir. issue dawn:2132 başlıklı makaleyi inceleyin.

Adaptör bilgisi güncellemeleri

Kullanıcı chrome://flags/#enable-webgpu-developer-features adresinde "WebGPU Geliştirici Özellikleri" işaretini etkinleştirdiğinde, requestAdapterInfo() çağrıldığında standart olmayan type ve backend bağdaştırıcı bilgisi özellikleri kullanılabilir. type, "discrete GPU", "integrated GPU", "CPU" veya "unknown" olabilir. backend; "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" veya "null" olmalıdır. issue dawn:2112 ve issue dawn:2107 sorunlarını inceleyin.

https://webgpureport.org adresinin, arka ucu ve bağdaştırıcı bilgilerindeki türü gösteren ekran görüntüsü.
Arka uç ve tür bilgileri https://webgpureport.org adresinde gösterilir.

requestAdapterInfo() içindeki isteğe bağlı unmaskHints liste parametresi kaldırıldı. dawn:1427 numaralı sorunu inceleyin.

Zaman damgası sorgularının nicemleme

Zaman damgası sorguları, uygulamaların GPU komutlarının yürütülme süresini nanosaniye hassasiyetinde ölçmesine olanak tanır. Ancak WebGPU spesifikasyonu, zamanlama saldırısı endişeleri nedeniyle zaman damgası sorgularını isteğe bağlı hale getirir. Chrome Ekibi, zaman damgası sorgularını nicelleştirmenin çözünürlüğü 100 mikrosaniyeye düşürerek hassasiyet ve güvenlik arasında iyi bir denge sağladığını düşünüyor. issue dawn:1800 başlıklı makaleyi inceleyin.

Kullanıcılar, Chrome'da chrome://flags/#enable-webgpu-developer-features adresindeki "WebGPU Geliştirici Özellikleri" flag'ini etkinleştirerek zaman damgası nicemlemesini devre dışı bırakabilir. Bu işaretin tek başına "timestamp-query" özelliğini etkinleştirmediğini unutmayın. Bu özellik hâlâ deneysel olarak uygulanmaktadır ve bu nedenle chrome://flags/#enable-unsafe-webgpu adresinde "Unsafe WebGPU Support" (Güvenli Olmayan WebGPU Desteği) işaretinin etkinleştirilmesi gerekir.

Dawn'da "timestamp_quantization" adlı yeni bir cihaz açma/kapatma düğmesi eklendi ve bu düğme varsayılan olarak etkinleştirildi. Aşağıdaki snippet'te, cihaz isteğinde bulunurken deneysel "timestamp-query" özelliğinin zaman damgası nicemlemesi olmadan nasıl etkinleştirileceği gösterilmektedir.

wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};

const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;

const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = &timestampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;

wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};

// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);

Bahar temizliği özellikleri

Deneysel "timestamp-query-inside-passes" özelliği, geliştiricilerin bu özelliğin deneysel olduğunu ve şu anda yalnızca Chromium tabanlı tarayıcılarda kullanılabildiğini anlaması için "chromium-experimental-timestamp-query-inside-passes" olarak yeniden adlandırıldı. dawn:1193 numaralı soruna bakın.

Yalnızca kısmen uygulanan deneysel "pipeline-statistics-query" özelliği, geliştirilmediği için kaldırıldı. issue chromium:1177506 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