پشتیبانی از مقادیر ممیز شناور 16 بیتی در WGSL
در WGSL، نوع f16
مجموعه ای از مقادیر ممیز شناور 16 بیتی از فرمت IEEE-754 باینری16 (نیمه دقت) است. این بدان معناست که از 16 بیت برای نمایش یک عدد ممیز شناور استفاده می کند، در مقابل 32 بیت برای ممیز شناور تک دقیق معمولی ( f32
). این اندازه کوچکتر می تواند منجر به بهبود عملکرد قابل توجهی شود، به خصوص هنگام پردازش مقادیر زیادی داده.
برای مقایسه، در دستگاه Apple M1 Pro، پیادهسازی f16
مدلهای Llama2 7B مورد استفاده در نسخه آزمایشی چت WebLLM به طور قابلتوجهی سریعتر از پیادهسازی f32
است، با بهبود 28 درصدی در سرعت پر کردن اولیه و 41 درصد بهبود در سرعت رمزگشایی همانطور که در نشان داده شده است. اسکرین شات های زیر
همه 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 را ببینید.
پارامتر فهرست اختیاری 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 = ×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 در دسترس است. . رجوع به سپیده دم: 1193 شود .
ویژگی آزمایشی "pipeline-statistics-query" که فقط تا حدی اجرا شده بود، حذف شده است زیرا دیگر در حال توسعه نیست. به شماره chromium:1177506 مراجعه کنید.
این تنها برخی از نکات کلیدی را پوشش می دهد. فهرست جامع تعهدات را بررسی کنید.
چه چیزی در WebGPU جدید است
فهرستی از همه چیزهایی که در سری What's New in WebGPU پوشش داده شده است.
کروم 131
- فاصله های کلیپ در WGSL
- GPUCanvasContext getConfiguration()
- نقطه و خط اولیه نباید بایاس عمق داشته باشند
- توابع داخلی اسکن جامع برای زیرگروه ها
- پشتیبانی آزمایشی برای چند قرعه کشی غیر مستقیم
- گزینه کامپایل ماژول Shader ریاضی سخت
- حذف GPUAdapter requestAdapterInfo()
- به روز رسانی سحر
کروم 130
- ترکیب منبع دوگانه
- بهبود زمان کامپایل شیدر در فلز
- منسوخ شدن GPUAdapter requestAdapterInfo()
- به روز رسانی سحر
کروم 129
کروم 128
- آزمایش با زیر گروه ها
- بایاس عمق تنظیم را برای خطوط و نقاط منسوخ کنید
- در صورت جلوگیری از Default، هشدار DevTools خطای ضبط نشده را مخفی کنید
- WGSL ابتدا نمونهگیری را درونیابی میکند و هر کدام را
- به روز رسانی سحر
کروم 127
- پشتیبانی آزمایشی از OpenGL ES در اندروید
- ویژگی اطلاعات GPUAdapter
- بهبودهای WebAssembly interop
- خطاهای رمزگذار فرمان بهبود یافته است
- به روز رسانی سحر
کروم 126
- حد maxTextureArrayLayers را افزایش دهید
- بهینه سازی بارگذاری بافر برای باطن Vulkan
- بهبود زمان کامپایل شیدر
- بافرهای فرمان ارسالی باید منحصر به فرد باشند
- به روز رسانی سحر
کروم 125
کروم 124
- بافت های ذخیره سازی فقط خواندنی و خواندنی و نوشتنی
- پشتیبانی کارگران خدماتی و کارگران مشترک
- ویژگی های اطلاعات آداپتور جدید
- رفع اشکال
- به روز رسانی سحر
کروم 123
- توابع داخلی DP4a در WGSL پشتیبانی می کند
- پارامترهای اشاره گر نامحدود در WGSL
- قند نحوی برای عدم ارجاع کامپوزیت ها در WGSL
- حالت فقط خواندنی را برای جنبه های استنسیل و عمق جدا کنید
- به روز رسانی سحر
کروم 122
- گسترش دسترسی با حالت سازگاری (ویژگی در حال توسعه)
- حد maxVertexAttributes را افزایش دهید
- به روز رسانی سحر
کروم 121
- پشتیبانی از WebGPU در اندروید
- برای کامپایل شیدر در ویندوز به جای FXC از DXC استفاده کنید
- پرس و جوهای مهر زمانی در گذرنامه های محاسبه و ارائه
- نقاط ورودی پیش فرض به ماژول های سایه زن
- پشتیبانی از display-p3 به عنوان فضای رنگی GPUExternalTexture
- اطلاعات انبوه حافظه
- به روز رسانی سحر
کروم 120
- پشتیبانی از مقادیر ممیز شناور 16 بیتی در WGSL
- محدودیت ها را فشار دهید
- تغییرات در حالت عمقی-استنسیل
- به روز رسانی اطلاعات آداپتور
- کوانتیزاسیون پرس و جوهای مهر زمانی
- ویژگی های تمیز کردن فنری
کروم 119
کروم 118
- پشتیبانی از HTMLImageElement و ImageData در
copyExternalImageToTexture()
- پشتیبانی آزمایشی از بافت ذخیرهسازی خواندنی-نوشتنی و فقط خواندنی
- به روز رسانی سحر
کروم 117
- بافر راس را تنظیم نکنید
- گروه bind را تنظیم نکنید
- هنگام گم شدن دستگاه، خطاهای ایجاد خط لوله ناهمگام را خاموش کنید
- به روز رسانی های ایجاد ماژول سایه زن SPIR-V
- بهبود تجربه توسعه دهندگان
- ذخیره سازی خطوط لوله با طرح تولید خودکار
- به روز رسانی سحر
کروم 116
- یکپارچه سازی WebCodecs
- دستگاه گمشده توسط GPUAdapter
requestDevice()
برگردانده شد - در صورت فراخوانی
importExternalTexture()
پخش ویدیو را روان نگه دارید - مطابقت با مشخصات
- بهبود تجربه توسعه دهندگان
- به روز رسانی سحر
کروم 115
- پشتیبانی از پسوندهای زبان WGSL
- پشتیبانی آزمایشی از Direct3D 11
- GPU گسسته را به طور پیشفرض با برق AC دریافت کنید
- بهبود تجربه توسعه دهندگان
- به روز رسانی سحر
کروم 114
- بهینه سازی جاوا اسکریپت
- getCurrentTexture() روی بوم پیکربندی نشده خطای InvalidState را ایجاد می کند
- به روز رسانی WGSL
- به روز رسانی سحر