תמיכה בערכים של נקודה צפה (floating-point) באורך 16 ביט ב-WGSL
ב-WGSL, הסוג f16
הוא קבוצת הערכים של נקודה צפה באורך 16 ביט בפורמט binary16 (חצי דיוק) של IEEE-754. המשמעות היא שהיא משתמשת ב-16 ביט כדי לייצג מספר של נקודה צפה, בניגוד ל-32 ביט של נקודה צפה רגילה עם דיוק יחיד (f32
). הגודל הקטן יותר יכול להוביל לשיפורים משמעותיים בביצועים, במיוחד כשמעובדים כמויות גדולות של נתונים.
לשם השוואה, במכשיר Apple M1 Pro, ההטמעה של f16
של מודלים של Llama2 7B שנעשה בה שימוש בהדמו של צ'אט WebLLM מהירה יותר באופן משמעותי מההטמעה של f32
, עם שיפור של 28% במהירות המילוי מראש ושיפור של 41% במהירות הפענוח, כפי שמוצג בצילום המסך הבא.
לא כל המעבדים הגרפיים תומכים בערכים של נקודה צפה באורך 16 ביט. כשהתכונה "shader-f16"
זמינה ב-GPUAdapter
, אפשר עכשיו לבקש GPUDevice
עם התכונה הזו וליצור מודול של שַדְר (shader) ב-WGSL שמנצל את סוג הנקודה הצפה ברמת דיוק חצי f16
. אפשר להשתמש בסוג הזה במודול ה-WGSL shader רק אם מפעילים את התוסף 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
בקוד של מודול ה-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. issue dawn:1849
שינויים במצב של סטנציאל עומק
כדי לשפר את חוויית הפיתוח, לא תמיד נדרשים יותר המאפיינים של מצב עומק-סטנסיל depthWriteEnabled
ו-depthCompare
: depthWriteEnabled
נדרש רק לפורמטים עם עומק, ו-depthCompare
לא נדרש לפורמטים עם עומק אם לא נעשה בהם שימוש בכלל. ראו issue dawn:2132.
עדכונים של פרטי המתאם
מאפייני המידע הלא סטנדרטיים של המתאם type
ו-backend
זמינים עכשיו בקריאה ל-requestAdapterInfo() כשהמשתמש הפעיל את הדגל 'WebGPU Developer Features' ב-chrome://flags/#enable-webgpu-developer-features
. הערך של type
יכול להיות 'GPU נפרד', 'GPU משולב', 'מעבד' או 'לא ידוע'. הערך של backend
הוא WebGPU, D3D11, D3D12, metal, vulkan, openGL, openGLES או null. ראו issue dawn:2112 ו-issue dawn:2107.
פרמטר הרשימה האופציונלי unmaskHints
ב-requestAdapterInfo() הוסר. ראו issue dawn:1427.
כימות של שאילתות עם חותמות זמן
שאילתות של חותמות זמן מאפשרות לאפליקציות למדוד את זמן הביצוע של פקודות GPU ברמת דיוק של ננו-שנייה. עם זאת, לפי מפרט WebGPU, שאילתות של חותמות זמן הן אופציונליות בגלל חששות לגבי התקפת תזמון. צוות Chrome סבור שאפשר להגיע לפשרה טובה בין דיוק לאבטחה על ידי הפחתת הרזולוציה של שאילתות של חותמות זמן ל-100 מיקרו-שניות. issue dawn:1800
ב-Chrome, המשתמשים יכולים להשבית את התקציבים של חותמות הזמן על ידי הפעלת הדגל 'WebGPU Developer Features' בקטע 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. issue dawn:1193
התכונה הניסיונית 'pipeline-statistics-query', שהוטמעה רק חלקית, הוסרה כי היא לא מתפתחת יותר. בעיה chromium:1177506
כאן מפורטות רק חלק מהנקודות העיקריות. רשימת ההצהרות המלאה
מה חדש ב-WebGPU
רשימה של כל מה שנדון בסדרה מה חדש ב-WebGPU.
Chrome 131
- חיתוך מרחקים ב-WGSL
- GPUCanvasContext getConfiguration()
- אסור שתהיה הטיה לעומק בפרימיטיבים של קווים ונקודות
- פונקציות מובנות של סריקה כוללת לקבוצות משנה
- תמיכה ניסיונית בקריאה עקיפה עם כמה משיכות
- Shader module compilation option strict math
- הסרת השיטה requestAdapterInfo() של GPUAdapter
- עדכונים לגבי Dawn
Chrome 130
- שילוב של שני מקורות
- שיפורי זמן הידור של שפות Shader ב-Metal
- הוצאה משימוש של requestAdapterInfo() של GPUAdapter
- עדכונים לגבי Dawn
Chrome 129
Chrome 128
- ניסוי עם תתי-קבוצות
- הוצאה משימוש של הגדרת הטיה של עומק לקווים ולנקודות
- הסתרת אזהרת DevTools על שגיאה שלא תועדה אם preventDefault
- WGSL מבצעת אינטרפולציה של הדגימה קודם ואז
- עדכונים לגבי Dawn
Chrome 127
- תמיכה ניסיונית ב-OpenGL ES ב-Android
- מאפיין המידע של GPUAdapter
- שיפורים בתאימות הדדית של WebAssembly
- שיפור שגיאות של מקודד הפקודות
- עדכונים לגבי Dawn
Chrome 126
- הגדלת המגבלה של maxTextureArrayLayers
- אופטימיזציה של העלאה למאגר לצד העורפי של Vulkan
- שיפורים בזמן הידור של שגיאות (shader)
- מאגרי הפקודות שנשלחים חייבים להיות ייחודיים
- עדכונים לגבי Dawn
Chrome 125
Chrome 124
- טקסטורות אחסון לקריאה בלבד ולקריאה וכתיבה
- תמיכה ב-Service Workers וב-Shared Workers
- מאפיינים חדשים של פרטי מתאם
- תיקוני באגים
- עדכונים לגבי Dawn
Chrome 123
- תמיכה בפונקציות מובנות של DP4a ב-WGSL
- פרמטרים של מצביע ללא הגבלה ב-WGSL
- תחביר פשוט יותר לביטול ההפניה למשתנים מורכבים ב-WGSL
- מצב נפרד לקריאה בלבד של אספקטים של תבנית ועומק
- עדכונים לגבי Dawn
Chrome 122
- הרחבת פוטנציאל החשיפה באמצעות מצב תאימות (תכונה בפיתוח)
- הגדלת המגבלה של maxVertexAttributes
- עדכונים לגבי Dawn
Chrome 121
- תמיכה ב-WebGPU ב-Android
- שימוש ב-DXC במקום ב-FXC לצורך הידור של שגיאות ב-Windows
- שאילתות של חותמות זמן בשלבי המחשוב והעיבוד
- נקודות כניסה שמוגדרות כברירת מחדל למודולי שַדְר (shader)
- תמיכה ב-display-p3 כמרחב צבע של GPUExternalTexture
- מידע על ערמות זיכרון
- עדכונים לגבי Dawn
Chrome 120
- תמיכה בערכים של נקודה צפה (floating-point) באורך 16 ביט ב-WGSL
- מעבר למגבלות
- שינויים במצב של עומק-המרקע
- עדכונים של פרטי המתאם
- קידוד נתונים של שאילתות עם חותמות זמן
- תכונות לניקיון האביב
Chrome 119
- טקסטורות של מספרים ממשיים (float) ב-32 ביט שניתן לסנן
- פורמט קודקוד unorm10-10-10-2
- פורמט טקסטורה של rgb10a2uint
- עדכונים לגבי Dawn
Chrome 118
- תמיכה ב-HTMLImageElement וב-ImageData ב-
copyExternalImageToTexture()
- תמיכה ניסיונית ברקמות אחסון לקריאה וכתיבה ולקריאה בלבד
- עדכונים לגבי Dawn
Chrome 117
- ביטול ההגדרה של מאגר הנקודות
- ביטול ההגדרה של קבוצת הקישור
- השתקת שגיאות שנובעות מיצירת צינור עיבוד נתונים אסינכררוני כשהמכשיר אבד
- עדכונים לגבי יצירת מודולים של שפות SPIR-V
- שיפור חוויית המפתחים
- אחסון צינורות עיבוד נתונים במטמון עם פריסה שנוצרה באופן אוטומטי
- עדכונים לגבי Dawn
Chrome 116
- שילוב WebCodecs
- מכשיר שאבד וחוזר על ידי GPUAdapter
requestDevice()
- שמירה על הפעלה חלקה של סרטונים אם מתבצעת קריאה ל-
importExternalTexture()
- תאימות למפרט
- שיפור חוויית המפתחים
- עדכונים לגבי Dawn
Chrome 115
- תוספים נתמכים לשפת WGSL
- תמיכה ניסיונית ב-Direct3D 11
- קבלת GPU נפרד כברירת מחדל בחשמל AC
- שיפור חוויית המפתחים
- עדכונים לגבי Dawn
Chrome 114
- אופטימיזציה של JavaScript
- getCurrentTexture() ב-Canvas לא מוגדר מפעילה שגיאה מסוג InvalidStateError
- עדכונים מ-WGSL
- עדכונים לגבי Dawn