Haim Cohen, Freescale Israel
הצעד הראשון בדרך לפתרון בעיה הוא יכולתנו לראות אותה. בפיתוח תוכנה בריבוי ליבות (multicore) קיימים אתגרים רבים, ויש חשיבות רבה ליכולת הצפייה בנתונים. עיבוד אסימטרי בהתקנים מרובי ליבות יכול לשפר את היעילות הכרוכה בתכנון התוכנה. כל ליבת מעבד – או קבוצה של ליבות – יכולה לבצע קוד ייחודי וייעודי למשימה, אשר עובר כוונון עדין למטרה מסוימת. באופן כזה, יישום אסימטרי יכול להפיק את המרב ממשאבי החומרה המשובצים של המערכת.
אמנם סוג זה של תכנון תוכנה נשמע אידיאלי, אך אותו מתכנת יישומים משובצים שיש בו היגיון יודע שלעתים קרובות המציאות אינה תואמת את המצב האידיאלי. ניפוי שגיאות מקוד הוא אתגר מרתיע, שיכול להפוך מרתיע עוד יותר, אם כרוך בכך ריבוי ליבות. הבעיה היא, כיצד נוכל לגרום לכך שתוכן הליבות ותוכן זיכרונות המטמון ייראה לעיני מהנדס התוכנה. בעיה זו יכולה להיפתר באמצעות כלי טוב לניפוי שגיאות.
כלי טוב לניפוי שגיאות, שנוצר מתוך הבנה מעמיקה של ריבוי ליבות, יכול להפוך את הגילוי של שגיאות קידוד, תנאי “מרוץ” (racing) ונעילת קיפאון (deadlock) לתהליך פשוט וקל יותר. הוא אמור גם להציג את ההקשר של הנתונים עבור כל ליבה ועבור זיכרונות המטמון שלהן, כדי שאפשר יהיה לצפות בדעיכת הנתונים ובזרימתם, בשעה שהיישום מנסה לטפל בצורה מכובדת בתנאי הקצה. הכלי של Freescale לפיתוח תוכנה בריבוי ליבות הוא סביבת הפיתוח ®CodeWarrior ל–StarCore V10.
כלי ניפוי השגיאות ®CodeWarrior יכול לספק את המידע האמור בעת ניפוי קוד מעבד DSP. כלי ניפוי השגיאות יכול לנהל ליבות מעבדים מרובות, כמו למשל שש הליבות שבהתקן MSC8156 של ®StarCore. הכלים של ®CodeWarrior, כאשר הם מוגדרים בקונפיגורציה בצורה נכונה, יכולים גם לנפות שגיאות מליבות רבות במערכת מרובת התקנים כמו למשל שלושה חלקי MSC8156 המחוברים בשרשרת דרך ממשק JTAG (ליצירה של 18 ליבות בסך הכל בדוגמה זו).
כלי ניפוי השגיאות ®CodeWarrior מספק עושר של מידע באמצעות נקודת המבט של ניפוי השגיאות. תצוגת ניפוי שגיאות מציגה את תהליכון (thread) הקוד המוקצה לליבה מסוימת ואת מצב הביצוע העכשווי שלו (כמו למשל במצב עצירה או פועל). אתה יכול להשתמש בתצוגות ממוינות עבור זיכרון, זיכרון מטמון ואוגרים (register), על מנת ללמוד את ההקשר שבו נמצאת ליבה שנבחרה בתצוגת ניפוי השגיאות. כאשר לוחצים על תהליכון בתצוגת ניפוי השגיאות, עוברות כל התצוגות האחרות להציג את ההקשר שבו נמצא המעבד של הליבה שלה שייך התהליכון. תצוגת עריכה מאפשרת לחקור את היישום ברמת קוד המקור ולעבור בו צעד אחר צעד.
כמובן שאפשר לקבוע נקודות עצירה (או נקודות צפייה) בקוד שמתבצע בליבה אחת או יותר. נקודות עצירה בחומרה מסתמכות על תכונות מיוחדות המשולבות בתוך המעבד ושאפשר לקשר אותן לליבה מסוימת אפילו עבור קוד המשמש בשיתוף (קוד שפועל ביותר מאשר ליבה אחת). אפשר לקבוע נקודות עצירה בתוכנה בכל סוג של קוד (המשמש בשיתוף או ללא שיתוף). עם זאת, הליבה הראשונה שתגיע לפקודה של נקודת העצירה, ללא קשר איזו מבין הליבות היא, תהיה זו שתעצור. בנוסף, קיימות פקודות למטרות מיוחדות של ריבוי ליבות שמאפשרות להתחיל, לעצור ולאפס את כל ליבות המעבדים באותו רגע, והן מאפשרות את חקירת המערכת כמכלול בכל רגע נתון.
כאשר במעבד יחיד פועלות שש ליבות או שבמערכת מרובת התקנים פועלות n ליבות, ייתכנו מצבים שבהם קבוצות חלקיות מורכבות של ליבות יפעילו חלקים שונים של קוד, קבוצות שהן מערכות משנה שיש להגדיר את הקונפיגורציה שלהן באופן שונה וכמו כן לבדוק אותן ולצפות בהן. הכלים של ®CodeWarrior תומכים ברעיון הפשוט של קבוצות הפעלה, על מנת להתמודד עם האתגר הזה. קבוצות הפעלה אוספות את הגדרות כלי ניפוי השגיאות עבור הליבות המוגדרות מראש ומציבות אותן בתוך אובייקט קבוצת הפעלה. כשמופעלת קבוצת ההפעלה שבה נכללות, למשל, שלוש ליבות מעבדים, רק אותן ליבות יתחילו לפעול. אפשר לקנן קבוצות הפעלה, כך שהפעלת קבוצת הפעלה אחת תפעיל את קבוצות ההפעלה שנכללות בה – וכתוצאה מכך מופעלות כל הליבות שנשלטות על ידן. לדוגמה, עבור מערכת מרובת ההתקנים האמורה, אפשר להגדיר בקונפיגורציה קבוצת הפעלה שמפעילה את כל הליבות שבמעבד הראשון, קבוצת הפעלה שנייה שמטפלת במעבד השני, וקבוצת הפעלה שלישית שמבקרת את ההתקן השלישי. לאחר מכן אפשר ליצור קבוצת הפעלה ראשית (master) שמכילה את שלוש קבוצת ההפעלה. כדי להפעיל את כל ההתקנים (ואת הליבות שלהם) בבת אחת, מפעילים רק את קבוצת ההפעלה הראשית. לחילופין, אפשר להשתמש בכל אחת מקבוצות ההפעלה באופן יחידני על מנת לטפל בהתקנים בנפרד לצורך בדיקה של הקוד שהוקצה להם.
לאחר שהקוד עבר ניפוי שגיאות והובא למצב מושלם, כלי ניפוי השגיאות ®CodeWarrior מספק כלים לביצוע אופטימיזציה של ביצועי הקוד. לדוגמה, אפשר להפעיל גרעין (kernel) מעבד DSP בכלי ההדמיה PACC שב–®CodeWarrior כשאפשרויות המעקב ויצירת הפרופילים מופעלות. אפשר להפעיל את התכונות האלה על ליבות מרובות או על ליבה יחידה. כנראה שהחלק במעקב שערכו הרב ביותר, הוא ניתוח הקוד הקריטי. חלק תצוגה זו מראה את המידע המתייחס לביצועי הגרעין עבור כל שורה של קוד מקור ב–C ושל פקודת אסמבלי. התצוגה כוללת גם את מצבי ה”תקיעה” (stall) של הליבות, מצבי “תקיעה” הקשורים לזיכרון המטמון ואת מצבי ה”תקיעה” של מערכות המשנה של הזיכרון. כך ניתן לראות היכן בדיוק מתרחשות החטאות של זיכרון המטמון ו”תקיעות” ליבה אחרות. לדוגמה, “תקיעה” חוזרת שמתרחשת בפעם הראשונה שהקוד ניגש לווקטור נתונים מרמזת על כך שהאלגוריתם יכול להשתפר כתוצאה משימוש בגישה שונה. “תקיעות” שמתרחשות בפקודות שמביאים אותן לעתים קרובות, מרמזות על מקומות שבהם אפשר להשתמש בפקודת PFETCH כדי להעביר מראש פקודות אל זיכרון המטמון על מנת לשפר את הביצועים. “תקיעות” בשולבים (interlock) ובקווי צינורות (pipline) של הליבה יכולות לציין אזורים שבהם אלגוריתם שונה יכול להאיץ את הביצועים. לעתים קרובות אפשר להקטין את ההשפעה של “תקיעה” פשוט על ידי ארגון מחדש של הקוד.
באיור מס 1: מעקב זיכרון המטמון עוקב אחרי השימוש בזיכרון המטמון ומציג אירועים כגון פגיעה (hit), החטאה (miss) ופגיעות מוקדמות (prefetch hits). אפשר להשתמש במידע זה על מנת להתאים ולכוון את קוד התוכנית ואת פעולות הנתונים, כדי לשפר את ביצועי זיכרון המטמון. החשיבות של פעולות אלו היא העובדה שהשינויים מתבצעים בהתבסס על נתונים אמינים, ולאחר מכן מתבצעים מעקב והפעלה בפרופילים נוספים כדי למדוד את תוצאות השינויים.
כתיבת קוד למערכות בריבוי ליבות דורשת את כשרונותיהם של מהנדסי תוכנה מנוסים. על ידי מסירת התמונה הברורה של המתרחש בתוכנית ומתן אפשרות לצפות בנתונים, כלי ניפוי השגיאות ®CodeWarrior מאפשר לבצע את העבודה טוב יותר.