מה חדש ב-WebGPU (Chrome {/7}128)

François Beaufort
François Beaufort

ניסוי עם קבוצות משנה

התכונה 'קבוצות משנה' מאפשרת לבצע עיבוד מקבילי ברמת SIMD, ומאפשרת לשרשורים בתוך קבוצה לתקשר ולבצע פעולות מתמטיות קולקטיביות (לדוגמה, חישוב הסכום של 16 מספרים). כך אפשר לשתף נתונים בצורה יעילה מאוד בין שרשורים שונים.

הטמעה מינימלית של הצעה לקבוצות משנה זמינה לבדיקה מקומית מאחורי הדגל 'תמיכה לא בטוחה ב-WebGPU' בכתובת chrome://flags/#enable-unsafe-webgpu.

אתם יכולים גם לנסות קבוצות משנה באתר עם משתמשים אמיתיים על ידי הרשמה לתקופת הניסיון במקור. במאמר תחילת השימוש בגרסת המקור לניסיון מוסבר איך להכין את האתר לשימוש בגרסת המקור לניסיון. תקופת הניסיון בגרסת המקור תתקיים מ-Chrome 128 עד Chrome 131 (ותסתיים ב-19 בפברואר 2025). כוונה לערוך ניסוי

כשהתכונה "subgroups" זמינה ב-GPUAdapter, צריך לבקש GPUDevice עם התכונה הזו כדי לקבל תמיכה בקבוצות משנה ב-WGSL ולבדוק את המגבלות של minSubgroupSize ו-maxSubgroupSize.

בנוסף, צריך להפעיל את התוסף הזה בקוד WGSL באופן מפורש באמצעות enable subgroups;. כשהאפשרות מופעלת, מקבלים גישה לתוספות הבאות:

  • subgroup_invocation_id: ערך מובנה של האינדקס של השרשור בתוך אותה תת-קבוצה.
  • subgroup_size: ערך מובנה לגישה לגודל של תת-קבוצה.
  • subgroupBallot(value): הפונקציה מחזירה קבוצה של שדות ביט, שבהם הביט התואם ל-subgroup_invocation_id הוא 1 אם value נכון לקריאה הפעילה הזו, ו-0 במקרים אחרים.
  • subgroupBroadcast(value, id): המערכת משדרת את הערך של value מהקריאה עם subgroup_invocation_id שתואם ל-id לכל הקריאות בתוך אותה קבוצת משנה. הערה: id חייב להיות קבוע בזמן הידור.

בעתיד יתווספו פונקציות מובנות נוספות, כמו subgroupAdd,‏ subgroupAll,‏ subgroupElect,‏ subgroupShuffle. בעיה מס' 354738715

כדי לאפשר את הפונקציה f16 בפעולות של קבוצות משנה, צריך לבקש GPUDevice עם התכונות "subgroups",‏ "subgroups-f16" ו-"shader-f16", ואז להפעיל אותה בקוד WGSL באמצעות enable f16, subgroups, subgroups_f16;.

קטע הקוד הבא מספק בסיס שיעזור לכם לבחון את הפוטנציאל של קבוצות משנה ולגלות את הפוטנציאל שלהן.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

הוצאה משימוש של הגדרת הטיה של עומק לקווים ולנקודות

שינוי במפרט של WebGPU גורם לכך שהגדרה של depthBias,‏ depthBiasSlopeScale ו-depthBiasClamp לערך שאינו אפס כשהטופוגרפיה של צינור עיבוד הנתונים לעיבוד תמונה היא מסוג קו או נקודה נחשבת לשגיאת אימות. כדי לתת למפתחים מספיק זמן לעדכן את הקוד שלהם, תוצג אזהרה במסוף כלי הפיתוח לגבי האימות הקרוב, וגם ערכים של 0 יופעלו במקרים כאלה. בעיה מס' 352567424

הסתרת האזהרה של כלי הפיתוח לגבי שגיאה שלא תועדה אםpreventDefault

במסוף DevTools, אזהרות לגבי אירועי uncapturederror לא מוצגות יותר אם רשום מאזין אירועים ל-uncapturederror והשיטה preventDefault() של האירוע הוזמנה בתוך פונקציית ה-callback של מאזין האירועים. ההתנהגות הזו תואמת לטיפול באירועים ב-JavaScript. דוגמה לכך מופיעה בבעיה 40263619.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

קודם כל דגימת אינטרפולציה של WGSL

המאפיין interpolate של WGSL מאפשר לנהל אינטרפולציה של נתוני IO שהוגדרו על ידי משתמשים. עכשיו, פרמטרים חדשים של דגימת אינטרפולציה first (ברירת המחדל) ו-either נותנים לכם שליטה נוספת: הפרמטר first משתמש בערך מהקודקוד הראשון של הפרימיטיב, והפרמטר either מאפשר להשתמש בקודקוד הראשון או האחרון. ראו בעיה 340278447.

עדכונים של Dawn

הושלמה ההטמעה של WGPUFuture של Dawn לצורך טיפול בפעולות אסינכרוניות. מושגי מפתח כוללים wgpuInstanceProcessEvents עיבוד אירועים מזדמן ו-WGPUCallbackMode להגדרת מיקומי קריאה חוזרת. WGPUFuture מציין אירועים חד-פעמיים עם משך חיים אינסופי, והפונקציה wgpuInstanceWaitAny מסתמכת על אירועים עתידיים או על תפוגת זמן קצוב לתפוגה. בעיה 42240932

עכשיו הערך של CompositeAlphaMode::Auto לא מדווח על ידי Surface::GetCapabilities(). היא עדיין תקפה, ומקבילה ל-Surface::GetCapabilities().alphaMode[0]. בעיה מס' 292

הקצה העורפי של OpenGL תומך עכשיו ב-Surface עם blit של Flip Y לכל קריאה ל-Present(). בעיה 344814083

השיטה Adapter::GetProperties() הוצאה משימוש והוחלפה על ידי השיטה Adapter::GetInfo().

Jaswant, שותף תורם חיצוני, כתב מחדש את כל קובצי CMake, כך שיהיה קל יותר לעדכן אותם ואפשר יהיה לבצע גרסאות build מראש. במדריך למתחילים מוסבר איך משתמשים ב-Dawn בפרויקטים של CMake.

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

מה חדש ב-WebGPU

רשימה של כל מה שנדון בסדרה מה חדש ב-WebGPU.

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113