גישות לזיכרון

white shadow 3

New member
גישות לזיכרון

הי!

רוצה רק לוודא אם הבנתי נכון:
נניח יש לי מערך של int, ונניח שיש לי משתנה j=0 ששמור ברגיסטר

א. כאשר אני כותב את השורה
zz A=j; zz
כמה גישות לזיכרון מבוצעות כאן? אחת -הגעה לאיבר במקום ה-i והשמה j לתוכו?

ב. כאשר אני כותב את השורה:
zz A+=j; zz
כמה גישות לזיכרון מבוצעות כאן? נראה כמו 2 (גישה ראשונה - ללכת לתוכן של האיבר ה-i ולקרוא את המידע שיש בו. לאחר מכן מוסיפים לתוכן זה את j, אבל j שמור ברגיסטר אז אין כאן גישה נוספת לזיכרון. ולאחר מכן גישה שניה: השמה של התוצאה לתוך האיבר במקום ה-j)

ג. כאשר אני כותב את השורה:
zz A+=10; zz
(בהנחה שמה שכתבתי בסעיף ב' נכון) - גם כאן יש 2 גישות לזיכרון, נכון?
גישה ראשונה של קריאת האיבר במקום ה-i ושמירת הערך שלו ברגיסטר, לאחר מכן הוספת הקבוע 4 שלא מצריך גישה לזיכרון, ולאחר מכן השמת התוצאה לתוך האיבר ה-i במערך.

הבנתי נכון?

תודה!
 

BravoMan

Active member
חסרים פרטים...

כתבת היכן שמור j בנקודה שמעניינת אותך, אבל היכן שמורה כתבות של מערך A?
האם היא כבר טעונה לריגיסטר, או שצריך ללכת להביא אותה?
&nbsp
ומה לגבי הערך של i?
האם גם הוא טעון לריגיסטר, או שגם אותו צריך ללכת להביא מזיכרון?
 

white shadow 3

New member
אממ...

לגבי i,j - שניהם טעונים כבר ברגיסטרים..
&nbsp
לא בטוח שהבנתי את הכוונה ב-"j בנקודה שמעניינת אותך"?
איברי המערך הם פונקציה של i, לא j...
&nbsp
ולגבי איפה הכתובת של המערך שמורה - שאלה טובה.
כתוב תחת ההנחות בשאלה:
"the only memory accesses are to the entries of the array"
(זה מתוך הספר
computer system - a proframmer's perspective
של
Bryant and O'Hallaron / Pearson
&nbsp
&nbsp
&nbsp
&nbsp
&nbsp
 

BravoMan

Active member
בנקודה שמעניינת אותך, הכוונה

למקום בתוכנה לגביו נשאלת השאלה.
&nbsp
שורה בשפת C לא בהכרח מתורגמת לקבוצה נפרדת של פקודות אסמבלי.
&nbsp
מהשורה הבודדת שציטטת לא ברור למה מתכוונים, ואני לפחות לא מכיר את ספר בע"פ (או בכלל) כך שלא אוכל למצוא את הקונטקסט ולנסות להבין...
&nbsp
מה שמשאיר אותנו עם השאלה:
האם צריך לטעון את A, לחבר לה את i כפול sizeof(int), או ש-A כבר טעון, ואז באמת יש רק גישה אחת לזיכרון והיא כתיבה של J ל-A + I...
 

white shadow 3

New member
אנסה לברר את הנושא,

אך אם נניח כי A טעונה כבר (השורה הזאת היא חלק מקטע קוד של לולאה שעובר על כל המערך אז אני חושב שזה סביר להניח שהכתובת של האיבר הראשון כבר נטענה ברגיסטר כלשהוא ובכל פעם מוסיפים לה רק i ולא מביאים מחדש מהזיכרון)
בסעיפים ב' + ג' מהפוסט, האם אכן מתצבעות 2 גישות לזיכרון? (אחת קריאה של הערך בתא עצמו והשניה כתיבה)?
&nbsp
תודה ויום טוב!
 

white shadow 3

New member
תודה, שאילתא נוספת

תחת אותן הנחות כמו מקודם (שכתובת המערך כבר טעונה ברגיסטר, וגם i ו-j טעונים ברגיסטר) ,
נניח ויש לי מערך של אובייקטים מסוג struct, וכל struct נניח מכיל 4 משתנים x,y,z,w מסוג int
&nbsp
ואני רוצה לכתוב משהו לתוך משתנה x של האובייקט וכותב שורה כמו:
zz A[j].x+=5; zz
&nbsp
כמה גישות לזיכרון מבוצעות כאן? האם עדיין 2 כמו מקודם או שעצם זה שאני צריך לגשת למשתנה של מחלקה שנמצא בתוך מערך משנה משהו בספירה של הגישות?
&nbsp
תודה!
 

BravoMan

Active member
למה שזה ישנה?

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

white shadow 3

New member
תודה...התייעצות קטנה אחרונה

על איזשהוא ויכוח שיש לי עם מישהו...
&nbsp
לפי מה שאני יודע (וגם לפי מה שקראתי באינטרנט), הביטוי ל-miss rate מחושב ע"פ הנוסחא
"מספר ניסיונות הגישה לזיכרון שהחטיאו חלקי מספר סה"כ ניסיונות הגישה שנעשו"
זה אומר, לפי מה שאני מבין, שעבור ההנחות שכתבתי מקודם (נניח כי הקאש ריק בהתחלה, ונניח כי כתובת המערך ו-i ו-j כבר מוזנים ברגיסטר), ועבור שורה כמו:
&nbsp
zz A[j]+=7; zz
אז ה-miss rate יהיה 1/2 (ניסיון גישה ראשון לקריאת הערך באיבר נכשל, ולאחר שהמידע הועלה מהזיכרון ל-cache ניסיון הכתיבה השניה הצליח, לכן יש לנו החטאה אחת מתוך 2 ניסיונות גישה
&nbsp
(דוגמא נוספת, נניח היה נתון מערך של struct שבכל מחלקה יש נניח 5 משתני int בשמות a,b,c,d,e, ונניח כי בבלוק אחד נכנסים 2 איברים של המערך הזה, ואני מבצע לולאה שעוברת על האיבר הראשון והשני (i=0 ו-i=1) ומעדכן להם את השדה שלהם ע"י
zz A.a+=4 zz
zz A.b+=4 zz
zz A.c+=4 zz
zz A.d+=4 zz
zz A.e+=4 zz
&nbsp
אז בניסיון הגישה הראשון (לקריאת התוכן של a) הייתה לי החטאה אחת, ולאחר מכן לפי הבנתי היו לי עוד 9 הצלחות עבור האיטרציה הראשונה, ועוד 10 הצלחות עבור האיטרציה השניה (הצלחה בקריאה ולאחר מכן הצלחה בכתיבה), לכן ה-miss rate שלי הוא 1/20, או שקריאה + כתיבה נחשבות (מסיבה כלשהיא בחישוב) כניסיון 1 ואז ה-miss rate שלי הוא 1/10?
&nbsp
תודה!
 
למעלה