پشتیبانی از مقادیر ممیز شناور ۱۶ بیتی در WGSL
در WGSL، نوع f16 مجموعه مقادیر ممیز شناور ۱۶ بیتی با قالب IEEE-754 binary16 (دقت نصف) است. این یعنی از ۱۶ بیت برای نمایش عدد ممیز شناور استفاده میکند، درحالیکه برای عدد ممیز شناور تکدقت معمولی از ۳۲ بیت استفاده میشود (f32). این اندازه کوچکتر میتواند منجر به بهبود قابلتوجه عملکرد شود، بهویژه هنگام پردازش مقادیر زیادی داده.
برای مقایسه، در دستگاه Apple M1 Pro، پیادهسازی f16 مدلهای Llama2 7B که در نمونه نمایشی گپ WebLLM استفاده میشود بهطور قابلتوجهی سریعتر از پیادهسازی f32 است، بهطوریکه سرعت پیشتکمیل ۲۸٪ و سرعت رمزگشایی ۴۱٪ بهبود یافته است، همانطور که در نماگرفتهای زیر نشان داده شده است.
f32 (راست) و f16 (چپ) Llama2 7B.همه واحدهای GPU از مقادیر ممیز شناور ۱۶ بیتی پشتیبانی نمیکنند. وقتی ویژگی "shader-f16" در GPUAdapter دردسترس باشد، اکنون میتوانید GPUDevice را با این ویژگی درخواست کنید و واحد سایهزن WGSL بسازید که از نوع ممیز شناور با دقت نصف f16 استفاده میکند. این نوع فقط درصورتی در واحد سایهزن WGSL معتبر است که افزونه f16 WGSL را با enable f16; فعال کنید. درغیراینصورت، createShaderModule() خطای اعتبارسنجی تولید خواهد کرد. مثال حداقلی زیر و issue 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...
بااستفاده از alias بسته به پشتیبانی ویژگی "shader-f16"، میتوان از هر دو نوع f16 و f32 در کد واحد سایهزن WGSL پشتیبانی کرد، همانطور که در تکهکد زیر نشان داده شده است.
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);
}
`;
محدودیتها را کنار بزنید
حداکثر تعداد بایتهای لازم برای نگهداری یک نمونه (پیکسل یا زیرپیکسل) از دادههای برونداد خط لوله پردازش، در سراسر پیوستهای رنگ، بهطور پیشفرض ۳۲ بایت است. اکنون بااستفاده از حد maxColorAttachmentBytesPerSample میتوانید حداکثر ۶۴ درخواست کنید. به مثال زیر و issue 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 که برای ارتباط بین مراحل استفاده میشود در همه پلاتفرمها افزایش یافته است. برای جزئیات، issue dawn:1448 را ببینید.
برای هر مرحله سایهزن، حداکثر تعداد ورودیهای طرحبندی گروه پیوند در سراسر طرحبندی خط لوله که بافرهای ذخیرهسازی هستند بهطور پیشفرض ۸ است. اکنون بااستفاده از حد maxStorageBuffersPerShaderStage میتوانید حداکثر ۱۰ درخواست کنید. issue dawn:2159 را ببینید.
محدودیت جدید maxBindGroupsPlusVertexBuffers اضافه شده است. این مقدار شامل حداکثر تعداد جایگاههای گروه پیوند و بافر رأس است که بهطور همزمان استفاده میشوند و جایگاههای خالی زیر بالاترین شاخص را نیز دربرمیگیرد. مقدار پیشفرض آن ۲۴ است. طلوع مشکل:۱۸۴۹ را ببینید.
تغییرات در وضعیت عمق-استنسیل
برای بهبود تجربه توسعهدهنده، وضعیت عمق-استنسیل depthWriteEnabled و depthCompare دیگر همیشه الزامی نیستند: depthWriteEnabled فقط برای قالبهای دارای عمق الزامی است، و depthCompare برای قالبهای دارای عمق درصورتیکه اصلاً استفاده نشود الزامی نیست. issue dawn:2132 را ببینید.
بهروزرسانیهای اطلاعات آداپتور
مشخصههای اطلاعات آداپتور غیراستاندارد type و backend اکنون با فراخوانی requestAdapterInfo() دردسترس است، مشروط بر اینکه کاربر پرچم ویژگیهای توسعهدهنده WebGPU را در chrome://flags/#enable-webgpu-developer-features فعال کرده باشد. type میتواند «واحد پردازش گرافیکی مجزا»، «واحد پردازش گرافیکی یکپارچه»، «واحد پردازش مرکزی»، یا «ناشناخته» باشد. backend میتواند «WebGPU»، «D3D11»، «D3D12»، «metal»، «vulkan»، «openGL»، «openGLES»، یا «null» باشد. issue dawn:2112 و issue dawn:2107 را ببینید.
پارامتر فهرست اختیاری unmaskHints در requestAdapterInfo() برداشته شده است. issue dawn:1427 را ببینید.
کوانتیزاسیون پُرسمانهای مُهر زمان
پُرسمانهای مُهر زمان به برنامهها امکان میدهد زمان اجرای دستورات GPU را با دقت نانوثانیه اندازهگیری کنند. بااینحال، مشخصات WebGPU بهدلیل نگرانیهای مربوط به حمله زمانبندی، پرسشهای مُهر زمان را اختیاری میکند. تیم Chrome معتقد است که با کاهش دقت به ۱۰۰ میکروثانیه، کوانتیزه کردن پُرسمانهای مُهر زمان توازنی خوب بین دقت و امنیت ایجاد میکند. issue dawn:1800 را ببینید.
در Chrome، کاربران میتوانند با فعال کردن پرچم «ویژگیهای توسعهدهنده WebGPU» در chrome://flags/#enable-webgpu-developer-features، کمیتسازی مُهر زمان را غیرفعال کنند. توجه داشته باشید که این پرچم بهتنهایی ویژگی "timestamp-query" را فعال نمیکند. پیادهسازی آن هنوز آزمایشی است و بنابراین به پرچم «پشتیبانی ناامن از WebGPU» در chrome://flags/#enable-unsafe-webgpu نیاز دارد.
در Dawn، یک کلید تغییر وضعیت دستگاه جدید بهنام «timestamp_quantization» اضافه شده است و بهطور پیشفرض فعال است. تکه کد زیر نحوه مجاز کردن ویژگی آزمایشی «پرسش براساس مُهر زمان» را بدون کمّیسازی مُهر زمان هنگام درخواست دستگاه نشان میدهد.
wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};
const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;
const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = ×tampQuantizationToggle;
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 دردسترس است. issue dawn:1193 را ببینید.
ویژگی آزمایشی «pipeline-statistics-query» که فقط بهصورت جزئی پیادهسازی شده بود برداشته شده است زیرا دیگر توسعه داده نمیشود. issue chromium:1177506 را ببینید.
این فقط برخیاز نکات برجسته کلیدی را پوشش میدهد. فهرست کامل تعهدات را بررسی کنید.
ویژگیهای جدید WebGPU
فهرستی از همه مواردی که در مجموعه ویژگیهای جدید WebGPU پوشش داده شده است.
۱۵۵-۱۵۶ Chrome
- افزونه WGSL fragment_depth
- فشردهسازی بافت ناهمتراز
- فضاهای رنگی srgb-linear و display-p3-linear
- قالب رأس snorm10-10-10-2 اضافی
- پشتیبانی f16 در NVIDIA با Vulkan
- بهروزرسانیهای سپیدهدم
۱۵۳-۱۵۴ Chrome
- افزونه WGSL buffer_view
- افزونه WGSL swizzle_assignment
- بهروزرسانیهای افزونه WGSL
- بهروزرسانیهای سپیدهدم
Chrome 151-152
۱۴۹-۱۵۰ Chrome
۱۴۷-۱۴۸ Chrome
۱۴۶ Chrome
- پشتیبانی از حالت سازگاری WebGPU در OpenGL ES 3.1
- پیوستهای گذرا
- افزونه WGSL texture_and_sampler_let
- بهروزرسانیهای سپیدهدم
Chrome 145
۱۴۴ Chrome
- افزونه WGSL subgroup_id
- افزونه WGSL uniform_buffer_standard_layout
- WebGPU در Linux
- writeBuffer و writeTexture سریعتر
- بهروزرسانیهای سپیدهدم
۱۴۳ Chrome
- ترکیب کردن عنصر بافت
- برداشتن استفاده از بافت ذخیرهسازی فقطخواندنی bgra8unorm
- بهروزرسانیهای سپیدهدم
۱۴۲ Chrome
Chrome 141
- «رنگآمیزی فروسرخ» تکمیل شد
- تجزیهوتحلیل محدوده عدد صحیح در کامپایلر WGSL
- بهروزرسانی SPIR-V 1.4 برای زیرینه Vulkan
- بهروزرسانیهای سپیدهدم
۱۴۰ Chrome
- درخواستهای دستگاه آداپتور را مصرف میکند
- کوتهنویسی برای استفاده از بافت در جایی که نمای بافت استفاده میشود
- WGSL textureSampleLevel از بافتهای یکبعدی پشتیبانی میکند
- منسوخ کردن استفاده از بافت فضای ذخیرهسازی فقط خواندنی bgra8unorm
- برداشتن مشخصه GPUAdapter isFallbackAdapter
- بهروزرسانیهای سپیدهدم
Chrome 139
- پشتیبانی از بافت سهبعدی برای قالبهای فشرده BC و ASTC
- ویژگی جدید «ویژگیهای اصلی و محدودیتها»
- آزمایش اصلی برای حالت سازگاری WebGPU
- بهروزرسانیهای سپیدهدم
Chrome 138
- کوتهنویسی برای استفاده از بافر بهعنوان منبع اتصال
- تغییرات الزامات اندازه برای میانههای نگاشتشده در زمان ایجاد
- گزارش معماری برای واحدهای پردازش گرافیکی اخیر
- منسوخ کردن مشخصه GPUAdapter isFallbackAdapter
- بهروزرسانیهای سپیدهدم
Chrome 137
- استفاده از نمای بافت برای پیوند externalTexture
- کپی کردن میانگیرها بدون مشخص کردن اندازه و جبران
- WGSL workgroupUniformLoad بااستفاده از اشارهگر به اتمی
- مشخصه GPUAdapterInfo powerPreference
- برداشتن مشخصه compatibilityMode در GPURequestAdapterOptions
- بهروزرسانیهای سپیدهدم
Chrome 136
- مشخصه GPUAdapterInfo isFallbackAdapter
- بهبود زمان گردآوری سایهزن در D3D12
- ذخیره و کپی کردن تصاویر بوم
- محدودیتهای حالت سازگاری بهینهگر
- بهروزرسانیهای سپیدهدم
۱۳۵ Chrome
- اجازه دادن به ایجاد چیدمان خط لوله با چیدمان گروه پیوند تهی
- اجازه دادن به درگاههای نمایش برای گسترش فراتر از محدودههای هدفهای پردازشی
- دسترسی آسانتر به حالت سازگاری آزمایشی در Android
- برداشتن محدودیت maxInterStageShaderComponents
- بهروزرسانیهای سپیدهدم
۱۳۴ Chrome
- بهبود دادن حجم کار یادگیری ماشین با زیرگروهها
- برداشتن پشتیبانی از انواع بافت فیلترپذیر شناور بهعنوان ترکیبشدنی
- بهروزرسانیهای سپیدهدم
Chrome 133
- قالبهای رأس تکمؤلفه و unorm8x4-bgra اضافی
- اجازه دادن به درخواست محدودیتهای ناشناخته با مقدار تعریفنشده
- تغییرات قوانین تراز WGSL
- بهبود عملکرد WGSL با کنار گذاشتن
- استفاده از displaySize در VideoFrame برای بافتهای خارجی
- مدیریت تصاویر با جهتگیریهای غیرپیشفرض بااستفاده از copyExternalImageToTexture
- بهبود تجربه توسعهدهنده
- فعال کردن حالت سازگاری با featureLevel
- پاکسازی ویژگیهای زیرگروه آزمایشی
- منسوخ کردن محدودیت maxInterStageShaderComponents
- بهروزرسانیهای سپیدهدم
۱۳۲ Chrome
- استفاده از نمای بافت
- ترکیب بافتهای شناور ۳۲ بیتی
- مشخصه GPUDevice adapterInfo
- پیکربندی بافت بوم با قالب نامعتبر باعث خطای جاوا اسکریپت میشود
- محدودیتهای فیلتر کردن نمونهبرداری روی بافتها
- آزمایش زیرگروههای گسترده
- بهبود تجربه توسعهدهنده
- پشتیبانی آزمایشی از قالبهای بافت نرمالسازیشده ۱۶ بیتی
- بهروزرسانیهای سپیدهدم
۱۳۱ Chrome
- فاصلههای کلیپ در WGSL
- GPUCanvasContext getConfiguration()
- نقطه و خطهای اولیه نباید انحراف عمق داشته باشند
- عملکردهای داخلی اسکن فراگیر برای زیرگروهها
- پشتیبانی آزمایشی برای چندقرعه غیرمستقیم
- گزینه کامپایل واحد سایهزن ریاضیات دقیق
- برداشتن GPUAdapter requestAdapterInfo()
- بهروزرسانیهای سپیدهدم
Chrome 130
- ترکیب منبع دوگانه
- بهبود زمان گردآوری سایهزن در Metal
- منسوخ شدن GPUAdapter requestAdapterInfo()
- بهروزرسانیهای سپیدهدم
Chrome 129
Chrome 128
- آزمایش با زیرگروهها
- منسوخ کردن تنظیم انحراف عمق برای خطوط و نقاط
- پنهان کردن هشدار DevTools خطای ثبتنشده درصورت preventDefault
- ابتدا نمونهبرداری درونیابی WGSL و سپس
- بهروزرسانیهای سپیدهدم
Chrome 127
- پشتیبانی آزمایشی از OpenGL ES در Android
- مشخصه اطلاعات GPUAdapter
- بهبودهای قابلیت تعامل WebAssembly
- خطاهای بهبودیافته کدبند فرمان
- بهروزرسانیهای سپیدهدم
Chrome 126
- افزایش حد maxTextureArrayLayers
- بهینهسازی بارگذاری بافر برای زیرینه Vulkan
- بهبود زمان گردآوری سایهزن
- بافرهای فرمان ارسالی باید منحصربهفرد باشند
- بهروزرسانیهای سپیدهدم
Chrome 125
Chrome 124
- بافتهای فضای ذخیرهسازی فقط خواندنی و خواندنی-نوشتنی
- پشتیبانی از عاملان خدماتی و عاملان همرسانیشده
- مشخصههای اطلاعات آداپتور جدید
- رفع اشکالها
- بهروزرسانیهای سپیدهدم
Chrome 123
- پشتیبانی از توابع داخلی DP4a در WGSL
- پارامترهای اشارهگر نامحدود در WGSL
- شکر نحوی برای ارجاعزدایی ترکیبات در WGSL
- وضعیت فقط خواندنی جداگانه برای جنبههای ژرفانمایی و عمق
- بهروزرسانیهای سپیدهدم
Chrome 122
- گسترش دسترسی با حالت سازگاری (ویژگی درحال توسعه)
- افزایش حد maxVertexAttributes
- بهروزرسانیهای سپیدهدم
Chrome 121
- پشتیبانی از WebGPU در Android
- استفاده از DXC بهجای FXC برای ترجمه سایهزن در Windows
- پرسشهای مُهر زمان در گذرگاههای محاسباتی و رندر
- نقاط ورودی پیشفرض به واحدهای سایهزن
- پشتیبانی از display-p3 بهعنوان فضای رنگ GPUExternalTexture
- اطلاعات پشتههای حافظه
- بهروزرسانیهای سپیدهدم
Chrome 120
- پشتیبانی از مقادیر ممیز شناور ۱۶ بیتی در WGSL
- محدودیتها را کنار بزنید
- تغییرات در وضعیت عمق-استنسیل
- بهروزرسانیهای اطلاعات آداپتور
- کمّیسازی پُرسمانهای مُهر زمان
- ویژگیهای نظافت بهاره
Chrome 119
- بافتهای شناور ۳۲ بیتی فیلترپذیر
- قالب رأس unorm10-10-10-2
- قالب بافت rgb10a2uint
- بهروزرسانیهای سپیدهدم
Chrome 118
- پشتیبانی از HTMLImageElement و ImageData در
copyExternalImageToTexture() - پشتیبانی آزمایشی از بافت فضای ذخیرهسازی خواندن-نوشتن و فقط خواندنی
- بهروزرسانیهای سپیدهدم
Chrome 117
- لغو تنظیم بافر رأس
- لغو تنظیم گروه پیوند
- بیصدا کردن خطاهای ایجاد خط لوله ناهمزمان هنگام گم شدن دستگاه
- بهروزرسانیهای ایجاد واحد سایهزن SPIR-V
- بهبود تجربه توسعهدهنده
- ذخیره کردن خطوط لوله با چیدمان تولیدشده خودکار
- بهروزرسانیهای سپیدهدم
Chrome 116
- یکپارچهسازی WebCodecs
- دستگاه ازدسترفته توسط GPUAdapter
requestDevice()برگردانده شد - اگر با
importExternalTexture()تماس گرفته شد، بازپخش ویدیو روان باشد - مطابقت با مشخصات
- بهبود تجربه توسعهدهنده
- بهروزرسانیهای سپیدهدم
Chrome 115
- افزونههای زبان WGSL پشتیبانیشده
- پشتیبانی آزمایشی از Direct3D 11
- در حالت اتصال به برق متناوب، بهطور پیشفرض از واحد پردازش گرافیکی مجزا استفاده کنید
- بهبود تجربه توسعهدهنده
- بهروزرسانیهای سپیدهدم
Chrome 114
- بهینهسازی جاوا اسکریپت
- getCurrentTexture() در بوم پیکربندینشده InvalidStateError را پرتاب میکند
- بهروزرسانیهای WGSL
- بهروزرسانیهای سپیدهدم