‏הצגת רשומות עם תוויות זמן ריצה. הצג את כל הרשומות
‏הצגת רשומות עם תוויות זמן ריצה. הצג את כל הרשומות

יום ראשון, 24 במרץ 2013

אסטרטגיות להאצת ישומי ואלגוריתמי MATLAB

ממש לאחרונה התפרסמה באתר MathWorks סקירה בסיסית של האסטרטגיות השונות להאצת ישומי ואלגוריתמי MATLAB. בין היתר, נידונות בסקירה אסטרטגיות כמו אלוקציה מראש של זיכרון, שימוש במספר מעבדים או בכרטיס המסך (GPU), שיטות לכתיבת אלגוריתמים טובים יותר, היתרונות בעבודה עם System Objects ויצירה אוטומטית של קבצי MEX.

לקריאת הסקירה, לחצו כאן.

אם יש לכם שאלות בנוגע לנושאים השונים המופיעים בסקירה, ניתן לכתוב תגובות בתחתית הפוסט.

יום רביעי, 5 בדצמבר 2012

שובם של ה-System Objects

בשלוש שנות קיומו של הבלוג הזה, השתדלתי כמה שפחות למחזר פוסטים. אבל בפוסט הנוכחי אחרוג ממנהגי, מכמה סיבות:
1. חלפו שנתיים וחצי מאז הפוסט האחרון בנושא שבו ארצה לדון
2. בתקופה הזו הנושא התפתח מאוד
3. חברת MathWorks רואה בנושא הזה מרכיב חשוב בתוכניותה לעתיד
4. מעט מאוד אנשים נחשפו לנושא הזה עד כה (בכל פעם שאני שואל את הקהל שאני ניצב מולו האם אנשים מכירים את הנושא, בודדים, אם בכלל, משיבים "כן").

הנושא הינו System Objects, אלגוריתמים העומדים מאחורי אובייקטים הקיימים בסביבת MATLAB כבר 6 גרסאות (מאז גרסת R2010a). כשכתבתי על כך לפני שנתיים וחצי, היו קיימים רק כ-140 אובייקטי מערכת, ורק בתחומים עיבוד אות, עיבוד וידאו, עיבוד תמונה וראיה ממוחשבת. כיום, קיימים כבר כ-330 אובייקטי מערכת, המשמשים ל:
1. עיבוד אות - מעל 95 אובייקטי מערכת ב-DSP System Toolbox
2. עיבוד וידאו, עיבוד תמונה וראיה ממוחשבת - מעל 60 אובייקטי מערכת ב-Computer Vision System Toolbox
3. פיתוח השכבה הפיזית של מערכות תקשורת - מעל 105 אובייקטי מערכת ב-Communications System Toolbox
4. תכנון, סימולציה וניתוח של מערכות מכ"מ, מערכות Ultrasound ומערכות תקשורת מרובות-אנטנות - מעל 60 אובייקטי מערכת ב-Phased Array System Toolbox

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

להבדיל מפונקציות MATLAB, אשר הינן מסוג "y שווה לפונקציה של x", ה-System Objects מסוגלים לעבוד עם קלט משתנה (Streams) וכן מסוגלים לספק מידע על המצבים הפנימיים של הפונקציה. בכך הם מרחיבים את שפת MATLAB באופן המאפשר למדל מערכות דינמיות באמצעות שפה טקסטואלית, ומהווים מעין "גשר" המקשר בין MATLAB ל-Simulink. כמובן שאם כתבתם אלגוריתם ב-MATLAB העושה שימוש ב-System Objects, אתם מוזמנים לנסות להכניס אותו לתוך בלוק ה-MATLAB Function ב-Simulink על מנת לשלבו כחלק ממודל בסביבה הזו.

מבחינת ביצועים – נניח ואתם מעוניינים לבצע Edge Detection לפריימים השונים בסרטון וידאו. בעוד ששימוש בפונקציית edge בתוך לולאה העוברת בין הפריימים השונים יהיה כרוך בקריאה לאותה פונקציה בכל פעם מחדש (דבר אשר כרוך באיתחולים חוזרים ונישנים), עבודה עם אובייקט המערכת vision.EdgeDetector ומתודת step אמורה להיות יעילה יותר. בנוסף, כמה System Objects המשתייכים ל-Communications System Toolbox ול-Phased Array System Toolbox ניתנים להאצה על ידי שימוש ב-GPU (הכרטיס הגרפי של המחשב), תוך שינוי מזערי של הקוד הכתוב.  אם כך, System Objects אמורים להביא לקיצור זמני הריצה של אלגוריתמים ! 

System Objects עשויים להקל על אלה מכם המנסים לבצע סימולציות Fixed-Point בסביבת MATLAB, וכן על מי שמנסה להמיר בקלות קוד MATLAB לקוד C או HDL. כבר כיום יש תמיכה ביצירת קוד C/HDL מתוך מגוון System Objects - למשל, כל
ה-System Objects שבגרסת R2012b של ה-Communications System Toolbox נתמכים ליצירה אוטומטית של קוד C. בהקשר זה, חשוב לציין כי החל מגרסת R2011b יכול כל אחד לפתח System Objects משלו, אשר יוכלו להתממשק אל אלה שפיתחה MathWorks, והחל מגרסת R2012a ניתן להמיר לקוד C כאלה אובייקטי מערכת שהמשתמש פיתח.


System Objects הוא נושא שאני ממליץ לכל אחד להתחיל ללמוד אותו וליישם אותו, שכן כבר היום הם נכללים בחלק גדול מכלי MathWorks - פרט להיותם חלק ממשפחת ה-System Toolboxes (אותם ארבעה כלים שהוזכרו לעיל ואשר קיימים מגרסת R2011a), יש כיום אובייקטי מערכת גם בכלים Image Acquisition Toolbox (אובייקט המאפשר רכישת תמונה הנתמך ליצירה אוטומטית של קוד C) ו-HDL Verifier (אובייקט המאפשר לבצע סימולציות FPGA-in-the-loop תוך שימוש ב-MATLAB ו-FPGA בלבד). וכפי שנכתב קודם, MathWorks מתכוונת להמשיך לפתח את הנושא הזה בשנים הבאות.

לרשימת ה-System Objects בארבעת ה-System Toolboxes המוזכרים לעיל, לחצו על הקישורים הבאים:
DSP
Computer Vision
Communications
Phased Array

יום ראשון, 10 ביולי 2011

כל המוסיף גורע מזמן הריצה

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

לאחרונה נתקלתי בתופעה מעניינת, לפיה ב-MATLAB, כל המוסיף אברים לוקטור שעליו הוא מבצע פעולה כלשהי, לא הופך את זמן הריצה של האלגוריתם לגרוע יותר, אלא להיפך. תוספת איברים גורעת מזמן הריצה !
והנה דוגמה. נסו לדרג את צמדי ה-tic-toc הבאים מהמהיר ביותר, לאיטי ביותר:



הלולאה הראשונה כופלת את כל האיברים שבמטריצות x ו-y, ולפיכך אמורה לרוץ יותר זמן מיתר הלולאות, אשר כופלות מטריצות הקצרות בשורה אחת או בעמודה אחת. אולם בפועל, הלולאה הראשונה רצה הכי פחות זמן מבין השלוש – רק 0.25 שניות על המחשב שלי, בעוד שהשניה רצה 1.75 שניות, והשלישית – 6.65 שניות.

מדוע הלולאה הראשונה היא המהירה ביותר ?

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

ומדוע הלולאה השניה רצה יותר מהר מהשלישית?

זה כבר קשור לכך ש-MATLAB מעדיפה פעולות על עמודות מאשר על שורות. בלולאה השניה מוכפלים כל האלמנטים למעט אלה שנמצאים בעמודה האחרונה, בעוד שבשלישית מוכפלים כל האלמנטים שהוצאו מתוך כל השורות, למעט השורה האחרונה.

האם בעבודתכם עם MATLAB נתקלתם בתופעות דומות המנוגדות לאינטואיציה הראשונית, דוגמת זו שמתוארת למעלה?