תכנות מקבילי

22wings

New member
תכנות מקבילי

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

arn0n

New member
לא מכיר MPI אבל...

אני לא מכיר MPI מעבר ל-BUZZWORDS, אבל יש פתרונות רבים לשימוש במספר מחשבים במקביל, ויכול להיות ש-MPI זה לא מה שאתה מחפש. מכיוון שזה פורום הנדסת תוכנה, אז הנה הזדמנות לדסקס את זה... בגדול, ניתן לחלק בעיות חישוביות לשני סוגים - מתמקבלות בקלות, ומתמקבלות בקושי. (זה קצת פשטני - יש סקלה של קושי, אבל זה מספיק בשביל דיון כללי) דוגמה לבעיה שמתמקבלת בקלות: דחיסת קבצי MP3. נניח שיש לך אלפי קבצים שאתה צריך לקודד ל-MP3. אם יש לך מחשב אחד, אז אתה עושה זאת בטור. אם יש לך 100 מחשבים, אתה פשוט נותן 1/100 מהקבצים לכל אחד מן המחשבים, וכך אתה מבצע את העבודה ב-1/100 מהזמן. פשוט. דרך אגב, המונח באנגלית הוא embarrasingly-parallel... דוגמה לבעיה שמתמקבלת בקושי מסוים: מיון. אפשר אמנם לחלק את המערך בין המחשבים השונים, אבל אז נקבל תתי מערכים ממוינים, ונצטרך לבצע עבודה לא טריוויאלית של לאחד אותם. גם את העבודה הזאת ניתן לפזר בין מספר מחשבים (למשל, כל שני תתי-מערך יועברו למחשב אחר), וכו'. (אני לא טוען שאין דרכים יעילות יותר, אבל זה רק ממחיש שזאת אינה בעיה טריוויאלית). הבדל העיקרי בין בעיות קלות למקבול לבין בעיות קשות למקבול הוא הצורך בתקשורת בין המעבדים אשר מבצעים את תתי-המטלות. בעיות קלות למקבול הן כאלו אשר לא דורשות תקשורת רבה (שגר ושכח), בעוד הבעיות הקשות מצריכות שיתוף של אינפורמציה בין המעבדים השונים. בנוסף, בעיות קלות למקבול בד"כ מאפשרות ניצול מקסימלי של המשאבים לאורך מרבית העבודה. בעיות קשות למקבול הרבה פעמים לא יכולות לעשות שימוש בכל המשאבים לאורך זמן. MPI היא ספריה אשר נועדה לאפשר פתרון בעיות קלות וגם קשות. היא כוללת תמיכה בהעברת הודעות בין המעבדים, סינכרוניזציה של חישובים ועוד. אולם כאשר באים לפתור בעיות קלות למקבול, יכול להיות ש-MPI היא overkill, מבחינת הקושי התכנותי. אם למשל אתה בא לפתור בעיה בסגנון של ה-MP3 שתיארתי קודם, הרבה יותר פשוט להכניס את רשימת הקבצים ל-DB, ולכתוב קליינטים שיהוו "סוסי עבודה": ישלפו רשומה מה-DB, ירשמו אותה בסטטוס "תפוסה", ידחסו את הקובץ המתאים, ויעדכנו את הסטטוס החדש. היתרון בארכיטקטורה כזאת הוא שהיא מאד scalable: יש לך עוד מעבדים? תריץ עוד קליינטים. בנוסף, הארכיטקטורה הזאת היא מאד פשוטה. יתרון אחר הוא fault-tolerance: נפלו כמה מחשבים תוך כדי ריצה? לא נורא. כשנגמרות כל הרשומות ה"פנויות", פשוט הופכים את הרשומות ה"תפוסות" לפנויות, והמחשבים שנותרו ממשיכים לעבד עד שכל הרשומות בסטטוס "הסתיים בהצלחה". לגבי הבעיה הספציפית שלך, ו-MPI: אני לא יודע מהו סוג הבעיה שאתה מנסה לפתור, ויהיה מעניין אם תפרט קצת יותר על אופי הבעיה.
 
למעלה