פיתוח אלגוריתמים

March 11, 2012

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


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


מי שחשב שתשתיות תוכנה לעיבוד מקבילי הן בעייתיות ימצא בעיות הרבה יותר גדולות בתחום האלגוריתמיקה. קודם כל הנחת היסוד היא שיתבצע שימוש מקסימלי בחומרה ולכן עבודה מקבילית היא מובנת מאליה. תשתית מולטימדיה של מיקרוסופט “DirectShow” קיימת עוד לפני שנת 2000 ומחייבת תכנון מקבילי ומבוססת על תרשימי זרימה של מידע. כנ”ל לגבי מיון וחיפוש מידע, בסיסי נתונים, ועוד.


כמות רבה מאד של אנשי הפיתוח בתחום הם מתמטיקאים ופיזיקאים. כלי העבודה לא כוללים Visual Studio אלא Matlab (מטלב) שהוא כלי מתמטי תיאורטי שעושה עבודה נפלאה אבל לא באמת מייצר מוצר שאפשר למכור.


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


כאשר אני עובד על אלגוריתמים של עיבוד תמונה וקול אני משתמש בתשתיות כמו DirectShow ובכלים דוגמת GraphEdit. באופן כזה אין באמת יכולת לשים breakpoint ולהבין מה קרה במערכת ואחד הפתרונות הוא כלי debug שמיועדים לפיתוח דרייברים.כך או כך, אנחנו מאבדים את היכולות והעוצמה של Visual Studio.


אחד הפתרונות היותר טובים הוא שימוש בזכרון משותף (Shared Memory). יש מעט מקרים שבהם הייתי ממליץ על הטכניקה הזו על פני למשל Pipe או Socket. במקרה הזה אין ספק שמדובר בפתרון טוב. העקרון הוא לחלק את הקודק לשני חלקים האחר הוא ממשק כלפי התשתית והשני מבצע את העיבוד. הראשון הוא פילטר ששולח את המידע שנכנס לזכרון משותף ומקבל את המידע שצריך להעביר הלאה דרך זכרון משותף. הרכיב השני הוא אפליקציה שפועלת תחת Debug ב- Visual Studio. כך אפשר לראות משתנים, לעצור, להמשיך, ולהבין מאיפה הגיע Exception. את הפיתוח אפשר לבצע אפילו בשפות .Net. פתרון כזה מקצר משמעותית תהליכי פיתוח.


דוגמא לשימוש בזכרון משותף אפשר למצא כאן: Shared Memory. ניתן להוריד את הספריה הסגורה כאן: WinModules.


מי שמתעניין בפיתוח אלגוריתמים מוזמן לקרא עוד על AVX, ועל C++ AMP.


בהצלחה,
אסף

Add comment
facebook linkedin twitter email

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

one comment

  1. HopsonAugust 5, 2012 ב 21:31

    היי

    אחלה פוסט, תודה!

    Reply