موارد جدید در WebGPU (Chrome 120)

فرانسوا بوفور
François Beaufort

پشتیبانی از مقادیر ممیز شناور 16 بیتی در WGSL

در WGSL، نوع f16 مجموعه ای از مقادیر ممیز شناور 16 بیتی از فرمت IEEE-754 باینری16 (نیمه دقت) است. این بدان معناست که از 16 بیت برای نمایش یک عدد ممیز شناور استفاده می کند، در مقابل 32 بیت برای ممیز شناور تک دقیق معمولی ( f32 ). این اندازه کوچکتر می تواند منجر به بهبود عملکرد قابل توجهی شود، به خصوص هنگام پردازش مقادیر زیادی داده.

برای مقایسه، در دستگاه Apple M1 Pro، پیاده‌سازی f16 مدل‌های Llama2 7B مورد استفاده در نسخه آزمایشی چت WebLLM به طور قابل‌توجهی سریع‌تر از پیاده‌سازی f32 است، با بهبود 28 درصدی در سرعت پر کردن اولیه و 41 درصد بهبود در سرعت رمزگشایی همانطور که در نشان داده شده است. اسکرین شات های زیر

اسکرین شات دموی چت WebLLM با مدل های f32 و f16 Llama2 7B.
دموهای چت WebLLM با مدل های f32 (چپ) و f16 (راست) Llama2 7B.

همه GPU ها از مقادیر ممیز شناور 16 بیتی پشتیبانی نمی کنند. هنگامی که ویژگی "shader-f16" در یک GPUAdapter در دسترس است، اکنون می توانید یک GPUDevice با این ویژگی درخواست کنید و یک ماژول سایه زن WGSL ایجاد کنید که از مزایای نیمه دقیق نوع ممیز شناور f16 بهره می برد. این نوع فقط برای استفاده در ماژول سایه زن WGSL معتبر است که پسوند f16 WGSL را با enable f16; . در غیر این صورت، ()createShaderModule یک خطای اعتبار سنجی ایجاد می کند. نمونه حداقلی و شماره dawn زیر را ببینید:1510 .

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

این امکان وجود دارد که از هر دو نوع f16 و f32 در کد ماژول سایه زن WGSL با alias بسته به پشتیبانی از ویژگی "shader-f16" همانطور که در قطعه زیر نشان داده شده است، پشتیبانی کنید.

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);
  }
`;

محدودیت ها را فشار دهید

حداکثر تعداد بایت‌های لازم برای نگهداری یک نمونه (پیکسل یا زیرپیکسل) از داده‌های خروجی خط لوله رندر، در همه پیوست‌های رنگی، به طور پیش‌فرض 32 بایت است. اکنون می توان با استفاده از محدودیت maxColorAttachmentBytesPerSample تا 64 درخواست داد. مثال زیر و شماره dawn: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 },
});

محدودیت‌های maxInterStageShaderVariables و maxInterStageShaderComponents که برای ارتباطات بین مرحله‌ای استفاده می‌شوند در همه پلتفرم‌ها افزایش یافته‌اند. برای جزئیات به شماره داون: 1448 مراجعه کنید.

برای هر مرحله سایه‌زن، حداکثر تعداد ورودی‌های طرح‌بندی گروه bind در طرح‌بندی خط لوله که بافرهای ذخیره‌سازی هستند، به طور پیش‌فرض 8 است. اکنون می توان با استفاده از محدودیت maxStorageBuffersPerShaderStage تا 10 درخواست داد. به شماره سپیده دم: 2159 مراجعه کنید.

یک محدودیت جدید maxBindGroupsPlusVertexBuffers اضافه شده است. این شامل حداکثر تعداد اسلات بافر گروه bind و راس است که به طور همزمان استفاده می شوند و هر شکاف خالی را زیر بالاترین شاخص شمارش می کند. مقدار پیش فرض آن 24 است. شماره dawn:1849 را ببینید.

تغییرات در حالت عمقی-استنسیل

برای بهبود تجربه توسعه‌دهنده، ویژگی‌های depth-stencil state depthWriteEnabled و depthCompare همیشه دیگر مورد نیاز نیستند: depthWriteEnabled فقط برای قالب‌های دارای عمق مورد نیاز است، و depthCompare برای قالب‌های دارای عمق اگر اصلاً استفاده نمی‌شود لازم نیست. رجوع به شماره سپیده دم: 2132 شود .

به روز رسانی اطلاعات آداپتور

وقتی کاربر پرچم «ویژگی‌های توسعه‌دهنده WebGPU» را در chrome://flags/#enable-webgpu-developer-features فعال کرده باشد، ویژگی‌های اطلاعات آداپتور type غیر استاندارد و backend اکنون با فراخوانی requestAdapterInfo() در دسترس هستند. type آن می تواند "GPU گسسته"، "GPU یکپارچه"، "CPU" یا "ناشناخته" باشد. backend یا "WebGPU"، "D3D11"، "D3D12"، "metal"، "vulkan"، "openGL"، "openGLES" یا "null" است. شماره dawn:2112 و issue dawn:2107 را ببینید.

اسکرین شات https://webgpureport.org حاوی اطلاعات باطنی و تایپ کردن اطلاعات آداپتور.
پشتیبان اطلاعات آداپتور و نوع آن در https://webgpureport.org نشان داده شده است.

پارامتر فهرست اختیاری unmaskHints در requestAdapterInfo() حذف شده است. رجوع به شماره فجر: 1427 شود .

کوانتیزاسیون پرس و جوهای مهر زمانی

پرس و جوهای مهر زمان به برنامه ها اجازه می دهد تا زمان اجرای دستورات GPU را با دقت نانوثانیه اندازه گیری کنند. با این حال، مشخصات WebGPU به دلیل نگرانی‌های مربوط به حمله زمان‌بندی، درخواست‌های مربوط به مهر زمانی را اختیاری می‌کند. تیم کروم معتقد است که کوانتیزه کردن پرس و جوهای مهر زمانی با کاهش وضوح به 100 میکروثانیه، سازش خوبی بین دقت و امنیت ایجاد می کند. شماره سپیده دم: 1800 را ببینید.

در Chrome، کاربران می‌توانند با فعال کردن پرچم «ویژگی‌های توسعه‌دهنده WebGPU» در chrome://flags/#enable-webgpu-developer-features کمی‌سازی مهر زمانی را غیرفعال کنند. توجه داشته باشید که این پرچم به تنهایی ویژگی "timestamp-query" فعال نمی کند. اجرای آن هنوز آزمایشی است و بنابراین به پرچم «پشتیبانی ناامن WebGPU» در chrome://flags/#enable-unsafe-webgpu نیاز دارد.

در Dawn، یک ضامن دستگاه جدید به نام "timestamp_quantization" اضافه شده است و به طور پیش فرض فعال است. قطعه زیر به شما نشان می دهد که چگونه هنگام درخواست یک دستگاه، به ویژگی آزمایشی "timestamp-query" بدون تعیین مقدار زمان مهر اجازه دهید.

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);

ویژگی های تمیز کردن فنری

ویژگی آزمایشی "timestamp-query-inside-passes" به "chromium-experimental-timestamp-query-inside-passes" تغییر نام داده است تا برای توسعه دهندگان مشخص شود که این ویژگی آزمایشی است و در حال حاضر فقط در مرورگرهای مبتنی بر Chromium در دسترس است. . رجوع به سپیده دم: 1193 شود .

ویژگی آزمایشی "pipeline-statistics-query" که فقط تا حدی اجرا شده بود، حذف شده است زیرا دیگر در حال توسعه نیست. به شماره chromium:1177506 مراجعه کنید.

این تنها برخی از نکات کلیدی را پوشش می دهد. فهرست جامع تعهدات را بررسی کنید.

چه چیزی در WebGPU جدید است

فهرستی از همه چیزهایی که در سری What's New in WebGPU پوشش داده شده است.

کروم 125

کروم 124

کروم 123

کروم 122

کروم 121

کروم 120

کروم 119

کروم 118

کروم 117

کروم 116

کروم 115

کروم 114

کروم 113