Discuss, Learn and be Happy דיון בשאלות

help brightness_4 brightness_7 format_textdirection_r_to_l format_textdirection_l_to_r

כמה תהליכים אפשר למקבל?

1
done
by
מיין לפי

מה התכנית אמורה לחשב? והאם התכנית תקינה?

1
done
סוג של מכפלה פנימית (בלי השורש) בין ווקטור x לווקטור y. התוצאה היא סקלר. i משתנה פרטי עבור כל thread. המשתנים n,x,y משתנים משותפים לכולם ז"א כל הthreads יחזיקו באותו משתנה ורק משתנה i יהיה פרטי עבור כל אחד (כדי למנוע התנגשויות כזו או אחרת). נריץ בלולאת for עם reduction את המכפלה כאשר כל thread יבצע מכפלה עם ה-i הפרטי שלו ובעזרת reduction מבצעים סכום של כל הפעולות שהthreads ביצעו למשתנה יחיד עבור המאסטר התוכנית תקינה
by
מיין לפי
by אייל יקיר
אייל יקיר 0 נקודות · יותר מ-6 חודשים
מוניטין: 60
סוג של מכפלה פנימית (בלי השורש) בין ווקטור x לווקטור y. התוצאה היא סקלר. i משתנה פרטי עבור כל thread. המשתנים n,x,y משתנים משותפים לכולם ז"א כל הthreads יחזיקו באותו משתנה ורק משתנה i יהיה פרטי עבור כל אחד (כדי למנוע התנגשויות כזו או אחרת). נריץ בלולאת for עם reduction את המכפלה כאשר כל thread יבצע מכפלה עם ה-i הפרטי שלו ובעזרת reduction מבצעים סכום של כל הפעולות שהthreads ביצעו למשתנה יחיד עבור
by

האם הקוד תקין? הסבר את מטרת הקוד ופעולתו

1
done
הקוד לא תקין מפני שהמשתנה j הוא לא private ואז לכל התהליכונים בפור שרץ עם i יהיה את אותו j שישתנה לכולם מתהליכונים אחרים אבל, אם j הוגדר בתוך הfor אז הוא פרייבט בברית מחדל ואז אין בעיה, צריך להתייחס איך שרוצים רק לכתוב (אפשר לכתוב את שני האפשרויות כדי שיבין שמבינים מה קורה) מטרת הקוד היא לבצע transpose על מטריצה A ולשמור את התוצאה במטריצה B.
by
מיין לפי
by אייל יקיר
אייל יקיר 0 נקודות · יותר מ-6 חודשים
מוניטין: 60
הקוד לא תקין מפני שהמשתנה j הוא לא private ואז לכל התהליכונים בפור שרץ עם i יהיה את אותו j שישתנה לכולם מתהליכונים אחרים אבל, אם j הוגדר בתוך הfor אז הוא פרייבט בברית מחדל ואז אין בעיה, צריך להתייחס איך שרוצים רק לכתוב (אפשר לכתוב את שני האפשרויות כדי שיבין שמבינים מה קורה) מטרת הקוד היא לבצע transpose על מטריצה A ולשמור את התוצאה במטריצה B.
by

האם הקוד תקין? אם כן מה הוא עושה

1
done
הקוד תקין, הקוד מבצע פעולת transpose על מטריצה A ושומר תוצאה במטריצה B i מבצע חילוק של k ב-N, מכיוון ש-i הוא int אז התוצאה תחזיר את המנה של החלוקה (כלומר 0 עבור k מ-1 עד N, 1 עבור k מ-N עד 2N, 2 עבור 2N עד 3N וכו'), כלומר i רץ על השורה, j מבצע מודולו של החלוקה ובעצם לוקח את השארית ויהווה את העמודה שרצים עליה. i,j הם משתנים פרטיים עבור כל thread, שהם האינדקסים של המטריצות. וככה מבצעים את הtranspose על A ושומרים את התוצאה במטריצה B ככה שכל thread יבצע את החישוב לפי האינדקס הפרטי שלו.
by
מיין לפי
by אייל יקיר
אייל יקיר 0 נקודות · יותר מ-6 חודשים
מוניטין: 60
הקוד תקין, הקוד מבצע פעולת transpose על מטריצה A ושומר תוצאה במטריצה B i מבצע חילוק של k ב-N, מכיוון ש-i הוא int אז התוצאה תחזיר את המנה של החלוקה (כלומר 0 עבור k מ-1 עד N, 1 עבור k מ-N עד 2N, 2 עבור 2N עד 3N וכו'), כלומר i רץ על השורה, j מבצע מודולו של החלוקה ובעצם לוקח את השארית ויהווה את העמודה שרצים עליה. i,j הם משתנים פרטיים עבור כל thread, שהם האינדקסים של המטריצות. וככה מבצעים את הtranspose על A ושומרים את התוצאה במטריצה B ככה שכל thread יבצע את החישוב לפי האינדקס הפרטי שלו.
by

האם התוצאות זהות

1
done
by
מיין לפי

מה עושה התוכנית? האם תקינה?

1
done
התוכנית מבצעת transpose למטריצה A ושומרת את השחלוף באותה מטריצה A. התוכנית תקינה כי אין 2 תהליכונים שכותבים לאותו מקום. Temp מאותחל בתוך הלולאה המקבילית לכן הוא הוא נוצר בכל מעבד בנפרד כלומר הוא משתנה פרטי, וj הוא משתנה פרטי כברירת מחדל כמשתנה איטרציה, לכן אין בעיה בתוכנית. ב- race condition הכוונה למצב בו תוצאת התוכנית תלויה בסדר בו פעלו ה-threads. נשים לב שכאן לא משנה הסדר שבהם יפעלו כי כל threads יבצע שחלוף לאיבר לפי האינדקס הפרטי שלו ואין חשיבות לסדר, כל תהליכון יהיה במקום אחר בזיכרון
by
מיין לפי
by אייל יקיר
אייל יקיר 0 נקודות · יותר מ-6 חודשים
מוניטין: 60
התוכנית מבצעת transpose למטריצה A ושומרת את השחלוף באותה מטריצה A. התוכנית תקינה כי אין 2 תהליכונים שכותבים לאותו מקום. Temp מאותחל בתוך הלולאה המקבילית לכן הוא הוא נוצר בכל מעבד בנפרד כלומר הוא משתנה פרטי, וj הוא משתנה פרטי כברירת מחדל כמשתנה איטרציה, לכן אין בעיה בתוכנית. ב- race condition הכוונה למצב בו תוצאת התוכנית תלויה בסדר בו פעלו ה-threads. נשים לב שכאן לא משנה הסדר שבהם יפעלו כי כל threads יבצע שחלוף לאיבר לפי האינדקס הפרטי שלו ואין חשיבות לסדר, כל תהליכון יהיה במקום אחר בזיכרון
by

א. מה מטרת התוכנית? האם תקינה? ב. בהנחה שהתוכנית תקינה, האם הפלא הבא אפשרי: 9,10,11,12 - rank 0 5,6,7,8 - rank 1 1,2,3,4 - rank 2 13,14,15,16 - rank 3

1
done
א. בתנאי שמריצים 4 מעבדים, התוכנית תשלח כל וקטור שורה במטריצה למעבד באינדקס המתאים, כלומר את השורה 0 למעבד 0, שורה 1 למעבד 1, שורה 2 למעבד, שורה למעבד 3 ב. לא, כפי שראינו הSCATTER מחלק בצורה עקבית, ההדפסה אולי תהיה בסדר לא עקבי אבל כל מעבד מקבל לפי הסדר של המטריצה, והפלט יהיה כפי שרשום למעלה.
by
מיין לפי
by אייל יקיר
אייל יקיר 0 נקודות · יותר מ-6 חודשים
מוניטין: 60
א. בתנאי שמריצים 4 מעבדים, התוכנית תשלח כל וקטור שורה במטריצה למעבד באינדקס המתאים, כלומר את השורה 0 למעבד 0, שורה 1 למעבד 1, שורה 2 למעבד, שורה למעבד 3 ב. לא, כפי שראינו הSCATTER מחלק בצורה עקבית, ההדפסה אולי תהיה בסדר לא עקבי אבל כל מעבד מקבל לפי הסדר של המטריצה, והפלט יהיה כפי שרשום למעלה.
by

האם הקוד תקין? האם ניתן לשפר את הקוד?

1
done
כן הקוד תקין, (נניח שיש שני תהליכונים) נשים לב עבור העדכון של e יש לנו שני תהליכונים שרצים עליו, אז תהליכון ראשון רץ על עדכון c והשני על עדכון d. יש לנו nowait אז נגיד השני סיים לפני הראשון אז הוא עושה את e ואין לו את כל c עדיין אז זה לא נורא כי אחרי שהתהליך הראשון יסיים את c הוא יעשה את e (כשיש לנו את d) ואז יעדכן כמו שצריך לערכים הנכונים. ניתן להאיץ את הקוד מפני שהריצות לא תלויות אז אפשר לחלק כל לולאה "עד N" מעבדים. אפשר להוסיף barrier בסוף הsections כדי שהעדכון של e יתבצע על ידי תהליך יחיד
by
מיין לפי
by אייל יקיר
אייל יקיר 0 נקודות · יותר מ-6 חודשים
מוניטין: 60
כן הקוד תקין, (נניח שיש שני תהליכונים) נשים לב עבור העדכון של e יש לנו שני תהליכונים שרצים עליו, אז תהליכון ראשון רץ על עדכון c והשני על עדכון d. יש לנו nowait אז נגיד השני סיים לפני הראשון אז הוא עושה את e ואין לו את כל c עדיין אז זה לא נורא כי אחרי שהתהליך הראשון יסיים את c הוא יעשה את e (כשיש לנו את d) ואז יעדכן כמו שצריך לערכים הנכונים. ניתן להאיץ את הקוד מפני שהריצות לא תלויות אז אפשר לחלק כל לולאה "עד N" מעבדים. אפשר להוסיף barrier בסוף הsections כדי שהעדכון של e יתבצע על ידי תהליך יחיד
by

איזה קוד מתאים לאיזה ציור

1
done
by
מיין לפי

האם התוכנית רצה? ואם כן מה היא עושה

1
done
כל מעבד ידפיס הודעת hello world from #rank כאשר rank יהיה הrank בהתאם למעבד שמדפיס. היא מבצעת זאת בכך שמעבד 0 שולח את ההודעה (יש בעיה הטיפוס הוא לא int אלא אמור להיות MPI_CHAR, לא יודע אם זה בעיה בשחזור של הקוד). אז מעבד 0 שולח את ההודעה לכל המעבדים האחרים שיש בקומינקטור בעזרת לולאת פור. ואז שאר המעבדים יכנסו לפקודת הrecv ויקבלו את ההודעה. גודל הבאפר גדול מההודעה עצמה לכן זה עדיין יעבוד אבל יש פה בזבוז זיכרון. הtag בשניהם זהה (שליחה וקבלה) לכן אין פה בעיה. איך ניתן לפשט? – לבצע פקודת bcast ממעבד 0 שישלח את ההודעה לכולם במקום להשתמש בsend, recv.
by
מיין לפי
by אייל יקיר
אייל יקיר 0 נקודות · יותר מ-6 חודשים
מוניטין: 60
כל מעבד ידפיס הודעת hello world from #rank כאשר rank יהיה הrank בהתאם למעבד שמדפיס. היא מבצעת זאת בכך שמעבד 0 שולח את ההודעה (יש בעיה הטיפוס הוא לא int אלא אמור להיות MPI_CHAR, לא יודע אם זה בעיה בשחזור של הקוד). אז מעבד 0 שולח את ההודעה לכל המעבדים האחרים שיש בקומינקטור בעזרת לולאת פור. ואז שאר המעבדים יכנסו לפקודת הrecv ויקבלו את ההודעה. גודל הבאפר גדול מההודעה עצמה לכן זה עדיין יעבוד אבל יש פה בזבוז זיכרון. הtag בשניהם זהה (שליחה וקבלה) לכן אין פה בעיה. איך ניתן לפשט? – לבצע פקודת bcast ממעבד 0 שישלח את ההודעה לכולם במקום להשתמש בsend, recv.
by