תכנות מקבילי להמונים

שלום לסשה גולדשטיין, CTO קבוצת סלע ו-MVP מיקרוסופט.  סשה לאחרונה אנחנו שומעים יותר ויותר על Parallel Programming ועל Parallel Processing. אתה עצמך פרסמת מספר כתבות מקצועיות, העברת הרצאות בכנסים ואתה מלמד קורסים מקיפים בנושא.  לאור ההתעניינות הגדולה בתחום, רצינו לשאול אותך מספר שאלות לטובת צופי ערוץ מכללת סלע

מה הן ההתפתחויות היותר חשובות בעיינך, בתחום התכנות והעיבוד המקבילי בשנים האחרונות?
אם היית שואל אותי לפני שנתיים-שלוש, התשובה שלי הייתה העובדה ש- 4-8 מעבדים הופכים לסטנדרט אפילו של מחשבים ביתיים, ואפליקציות מכל הסוגים צריכות ללמוד לנצל את משאבי החומרה האלה כדי לא להישאר מאחור. אלא שכפי רואים בזמן האחרון ממש, הדהירה לעבר מספרים הולכים וגדלים של מעבדים מעלה אתגרים חדשים אפילו לכותבי מערכות הפעלה, לא כל שכן למפתחי אפליקציות ושרתים, במירוץ אחר החומרה. לקחת תוכנית שתוכננה לרוץ על מעבד אחד ולגרום לה לנצל היטב 4 מעבדים זה אתגר לא פשוט. אבל אחרי שעוברים את המשוכה הזאת, לקחת את התוכנית ולאפשר לה לנצל 256 מעבדים – זהו סיפור אחר לגמרי מבחינת קשיים ואתגרים טכנולוגיים.

מה מיוחד בכלים שנוספו לאחרונה למפתחים?  הרי תמיד היה Multi processing ודי מזמן היה Multi threading – אז מה חדש?
אכן, בשרתים ומחשבי-על אין כל חדש; אבל מערכות ההפעלה וכלי הפיתוח למחשבים הסטנדרטיים, כגון מחשבים שולחניים ושרתים ארגוניים, עוברים שינויים דרמטיים בשנים האחרונות. אני לא חושב שמישהו יכול להתחייב באילו כלים ותשתיות ייכתבו אפליקציות שמשתמשות ב- 1000 מעבדים על Windows בעוד 10 שנים, אבל כרגע המגמה ברורה – Visual Studio יהיה כלי הפיתוח ו- .NET תישאר הפלטפורמה. בין השינויים תמצא חלונות נוספים ל- Debugger כמו Parallel Tasks, Parallel Stacks, Debugger Canvas, אפשרויות חדשות של Profiling, תוספות של מילות מפתח לשפה, וכמובן ספריה של מחלקות לתכנות מרובה מעבדים.

עד כמה כלי התוכנה הקיימים היום מסוגלים לנצל בצורה מיטבית את ריבוי הליבות הקיים במחשבים המודרניים? האם זה תלוי בדרך בה כותבים את התוכנה הספציפית או שזה יותר עניין למערכת ההפעלה, ה-CLR והקומפיילר?
זה לגמרי תלוי בתוכנה הספציפית. לצערי אנחנו עדיין לא נמצאים במקום שבו מערכת ההפעלה או כל תשתית חכמה אחרת יכולה למקבל את הקוד בשבילי ולהחליט איך להשתמש במשאבים נכון. זה תחום מחקר פעיל ומרתק אבל לא היו בו תוצאות של ממש, בכל מקרה לא לשפות general-purpose כמו C# או C++. המשמעות היא שצריך ללמוד לכתוב אפליקציות שמשתמשות נכון במספר מעבדים. כמו שאמר Herb Sutter בלאקוניות, The free lunch is over.

עד לא מזמן תכנות מקבילי היה נחלתם של פרויקטים מאוד ספציפיים.  האם בעקבות התפתחויות אלו אתה צופה שהשימוש בכלים של תכנות מקבילי יהפכו לכלים סטנדרטיים כמו לולאות, Classes, Generic וכד'?
כן, אבל זה יכול לקחת זמן. זה יהיה כנראה שינוי הפרדיגמה הגדול של 10-20 השנים הבאות. דברים כמו Cloud ו- Mobile הם שינויים טכנולוגיים ראויים, אבל השינויים ברמת השורה הבודדת בקוד יהיו כנראה הכי גדולים בתחום ניצול המקביליות. אני חושב שכבר היום המודעות יחסית גדולה, ומפתחים רבים מבינים שהם צריכים "לעשות משהו" כדי לנצל את משאבי החישוב. מה שאני לא בטוח בו בכלל זה עד כמה הדברים האלה הפכו ל"טבעיים" כמו Generics או דברים אחרים שהזכרת.


בזמנו תכנות מקבילי נחשב למסוכן וקשה ל-Testing ו-Debugging עקב מימד האקראיות של בו-זמניות הפעולות. האם היום פותחו כלים המצמצמים את הסכנה ו/או את הקושי בבדיקת הנכונות?

בתכנות המקבילי קרה בשנים האחרונות משהו שדומה יחסית לעלייתן של שפות התכנות הפרוצדוראליות בשנות ה- 60, עם התזכיר המפורסם של Dijkstra על כך ש- “GOTO Considered Harmful”. כפי ששפות התכנות של שנות ה- 60 השתמשו ב- GOTO ולא הייתה בהן המבניות הפרוצדרואליות, כך האופן שבו כתבנו אפליקציות מקביליות עד לפני מספר שנים סבל מחוסר סדר וספוראדיות גדולה. אבל התשתיות שקיימות היום – גם ב- .NET וגם ב- C++ - מאפשרות כתיבה מובנית של קוד מקבילי. יתר על כן, כשכותבים שרת הרבה פעמים המקביליות ממומשת ברמת התשתית, למשל ע"י ASP.NET, WCF, ותשתיות אפליקטיביות אחרות. בכל זאת, זה לא אומר שה- Debugging הפך לקל יותר. להיפך – ככל שהתשתיות עושות יותר בשבילך, כל דבר ש"לא עובד" באבסטרקציה החדשה הרבה יותר קשה לתיקון ולהבנה. עם זאת, יש מחקר פעיל וכלים ראשוניים לזיהוי בעיות סנכרון ובעיות סקאלאביליות בשלב הפיתוח.

לאילו סוגי ארכיטקטורות או סוגי פרויקטים אתה ממליץ לשקול שימוש אינטנסיבי בתכנות מקבילי?
כפי שאמרתי קודם, בהרבה מקרים התשתית האפליקטיבית מספקת כבר את שירותי המקבול. במקרים כאלה צריך להיזהר ולא ליצור over-subscription ועומס יתר על משאבי המערכת. בכל זאת יש הרבה מערכות צד-שרת שנאלצות לנהל בעצמן את משאבי החישוב, בעיקר כאלה שלא משתמשות בתשתית תקשורת או ניהול Requests מסודרת. בצד הלקוח, אפליקציות עיבוד כבדות כמו למשל Photoshop או מערכת הדמיה רפואית בהחלט יכולות וצריכות להרוויח מריבוי מעבדים.

אתה גם מלמד קורסים בנושא.  באילו קורסים מדובר? מה לומדים בהם?
הקורס המרכזי שלנו בנושא נקרא Parallel Programming in .NET 4.0. זהו קורס של שלושה ימים העמוס בפרטים ותרגילים שבסופו המשתתפים מקבלים המון דוגמאות וגם ניסיון מעשי בכתיבת קוד המשתמש במספר מעבדים. מה שמייחד את הקורס שלנו הוא שאנחנו שמים דגש על Design Patterns וארכיטקטורה, דוגמאות קונקרטיות של מצבים שבהם מקבול יכול לעזור – ולא רק דוגמאות תיאורטיות של שלוש שורות קוד. בין הנושאים תמצא כמובן את ה- Task Parallel Library של .NET 4.0, מנגנוני סנכרון, Thread-safe Collections, כתיבת קוד Lock-free, ועוד.
                                          
תוכל לתת לנו את התחזית שלך לשנים הבאות. כיצד התחום עשוי להתפתח?

הייתי מעדיף לא להתנבא, אבל אני מעריך שהאתגרים יהפכו קשים יותר. מצד אחד, חדירת ה- Mobile תגרום לכך שנצטרך ללמוד מחדש איך להשתמש נכון במעבדים השונים באופיים – מעבדי ARM למשל – ובפרט למקבל תוכניות הרצות עליהם. מצד שני, בשרתים או מחשבים אישיים חזקים אנו עומדים לראות עשרות ואף מאות מעבדים בשנים הקרובות, ויחד איתם אתגרים גדולים של סקאלאביליות. רק כדי לסבר את האוזן, כבר במעבדי i7 שאפשר לקנות היום למחשב שולחני ואפילו לנייד, יש ארכיטקטורת חומרה הנקראת NUMA שעלולות להיות לה השלכות משמעותיות על האופן שבו אנו כותבים קוד או לפחות על מערכות ההפעלה המודרניות. ולמה NUMA? בגלל אתגרים פיזיקליים של סידור כמות גדולה של מעבדים על שטח קטן ובצמידות לזיכרון הראשי. בקיצור – יהיה מעניין.

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

תודה רבה

לרשימת כל הידיעות שפורסמו לאחרונה
לסלע שתי זרועות עיקריות: מכללת סלע וסלע – המרכז הטכנולוגי.  מכללת סלע קיימת מזה 20 שנה והיא המכללה הפרטית הותיקה ביותר בשוק הישראלי. מכללת סלע עוסקת בהדרכה להיי-טק ובהסמכת סטודנטים במסגרת ארבעה בתי ספר: מקצועות התוכנה, גרפיקה ומולטימדיה, סיסטם ותקשורת ובית ספר לניהול. המרכז הטכנולוגי מספק פתרונות מיקור חוץ וייעוץ בכיר לטכנולוגיות החדישות ביותר. המרכז עומד בקשר ישיר עם מרכזי הפתוח של מיקרוסופט בעולם ומביא את הטכנולוגיות החדישות ביותר לתוך הפרויקטים בהם הוא עוסק. לסלע חמישה סניפים ברחבי העולם: בהודו, בסינגפור, בקנדה ובארה"ב (וושינגטון די. סי. וסיאטל). לסלע 250 עובדים.

הדפסשלח לחבר
דרונט בניית אתרים