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 hassasiyet) biçimindeki 16 bitlik kayan nokta değerleri kümesidir. Bu, geleneksel tek hassasiyetli kayan nokta (f32) için 32 bit yerine kayan noktalı sayıyı temsil etmek üzere 16 bit kullanıldığı anlamına gelir. Bu daha küçük boyut, özellikle büyük miktarlarda veri işlenirken önemli performans iyileştirmelerine yol açabilir.

Karşılaştırma amacıyla, Apple M1 Pro cihazda WebLLM sohbet demosunda kullanılan Llama2 7B modellerinin f16 uygulaması, 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 modellerinin kullanıldığı WebLLM sohbet demolarının ekran görüntüsü.
f32 (solda) ve f16 (sağda) Llama2 7B modelleriyle WebLLM sohbet demoları.

Bazı GPU'lar 16 bit kayan nokta değerlerini desteklemez. "shader-f16" özelliği bir GPUAdapter'ta kullanıma sunulduğunda artık bu özellikli bir GPUDevice isteyebilir ve yarı hassas kayan nokta türü f16'ten yararlanan bir WGSL gölgelendirici modülü oluşturabilirsiniz. Bu tür, WGSL gölgelendirici modülünde yalnızca enable f16; ile f16 WGSL uzantısını etkinleştirdiğinizde kullanılabilir. Aksi takdirde createShaderModule() bir doğrulama hatası oluşturur. Aşağıdaki minimal örneğe ve sayı dawn:1510'a bakın.

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...

WGSL gölgelendirici modülü kodunda, aşağıdaki snippet'te gösterildiği gibi "shader-f16" özellik desteğine bağlı olarak hem f16 hem de f32 türlerini alias ile 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 eklerinde oluşturma ardışık düzeni çı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ını kullanarak en fazla 64 tane istek gönderebilirsiniz. Aşağıdaki örneğe ve sürüm dawn:2036'a bakın.

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şim için kullanılan maxInterStageShaderVariables ve maxInterStageShaderComponents sınırları tüm platformlarda artırıldı. Ayrıntılar için issue dawn:1448 konusuna bakın.

Her gölgelendirici aşaması için, bir ardışık düzende depolama arabellekleri olan maksimum bağlama grubu düzeni girişi sayısı varsayılan olarak 8'dir. Artık maxStorageBuffersPerShaderStage sınırını kullanarak 10'a kadar istek gönderebilirsiniz. issue dawn:2159 konusuna bakın.

Yeni bir maxBindGroupsPlusVertexBuffers sınırı eklendi. En yüksek dizinin altındaki boş slotlar sayılarak aynı anda kullanılan maksimum sayıdaki bağlama grubu ve köşe ucu arabellek slotlarından oluşur. Varsayılan değeri 24'tür. issue dawn:1849 konusuna bakın.

Derinlik gölgesi durumunda yapılan değişiklikler

Geliştirici deneyimini iyileştirmek için artık derinlik rengi durumu depthWriteEnabled ve depthCompare özellikleri her zaman gerekli değildir: depthWriteEnabled yalnızca derinlik içeren biçimler için gereklidir ve depthCompare, hiç kullanılmadığı takdirde derinlik içeren biçimler için gerekli değildir. sorun dawn:2132 konusuna bakın.

Adaptör bilgileri güncellemeleri

Standart olmayan type ve backend adaptör bilgi özellikleri artık kullanıcı chrome://flags/#enable-webgpu-developer-features adresinde "WebGPU Geliştirici Özellikleri" işaretini etkinleştirdiğinde requestAdapterInfo() çağrıldıktan sonra kullanılabilir. type, "ayrı GPU", "entegre GPU", "CPU" veya "bilinmeyen" olabilir. backend, "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" veya "null" olmalıdır. issue dawn:2112 ve issue dawn:2107 konusuna bakın.

Arka uç ve adaptör bilgilerini içeren https://webgpureport.org ekran görüntüsü.
https://webgpureport.org adresinde gösterilen arka uç ve tür bilgileri

requestAdapterInfo() işlevindeki isteğe bağlı unmaskHints liste parametresi kaldırıldı. issue dawn:1427 konusuna bakın.

Zaman damgası sorguları için kesme

Zaman damgası sorguları, uygulamaların GPU komutlarının yürütme 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ı kesikli hale getirmenin çözünürlüğü 100 mikrosaniyeye düşürerek hassasiyet ve güvenlik arasında iyi bir uzlaşma sağladığına inanıyor. issue dawn:1800 konusuna bakın.

Chrome'da kullanıcılar, chrome://flags/#enable-webgpu-developer-features adresinde "WebGPU Geliştirici Özellikleri" flag'ini etkinleştirerek zaman damgası kesme işlemini devre dışı bırakabilir. Bu işaretin tek başına "timestamp-query" özelliğini etkinleştirmediğini unutmayın. Bu özellik henüz deneysel aşamada olduğundan chrome://flags/#enable-unsafe-webgpu adresinde "Güvenli Olmayan WebGPU Desteği" işaretini etkinleştirmeniz gerekir.

Dawn'da "timestamp_quantization" adlı yeni bir cihaz açma/kapatma düğmesi eklendi ve varsayılan olarak etkinleştirildi. Aşağıdaki snippet'te, cihaz isteğinde bulunurken zaman damgası kesme işlemi uygulanmayan deneysel "zaman damgası sorgusu" özelliğine nasıl izin vereceğiniz 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ştiricilere bu özelliğin deneysel olduğunu ve şu anda yalnızca Chromium tabanlı tarayıcılarda kullanılabildiğini açıkça belirtmek için "chromium-experimental-timestamp-query-inside-passes" olarak yeniden adlandırıldı. issue dawn:1193 konusuna bakın.

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