תמיכה בערכי נקודה צפה (floating-point) של 16 ביט ב-WGSL
ב-WGSL, סוג f16
הוא קבוצה של ערכי נקודה צפה (floating-point) של 16 ביט בפורמט IEEE-754 בינארי16 (חצי דיוק). כלומר, היא משתמשת ב-16 ביטים כדי לייצג מספר נקודה צפה (floating-point), בניגוד ל-32 ביטים בנקודה צפה (floating-point) קונבנציונלי חד-פעמי (f32
). שימוש בגודל קטן יותר יכול להוביל לשיפורים משמעותיים בביצועים, במיוחד כשמעבדים כמויות גדולות של נתונים.
לעומת זאת, במכשיר Apple M1 Pro, ההטמעה של f16
של מודלים של Llama2 7B שנעשה בהם שימוש בהדגמה של WebLLM מהירה יותר באופן משמעותי מההטמעה של f32
. המהירות הזו השתפרה ב-28% מבחינת מהירות הפענוח ויש שיפור של 41% במהירות הפענוח, כפי שמוצג בצילומי המסך הבאים.
![צילום מסך של הדגמות בצ'אט ב-WebLLM עם מודלים f32 ו-f16 Llama2 7B.](https://developer.chrome.com/static/blog/new-in-webgpu-120/image/webllm-chat-demos.png?authuser=9&hl=he)
f32
(משמאל) ו-f16
(ימין) של Llama2 7B.לא כל יחידות ה-GPU תומכות בערכי נקודה צפה (floating-point) של 16 ביט. כשהתכונה "shader-f16"
זמינה ב-GPUAdapter
, עכשיו אפשר לבקש GPUDevice
עם התכונה הזו וליצור מודול של תוכנת ההצללה (shader) WGSL שמנצל את סוג הנקודה הצפה חצי דיוק f16
. הסוג הזה תקף לשימוש במודול תוכנת ההצללה של WGSL רק אם מפעילים את תוסף WGSL f16
עם 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
בקוד המודול של תוכנת ההצללה (shader) 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 בייטים. עכשיו אפשר לבקש עד 64 תווים באמצעות המגבלה של maxColorAttachmentBytesPerSample
. אפשר לראות את הדוגמה הבאה ואת הבעיה 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
שמשמשות לתקשורת בין שלבים הוגדלו בכל הפלטפורמות. לפרטים נוספים, ראו גיליון dawn:1448.
בכל שלב של תוכנת ההצללה, המספר המקסימלי של רשומות בפריסת קבוצת קישורים בפריסת צינור עיבוד נתונים, שהוא מאגרי אחסון זמני, הוא 8 כברירת מחדל. עכשיו אפשר לבקש עד 10 בקשות תוך שימוש במגבלה של maxStorageBuffersPerShaderStage
. ראו גיליון dawn:2159.
נוספה מגבלה חדשה על maxBindGroupsPlusVertexBuffers
. הוא מורכב מהמספר המקסימלי של חריצים למאגר נתונים וקודקודים שבהם משתמשים בו-זמנית, תוך ספירה של כל המשבצות הריקות מתחת לאינדקס הגבוה ביותר. ערך ברירת המחדל שלו הוא 24. ראו גיליון dawn:1849.
שינויים במצב העומק של שבלונה
כדי לשפר את חוויית המפתח, אין יותר צורך במאפיינים של מצב העומק depthWriteEnabled
ו-depthCompare
: המאפיין depthWriteEnabled
נדרש רק לפורמטים עם עומק, ולא נדרש יותר depthCompare
לפורמטים עם עומק אם לא משתמשים בהם בכלל. ראו גיליון dawn:2132.
עדכונים למידע על המתאם
מאפיינים של פרטי מתאמים type
ו-backend
לא סטנדרטיים זמינים עכשיו בעת קריאה ל-requestAdapterInfo() לאחר שהמשתמש מפעיל את "תכונות למפתחים של WebGPU" סימון ב-chrome://flags/#enable-webgpu-developer-features
. הערך של type
יכול להיות 'GPU נפרד', 'GPU משולב', 'מעבד' או 'לא ידוע'. הערך של backend
הוא "WebGPU" , "D3D11", "D3D12", "Metaal", "vulkan", "openGL", "openGLES" או "null". אפשר לעיין במהדורה dawn:2112 ובגיליון dawn:2107.
![צילום מסך של https://webgpureport.org שכולל את הקצה העורפי ומזינים את פרטי המתאם.](https://developer.chrome.com/static/blog/new-in-webgpu-120/image/webgpureport.png?authuser=9&hl=he)
הפרמטר האופציונלי הרשימה unmaskHints
ב-requestAdapterInfo() הוסר. ראו גיליון dawn:1427.
כימות חותמות זמן של שאילתות
שאילתות חותמת זמן מאפשרות לאפליקציות למדוד את זמן הביצוע של פקודות GPU ברמת דיוק של ננו-שנייה. עם זאת, במפרט של WebGPU שאילתות חותמת זמן לא אופציונליות עקב בעיות של התקפת תזמון. צוות Chrome מאמין שכימות חותמות זמן של שאילתות מספקים התאמה טובה בין דיוק לאבטחה, על ידי הפחתת הרזולוציה ל-100 מיקרו-שניות. ראו גיליון dawn:1800.
ב-Chrome, משתמשים יכולים להשבית את הכיול של חותמות הזמן על ידי הפעלת התכונה WebGPU Developer Features (תכונות למפתחים של WebGPU) flag ב-chrome://flags/#enable-webgpu-developer-features
. לתשומת ליבכם: הדגל הזה לבדו לא מפעיל את התכונה "timestamp-query"
. ההטמעה שלה עדיין ניסיונית ולכן נדרשת 'תמיכה לא בטוחה ב-WebGPU' בסימון chrome://flags/#enable-unsafe-webgpu
.
בשעת הזריחה, מופיע מתג חדש במכשיר שנקרא 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. ראו גיליון dawn:1193.
המודל הניסיוני של צינור עיבוד נתונים-סטטיסטיקה-שאילתה , שמוטמעת באופן חלקי בלבד, הוסרה מאחר שכבר לא בתהליך פיתוח. ראו בעיה כ-chromium:1177506.
זה כולל רק חלק מהעדכונים העיקריים. אתם מוזמנים לעיין ברשימה המלאה של ההתחייבויות.
מה חדש ב-WebGPU
רשימה של כל מה שדיברנו עליו בסדרה מה חדש ב-WebGPU.
Chrome 128
- התנסות עם תתי-קבוצות
- הוצאה משימוש של הגדרה של הטיית עומק לקווים ולנקודות
- הסתרת האזהרה של כלי הפיתוח לגבי שגיאה שלא תועדה אםpreventDefault
- קודם כל דגימת אינטרפולציה של WGSL
- עדכונים לגבי זריחה
Chrome 127
- תמיכה ניסיונית ב-OpenGL ES ב-Android
- מאפיין המידע של GPUAdapter
- שיפורים ב-WebAssembly יכולת פעולה הדדית
- שיפור בשגיאות מקודד פקודות
- עדכונים לגבי זריחה
Chrome 126
- הגדלת המגבלה של maxTextureArrayLayers
- אופטימיזציה של העלאת מאגר נתונים זמני לקצה העורפי של Vulkan
- שיפורים בזמן האיסוף של Shader
- מאגרי הפקודות שנשלחים חייבים להיות ייחודיים
- עדכונים לגבי זריחה
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
- תמיכה בערכי נקודה צפה (floating-point) של 16 ביט ב-WGSL
- מרחיבים את הגבולות
- שינויים במצב העומק של סטנסיל
- עדכונים במידע על מתאם
- כימות שאילתות חותמות זמן
- תכונות לניקוי האביב
Chrome 119
- טקסטורות צפות של 32 ביט שניתן לסנן
- פורמט unorm10-10-10-2 קודקוד
- פורמט טקסטורה של IMAP10a2uint
- עדכונים לגבי זריחה
Chrome 118
- תמיכה ב-HTMLImageElement וב-ImageData ב-
copyExternalImageToTexture()
- תמיכה ניסיונית במרקם האחסון לקריאה בלבד ולקריאה בלבד
- עדכונים לגבי זריחה
Chrome 117
- ביטול הגדרה של מאגר נתונים זמני של קודקודים
- ביטול ההגדרה של קבוצת קישור
- השתקת שגיאות מיצירה של צינור עיבוד נתונים אסינכרוני כשהמכשיר אבד
- עדכונים ליצירת מודול של תוכנת ההצללה (shader) SPIR-V
- שיפור חוויית הפיתוח
- שמירה במטמון של צינורות עיבוד נתונים באמצעות פריסה שנוצרת באופן אוטומטי
- עדכונים לגבי זריחה
Chrome 116
- שילוב של קודק WebCodec
- המכשיר שאבד הוחזר על ידי GPUAdapter
requestDevice()
- הפעלת הסרטון ב-
importExternalTexture()
צריכה להיות חלקה - תאימות מפרטת
- שיפור חוויית הפיתוח
- עדכונים לגבי זריחה
Chrome 115
- תוספים נתמכים לשפות של WGSL
- תמיכה ניסיונית ב-Direct3D 11
- קבלת GPU נפרד כברירת מחדל בחיבור לחשמל
- שיפור חוויית הפיתוח
- עדכונים לגבי זריחה
Chrome 114
- אופטימיזציה של JavaScript
- getCurrentTexture() בבד ציור שלא הוגדר גורם לשגיאה InvalidStateError
- עדכונים ל-WGSL
- עדכונים לגבי זריחה