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

François Beaufort
François Beaufort

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

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

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

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

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

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

  • subgroup_invocation_id: ערך מובנה לאינדקס של ה-thread בתוך קבוצת המשנה.
  • 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

במסוף כלי הפיתוח, אזהרות לגבי 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

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

עדכונים לגבי זריחה

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

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

הקצה העורפי של OpenGL תומך עכשיו ב-Surface עם הבזק y-flip בכל שיחת Present(). ראו בעיה 344814083.

השיטה Adapter::GetProperties() הוצאה משימוש לטובת השימוש ב-Adapter::GetInfo().

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

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

מה חדש ב-WebGPU

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

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