עבודה עם ליבות

Sandro

New member
עבודה עם ליבות

שלום לכולם,

אני מתכנת ב-C++ בסביבת CVI לצורכי מחקר אקדמי.
לאחרונה מישהו הסביר לי מעט על חישובים באמצעות ליבות, שאפשר למשל בלולאת for שרצה עד 2000, לנצל 4 ליבות במקביל כך שכל אחת עובדת בקפיצות של 500.
יש לי שתי שאלות שלא בהכרח רלוונטיות ל-++C אלא באופן כללי מתוך סקרנות גדולה:
1. האם חישובים אלו מהירים יותר מחישוב טורי רגיל (ריצה רגילה מ-1 עד 2000)? איך? כמה ליבות עובדות בחישוב טורי שכזה?
2. האם ניתן לתכנת למשל ארבעה דברים שונים לחלוטין (נניח 4 לולאות for שונות) שיעבדו במקביל כך שכל ליבה עובדת על לולאה אחרת ואיכשהו לסנכרן בינהם? אם כן, האם תכנות מסוג זה יכול להיות יעיל? ואיך עושים את זה?

תודה רבה לעונים!
 

EyesToSee

New member
התשובה היא כן לכל השאלות.

ההסברים מצריכים קורס אקדמאי אחד או יותר.
יש קורסים חינמיים ברשת.
אחד הנושאים שפופולרי לאחרונה הוא Big Data.
 

Sandro

New member
אשמח להסבר כללי

למשל על איך הליבות עובדות בחישוב טורי לעומת מקבילי
 

Sandro

New member


 

selalerer

New member
אני לא יודע מה זה CVI אבל אני אנסה לתת עוד מידע.

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

Sandro

New member
תודה רבה! שאלה קטנה נוספת

שמעתי את המושג "ליבות וירטואליות", אתה יודע במקרה מה זה אומר?
 

bismark1

New member
התשובה האמיתית היא - תלוי

כשמדברים על חישוב מקבילי צריך להבין איך העבודה שצריכה להתבצע יכולה להתחלק בין כמה משימות עיבוד, במקרה האידיאלי אין לך תלויות בין פעולות (מה שנקרא בז'רגון המקצועי embarrassingly parallel) ואז אפשר להגיע תאורטית להאצת ביצועים שקרובה למספר יחידות העיבוד שעומד לרשותך (לדוגמא - אם יש לך שני וקטורים בעלי N איברים ואתה רוצה לחשב את סכומם, ברור שלתוצאה בתא i אין תלות בתאים עבורם j != i). מנגד, ישנן משימות שקשה מאוד למקבל (וגם כל מני מקרים באמצע) ולכן התשובה היא - תלוי במה שאתה מנסה לעשות.

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

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

bismark1

New member
הא?

כן, פייתון קלה יותר אבל:
1. נראה שהשואל כבר כותב ב-C או ++C
2. עם כל הכבוד לפייתון (שאני מאוד אוהב), יש מעט דברים יותר קלים מלכתוב
#pragma omp parallel for for(int n=0; n<size; ++n)
בטח אם האלטנטיבה היא להתמודד עם שפה חדשה, קלה ככל שתהיה.
 

EyesToSee

New member
CVI עובד גם עם פייטון, ולכן

עם כל הכבוד ל ++C עבור CVI, השואל ביקש בעיקר ללמוד, נראה לי כי קל יותר ללמוד עם פייטון.
 
למעלה