יום שני, 2 בינואר 2012

האצת ביצועי אלגוריתם לעיבוד וידאו בעזרת FPGA-in-the-Loop

"הרשו לי לפנות את הבמה פעם נוספת לטובת בלוגר אורח – יגאל ירוסלבסקי, אשר התארח בבלוג הזה לפני כחצי שנה. יגאל עובד יחד עמי בחברת סיסטמטיקס. ומתמחה בכלי MathWorks המיועדים לעולם התקשורת, עיבוד אות, יצירה אוטומטית של קוד HDL ואימות (Verification) שלו, וכן בתהליכי פיתוח של אלגוריתמים המתוכננים לפעול על FPGA-ים".
מה קיבלתם לראש השנה האזרחית? אתם לא באמת חייבים לענות, זאת הייתה שאלה רטורית שכל מטרתה היתה להביא אותי לספר על מה שאני קיבלתי. ובכן, אני קיבלתי לוח FPGA חדש, "צעצוע" שצפוי לספק לי שעות של הנאה בחודשים הקרובים. ומה היה הדבר הראשון אותו החלטתי לבדוק אחרי שפתחתי את הקופסא? ובכן, החלטתי לבדוק עד כמה הרצת האלגוריתם על גבי ה- FPGA יכולה להאיץ את ביצועי סימולציות ה-Simulink שלי.

אז הנה לכם, בפינה השמאלית עומד לו מעבד אינטל עם 4 ליבות הנמצא במחשב בעל 4 ג'יגה זכרון ומערכת הפעלה של 64 ביט. ומולו, בפינה הימנית, לוח FPGA של אחת משתי היצרניות הגדולות ביותר לשבבי FPGA. הלוח, אגב, איננו חמוש ב High-End FPGA חדש אלא ב-FPGA "ותיק" ממנו בשני דורות. אז מי לדעתכם ינצח? אם קראתם את הכותרת, אתם כבר יודעים את התשובה.

לטובת בדיקת הביצועים בחרתי במודל לדוגמה (DEMO) המסופק כחלק מה-HELP של MATLAB. הדמו עוסק בחידוד של וידאו על ידי שימוש ב-Computer Vision System Toolbox, והוא נמצא תחת כלי בשם EDA Simulator Link אשר שימש אותי לטובת הורדת קוד ה-HDL (הנוצר אוטומטית מתוך המודל) לתוך שבב ה-FPGA. אלה מכם שירצו לחזור על הפעולות שלי פשוט צריכים לחפש fil_videosharp_fpga ב-HELP בכל גרסת MATLAB החל מ-R2011a.

להלן המודל המיועד לריצה ב-Simulink "בלבד":


כאשר הרצתי חצי שניה של סימולציה ומדדתי זמן ריצה קיבלתי:

>> tic; sim('fil_videosharp_sim'); toc
Elapsed time is 752.932444 seconds.
לא מעט זמן... השאלה היא לאיזו תוצאה אפשר להגיע על ידי שימוש בלוח FPGA.

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

על מנת להוריד אלגוריתם לשבב FPGA, יש להפוך אותו לקוד Hardware Description Language, או בקיצור - HDL. ניתן לממש את האלגוריתם לעיל מחדש בשפת HDL באופן ידני, אך קל יותר פשוט להשתמש ב-Simulink HDL Coder שעושה זאת עבורנו בצורה אוטומטית – מהר יותר, ללא שגיאות קידוד, ופשוט יותר. כל מה שעלינו לעשות הוא להקליק עם הלחצן הימני של העכבר על הבלוק הורוד ולבקש יצירה של קוד HDL:

והתוצאה - קבצי ה-HDL של האלגוריתם (אצלי ברירת המחדל היא קבלת VHDL, אבל ניתן לקבל גם Verilog):

שימו לב כי הקבצים למעלה הינם "רק" קבצי מימוש האלגוריתם. על מנת ליצור את רכיבי השרות, האחראים בין היתר על ניהול התקשורת מול Simulink, יש לפתוח את אשף
ה-
FPGA-in-the-Loop  באמצעות הפקודה filWizard:

העבודה עם האשף די אינטואיטיבית, ובסיומה נוצרים בצורה אוטומטית קבצי השרות:

בנוסף, האשף יוצר גם בלוק Cosimulation אותו יש לשלב במקום הבלוק האלגוריתמי המקורי. שינוי נוסף שיש לבצע במודל המקורי הוא להתאים את הממשק בין המודל לבלוק הסימולציה, וכן יש לתרגם את ה-frames הדו-מימדים של אות הוידאו לוקטורים חד-מימדיים בעלי אותה כמות פיקסלים. המודל הסופי לצורך FPGA Cosimulation נראה כך:

וכעת, כל מה שנותר הוא רק לסתנז את קבצי ה-HDL לקבצים בינאריים הניתנים לטעינה לתוך ה-FPGA ולטעון אותם אל ה-FPGA. נשמע מסובך? אז תשמחו לגלות שגם תהליך זה נעשה בצורה אוטומטית. קליק כפול על בלוק ה-Cosimulation ולחיצה על Load יגרמו לביצוע תהליכי הסינתזה, המיפוי, המיקום, הניתוב וטעינת השבב:
לחיצה על כפתור ה-PLAY במודל ה-Simulink ומדידה של זמן הריצה עבור עיבוד 10 שניות של וידאו (פי 20 ממשך הוידאו שעיבדתי קודם לכן) מניבה את התוצאה הבאה:


>> tic; sim('fil_videosharp_fpga'); toc
Elapsed time is 7.571201 seconds.

סיכום כמותי:

Simulink בלבד:                         חצי שניה של וידאו מעובד = 753 שניות ריצה בפועל
קו-סימולציית Simulink + שבב FPGA: עשר שניות של וידאו מעובד = 7.6 שניות ריצה בפועל

בחישוב גס, שימוש ב- FPGA-in-the-Loop הביא להאצה של כמעט פי 2000 ! ואם הסימולציות שלכם כבדות יותר (כאלה שבהן איטרציה אחת יכולה לקחת שעות או אולי ימים), האצה של פי 2000 יכולה להיות קריטית לעתיד הפרוייקט שבמסגרתו הסימולציות האלה צריכות להתבצע. ואגב, אותם הכלים שהוזכרו לעיל יכולים לשמש לא רק לטובת האצת ביצועים, אלא אף לפיתוח השבב ולאימות קוד HDL ידני או קנוי מחברה חיצונית. אבל על כך אני כבר אכתוב בפעם אחרת.

האם הייתם מודעים ליכולת להאיץ סימולציות על ידי FPGA-in-the-Loop ? האם ידעתם שניתן גם להמיר קוד MATLAB לקוד HDL באופן אוטומטי?

2 comments:

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

    השבמחק
  2. ובכן,
    1) זה יעבוד לכל אלגוריתם שניתן לפתח בסימולינק ושהינו מפותח לרמת חומרה. ז"א בנוי מבלוקים התומכים ביצירת קוד חומרה ובצורה שתתכן ע"ג חומרה.
    2) הלוח שלי עולה כ 1200$, יש יקרים ויש זולים ממנו. שבב ה FPGA הוא הרבה יותר זול, אבל ללא לוח לא יהיה לו שום ערך בהאצת ביצועים.
    3) תקבל האצה, אבל כמה האצה זה מאוד תלוי באלגוריתם וכמה הוא אופטימאלי למימוש ע"ג חומרה. ככל שניתן יהיה למקבל אותו יותר כך השימוש במקביליות ה FPGA תגדל ואיתו יגדל פקטור ההאצה.

    בברכה,
    יגאל.

    השבמחק