חדשות היום

יתרונות גודל הקוד בארכיטקטורות של 32 ביט

ג’וזף ייו ואנדרו פריים, ARM

בעבר נחשבו המיקרו-בקרים של 8 ושל 16 ביט לבחירה הטובה ביותר עבור תכנונים המצריכים ממדי קוד תוכנית קטנים. במאמר זה נבחן את התפיסה הזו ונציג את ממצאי הבדיקה.
כדי להתחיל בבחינה זו עלינו לערוך השוואה המסתמכת על יישום לדוגמה, במקרה זה תבחין (בנצ’מרק) Dhrystone, המהודר על כמה ארכיטקטורות פופולריות, ומדידה של דרישות גודל התוכנית. התוצאות, המוצגות בטבלה שלהלן, עשויות להפתיע כמה מהקוראים, כיוון שהן מראות כי ארכיטקטורת 32 ביט מוכנה לשימוש “מהקופסה” היא בעלת גודל קוד קטן באופן משמעותי הן מזה של ארכיטקטורת 16 ביט והן של 8 ביט.
למעשה, אמנם גודל הקוד הנדרש עבור ארכיטקטורת ה-8 ביט הוא גדול יותר באופן ניכר, ואילו גודל הקוד של ארכיטקטורת ה-16 ביט קרוב לזה של ארכיטקטורת ה-32 ביט, אך הוא עלול גם להיות גדול בהרבה כאשר יש צורך במודל זיכרון גדול. כדי להסביר את הסיבות לכך עלינו לבחון באופן מעמיק יותר את הגודל האמיתי של הפקודה, ועד כמה היא מטופלת ביעילות.

גודל הפקודות
ניתן לצפות שגודל הפקודה יהיה זהה לגודל נתיב הנתונים של הארכיטקטורה. במציאות, אמנם ישנן פקודות של מעבד 8 ביט שאורכן בייט אחד, אבל פקודות רבות הן למעשה באורך של שניים ואפילו שלושה בייטים. אותו המצב חל גם על ארכיטקטורות של 16 ביט, לדוגמה, פקודות מסוימות על MSP430 גנרי הן באורך של שישה בייטים, ובמקרה של MSP430X (ארכיטקטורת MSP430 מורחבת), פקודות מסוימות יכולות להגיע גם לאורך של שמונה בייט.
ארכיטקטורת 32 ביט, כדוגמת זו של ARM, תומכת הן בפקודות 32 ביט והן בפקודות 16 ביט. ברוב המקרים, עבור פיסה של קוד מהודר, היחס הממוצע של פקודות 32 ביט לפקודות 16 ביט הוא נמוך יחסית. לדוגמה, הכמות של פקודות 32 ביט בתמונת תוכנית ה-Dhrystone היא רק 15.8% ממספר הפקודות הכולל (גודל פקודה ממוצע הוא 18.53 ביט) כאשר התוכנית מהודרת עבור ה-ARM Cortex-M3, ורק 5.4% (גודל פקודה ממוצע הוא 16.9 ביט) כשהתוכנית מהודרת עבור ה-ARM Cortex-M0.

המיתוסים סביב
יישומי 8 ביט
ברוב היישומים הכרחי לעבד נתוני 16 ביט או גדולים יותר. לדוגמה, עבור ארכיטקטורת 8 ביט, נתונים מסוג מספר שלם הם 16 ביט, כך שבכל פעם שמשתמשים במספר שלם (לדוגמה, בלולאת “for”), או בפונקציה של ספריית C התומכת במספר שלם, מתבצע עיבוד של נתוני 16 ביט. עיבוד כזה מצריך רצף ארוך של פקודות עבור ארכיטקטורת 8 ביט. סוגיה דומה משפיעה גם על הטיפול במצביע לזיכרון (פוינטר) על ארכיטקטורות של 16 ביט. טיפול כזה במצביע עלול להפוך למאוד לא יעיל כאשר הוא נדרש לגשת לכמות זיכרון החורגת ממגבלת ה-64KB. כתוצאה מכך, כפי שניתן לראות בדוגמה של ה-Dhrystone, מתרחשת עלייה של 17% בגודל הקוד כאשר עוברים לגרסת מודל הזיכרון הגדול יותר של ה-MSP430.

יעילות מערך הפקודות
רוב ארכיטקטורות ה-8 ביט למעשה מסתמכות על צובר (אקומולטור) ועל אוגרי מצביע (רגיסטרים) מיוחדים לצורך עיבוד נתונים וגישת זיכרון, מה שמוביל לממדי קוד גדולים יותר ולרמת ביצועים נמוכה יותר כיוון שיש צורך בפקודות נוספות כדי להעביר את הנתונים אל תוך האוגרים המיוחדים הללו והחוצה מהם. בעת העיבוד של נתוני 8 או 16 ביט יש צורך בכמה אוגרים נוספים כדי לאחסן מידע, מה שמוביל לעלייה במספר הגישות לזיכרון צבר, כיוון שאין די אוגרים כדי לשמור את כל הנתונים העוברים עיבוד. בנוסף, האופי הפשוט והמוגבל של מערך פקודות 8 ביט מוליד גם כמה פעולות פשוטות יחסית שהשלמתן מצריכה כמה פקודות.
ארכיטקטורות של 16 ביט ניסו להימנע מכמה מהמלכודות שאותן היכרנו עם הארכיטקטורות של 8 ביט, אבל יעילות הפקודה עדיין יורדת כאשר נדרש עיבוד של נתוני 32 ביט, או כאשר המערכת מצריכה יותר מ-64KB של זיכרון, בעיקר בגלל יעילות נמוכה בעיבוד מצביע הזיכרון. רואים את זה בבירור בתוצאות של ממדי קוד ה-Dhrystone כאשר משווים בין ה-MSP430 הגנרי לבין ה-MSP430 בעל מודל הזיכרון הגדול יותר. עם ארכיטקטורות של 8 ביט היכולת לטפל בזיכרון גדול נהיית בעייתית עוד יותר כיוון שהטיפול הזה נשען בדרך כלל על מעבר לבנק זיכרון מאד לא יעיל. לארכיטקטורות האופייניות של 16 ביט יש גם תמיכה מוגבלת מאוד במוד מיעון, ממש כמו למיקרו-בקרים של 8 ביט, מה שמוביל ליעילות פקודה נמוכה יותר כאשר עיבוד הנתונים נהייה מורכב יותר.
לארכיטקטורת 32 ביט יש את היתרון שהיא מסוגלת לספק פקודות הרבה יותר עצמתיות. פקודות דחיפה או שליפה (push or pop) של צבר בארכיטקטורה של ARM, לדוגמה, יכולות להעביר כמה פיסות של נתוני 32 ביט עם פקודה אחת יחידה. למעבד ה-ARM Cortex-M3 יש גם פקודות של פעולת bit field המאפשרות ביצוע של פעולות bit field בפקודה אחת יחידה, משימה המצריכה כמה פקודות כשמדובר בארכיטקטורות של 8 או של 16 ביט.
יתרונות נוספים של ארכיטקטורות 32 ביט
מלבד ממדי הקוד הקטנים, השימוש בארכיטקטורת 32 ביט יכול גם להקטין את צריכת ההספק. כיוון שהביצועים של מעבדי 8 ביט נמוכים בהרבה מאלו של 32 ביט, יש צורך בהרבה יותר מחזורי שעון כדי לבצע את אותן משימות, מה שמגדיל מאוד את צריכת ההספק. למעבדי 16 ביט יש רמת ביצועים טובה מזו של 8 ביט, אבל עדיין הרבה פחות טובה מזו של מעבד 32 ביט. עם מיקרו-בקרים של 32 ביט, כדי להשיג את אותה רמת תפוקה, ניתן להקטין את תדר השעון כדי להקטין את צריכת ההספק, או להפחית את המחזורים האקטיביים באמצעות הכנסת אותה מערכת למוד שינה למשך זמן ממושך יותר כיוון שמשימות נוטות להסתיים מהר יותר. ולבסוף, כיוון שהממדים הכוללים של הקוד קטנים יותר, מוצר מיקרו-בקר של 32 ביט עם בלוק זיכרון הבזק קטן יותר יכול לשמש להפחתת צריכת ההספק הכוללת של המערכת.

סיכום
המשך השימוש בארכיטקטורת 8 או 16 ביט תמיד יגבה מחיר גבוה יותר במונחים של ממדי קוד ושל צריכת הספק, בהשוואה למעבר לארכיטקטורת 32 ביט מודרנית. הצמצום בגודל הקוד שאותו ניתן לממש כשעוברים לארכיטקטורת 32 ביט יכול לאפשר למפתחי תוכנות משובצות לבחור במיקרו-בקרים עם ממדי הבזק קטנים יותר, מה שיקטין גם עלויות וגם צריכת הספק, ובמקביל יוביל לשיפור ניכר  ברמת ביצועי העיבוד.

תגובות סגורות