Homework Dry 3 Due date: Sunday, 9/06/2013 12:30 noon Teaching assistant in charge: Anastasia Braginsky Important: this semester the Q&A for the exercise will take place at a public forum only. To register to the forum, please go to its sign up page. Our course s homepage is here. Please note, the forum is a part of the exercise, any clarification/correction that will be published in the forum is a *MUST*. A number of guidelines to use the forum: Read previous Q&A carefully before asking the question; repeated questions will probably go without answers Be polite, remember that course staff does this as a service for the students You re not allowed to post any kind of solution and/or source code in the forum as a hint for other students; In case you feel that you have to discuss such a matter, please come to the reception hour When posting questions regarding hw3, put them in the hw3 folder שאלה 1 נתונה מטריצה A ו- 2 וקטורים cols_sum ו- row_sum אשר מחזיקים את סכום השורות והעמודות במטריצה. א. כתוב קוד אשר מאפשר עדכון מקבילי של איברי המטריצה A והוקטורים cols_num ו- rows_num כך שגישה במקביל לשני איברים שלא נמצאים באותה השורה והעמודה תהיה אפשרית. update_val(int A[N][M], int row_sum[], int col_sum[], int new_val, int i, int j)
מציעים לכתוב את הפונקציה אשר מעדכנת קבוצה של ערכים בבת אחת. עדיין אנו רוצים לשמור על גישה מקבילית ככל האפשר. סטודנט הציע לפתור את הבעיה בצורה הבאה: mutex m_rows[n]; mutex m_cols[m]; multiple_update_val(int A[][M], int row_sum[], int col_sum[], int new_vals[],int i_places[], int j_places[], int length) int k=1; for k=1:length i = i_places[k]; j = j_places[k]; lock(m_cols[j]); lock(m_rows[i]); end for k=1:length i = i_places[k]; j = j_places[k]; col_sum[j] += new_val A[i][j]; row_sum[i] += new_val A[i][j]; A[i][j] = new_val; end for k=1:length i = i_places[k]; j = j_places[k]; unlock(m_cols[j]); unlock(m_rows[i]); end
ב. לפניכם מספר טענות בקשר למימוש הנ"ל. לכל טענה, סמנו האם הטענה נכונה והסבירו מדוע. שימו לב, הפתרון כתוב כפסאודו-קוד ולא ב- C עם.POSIX Threads הניחו שה- mutex -ים מתנהגים כפי שלמדתם בהרצאה. האם ייתכן מצב של deadlook בפתרון עקב נעילה עצמית? הטענה נכונה: כן / לא הסבר: האם ייתכן מצב של deadlook בפתרון שלא עקב נעילה עצמית? הטענה נכונה: כן / לא הסבר: תחת ההנחה שלא מתקיים deadlock האם הפתרון הנ"ל מאפשר מקסימום מקביליות? אם לא תן דוגמא שבא חוט ממתין כאשר הוא היה יכול לבצע עדכון של המטריצה הטענה נכונה: כן / לא הסבר: ג. ממשו את הפונקציה.multiple_update_val הפתרון שלכם צריך להיות חסר,deadlock וצריך לאפשר מקסימום מקביליות. multiple_update_val(int A[][M], int row_sum[], int col_sum[], int new_vals[], int i_places[], int j_places[], int length)
שאלה 2 א. שלושה חוטים, D, C, B, משתפים פעולה על-מנת לסכום את הערכים )מספרים שלמים( המאוחסנים במערך X בגודל 22, באופן הבא: X[0], X[2], X[18] סוכם את האיברים הזוגיים B.1 X[1], X[3], X[19] סוכם את האיברים האי-זוגיים C.2 ו- C. B מחבר את התוצאות של D 3. השלם את הקוד המופיע להלן )כולל הגדרת משתנים, אם צריך(, כך ש: 1. כל חוט מסיים אחרי שגמר את תפקידו. 2. B ו- C ניגשים לאיברים שונים של המערך בו-זמנית. 3. הפתרון משתמש רק בסמפורים. 4. החוטים לא מבצעים.busy-wait 5. המערך X מאותחל עם ערכים מתאימים. 6. מספר השורות הריקות אינו מחייב. int x[20]; int sum, sumb, sumc; ThreadB: sumb = 0; for(i=0; i<20; i+=2) sumb += x[i];
ThreadC sumc = 0; for(i=1; i<20; i+=2) sumc += x[i]; ThreadD: sum = sumb + sumc; ב. למקרים כאלה משתמשים לפעמים בכלי סינכרון כללי יותר שנקרא מחסום.)barrier( הגרסה החד-פעמית של המחסום תומכת בפונקציה enter_barrier עבור מספר תהליכים N ידוע מראש. תהליך הקורא לפונקציה ימתין )המתנה חוסמת( עד שכל N התהליכים יקראו ל.enter-barrier רק לאחר שכל התהליכים "נכנסו למחסום" )הפעילו את הפונקציה )enter_barrier יוכלו כל N התהליכים להמשיך את הביצוע שלהם. כתוב פסאודו-קוד לפונקציה enter_barrier לשימוש חד פעמי, אשר משתמש רק במנעול אחד ובמשתנה תנאי אחד. מותר להשתמש במשתנים גלובליים נוספים )אבל לא אמצעי סנכרון נוספים(. Lock L Condition C Function enter_barrier