WebGPU: טיפים ותיקונים לפתרון בעיות

François Beaufort
François Beaufort

במסמך הזה מוסבר למה WebGPU לא פעיל או לא פועל כצפוי בדפדפן Chrome, כולל שלבים ברורים לפתרון הבעיות כשזה אפשרי.

בדוגמה הבאה מוצגת שגיאת JavaScript שעלולה להופיע כש-gpu לא זמין ב-navigator:

const adapter = await navigator.gpu.requestAdapter();
cancel Uncaught TypeError: Cannot read properties of undefined (reading 'requestAdapter')

אלה הסיבות האפשריות לדחיית הבקשה. כדאי לבדוק את אלה שמופיעים בסדר הזה:

  1. כדי להשתמש ב-WebGPU, צריך להשתמש ב-Chrome מגרסה 113 ואילך ב-ChromeOS, ב-macOS, ב-Windows וב-Chrome מגרסה 121 ואילך ב-Android. מומלץ לבדוק את הגרסה בכתובת chrome://version ולעדכן אותה לפי הצורך.

  2. ניתן לגשת ל-WebGPU רק בהקשרים מאובטחים. אם שולחים את הקוד בפרוטוקול לא מאובטח (לדוגמה, http:, file:), צריך להשתמש בפרוטוקול https: המאובטח או לטפל בו במהלך הפיתוח של אפליקציית האינטרנט באחת מהדרכים הבאות:

    • ממלאים את הקוד באופן מקומי ב-http://localhost או ב-http://127.0.0.1 באמצעות אחת מהפקודות האלה: npx http-server או python3 -m http.server.

    • מוסיפים את המקור לערך 'מקורות לא מאובטחים המטופלים כמאובטחים' רשימה של chrome://flags/#unsafely-treat-insecure-origin-as-secure ולהפעיל מחדש את Chrome.

    • מתקינים את Node.js ומריצים את הפקודה npx servez --ssl כדי להציג את התיקייה ב-https עם אישור מזויף. עדיין תוצג ב-Chrome אזהרה שניתן לעקוף באמצעות לחיצה על 'מתקדם' ולאחר מכן "המשך אל...".

    • חושפים את שרת האינטרנט המקומי לאינטרנט באמצעות ngrok.

מתאם ה-GPU ריק

הדוגמה הבאה היא של שגיאת JavaScript שעלולה להופיע כשהמתאם שמקבלים משליחת קריאה אל requestAdapter() הוא null:

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
cancel Uncaught TypeError: Cannot read properties of undefined (reading requestDevice)

יכולות להיות לכך כמה סיבות. כדאי לבדוק את אלה שמופיעים בסדר הזה:

  1. WebGPU מושבת כשהמשתמש משבית את האפשרות 'שימוש בהאצת גרפיקה כשזה אפשרי' ב-chrome://settings/system. צריך לבדוק אם ההגדרה הזו מושבתת ולהפעיל אותה מחדש

  2. בשלב הזה אין תמיכה ב-WebGPU בפלטפורמה הזו. אפשר להפעיל את הדגל chrome://flags/#enable-unsafe-webgpu ולהפעיל מחדש את Chrome. כדי לקבל תמיכה ניסיונית ב-Linux, יש להפעיל גם את הדגל chrome://flags/#enable-vulkan. למידע נוסף, כדאי לעיין בתמיכה ב-WebGPU ב-Headless Chrome.

  3. חומרת ה-GPU נוספה לרשימת חסימה באופן ספציפי. אם מופיעה ההודעה "WebGPU הושבת דרך רשימת חסימה או שורת הפקודה" ב-chrome://gpu אפשר להשבית את רשימת החסימה של מתאמי WebGPU על ידי הפעלת הדגל chrome://flags/#enable-unsafe-webgpu והפעלה מחדש של Chrome.

  4. אין מתאם GPU תואם לאפשרויות שהועברו ב-requestAdapter(). אפשר לנסות להתקשר אל requestAdapter() עם אפשרויות אחרות.

  5. ל-WebGPU נדרש GPU (אמולציה של חומרה או תוכנה). כדי לבדוק אם Chrome מזהה GPU, אפשר להיכנס לכתובת chrome://gpu.

WebGPU איטי יותר מ-WebGL

  1. פותחים את chrome://gpu ומוודאים שהאפשרות "WebGPU: Hardware Accelerated (האצת חומרה)". אם קוראים את ההודעה "WebGPU: תוכנה בלבד, שיפור המהירות באמצעות חומרה לא זמין", יכול להיות שצריך לעדכן את מנהלי ההתקנים של ה-GPU.

  2. יכול להיות שתרגום ישיר של מושגי WebGL ל-WebGPU לא ינצל את מלוא האופטימיזציה של WebGPU. כדאי לעיין במאמר מ-WebGL ל-WebGPU כדי ללמוד על כמה מההבדלים ביניהם.

מגבלות ספציפיות ל-Windows

חשוב לשים לב למגבלות הבאות כשמשתמשים ב-WebGPU במכשירי Windows:

  • Chrome לא תומך בשימוש במספר מתאמי GPU בו-זמנית. ראו בעיה ב-chromium:329211593.

  • Chrome משתמש תמיד באותו מתאם GPU שהוקצה לעומסי עבודה אחרים של Chrome. במחשבים ניידים הוא בדרך כלל כרטיס הגרפיקה המשולב, בגלל היבט השימוש בחשמל (כלומר, חיסכון בחשמל). המשמעות היא שהאפשרות powerPreference לא משפיעה כשמתקשרים אל requestAdapter().