שיעור 34: זיכרון מאוחד (Unified Memory) עם cudaMallocManaged
עד עכשיו ניהלנו שני עותקים נפרדים של כל מערך: מצביע host (למשל a) ומצביע device (למשל d_a), והעברנו ביניהם ב-cudaMemcpy ידני בכל כיוון. זיכרון מאוחד (Unified Memory) מבטל את הכפילות הזו: cudaMallocManaged מקצה מצביע יחיד שתקף גם על ה-host וגם על ה-device, וה-driver מעביר דפי זיכרון (pages) על-פי דרי
במקום שני מחברות נפרדות — אחת על השולחן שלך (host) ואחת על השולחן של החבר (device) — שאתה כל הזמן מעתיק ביניהן ידנית, יש מחברת קסם אחת. כשאתה צריך אותה היא מופיעה אצלך, כשהחבר צריך היא עוברת אליו לבד. נוח מאוד, אבל המעבר עצמו לוקח רגע.
- זיכרון מאוחד (Unified Memory)
- מרחב כתובות יחיד הנגיש גם ל-host וגם ל-device דרך מצביע אחד. ה-driver מעביר דפים על-פי דרישה.
- cudaMallocManaged
- מקצה זיכרון מנוהל ומחזיר מצביע יחיד שעובד על host ועל device בלי cudaMemcpy מפורש.
- הגירת דפים (page migration)
- כשצד אחד ניגש לדף שנמצא אצל הצד השני, ה-driver מעביר את הדף אליו. זה גורם page fault ועולה זמן.
- cudaMemPrefetchAsync
- רמז שמעביר דפים מנוהלים מראש ליעד מסוים (device או host) כדי להימנע מ-page faults תוך כדי ריצת ה-kernel.